[taurus] 02/06: New upstream version 4.0.1+dfsg

Frédéric-Emmanuel Picca picca at moszumanska.debian.org
Sat Aug 27 15:29:11 UTC 2016


This is an automated email from the git hooks/post-receive script.

picca pushed a commit to annotated tag debian/4.0.1+dfsg-1
in repository taurus.

commit 37bd813ec9d5071bf1cf6ddc9738692dfbf3d10f
Author: Picca Frédéric-Emmanuel <picca at debian.org>
Date:   Sat Aug 27 14:37:56 2016 +0200

    New upstream version 4.0.1+dfsg
---
 CHANGELOG.md                                       |  159 ++
 MANIFEST.in                                        |    8 +
 PKG-INFO                                           |   21 +-
 doc/auto_rst4api.py                                |  196 +-
 doc/buildmock.py                                   |  131 +-
 doc/makeman                                        |   25 +-
 doc/man/tau2taurus.1                               |   19 -
 doc/man/taurusconfigbrowser.1                      |    6 +-
 doc/man/tauruscurve.1                              |    6 +-
 doc/man/taurusdesigner.1                           |    6 +-
 doc/man/taurusdevicepanel.1                        |    6 +-
 doc/man/taurusdoc.1                                |   48 -
 doc/man/taurusform.1                               |    6 +-
 doc/man/taurusgui.1                                |    6 +-
 doc/man/{taurusdemo.1 => taurusiconcatalog.1}      |   16 +-
 doc/man/taurusimage.1                              |    6 +-
 doc/man/tauruspanel.1                              |    6 +-
 doc/man/taurusplot.1                               |    6 +-
 doc/man/taurusremotelogmonitor.1                   |   56 -
 doc/man/taurustestsuite.1                          |   24 +
 doc/man/taurustrend.1                              |    6 +-
 doc/man/taurustrend1d.1                            |    6 +-
 doc/man/taurustrend2d.1                            |    6 +-
 doc/man/taurusui.1                                 |   38 -
 doc/man/taurusuic4.1                               |   47 -
 doc/mock.zip                                       |  Bin 2128510 -> 2627123 bytes
 doc/source/_static/attributechooser01.png          |  Bin 32644 -> 0 bytes
 doc/source/_static/macros/favouriteeditor01.png    |  Bin 12205 -> 0 bytes
 doc/source/_static/macros/macroexecutor01.odg      |  Bin 42236 -> 0 bytes
 doc/source/_static/macros/macroexecutor01.png      |  Bin 1111166 -> 0 bytes
 doc/source/_static/macros/macroexecutor01_raw.png  |  Bin 21869 -> 0 bytes
 .../_static/macros/macroparameterseditor01.png     |  Bin 8124 -> 0 bytes
 .../_static/macros/macroparameterseditor02.png     |  Bin 7635 -> 0 bytes
 .../_static/macros/macroparameterseditor03.odg     |  Bin 20268 -> 0 bytes
 .../_static/macros/macroparameterseditor03.png     |  Bin 604944 -> 0 bytes
 .../_static/macros/macroparameterseditor03_raw.png |  Bin 7773 -> 0 bytes
 .../_static/macros/macroparameterseditor04.odg     |  Bin 23179 -> 0 bytes
 .../_static/macros/macroparameterseditor04.png     |  Bin 604944 -> 0 bytes
 .../_static/macros/macroparameterseditor04_raw.png |  Bin 10110 -> 0 bytes
 .../_static/macros/macroparameterseditor05.odg     |  Bin 22524 -> 0 bytes
 .../_static/macros/macroparameterseditor05.png     |  Bin 604944 -> 0 bytes
 doc/source/_static/macros/sequenceeditor01.png     |  Bin 13687 -> 0 bytes
 doc/source/_static/macros/sequenceeditor02.odg     |  Bin 27793 -> 0 bytes
 doc/source/_static/macros/sequenceeditor02.png     |  Bin 672669 -> 0 bytes
 doc/source/_static/macros/sequenceeditor02_raw.png |  Bin 13687 -> 0 bytes
 doc/source/_static/macros/sequenceeditor03.odg     |  Bin 30108 -> 0 bytes
 doc/source/_static/macros/sequenceeditor03.png     |  Bin 628299 -> 0 bytes
 doc/source/_static/macros/sequenceeditor03_raw.png |  Bin 15806 -> 0 bytes
 doc/source/_static/macros/sequenceeditor04.odg     |  Bin 29610 -> 0 bytes
 doc/source/_static/macros/sequenceeditor04.png     |  Bin 628299 -> 0 bytes
 doc/source/_static/macros/sequenceeditor05_raw.png |  Bin 19830 -> 0 bytes
 doc/source/_static/macros/sequencer01.odg          |  Bin 47998 -> 0 bytes
 doc/source/_static/macros/sequencer01.png          |  Bin 1233154 -> 0 bytes
 doc/source/_static/macros/sequencer01_raw.png      |  Bin 29047 -> 0 bytes
 doc/source/_static/taurusgui-newgui01.png          |  Bin 0 -> 32321 bytes
 doc/source/_static/taurusiconcatalog-01.png        |  Bin 0 -> 94445 bytes
 doc/source/_static/taurusiconcatalog-details01.png |  Bin 0 -> 48920 bytes
 doc/source/_templates/layout.html                  |   12 -
 doc/source/conf.py                                 |  168 +-
 doc/source/devel/coding_guide.rst                  |  244 +--
 doc/source/devel/color_guide.rst                   |  108 --
 doc/source/devel/core_tutorial.rst                 |  268 +--
 doc/source/devel/designer_tutorial.rst             |  157 +-
 doc/source/devel/examples.rst                      |   21 +-
 doc/source/devel/examples/TaurusTest.py            |  168 +-
 doc/source/devel/examples/edit01.py                |    8 +-
 doc/source/devel/examples/edit02.py                |   14 +-
 doc/source/devel/examples/edit03.py                |   14 +-
 doc/source/devel/examples/forms01.py               |    4 +-
 doc/source/devel/examples/forms02.py               |   10 +-
 doc/source/devel/examples/label02.py               |    4 +-
 doc/source/devel/examples/label03.py               |    6 +-
 doc/source/devel/examples/label04.py               |    8 +-
 doc/source/devel/examples/label05.py               |    4 +-
 doc/source/devel/examples/label06.py               |   10 +-
 .../devel/examples/parentmodel_issue_demo.py       |   55 +-
 doc/source/devel/examples/pyqwt_issue_test.py      |   23 +-
 doc/source/devel/examples/taurusplot01.py          |    6 +-
 doc/source/devel/examples/taurusplot02.py          |    4 +-
 doc/source/devel/examples/taurusplot03.py          |   11 +-
 doc/source/devel/examples/taurustrend01.py         |    6 +-
 doc/source/devel/icon_example.py                   |   27 +-
 doc/source/devel/icon_guide.rst                    |   42 +-
 doc/source/devel/index.rst                         |   13 +-
 doc/source/devel/popupmenu_tutorial.rst            |   11 -
 doc/source/devel/tau2taurus_migration_guide.rst    |  768 --------
 doc/source/devel/taurus3to4.rst                    |   25 +
 doc/source/devel/tauruscustomsettings.rst          |   14 +
 doc/source/devel/taurusgui_newgui.rst              |   60 +
 doc/source/devel/widget_tutorial.rst               |  197 --
 doc/source/sphinxext/taurusextension.py            |   87 +-
 doc/source/users/getting_started.rst               |  150 +-
 doc/source/users/introduction.rst                  |   88 +-
 doc/source/users/ui/attributechooser.rst           |   33 -
 doc/source/users/ui/experimentconfiguration.rst    |   15 -
 doc/source/users/ui/forms.rst                      |   60 +-
 doc/source/users/ui/index.rst                      |    4 -
 doc/source/users/ui/macros/index.rst               |   11 -
 doc/source/users/ui/macros/macroexecutor.rst       |  152 --
 doc/source/users/ui/macros/sequencer.rst           |  123 --
 doc/source/users/ui/sardanaeditor.rst              |   15 -
 doc/source/users/ui/taurusgui.rst                  |   11 +-
 doc/source/users/ui/ui_colors.rst                  |  132 +-
 doc/thumbnails.zip                                 |  Bin 881911 -> 0 bytes
 PKG-INFO => lib/taurus.egg-info/PKG-INFO           |   21 +-
 lib/taurus.egg-info/SOURCES.txt                    | 1918 ++++++++++++++++++++
 lib/taurus.egg-info/dependency_links.txt           |    1 +
 lib/taurus.egg-info/entry_points.txt               |   18 +
 lib/taurus.egg-info/top_level.txt                  |    1 +
 lib/taurus/__init__.py                             |   35 +-
 lib/taurus/console/__init__.py                     |   34 +-
 lib/taurus/console/enums.py                        |   38 +-
 lib/taurus/console/list.py                         |  123 +-
 lib/taurus/console/table.py                        |   72 +-
 lib/taurus/console/util/__init__.py                |   36 +-
 lib/taurus/core/__init__.py                        |   39 +-
 lib/taurus/core/epics/__init__.py                  |   69 +-
 lib/taurus/core/epics/epicsattribute.py            |  261 +++
 lib/taurus/core/epics/epicsauthority.py            |   44 +
 lib/taurus/core/epics/epicsdevice.py               |   44 +
 lib/taurus/core/epics/epicsfactory.py              |  786 ++------
 lib/taurus/core/epics/epicsvalidator.py            |  113 ++
 lib/taurus/core/epics/test/__init__.py             |   24 +
 lib/taurus/core/epics/test/res/__init__.py         |   24 +
 lib/taurus/core/epics/test/res/epics_test.db       |   44 +
 lib/taurus/core/epics/test/test_epicsattribute.py  |  152 ++
 lib/taurus/core/epics/test/test_epicsvalidator.py  |  134 ++
 lib/taurus/core/evaluation/__init__.py             |  223 +--
 lib/taurus/core/evaluation/dev_example.py          |   78 +-
 lib/taurus/core/evaluation/evalattribute.py        |  459 +++++
 lib/taurus/core/evaluation/evalauthority.py        |   43 +
 lib/taurus/core/evaluation/evaldevice.py           |   80 +
 lib/taurus/core/evaluation/evalfactory.py          |  923 ++--------
 lib/taurus/core/evaluation/evalvalidator.py        |  516 ++++++
 lib/taurus/core/evaluation/ipap_example.py         |   75 +-
 lib/taurus/core/evaluation/test/__init__.py        |   24 +
 .../core/evaluation/test/test_evalattribute.py     |  295 +++
 .../core/evaluation/test/test_evalfactory.py       |   82 +
 .../core/evaluation/test/test_evalvalidator.py     |  362 ++++
 lib/taurus/core/init_bkcomp.py                     |   40 +-
 lib/taurus/core/init_lightweight.py                |   36 +-
 lib/taurus/core/release.py                         |   56 +-
 lib/taurus/core/resource/__init__.py               |  122 +-
 lib/taurus/core/resource/resfactory.py             |  309 ++--
 lib/taurus/core/resource/resvalidator.py           |  163 ++
 lib/taurus/core/resource/test/__init__.py          |   24 +
 .../test/res/__init__.py}                          |    0
 .../core/resource/test/res/attr_resources_file.py  |   11 +
 lib/taurus/core/resource/test/test_resfactory.py   |  222 +++
 lib/taurus/core/resource/test/test_resvalidator.py |  135 ++
 lib/taurus/core/simulation/__init__.py             |   42 -
 lib/taurus/core/simulation/simfactory.py           |  395 ----
 lib/taurus/core/tango/__init__.py                  |  116 +-
 lib/taurus/core/tango/enums.py                     |  129 +-
 lib/taurus/core/tango/img/__init__.py              |   35 +-
 lib/taurus/core/tango/img/img.py                   |  127 +-
 lib/taurus/core/tango/search.py                    |  151 +-
 lib/taurus/core/tango/starter.py                   |  124 +-
 lib/taurus/core/tango/tangoattribute.py            | 1055 +++++++++--
 lib/taurus/core/tango/tangoconfiguration.py        |  444 +----
 lib/taurus/core/tango/tangodatabase.py             |  759 ++++++--
 lib/taurus/core/tango/tangodevice.py               |  380 ++--
 lib/taurus/core/tango/tangofactory.py              |  679 +++----
 lib/taurus/core/tango/tangovalidator.py            |  224 +++
 lib/taurus/core/tango/test/__init__.py             |   26 +
 lib/taurus/core/tango/test/res/TangoSchemeTest     |  499 +++++
 lib/taurus/core/tango/test/res/__init__.py         |   24 +
 lib/taurus/core/tango/test/test_modelequality.py   |   50 +
 lib/taurus/core/tango/test/test_tangoattribute.py  |  823 +++++++++
 lib/taurus/core/tango/test/test_tangovalidator.py  |  162 ++
 lib/taurus/core/tango/test/tgtestds.py             |   73 +
 lib/taurus/core/tango/util/__init__.py             |   28 +
 lib/taurus/core/tango/util/tango_taurus.py         |  180 ++
 lib/taurus/core/taurusattribute.py                 |  473 ++---
 lib/taurus/core/taurusauthority.py                 |  106 ++
 lib/taurus/core/taurusbasetypes.py                 |  428 ++---
 lib/taurus/core/taurusconfiguration.py             |  481 +----
 lib/taurus/core/taurusdatabase.py                  |  580 +-----
 lib/taurus/core/taurusdevice.py                    |  236 +--
 lib/taurus/core/taurusexception.py                 |   42 +-
 lib/taurus/core/taurusfactory.py                   |  357 ++--
 lib/taurus/core/taurushelper.py                    |  370 +++-
 lib/taurus/core/tauruslistener.py                  |   66 +-
 lib/taurus/core/taurusmanager.py                   |  252 +--
 lib/taurus/core/taurusmodel.py                     |  230 ++-
 lib/taurus/core/taurusoperation.py                 |   39 +-
 lib/taurus/core/tauruspollingtimer.py              |   86 +-
 lib/taurus/core/taurusvalidator.py                 |  561 +++---
 lib/taurus/core/test/__init__.py                   |   29 +
 lib/taurus/core/test/basevalidator.py              |   88 +
 lib/taurus/core/test/modelequality.py              |   63 +
 lib/taurus/core/test/modulemanager.py              |  150 ++
 lib/taurus/core/test/test_tauruscoreindependent.py |  108 ++
 lib/taurus/core/test/test_taurushelper.py          |  467 +++++
 lib/taurus/core/util/__init__.py                   |   39 +-
 lib/taurus/core/util/argparse/__init__.py          |   36 +-
 lib/taurus/core/util/argparse/taurusargparse.py    |   49 +-
 lib/taurus/core/util/codecs.py                     |  556 +++---
 lib/taurus/core/util/colors.py                     |  205 ++-
 lib/taurus/core/util/console.py                    |  249 +--
 lib/taurus/core/util/constant.py                   |   46 +-
 lib/taurus/core/util/containers.py                 |  810 +++++----
 lib/taurus/core/util/decorator/decorator.py        |   41 +-
 lib/taurus/core/util/decorator/deprecated.py       |   72 -
 lib/taurus/core/util/decorator/memoize.py          |   26 +-
 lib/taurus/core/util/decorator/typecheck.py        |   39 +-
 lib/taurus/core/util/enumeration.py                |   70 +-
 lib/taurus/core/util/event.py                      |  203 ++-
 lib/taurus/core/util/eventfilters.py               |  196 +-
 lib/taurus/core/util/excepthook.py                 |   42 +-
 lib/taurus/core/util/init_bkcomp.py                |   39 +-
 lib/taurus/core/util/init_lightweight.py           |   43 +-
 lib/taurus/core/util/lock.py                       |   49 +-
 lib/taurus/core/util/log.py                        |  305 +++-
 lib/taurus/core/util/object.py                     |   51 +-
 lib/taurus/core/util/prop.py                       |   56 +-
 lib/taurus/core/util/property_parser.py            |  144 +-
 lib/taurus/core/util/propertyfile.py               |  145 +-
 lib/taurus/core/util/remotelogmonitor.py           |   30 +-
 lib/taurus/core/util/report/__init__.py            |   36 +-
 lib/taurus/core/util/report/report.py              |   41 +-
 lib/taurus/core/util/safeeval.py                   |  154 +-
 lib/taurus/core/util/singleton.py                  |   84 +-
 lib/taurus/core/util/sourcecode.py                 |   44 +-
 lib/taurus/core/util/tablepprint.py                |  141 +-
 lib/taurus/core/util/tb.py                         |   47 +-
 lib/taurus/core/util/test/__init__.py              |   36 +-
 lib/taurus/core/util/test/test_codecs.py           |   81 +-
 lib/taurus/core/util/test/test_timer.py            |   67 +-
 lib/taurus/core/util/threadpool.py                 |   85 +-
 lib/taurus/core/util/timer.py                      |   44 +-
 lib/taurus/core/util/user.py                       |   50 +-
 lib/taurus/core/util/whichexecutable.py            |   41 +-
 lib/taurus/core/util/wrap.py                       |   42 +-
 lib/taurus/core/utils/__init__.py                  |   29 -
 lib/taurus/external/pint/__init__.py               |   22 +-
 lib/taurus/external/qt/QtHelp.py                   |    0
 lib/taurus/external/test/test_qt.py                |   11 +-
 lib/taurus/qt/Qt.py                                |   34 +-
 lib/taurus/qt/QtCore.py                            |   34 +-
 lib/taurus/qt/QtDesigner.py                        |   34 +-
 lib/taurus/qt/QtGui.py                             |   34 +-
 lib/taurus/qt/QtNetwork.py                         |   26 +-
 lib/taurus/qt/QtSvg.py                             |   26 +-
 lib/taurus/qt/QtUiTools.py                         |   26 +-
 lib/taurus/qt/QtWebKit.py                          |   26 +-
 lib/taurus/qt/Qwt5.py                              |   26 +-
 lib/taurus/qt/__init__.py                          |   34 +-
 lib/taurus/qt/qtcore/__init__.py                   |   34 +-
 lib/taurus/qt/qtcore/communication/__init__.py     |   38 +-
 .../qt/qtcore/communication/communication.py       |  248 +--
 lib/taurus/qt/qtcore/configuration/__init__.py     |   36 +-
 .../qt/qtcore/configuration/configuration.py       |  327 ++--
 lib/taurus/qt/qtcore/mimetypes/__init__.py         |   36 +-
 lib/taurus/qt/qtcore/mimetypes/mimetypes.py        |   41 +-
 lib/taurus/qt/qtcore/model/__init__.py             |   38 +-
 lib/taurus/qt/qtcore/model/taurusdatabasemodel.py  |  198 +-
 lib/taurus/qt/qtcore/model/taurusmodel.py          |  180 +-
 lib/taurus/qt/qtcore/tango/__init__.py             |   36 +-
 lib/taurus/qt/qtcore/taurusqlistener.py            |   77 +-
 lib/taurus/qt/qtcore/util/__init__.py              |   34 +-
 lib/taurus/qt/qtcore/util/emitter.py               |  311 ++--
 lib/taurus/qt/qtcore/util/properties.py            |  161 +-
 lib/taurus/qt/qtcore/util/signal.py                |   55 +
 lib/taurus/qt/qtcore/util/tauruslog.py             |   50 +-
 lib/taurus/qt/qtdesigner/__init__.py               |   35 +-
 lib/taurus/qt/qtdesigner/containerplugin.py        |   88 +-
 lib/taurus/qt/qtdesigner/extraguiqwtplugin.py      |   38 +-
 lib/taurus/qt/qtdesigner/taurusdesigner.py         |   64 +-
 lib/taurus/qt/qtdesigner/taurusplugin/__init__.py  |   35 +-
 .../qt/qtdesigner/taurusplugin/taurusplugin.py     |   77 +-
 lib/taurus/qt/qtdesigner/tauruspluginplugin.py     |   83 +-
 lib/taurus/qt/qtgui/__init__.py                    |   50 +-
 lib/taurus/qt/qtgui/application/__init__.py        |   36 +-
 .../qt/qtgui/application/taurusapplication.py      |   50 +-
 lib/taurus/qt/qtgui/base/__init__.py               |   35 +-
 lib/taurus/qt/qtgui/base/taurusbase.py             | 1231 +++++++------
 lib/taurus/qt/qtgui/base/tauruscontroller.py       |  210 +--
 lib/taurus/qt/qtgui/base/taurusqattribute.py       |  193 --
 lib/taurus/qt/qtgui/base/test/__init__.py          |   26 +
 lib/taurus/qt/qtgui/base/test/test_taurusbase.py   |  101 ++
 lib/taurus/qt/qtgui/button/__init__.py             |   34 +-
 lib/taurus/qt/qtgui/button/qbuttonbox.py           |  129 +-
 lib/taurus/qt/qtgui/button/taurusbutton.py         |  514 +++---
 lib/taurus/qt/qtgui/button/test/__init__.py        |   26 +-
 lib/taurus/qt/qtgui/button/test/res/Timeout        |   62 +-
 lib/taurus/qt/qtgui/button/test/res/__init__.py    |   26 +-
 .../qt/qtgui/button/test/test_taurusbutton.py      |   44 +-
 lib/taurus/qt/qtgui/compact/__init__.py            |   34 +-
 lib/taurus/qt/qtgui/compact/abstractswitcher.py    |  302 +--
 lib/taurus/qt/qtgui/compact/basicswitcher.py       |   63 +-
 lib/taurus/qt/qtgui/console/__init__.py            |   37 +-
 lib/taurus/qt/qtgui/console/taurusconsole.py       |   36 +-
 .../qt/qtgui/console/taurusconsoleapplication.py   |   38 +-
 .../qt/qtgui/console/taurusconsoleextensions.py    |   70 +-
 .../qt/qtgui/console/taurusconsolefactory.py       |   55 +-
 lib/taurus/qt/qtgui/console/taurusconsolewidget.py |   28 +-
 lib/taurus/qt/qtgui/console/taurusconsolewindow.py |   62 +-
 lib/taurus/qt/qtgui/container/__init__.py          |   34 +-
 lib/taurus/qt/qtgui/container/qcontainer.py        |  246 +--
 .../qt/qtgui/container/taurusbasecontainer.py      |  107 +-
 lib/taurus/qt/qtgui/container/taurusframe.py       |   84 +-
 lib/taurus/qt/qtgui/container/taurusgroupbox.py    |  142 +-
 lib/taurus/qt/qtgui/container/taurusgroupwidget.py |   99 +-
 lib/taurus/qt/qtgui/container/taurusmainwindow.py  |  781 ++++----
 lib/taurus/qt/qtgui/container/taurusscrollarea.py  |  108 +-
 lib/taurus/qt/qtgui/container/tauruswidget.py      |   72 +-
 lib/taurus/qt/qtgui/dialog/__init__.py             |   34 +-
 .../qt/qtgui/dialog/taurusconfigurationdialog.py   |   57 +-
 lib/taurus/qt/qtgui/dialog/taurusinputdialog.py    |  103 +-
 lib/taurus/qt/qtgui/dialog/taurusmessagebox.py     |  150 +-
 lib/taurus/qt/qtgui/display/__init__.py            |   39 +-
 lib/taurus/qt/qtgui/display/demo/__init__.py       |   34 +-
 .../qt/qtgui/display/demo/qpixmapwidgetdemo.py     |   51 +-
 .../qt/qtgui/display/demo/tauruslabeldemo.py       |   79 +-
 lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py  |   66 +-
 lib/taurus/qt/qtgui/display/demo/taurusleddemo.py  |   75 +-
 lib/taurus/qt/qtgui/display/qfallback.py           |   50 +-
 lib/taurus/qt/qtgui/display/qled.py                |  205 ++-
 lib/taurus/qt/qtgui/display/qlogo.py               |   78 +-
 lib/taurus/qt/qtgui/display/qpixmapwidget.py       |  104 +-
 lib/taurus/qt/qtgui/display/qsevensegment.py       |  310 ++--
 lib/taurus/qt/qtgui/display/taurusboolled.py       |  221 ---
 lib/taurus/qt/qtgui/display/taurusconfiglabel.py   |  231 ---
 lib/taurus/qt/qtgui/display/tauruslabel.py         |  264 +--
 lib/taurus/qt/qtgui/display/tauruslcd.py           |  189 +-
 lib/taurus/qt/qtgui/display/tauruslcdvalue.py      |  183 --
 lib/taurus/qt/qtgui/display/taurusled.py           |  226 +--
 lib/taurus/qt/qtgui/display/taurusstateled.py      |  190 --
 lib/taurus/qt/qtgui/display/taurusvaluelabel.py    |  419 -----
 lib/taurus/qt/qtgui/display/test/__init__.py       |   26 +-
 .../qt/qtgui/display/test/test_tauruslabel.py      |  152 +-
 lib/taurus/qt/qtgui/editor/__init__.py             |   38 +-
 lib/taurus/qt/qtgui/editor/tauruseditor.py         |  113 +-
 lib/taurus/qt/qtgui/extra_guiqwt/__init__.py       |   34 +-
 lib/taurus/qt/qtgui/extra_guiqwt/builder.py        |  231 +--
 lib/taurus/qt/qtgui/extra_guiqwt/curve.py          |  304 ++--
 lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py    |  274 +--
 lib/taurus/qt/qtgui/extra_guiqwt/image.py          |  465 ++---
 lib/taurus/qt/qtgui/extra_guiqwt/plot.py           |  429 +++--
 lib/taurus/qt/qtgui/extra_guiqwt/styles.py         |   52 +-
 lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py  |  260 +--
 lib/taurus/qt/qtgui/extra_guiqwt/tools.py          |  234 ++-
 .../qt/qtgui/extra_macroexecutor/__init__.py       |   29 +-
 lib/taurus/qt/qtgui/extra_nexus/__init__.py        |   36 +-
 .../qt/qtgui/extra_nexus/taurusnexuswidget.py      |  148 +-
 lib/taurus/qt/qtgui/extra_pool/__init__.py         |   29 +-
 lib/taurus/qt/qtgui/extra_sardana/__init__.py      |   29 +-
 lib/taurus/qt/qtgui/extra_xterm/__init__.py        |   30 -
 lib/taurus/qt/qtgui/extra_xterm/qxtermwidget.py    |  140 --
 lib/taurus/qt/qtgui/gauge/__init__.py              |   39 -
 lib/taurus/qt/qtgui/gauge/demo/__init__.py         |   28 -
 lib/taurus/qt/qtgui/gauge/demo/qmeterdemo.py       |  189 --
 lib/taurus/qt/qtgui/gauge/qmeter.py                |  747 --------
 lib/taurus/qt/qtgui/gauge/taurusgauge.py           |  263 ---
 lib/taurus/qt/qtgui/graphic/__init__.py            |   34 +-
 lib/taurus/qt/qtgui/graphic/jdraw/__init__.py      |   36 +-
 lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py         |  279 +--
 lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py  |  212 ++-
 lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py    |  398 ++--
 lib/taurus/qt/qtgui/graphic/jdraw/test/__init__.py |   34 +-
 .../qt/qtgui/graphic/jdraw/test/res/__init__.py    |   44 +-
 lib/taurus/qt/qtgui/graphic/taurusgraphic.py       | 1127 +++++++-----
 lib/taurus/qt/qtgui/graphic/taurusgraphicview.py   |   45 +-
 lib/taurus/qt/qtgui/help/__init__.py               |   26 +-
 lib/taurus/qt/qtgui/help/aboutdialog.py            |   42 +-
 lib/taurus/qt/qtgui/help/assistant.py              |   47 +-
 lib/taurus/qt/qtgui/help/helppanel.py              |   49 +-
 lib/taurus/qt/qtgui/icon/Tango/index.theme         |   72 +
 .../Tango/scalable/actions/add.svg}                |    0
 .../Tango/scalable}/actions/address-book-new.svg   |    0
 .../Tango/scalable}/actions/appointment-new.svg    |    0
 .../Tango/scalable/actions/appointment.svg}        |    0
 .../Tango/scalable/actions/back.svg}               |    0
 .../Tango/scalable}/actions/bookmark-new.svg       |    0
 .../Tango/scalable/actions/bookmark_add.svg}       |    0
 .../Tango/scalable/actions/bookmarks_list_add.svg} |    0
 .../Tango/scalable/actions/bottom.svg}             |    0
 .../Tango/scalable/actions/centrejust.svg}         |    0
 .../Tango/scalable}/actions/contact-new.svg        |    0
 .../Tango/scalable}/actions/document-new.svg       |    0
 .../Tango/scalable}/actions/document-open.svg      |    0
 .../scalable}/actions/document-print-preview.svg   |    0
 .../Tango/scalable}/actions/document-print.svg     |    0
 .../scalable}/actions/document-properties.svg      |    0
 .../Tango/scalable}/actions/document-save-as.svg   |    0
 .../Tango/scalable}/actions/document-save.svg      |    0
 .../Tango/scalable/actions/down.svg}               |    0
 .../Tango/scalable}/actions/edit-clear.svg         |    0
 .../Tango/scalable}/actions/edit-copy.svg          |    0
 .../Tango/scalable}/actions/edit-cut.svg           |    0
 .../icon/Tango/scalable/actions/edit-delete.svg    |  896 +++++++++
 .../Tango/scalable}/actions/edit-find-replace.svg  |    0
 .../Tango/scalable}/actions/edit-find.svg          |    0
 .../Tango/scalable}/actions/edit-paste.svg         |    0
 .../Tango/scalable}/actions/edit-redo.svg          |    0
 .../Tango/scalable}/actions/edit-select-all.svg    |    0
 .../Tango/scalable}/actions/edit-undo.svg          |    0
 .../Tango/scalable/actions/editclear.svg}          |    0
 .../Tango/scalable/actions/editcopy.svg}           |    0
 .../Tango/scalable/actions/editcut.svg}            |    0
 .../icon/Tango/scalable/actions/editdelete.svg     |  896 +++++++++
 .../Tango/scalable/actions/editpaste.svg}          |    0
 .../Tango/scalable/actions/exit.svg}               |    0
 .../Tango/scalable/actions/filefind.svg}           |    0
 .../Tango/scalable/actions/filenew.svg}            |    0
 .../Tango/scalable/actions/fileopen.svg}           |    0
 .../Tango/scalable/actions/fileprint.svg}          |    0
 .../Tango/scalable/actions/filequickprint.svg}     |    0
 .../Tango/scalable/actions/filesave.svg}           |    0
 .../Tango/scalable/actions/filesaveas.svg}         |    0
 .../Tango/scalable/actions/find.svg}               |    0
 .../Tango/scalable/actions/finish.svg}             |    0
 .../Tango/scalable}/actions/folder-new.svg         |    0
 .../Tango/scalable/actions/folder_new.svg}         |    0
 .../Tango/scalable}/actions/format-indent-less.svg |    0
 .../Tango/scalable}/actions/format-indent-more.svg |    0
 .../scalable}/actions/format-justify-center.svg    |    0
 .../scalable}/actions/format-justify-fill.svg      |    0
 .../scalable}/actions/format-justify-left.svg      |    0
 .../scalable}/actions/format-justify-right.svg     |    0
 .../Tango/scalable}/actions/format-text-bold.svg   |    0
 .../Tango/scalable}/actions/format-text-italic.svg |    0
 .../actions/format-text-strikethrough.svg          |    0
 .../scalable}/actions/format-text-underline.svg    |    0
 .../Tango/scalable/actions/forward.svg}            |    0
 .../Tango/scalable/actions/gnome-lockscreen.svg}   |    0
 .../Tango/scalable/actions/gnome-logout.svg}       |    0
 .../Tango/scalable/actions/gnome-searchtool.svg}   |    0
 .../scalable/actions/gnome-session-logout.svg}     |    0
 .../Tango/scalable/actions/gnome-shutdown.svg}     |    0
 .../scalable/actions/gnome-stock-mail-fwd.svg}     |    0
 .../scalable/actions/gnome-stock-mail-new.svg}     |    0
 .../scalable/actions/gnome-stock-mail-rpl.svg}     |    0
 .../scalable/actions/gnome-stock-text-indent.svg}  |    0
 .../actions/gnome-stock-text-unindent.svg}         |    0
 .../Tango/scalable}/actions/go-bottom.svg          |    0
 .../Tango/scalable}/actions/go-down.svg            |    0
 .../Tango/scalable}/actions/go-first.svg           |    0
 .../Tango/scalable}/actions/go-home.svg            |    0
 .../Tango/scalable}/actions/go-jump.svg            |    0
 .../Tango/scalable}/actions/go-last.svg            |    0
 .../Tango/scalable}/actions/go-next.svg            |    0
 .../Tango/scalable}/actions/go-previous.svg        |    0
 .../Tango/scalable}/actions/go-top.svg             |    0
 .../Tango/scalable}/actions/go-up.svg              |    0
 .../Tango/scalable/actions/gohome.svg}             |    0
 .../Tango/scalable/actions/gtk-add.svg}            |    0
 .../Tango/scalable/actions/gtk-bold.svg}           |    0
 .../Tango/scalable/actions/gtk-cancel.svg}         |    0
 .../Tango/scalable/actions/gtk-clear.svg}          |    0
 .../Tango/scalable/actions/gtk-copy.svg}           |    0
 .../Tango/scalable/actions/gtk-cut.svg}            |    0
 .../icon/Tango/scalable/actions/gtk-delete.svg     |  896 +++++++++
 .../scalable/actions/gtk-find-and-replace.svg}     |    0
 .../Tango/scalable/actions/gtk-find.svg}           |    0
 .../Tango/scalable/actions/gtk-fullscreen.svg}     |    0
 .../Tango/scalable/actions/gtk-go-back-ltr.svg}    |    0
 .../Tango/scalable/actions/gtk-go-back-rtl.svg}    |    0
 .../Tango/scalable/actions/gtk-go-down.svg}        |    0
 .../Tango/scalable/actions/gtk-go-forward-ltr.svg} |    0
 .../Tango/scalable/actions/gtk-go-forward-rtl.svg} |    0
 .../Tango/scalable/actions/gtk-go-up.svg}          |    0
 .../Tango/scalable/actions/gtk-goto-bottom.svg}    |    0
 .../Tango/scalable/actions/gtk-goto-first-ltr.svg} |    0
 .../Tango/scalable/actions/gtk-goto-first-rtl.svg} |    0
 .../Tango/scalable/actions/gtk-goto-last-ltr.svg}  |    0
 .../Tango/scalable/actions/gtk-goto-last-rtl.svg}  |    0
 .../Tango/scalable/actions/gtk-goto-top.svg}       |    0
 .../Tango/scalable/actions/gtk-home.svg}           |    0
 .../Tango/scalable/actions/gtk-indent-ltr.svg}     |    0
 .../Tango/scalable/actions/gtk-indent-rtl.svg}     |    0
 .../Tango/scalable/actions/gtk-italic.svg}         |    0
 .../Tango/scalable/actions/gtk-jump-to-ltr.svg}    |    0
 .../Tango/scalable/actions/gtk-jump-to-rtl.svg}    |    0
 .../Tango/scalable/actions/gtk-justify-center.svg} |    0
 .../Tango/scalable/actions/gtk-justify-fill.svg}   |    0
 .../Tango/scalable/actions/gtk-justify-left.svg}   |    0
 .../Tango/scalable/actions/gtk-justify-right.svg}  |    0
 .../scalable/actions/gtk-media-forward-ltr.svg}    |    0
 .../scalable/actions/gtk-media-forward-rtl.svg}    |    0
 .../Tango/scalable/actions/gtk-media-next-ltr.svg} |    0
 .../Tango/scalable/actions/gtk-media-next-rtl.svg} |    0
 .../Tango/scalable/actions/gtk-media-pause.svg}    |    0
 .../Tango/scalable/actions/gtk-media-play-ltr.svg} |    0
 .../scalable/actions/gtk-media-previous-ltr.svg}   |    0
 .../scalable/actions/gtk-media-previous-rtl.svg}   |    0
 .../Tango/scalable/actions/gtk-media-record.svg}   |    0
 .../scalable/actions/gtk-media-rewind-ltr.svg}     |    0
 .../scalable/actions/gtk-media-rewind-rtl.svg}     |    0
 .../Tango/scalable/actions/gtk-media-stop.svg}     |    0
 .../Tango/scalable/actions/gtk-new.svg}            |    0
 .../Tango/scalable/actions/gtk-open.svg}           |    0
 .../Tango/scalable/actions/gtk-paste.svg}          |    0
 .../Tango/scalable/actions/gtk-print-preview.svg}  |    0
 .../Tango/scalable/actions/gtk-print.svg}          |    0
 .../Tango/scalable/actions/gtk-properties.svg}     |    0
 .../Tango/scalable/actions/gtk-redo-ltr.svg}       |    0
 .../Tango/scalable/actions/gtk-refresh.svg}        |    0
 .../Tango/scalable/actions/gtk-remove.svg}         |    0
 .../Tango/scalable/actions/gtk-save-as.svg}        |    0
 .../Tango/scalable/actions/gtk-save.svg}           |    0
 .../Tango/scalable/actions/gtk-select-all.svg}     |    0
 .../Tango/scalable/actions/gtk-stop.svg}           |    0
 .../Tango/scalable/actions/gtk-strikethrough.svg}  |    0
 .../Tango/scalable/actions/gtk-underline.svg}      |    0
 .../Tango/scalable/actions/gtk-undo-ltr.svg}       |    0
 .../Tango/scalable/actions/gtk-unindent-ltr.svg}   |    0
 .../Tango/scalable/actions/gtk-unindent-rtl.svg}   |    0
 .../Tango/scalable/actions/kfind.svg}              |    0
 .../Tango/scalable/actions/kfm_home.svg}           |    0
 .../Tango/scalable/actions/leftjust.svg}           |    0
 .../Tango/scalable}/actions/list-add.svg           |    0
 .../Tango/scalable}/actions/list-remove.svg        |    0
 .../Tango/scalable/actions/lock.svg}               |    0
 .../Tango/scalable}/actions/mail-forward.svg       |    0
 .../Tango/scalable}/actions/mail-mark-junk.svg     |    0
 .../Tango/scalable}/actions/mail-message-new.svg   |    0
 .../Tango/scalable}/actions/mail-reply-all.svg     |    0
 .../Tango/scalable}/actions/mail-reply-sender.svg  |    0
 .../Tango/scalable}/actions/mail-send-receive.svg  |    0
 .../Tango/scalable/actions/mail_forward.svg}       |    0
 .../Tango/scalable/actions/mail_new.svg}           |    0
 .../Tango/scalable/actions/mail_reply.svg}         |    0
 .../Tango/scalable/actions/mail_replyall.svg}      |    0
 .../Tango/scalable/actions/mail_spam.svg}          |    0
 .../Tango/scalable}/actions/media-eject.svg        |    0
 .../scalable}/actions/media-playback-pause.svg     |    0
 .../scalable}/actions/media-playback-start.svg     |    0
 .../scalable}/actions/media-playback-stop.svg      |    0
 .../Tango/scalable}/actions/media-record.svg       |    0
 .../scalable}/actions/media-seek-backward.svg      |    0
 .../Tango/scalable}/actions/media-seek-forward.svg |    0
 .../scalable}/actions/media-skip-backward.svg      |    0
 .../Tango/scalable}/actions/media-skip-forward.svg |    0
 .../Tango/scalable/actions/next.svg}               |    0
 .../Tango/scalable/actions/player_eject.svg}       |    0
 .../Tango/scalable/actions/player_end.svg}         |    0
 .../Tango/scalable/actions/player_fwd.svg}         |    0
 .../Tango/scalable/actions/player_pause.svg}       |    0
 .../Tango/scalable/actions/player_play.svg}        |    0
 .../Tango/scalable/actions/player_record.svg}      |    0
 .../Tango/scalable/actions/player_rew.svg}         |    0
 .../Tango/scalable/actions/player_start.svg}       |    0
 .../Tango/scalable/actions/player_stop.svg}        |    0
 .../Tango/scalable/actions/previous.svg}           |    0
 .../Tango/scalable}/actions/process-stop.svg       |    0
 .../Tango/scalable/actions/redhat-home.svg}        |    0
 .../Tango/scalable/actions/redo.svg}               |    0
 .../Tango/scalable/actions/reload.svg}             |    0
 .../Tango/scalable/actions/reload3.svg}            |    0
 .../Tango/scalable/actions/reload_all_tabs.svg}    |    0
 .../Tango/scalable/actions/reload_page.svg}        |    0
 .../Tango/scalable/actions/remove.svg}             |    0
 .../Tango/scalable/actions/rightjust.svg}          |    0
 .../Tango/scalable/actions/search.svg}             |    0
 .../Tango/scalable/actions/start.svg}              |    0
 .../Tango/scalable/actions/stock_add-bookmark.svg} |    0
 .../Tango/scalable/actions/stock_bottom.svg}       |    0
 .../Tango/scalable/actions/stock_copy.svg}         |    0
 .../Tango/scalable/actions/stock_cut.svg}          |    0
 .../icon/Tango/scalable/actions/stock_delete.svg   |  896 +++++++++
 .../Tango/scalable/actions/stock_down.svg}         |    0
 .../scalable/actions/stock_file-properites.svg}    |    0
 .../Tango/scalable/actions/stock_first.svg}        |    0
 .../Tango/scalable/actions/stock_fullscreen.svg}   |    0
 .../scalable/actions/stock_help-add-bookmark.svg}  |    0
 .../Tango/scalable/actions/stock_home.svg}         |    0
 .../Tango/scalable/actions/stock_last.svg}         |    0
 .../Tango/scalable/actions/stock_left.svg}         |    0
 .../Tango/scalable/actions/stock_mail-compose.svg} |    0
 .../Tango/scalable/actions/stock_mail-forward.svg} |    0
 .../scalable/actions/stock_mail-reply-to-all.svg}  |    0
 .../Tango/scalable/actions/stock_mail-reply.svg}   |    0
 .../scalable/actions/stock_mail-send-receive.svg}  |    0
 .../Tango/scalable/actions/stock_media-fwd.svg}    |    0
 .../Tango/scalable/actions/stock_media-next.svg}   |    0
 .../Tango/scalable/actions/stock_media-pause.svg}  |    0
 .../Tango/scalable/actions/stock_media-play.svg}   |    0
 .../Tango/scalable/actions/stock_media-prev.svg}   |    0
 .../Tango/scalable/actions/stock_media-rec.svg}    |    0
 .../Tango/scalable/actions/stock_media-rew.svg}    |    0
 .../Tango/scalable/actions/stock_media-stop.svg}   |    0
 .../scalable/actions/stock_new-address-book.svg}   |    0
 .../scalable/actions/stock_new-appointment.svg}    |    0
 .../Tango/scalable/actions/stock_new-bcard.svg}    |    0
 .../Tango/scalable/actions/stock_new-dir.svg}      |    0
 .../Tango/scalable/actions/stock_new-tab.svg}      |    0
 .../Tango/scalable/actions/stock_new-text.svg}     |    0
 .../Tango/scalable/actions/stock_new-window.svg}   |    0
 .../Tango/scalable/actions/stock_paste.svg}        |    0
 .../scalable/actions/stock_print-preview.svg}      |    0
 .../Tango/scalable/actions/stock_print.svg}        |    0
 .../Tango/scalable/actions/stock_properties.svg}   |    0
 .../Tango/scalable/actions/stock_redo.svg}         |    0
 .../Tango/scalable/actions/stock_refresh.svg}      |    0
 .../Tango/scalable/actions/stock_right.svg}        |    0
 .../Tango/scalable/actions/stock_save-as.svg}      |    0
 .../Tango/scalable/actions/stock_save.svg}         |    0
 .../scalable/actions/stock_search-and-replace.svg} |    0
 .../Tango/scalable/actions/stock_search.svg}       |    0
 .../Tango/scalable/actions/stock_select-all.svg}   |    0
 .../Tango/scalable/actions/stock_spam.svg}         |    0
 .../Tango/scalable/actions/stock_stop.svg}         |    0
 .../scalable/actions/stock_text-strikethrough.svg} |    0
 .../Tango/scalable/actions/stock_text_bold.svg}    |    0
 .../Tango/scalable/actions/stock_text_center.svg}  |    0
 .../Tango/scalable/actions/stock_text_indent.svg}  |    0
 .../Tango/scalable/actions/stock_text_italic.svg}  |    0
 .../Tango/scalable/actions/stock_text_justify.svg} |    0
 .../Tango/scalable/actions/stock_text_left.svg}    |    0
 .../Tango/scalable/actions/stock_text_right.svg}   |    0
 .../scalable/actions/stock_text_underlined.svg}    |    0
 .../scalable/actions/stock_text_unindent.svg}      |    0
 .../Tango/scalable/actions/stock_top.svg}          |    0
 .../Tango/scalable/actions/stock_undo.svg}         |    0
 .../Tango/scalable/actions/stock_up.svg}           |    0
 .../Tango/scalable/actions/stop.svg}               |    0
 .../Tango/scalable}/actions/system-lock-screen.svg |    0
 .../Tango/scalable}/actions/system-log-out.svg     |    0
 .../Tango/scalable}/actions/system-search.svg      |    0
 .../Tango/scalable}/actions/system-shutdown.svg    |    0
 .../Tango/scalable}/actions/tab-new.svg            |    0
 .../Tango/scalable/actions/tab_new.svg}            |    0
 .../Tango/scalable/actions/text_bold.svg}          |    0
 .../Tango/scalable/actions/text_italic.svg}        |    0
 .../Tango/scalable/actions/text_strike.svg}        |    0
 .../Tango/scalable/actions/text_under.svg}         |    0
 .../Tango/scalable/actions/top.svg}                |    0
 .../Tango/scalable/actions/undo.svg}               |    0
 .../Tango/scalable/actions/up.svg}                 |    0
 .../Tango/scalable}/actions/view-fullscreen.svg    |    0
 .../Tango/scalable}/actions/view-refresh.svg       |    0
 .../Tango/scalable}/actions/window-new.svg         |    0
 .../Tango/scalable/actions/window_fullscreen.svg}  |    0
 .../Tango/scalable/actions/window_new.svg}         |    0
 .../Tango/scalable/actions/xfce-system-lock.svg}   |    0
 .../Tango/scalable/apps/access.svg}                |    0
 .../scalable/apps/accessibility-directory.svg}     |    0
 .../scalable}/apps/accessories-calculator.svg      |    0
 .../scalable}/apps/accessories-character-map.svg   |    0
 .../scalable}/apps/accessories-text-editor.svg     |    0
 .../Tango/scalable/apps/background.svg}            |    0
 .../Tango/scalable/apps/browser.svg}               |    0
 .../Tango/scalable/apps/calc.svg}                  |    0
 .../Tango/scalable/apps/config-language.svg}       |    0
 .../Tango/scalable/apps/config-users.svg}          |    0
 .../Tango/scalable/apps/date.svg}                  |    0
 .../Tango/scalable/apps/email.svg}                 |    0
 .../Tango/scalable/apps/file-manager.svg}          |    0
 .../Tango/scalable/apps/fonts.svg}                 |    0
 .../Tango/scalable/apps/gnome-calculator.svg}      |    0
 .../Tango/scalable/apps/gnome-character-map.svg}   |    0
 .../Tango/scalable/apps/gnome-help.svg}            |    0
 .../Tango/scalable/apps/gnome-monitor.svg}         |    0
 .../Tango/scalable/apps/gnome-remote-desktop.svg}  |    0
 .../Tango/scalable/apps/gnome-session.svg}         |    0
 .../gnome-settings-accessibility-technologies.svg} |    0
 .../scalable/apps/gnome-settings-background.svg}   |    0
 .../Tango/scalable/apps/gnome-settings-font.svg}   |    0
 .../scalable/apps/gnome-settings-keybindings.svg}  |    0
 .../Tango/scalable/apps/gnome-settings-theme.svg}  |    0
 .../Tango/scalable/apps/gnome-terminal.svg}        |    0
 .../Tango/scalable/apps/gnome-window-manager.svg}  |    0
 .../Tango/scalable/apps/gucharmap.svg}             |    0
 .../Tango/scalable}/apps/help-browser.svg          |    0
 .../Tango/scalable}/apps/internet-group-chat.svg   |    0
 .../Tango/scalable}/apps/internet-mail.svg         |    0
 .../Tango/scalable}/apps/internet-news-reader.svg  |    0
 .../Tango/scalable}/apps/internet-web-browser.svg  |    0
 .../Tango/scalable/apps/kcalc.svg}                 |    0
 .../Tango/scalable/apps/kcharselect.svg}           |    0
 .../Tango/scalable/apps/kcmkwm.svg}                |    0
 .../Tango/scalable/apps/kedit.svg}                 |    0
 .../Tango/scalable/apps/key_bindings.svg}          |    0
 .../Tango/scalable/apps/kfm.svg}                   |    0
 .../Tango/scalable/apps/khelpcenter.svg}           |    0
 .../Tango/scalable/apps/konsole.svg}               |    0
 .../Tango/scalable/apps/krfb.svg}                  |    0
 .../Tango/scalable/apps/kscreensaver.svg}          |    0
 .../Tango/scalable/apps/ksysguard.svg}             |    0
 .../Tango/scalable/apps/kuser.svg}                 |    0
 .../Tango/scalable/apps/kwin.svg}                  |    0
 .../Tango/scalable/apps/locale.svg}                |    0
 .../Tango/scalable/apps/mail_generic.svg}          |    0
 .../Tango/scalable}/apps/office-calendar.svg       |    0
 .../Tango/scalable/apps/openterm.svg}              |    0
 .../apps/preferences-desktop-accessibility.svg     |    0
 .../preferences-desktop-assistive-technology.svg   |    0
 .../scalable}/apps/preferences-desktop-font.svg    |    0
 .../preferences-desktop-keyboard-shortcuts.svg     |    0
 .../scalable}/apps/preferences-desktop-locale.svg  |    0
 .../apps/preferences-desktop-multimedia.svg        |    0
 .../apps/preferences-desktop-remote-desktop.svg    |    0
 .../apps/preferences-desktop-screensaver.svg       |    0
 .../scalable}/apps/preferences-desktop-theme.svg   |    0
 .../apps/preferences-desktop-wallpaper.svg         |    0
 .../apps/preferences-system-network-proxy.svg      |    0
 .../scalable}/apps/preferences-system-session.svg  |    0
 .../scalable}/apps/preferences-system-windows.svg  |    0
 .../Tango/scalable/apps/proxy-config.svg}          |    0
 .../Tango/scalable/apps/proxy.svg}                 |    0
 .../Tango/scalable/apps/redhat-email.svg}          |    0
 .../Tango/scalable/apps/redhat-filemanager.svg}    |    0
 .../Tango/scalable/apps/redhat-web-browser.svg}    |    0
 .../Tango/scalable/apps/screensaver.svg}           |    0
 .../Tango/scalable/apps/stock_proxy.svg}           |    0
 .../Tango/scalable/apps/style.svg}                 |    0
 .../Tango/scalable/apps/susehelpcenter.svg}        |    0
 .../Tango/scalable/apps/system-config-users.svg}   |    0
 .../Tango/scalable}/apps/system-file-manager.svg   |    0
 .../Tango/scalable}/apps/system-installer.svg      |    0
 .../scalable}/apps/system-software-update.svg      |    0
 .../Tango/scalable}/apps/system-users.svg          |    0
 .../Tango/scalable/apps/terminal.svg}              |    0
 .../Tango/scalable/apps/text-editor.svg}           |    0
 .../Tango/scalable/apps/update-manager.svg}        |    0
 .../scalable}/apps/utilities-system-monitor.svg    |    0
 .../Tango/scalable}/apps/utilities-terminal.svg    |    0
 .../Tango/scalable/apps/wallpaper.svg}             |    0
 .../Tango/scalable/apps/web-browser.svg}           |    0
 .../Tango/scalable/apps/xfcalendar.svg}            |    0
 .../Tango/scalable/apps/xfce-edit.svg}             |    0
 .../Tango/scalable/apps/xfce-filemanager.svg}      |    0
 .../Tango/scalable/apps/xfce-mail.svg}             |    0
 .../Tango/scalable/apps/xfce-man.svg}              |    0
 .../Tango/scalable/apps/xfce-terminal.svg}         |    0
 .../Tango/scalable/apps/xfce4-backdrop.svg}        |    0
 .../Tango/scalable/apps/xfce4-session.svg}         |    0
 .../Tango/scalable/apps/xfce4-ui.svg}              |    0
 .../Tango/scalable/apps/xfwm4.svg}                 |    0
 .../scalable/apps/ximian-evolution-calendar.svg}   |    0
 .../Tango/scalable/apps/xscreensaver.svg}          |    0
 .../Tango/scalable/apps/zen-icon.svg}              |    0
 .../categories/applications-accessories.svg        |    0
 .../categories/applications-development.svg        |    0
 .../scalable}/categories/applications-games.svg    |    0
 .../scalable}/categories/applications-graphics.svg |    0
 .../scalable}/categories/applications-internet.svg |    0
 .../categories/applications-multimedia.svg         |    0
 .../scalable}/categories/applications-office.svg   |    0
 .../scalable}/categories/applications-other.svg    |    0
 .../scalable}/categories/applications-system.svg   |    0
 .../scalable/categories/gnome-applications.svg}    |    0
 .../scalable/categories/gnome-control-center.svg}  |    0
 .../Tango/scalable/categories/gnome-devel.svg}     |    0
 .../Tango/scalable/categories/gnome-globe.svg}     |    0
 .../Tango/scalable/categories/gnome-graphics.svg}  |    0
 .../Tango/scalable/categories/gnome-joystick.svg}  |    0
 .../scalable/categories/gnome-multimedia.svg}      |    0
 .../Tango/scalable/categories/gnome-other.svg}     |    0
 .../Tango/scalable/categories/gnome-settings.svg}  |    0
 .../Tango/scalable/categories/gnome-system.svg}    |    0
 .../Tango/scalable/categories/gnome-util.svg}      |    0
 .../Tango/scalable/categories/gtk-preferences.svg} |    0
 .../categories/input_devices_settings.svg}         |    0
 .../Tango/scalable/categories/kcontrol.svg}        |    0
 .../scalable/categories/package_development.svg}   |    0
 .../Tango/scalable/categories/package_games.svg}   |    0
 .../scalable/categories/package_graphics.svg}      |    0
 .../scalable/categories/package_multimedia.svg}    |    0
 .../Tango/scalable/categories/package_network.svg} |    0
 .../Tango/scalable/categories/package_office.svg}  |    0
 .../scalable/categories/package_settings.svg}      |    0
 .../Tango/scalable/categories/package_system.svg}  |    0
 .../scalable/categories/package_utilities.svg}     |    0
 .../categories/preferences-desktop-peripherals.svg |    0
 .../scalable}/categories/preferences-desktop.svg   |    0
 .../scalable}/categories/preferences-system.svg    |    0
 .../scalable/categories/redhat-accessories.svg}    |    0
 .../Tango/scalable/categories/redhat-games.svg}    |    0
 .../Tango/scalable/categories/redhat-graphics.svg} |    0
 .../Tango/scalable/categories/redhat-internet.svg} |    0
 .../Tango/scalable/categories/redhat-office.svg}   |    0
 .../scalable/categories/redhat-preferences.svg}    |    0
 .../scalable/categories/redhat-programming.svg}    |    0
 .../scalable/categories/redhat-sound_video.svg}    |    0
 .../categories/redhat-system_settings.svg}         |    0
 .../scalable/categories/redhat-system_tools.svg}   |    0
 .../Tango/scalable/categories/stock_internet.svg}  |    0
 .../Tango/scalable/categories/xfce-devel.svg}      |    0
 .../Tango/scalable/categories/xfce-games.svg}      |    0
 .../Tango/scalable/categories/xfce-graphics.svg}   |    0
 .../Tango/scalable/categories/xfce-internet.svg}   |    0
 .../Tango/scalable/categories/xfce-multimedia.svg} |    0
 .../Tango/scalable/categories/xfce-office.svg}     |    0
 .../scalable/categories/xfce-system-settings.svg}  |    0
 .../Tango/scalable/categories/xfce-system.svg}     |    0
 .../Tango/scalable/categories/xfce-utils.svg}      |    0
 .../Tango/scalable/categories/xfce4-settings.svg}  |    0
 .../Tango/scalable/devices/3floppy_unmount.svg}    |    0
 .../Tango/scalable}/devices/audio-card.svg         |    0
 .../scalable}/devices/audio-input-microphone.svg   |    0
 .../Tango/scalable}/devices/battery.svg            |    0
 .../Tango/scalable}/devices/camera-photo.svg       |    0
 .../Tango/scalable}/devices/camera-video.svg       |    0
 .../Tango/scalable/devices/camera.svg}             |    0
 .../Tango/scalable/devices/camera_unmount.svg}     |    0
 .../Tango/scalable/devices/cdrom_unmount.svg}      |    0
 .../Tango/scalable/devices/cdwriter_unmount.svg}   |    0
 .../Tango/scalable/devices/chardevice.svg}         |    0
 .../Tango/scalable}/devices/computer.svg           |    0
 .../Tango/scalable/devices/display.svg}            |    0
 .../Tango/scalable/devices/drive-cdrom.svg}        |    0
 .../Tango/scalable}/devices/drive-harddisk.svg     |    0
 .../Tango/scalable}/devices/drive-optical.svg      |    0
 .../scalable}/devices/drive-removable-media.svg    |    0
 .../Tango/scalable/devices/dvd_unmount.svg}        |    0
 .../Tango/scalable/devices/gnome-dev-battery.svg}  |    0
 .../scalable/devices/gnome-dev-cdrom-audio.svg}    |    0
 .../Tango/scalable/devices/gnome-dev-cdrom.svg}    |    0
 .../Tango/scalable/devices/gnome-dev-computer.svg} |    0
 .../Tango/scalable/devices/gnome-dev-disc-cdr.svg} |    0
 .../scalable/devices/gnome-dev-disc-cdrw.svg}      |    0
 .../scalable/devices/gnome-dev-disc-dvdr-plus.svg} |    0
 .../scalable/devices/gnome-dev-disc-dvdr.svg}      |    0
 .../scalable/devices/gnome-dev-disc-dvdram.svg}    |    0
 .../scalable/devices/gnome-dev-disc-dvdrom.svg}    |    0
 .../scalable/devices/gnome-dev-disc-dvdrw.svg}     |    0
 .../Tango/scalable/devices/gnome-dev-dvd.svg}      |    0
 .../Tango/scalable/devices/gnome-dev-ethernet.svg} |    0
 .../Tango/scalable/devices/gnome-dev-floppy.svg}   |    0
 .../scalable/devices/gnome-dev-harddisk-1394.svg}  |    0
 .../scalable/devices/gnome-dev-harddisk-usb.svg}   |    0
 .../Tango/scalable/devices/gnome-dev-harddisk.svg} |    0
 .../Tango/scalable/devices/gnome-dev-ipod.svg}     |    0
 .../Tango/scalable/devices/gnome-dev-keyboard.svg} |    0
 .../Tango/scalable/devices/gnome-dev-media-cf.svg} |    0
 .../Tango/scalable/devices/gnome-dev-media-ms.svg} |    0
 .../scalable/devices/gnome-dev-media-sdmmc.svg}    |    0
 .../Tango/scalable/devices/gnome-dev-media-sm.svg} |    0
 .../scalable/devices/gnome-dev-mouse-ball.svg}     |    0
 .../scalable/devices/gnome-dev-mouse-optical.svg}  |    0
 .../Tango/scalable/devices/gnome-dev-printer.svg}  |    0
 .../scalable/devices/gnome-dev-removable-1394.svg} |    0
 .../scalable/devices/gnome-dev-removable-usb.svg}  |    0
 .../scalable/devices/gnome-dev-removable.svg}      |    0
 .../Tango/scalable/devices/gnome-dev-wavelan.svg}  |    0
 .../Tango/scalable/devices/gnome-fs-client.svg}    |    0
 .../Tango/scalable/devices/gnome-stock-mic.svg}    |    0
 .../Tango/scalable/devices/gtk-cdrom.svg}          |    0
 .../Tango/scalable/devices/gtk-floppy.svg}         |    0
 .../Tango/scalable/devices/gtk-harddisk.svg}       |    0
 .../Tango/scalable/devices/harddrive.svg}          |    0
 .../Tango/scalable/devices/hdd_unmount.svg}        |    0
 .../Tango/scalable}/devices/input-gaming.svg       |    0
 .../Tango/scalable}/devices/input-keyboard.svg     |    0
 .../Tango/scalable}/devices/input-mouse.svg        |    0
 .../Tango/scalable/devices/ipod_mount.svg}         |    0
 .../Tango/scalable/devices/joystick.svg}           |    0
 .../Tango/scalable/devices/keyboard.svg}           |    0
 .../Tango/scalable/devices/kjobviewer.svg}         |    0
 .../Tango/scalable/devices/kxkb.svg}               |    0
 .../Tango/scalable/devices/media-cdrom.svg}        |    0
 .../Tango/scalable}/devices/media-flash.svg        |    0
 .../Tango/scalable}/devices/media-floppy.svg       |    0
 .../Tango/scalable}/devices/media-optical.svg      |    0
 .../Tango/scalable/devices/mouse.svg}              |    0
 .../Tango/scalable}/devices/multimedia-player.svg  |    0
 .../Tango/scalable}/devices/network-wired.svg      |    0
 .../Tango/scalable}/devices/network-wireless.svg   |    0
 .../Tango/scalable/devices/nm-adhoc.svg}           |    0
 .../Tango/scalable/devices/nm-device-wired.svg}    |    0
 .../Tango/scalable/devices/nm-device-wireless.svg} |    0
 .../Tango/scalable/devices/printer-remote.svg}     |    0
 .../Tango/scalable}/devices/printer.svg            |    0
 .../Tango/scalable/devices/printer1.svg}           |    0
 .../Tango/scalable/devices/printmgr.svg}           |    0
 .../Tango/scalable/devices/stock_mic.svg}          |    0
 .../Tango/scalable/devices/stock_printers.svg}     |    0
 .../Tango/scalable/devices/system-floppy.svg}      |    0
 .../Tango/scalable/devices/system.svg}             |    0
 .../scalable/devices/usbpendrive_unmount.svg}      |    0
 .../Tango/scalable}/devices/video-display.svg      |    0
 .../Tango/scalable/devices/xfce-printer.svg}       |    0
 .../Tango/scalable/devices/xfce4-display.svg}      |    0
 .../Tango/scalable/devices/xfce4-keyboard.svg}     |    0
 .../Tango/scalable/devices/xfce4-mouse.svg}        |    0
 .../Tango/scalable/devices/yast_HD.svg}            |    0
 .../Tango/scalable/devices/yast_idetude.svg}       |    0
 .../Tango/scalable/devices/yast_joystick.svg}      |    0
 .../Tango/scalable/devices/yast_mouse.svg}         |    0
 .../Tango/scalable/devices/yast_printer.svg}       |    0
 .../Tango/scalable/devices/yast_soundcard.svg}     |    0
 .../Tango/scalable}/emblems/emblem-favorite.svg    |    0
 .../Tango/scalable}/emblems/emblem-important.svg   |    0
 .../Tango/scalable/emblems/emblem-noread.svg}      |    0
 .../Tango/scalable/emblems/emblem-nowrite.svg}     |    0
 .../Tango/scalable}/emblems/emblem-photos.svg      |    0
 .../Tango/scalable}/emblems/emblem-readonly.svg    |    0
 .../scalable}/emblems/emblem-symbolic-link.svg     |    0
 .../Tango/scalable}/emblems/emblem-system.svg      |    0
 .../Tango/scalable}/emblems/emblem-unreadable.svg  |    0
 .../Tango/scalable}/emotes/face-angel.svg          |    0
 .../Tango/scalable}/emotes/face-crying.svg         |    0
 .../Tango/scalable}/emotes/face-devilish.svg       |    0
 .../Tango/scalable}/emotes/face-glasses.svg        |    0
 .../Tango/scalable}/emotes/face-grin.svg           |    0
 .../Tango/scalable}/emotes/face-kiss.svg           |    0
 .../Tango/scalable}/emotes/face-monkey.svg         |    0
 .../Tango/scalable}/emotes/face-plain.svg          |    0
 .../Tango/scalable}/emotes/face-sad.svg            |    0
 .../Tango/scalable}/emotes/face-smile-big.svg      |    0
 .../Tango/scalable}/emotes/face-smile.svg          |    0
 .../Tango/scalable}/emotes/face-surprise.svg       |    0
 .../Tango/scalable}/emotes/face-wink.svg           |    0
 .../Tango/scalable/emotes/stock_smiley-1.svg}      |    0
 .../Tango/scalable/emotes/stock_smiley-11.svg}     |    0
 .../Tango/scalable/emotes/stock_smiley-13.svg}     |    0
 .../Tango/scalable/emotes/stock_smiley-18.svg}     |    0
 .../Tango/scalable/emotes/stock_smiley-2.svg}      |    0
 .../Tango/scalable/emotes/stock_smiley-22.svg}     |    0
 .../Tango/scalable/emotes/stock_smiley-3.svg}      |    0
 .../Tango/scalable/emotes/stock_smiley-4.svg}      |    0
 .../Tango/scalable/emotes/stock_smiley-5.svg}      |    0
 .../Tango/scalable/emotes/stock_smiley-6.svg}      |    0
 .../Tango/scalable/emotes/stock_smiley-7.svg}      |    0
 .../Tango/scalable/emotes/stock_smiley-8.svg}      |    0
 .../mimetypes/application-certificate.svg          |    0
 ...ication-vnd.ms-excel.sheet.macroEnabled.12.svg} |    0
 ...ms-powerpoint.presentation.macroEnabled.12.svg} |    0
 ...ation-vnd.ms-word.document.macroEnabled.12.svg} |    0
 ...officedocument.presentationml.presentation.svg} |    0
 ...ats-officedocument.presentationml.template.svg} |    0
 ...formats-officedocument.spreadsheetml.sheet.svg} |    0
 ...mats-officedocument.spreadsheetml.template.svg} |    0
 ...s-officedocument.wordprocessingml.document.svg} |    0
 ...s-officedocument.wordprocessingml.template.svg} |    0
 .../mimetypes/application-x-executable.svg         |    0
 .../Tango/scalable/mimetypes/ascii.svg}            |    0
 .../Tango/scalable}/mimetypes/audio-x-generic.svg  |    0
 .../Tango/scalable/mimetypes/binary.svg}           |    0
 .../Tango/scalable/mimetypes/contents2.svg}        |    0
 .../Tango/scalable/mimetypes/deb.svg}              |    0
 .../Tango/scalable/mimetypes/document.svg}         |    0
 .../Tango/scalable/mimetypes/empty.svg}            |    0
 .../Tango/scalable/mimetypes/exec.svg}             |    0
 .../Tango/scalable/mimetypes/folder_tar.svg}       |    0
 .../Tango/scalable}/mimetypes/font-x-generic.svg   |    0
 .../Tango/scalable/mimetypes/font.svg}             |    0
 .../Tango/scalable/mimetypes/font_bitmap.svg}      |    0
 .../Tango/scalable/mimetypes/font_truetype.svg}    |    0
 .../Tango/scalable/mimetypes/font_type1.svg}       |    0
 .../scalable/mimetypes/gnome-fs-executable.svg}    |    0
 .../gnome-mime-application-magicpoint.svg}         |    0
 .../mimetypes/gnome-mime-application-msword.svg}   |    0
 .../mimetypes/gnome-mime-application-ogg.svg}      |    0
 .../mimetypes/gnome-mime-application-pdf.svg}      |    0
 .../gnome-mime-application-postscript.svg}         |    0
 .../mimetypes/gnome-mime-application-rtf.svg}      |    0
 .../gnome-mime-application-vnd.lotus-1-2-3.svg}    |    0
 .../gnome-mime-application-vnd.ms-excel.svg}       |    0
 .../gnome-mime-application-vnd.ms-powerpoint.svg}  |    0
 ...n-vnd.oasis.opendocument.graphics-template.svg} |    0
 ...pplication-vnd.oasis.opendocument.graphics.svg} |    0
 ...e-application-vnd.oasis.opendocument.image.svg} |    0
 ...d.oasis.opendocument.presentation-template.svg} |    0
 ...cation-vnd.oasis.opendocument.presentation.svg} |    0
 ...nd.oasis.opendocument.spreadsheet-template.svg} |    0
 ...ication-vnd.oasis.opendocument.spreadsheet.svg} |    0
 ...ation-vnd.oasis.opendocument.text-template.svg} |    0
 ...pplication-vnd.oasis.opendocument.text-web.svg} |    0
 ...me-application-vnd.oasis.opendocument.text.svg} |    0
 ...e-mime-application-vnd.rn-realmedia-secure.svg} |    0
 ...nome-mime-application-vnd.rn-realmedia-vbr.svg} |    0
 .../gnome-mime-application-vnd.rn-realmedia.svg}   |    0
 ...ome-mime-application-vnd.stardivision.calc.svg} |    0
 ...-mime-application-vnd.stardivision.impress.svg} |    0
 ...e-mime-application-vnd.stardivision.writer.svg} |    0
 .../gnome-mime-application-vnd.sun.xml.calc.svg}   |    0
 ...mime-application-vnd.sun.xml.calc.template.svg} |    0
 .../gnome-mime-application-vnd.sun.xml.draw.svg}   |    0
 ...mime-application-vnd.sun.xml.draw.template.svg} |    0
 ...gnome-mime-application-vnd.sun.xml.impress.svg} |    0
 ...e-application-vnd.sun.xml.impress.template.svg} |    0
 .../gnome-mime-application-vnd.sun.xml.writer.svg} |    0
 ...me-application-vnd.sun.xml.writer.template.svg} |    0
 .../gnome-mime-application-wordperfect.svg}        |    0
 .../gnome-mime-application-x-7z-compressed.svg}    |    0
 .../gnome-mime-application-x-abiword.svg}          |    0
 ...nome-mime-application-x-applix-spreadsheet.svg} |    0
 .../gnome-mime-application-x-applix-word.svg}      |    0
 .../gnome-mime-application-x-archive.svg}          |    0
 .../mimetypes/gnome-mime-application-x-arj.svg}    |    0
 ...ome-mime-application-x-bzip-compressed-tar.svg} |    0
 .../mimetypes/gnome-mime-application-x-bzip.svg}   |    0
 .../gnome-mime-application-x-compress.svg}         |    0
 .../gnome-mime-application-x-compressed-tar.svg}   |    0
 .../gnome-mime-application-x-cpio-compressed.svg}  |    0
 .../mimetypes/gnome-mime-application-x-cpio.svg}   |    0
 .../mimetypes/gnome-mime-application-x-deb.svg}    |    0
 .../mimetypes/gnome-mime-application-x-dvi.svg}    |    0
 .../gnome-mime-application-x-executable.svg}       |    0
 .../gnome-mime-application-x-font-afm.svg}         |    0
 .../gnome-mime-application-x-font-bdf.svg}         |    0
 .../gnome-mime-application-x-font-linux-psf.svg}   |    0
 .../gnome-mime-application-x-font-pcf.svg}         |    0
 .../gnome-mime-application-x-font-sunos-news.svg}  |    0
 .../gnome-mime-application-x-font-ttf.svg}         |    0
 .../gnome-mime-application-x-gnumeric.svg}         |    0
 .../mimetypes/gnome-mime-application-x-gzip.svg}   |    0
 .../gnome-mime-application-x-gzpostscript.svg}     |    0
 .../mimetypes/gnome-mime-application-x-jar.svg}    |    0
 .../gnome-mime-application-x-killustrator.svg}     |    0
 .../gnome-mime-application-x-kpresenter.svg}       |    0
 .../gnome-mime-application-x-kspread.svg}          |    0
 .../mimetypes/gnome-mime-application-x-kword.svg}  |    0
 .../mimetypes/gnome-mime-application-x-lha.svg}    |    0
 .../mimetypes/gnome-mime-application-x-lhz.svg}    |    0
 ...ome-mime-application-x-lzma-compressed-tar.svg} |    0
 .../mimetypes/gnome-mime-application-x-lzma.svg}   |    0
 ...gnome-mime-application-x-ms-dos-executable.svg} |    0
 .../mimetypes/gnome-mime-application-x-perl.svg}   |    0
 .../mimetypes/gnome-mime-application-x-php.svg}    |    0
 .../gnome-mime-application-x-python-bytecode.svg}  |    0
 .../mimetypes/gnome-mime-application-x-rar.svg}    |    0
 .../mimetypes/gnome-mime-application-x-rpm.svg}    |    0
 .../gnome-mime-application-x-scribus.svg}          |    0
 .../gnome-mime-application-x-shellscript.svg}      |    0
 .../gnome-mime-application-x-shockwave-flash.svg}  |    0
 .../gnome-mime-application-x-stuffit.svg}          |    0
 .../mimetypes/gnome-mime-application-x-tar.svg}    |    0
 .../mimetypes/gnome-mime-application-x-tarz.svg}   |    0
 .../mimetypes/gnome-mime-application-x-tex.svg}    |    0
 .../gnome-mime-application-xhtml+xml.svg}          |    0
 .../mimetypes/gnome-mime-application-zip.svg}      |    0
 .../Tango/scalable/mimetypes/gnome-mime-audio.svg} |    0
 .../Tango/scalable/mimetypes/gnome-mime-image.svg} |    0
 .../scalable/mimetypes/gnome-mime-text-html.svg}   |    0
 .../mimetypes/gnome-mime-text-vnd.wap.wml.svg}     |    0
 .../scalable/mimetypes/gnome-mime-text-x-csh.svg}  |    0
 .../mimetypes/gnome-mime-text-x-python.svg}        |    0
 .../scalable/mimetypes/gnome-mime-text-x-sh.svg}   |    0
 .../mimetypes/gnome-mime-text-x-vcalendar.svg}     |    0
 .../mimetypes/gnome-mime-text-x-vcard.svg}         |    0
 .../scalable/mimetypes/gnome-mime-text-x-zsh.svg}  |    0
 .../Tango/scalable/mimetypes/gnome-mime-text.svg}  |    0
 .../Tango/scalable/mimetypes/gnome-mime-video.svg} |    0
 .../scalable/mimetypes/gnome-mime-x-font-afm.svg}  |    0
 .../Tango/scalable/mimetypes/gnome-package.svg}    |    0
 .../Tango/scalable/mimetypes/html.svg}             |    0
 .../Tango/scalable}/mimetypes/image-x-generic.svg  |    0
 .../Tango/scalable/mimetypes/image.svg}            |    0
 .../Tango/scalable/mimetypes/kpresenter_kpr.svg}   |    0
 .../Tango/scalable/mimetypes/mime_ascii.svg}       |    0
 .../Tango/scalable/mimetypes/misc.svg}             |    0
 .../scalable}/mimetypes/package-x-generic.svg      |    0
 .../Tango/scalable/mimetypes/package.svg}          |    0
 .../Tango/scalable/mimetypes/package_editors.svg}  |    0
 .../scalable/mimetypes/package_wordprocessing.svg} |    0
 .../Tango/scalable/mimetypes/plan.svg}             |    0
 .../Tango/scalable/mimetypes/rpm.svg}              |    0
 .../Tango/scalable/mimetypes/shellscript.svg}      |    0
 .../Tango/scalable/mimetypes/sound.svg}            |    0
 .../Tango/scalable/mimetypes/spreadsheet.svg}      |    0
 .../scalable/mimetypes/stock_addressbook.svg}      |    0
 .../Tango/scalable/mimetypes/stock_calendar.svg}   |    0
 .../scalable/mimetypes/stock_certificate.svg}      |    0
 .../Tango/scalable/mimetypes/stock_script.svg}     |    0
 .../Tango/scalable/mimetypes/tar.svg}              |    0
 .../Tango/scalable/mimetypes/template_source.svg}  |    0
 .../Tango/scalable}/mimetypes/text-html.svg        |    0
 .../mimetypes/text-x-generic-template.svg          |    0
 .../Tango/scalable}/mimetypes/text-x-generic.svg   |    0
 .../Tango/scalable}/mimetypes/text-x-script.svg    |    0
 .../Tango/scalable/mimetypes/tgz.svg}              |    0
 .../Tango/scalable/mimetypes/txt.svg}              |    0
 .../Tango/scalable/mimetypes/txt2.svg}             |    0
 .../Tango/scalable/mimetypes/unknown.svg}          |    0
 .../Tango/scalable/mimetypes/vcalendar.svg}        |    0
 .../Tango/scalable/mimetypes/vcard.svg}            |    0
 .../Tango/scalable}/mimetypes/video-x-generic.svg  |    0
 .../Tango/scalable/mimetypes/video.svg}            |    0
 .../Tango/scalable/mimetypes/wordprocessing.svg}   |    0
 .../Tango/scalable/mimetypes/www.svg}              |    0
 .../scalable}/mimetypes/x-office-address-book.svg  |    0
 .../scalable}/mimetypes/x-office-calendar.svg      |    0
 .../mimetypes/x-office-document-template.svg       |    0
 .../scalable}/mimetypes/x-office-document.svg      |    0
 .../mimetypes/x-office-drawing-template.svg        |    0
 .../Tango/scalable}/mimetypes/x-office-drawing.svg |    0
 .../mimetypes/x-office-presentation-template.svg   |    0
 .../scalable}/mimetypes/x-office-presentation.svg  |    0
 .../mimetypes/x-office-spreadsheet-template.svg    |    0
 .../scalable}/mimetypes/x-office-spreadsheet.svg   |    0
 .../Tango/scalable/mimetypes/zip.svg}              |    0
 .../places/application-x-gnome-saved-search.svg}   |    0
 .../Tango/scalable/places/desktop.svg}             |    0
 .../Tango/scalable/places/distributor-logo.svg}    |    0
 .../Tango/scalable/places/emptytrash.svg}          |    0
 .../Tango/scalable}/places/folder-remote.svg       |    0
 .../Tango/scalable}/places/folder-saved-search.svg |    0
 .../Tango/scalable}/places/folder.icon             |    0
 .../Tango/scalable}/places/folder.svg              |    0
 .../Tango/scalable/places/folder_home.svg}         |    0
 .../Tango/scalable/places/gnome-fs-desktop.svg}    |    0
 .../Tango/scalable/places/gnome-fs-directory.icon} |    0
 .../Tango/scalable/places/gnome-fs-directory.svg}  |    0
 .../Tango/scalable/places/gnome-fs-ftp.svg}        |    0
 .../Tango/scalable/places/gnome-fs-home.svg}       |    0
 .../Tango/scalable/places/gnome-fs-network.svg}    |    0
 .../Tango/scalable/places/gnome-fs-nfs.svg}        |    0
 .../Tango/scalable/places/gnome-fs-server.svg}     |    0
 .../Tango/scalable/places/gnome-fs-share.svg}      |    0
 .../Tango/scalable/places/gnome-fs-smb.svg}        |    0
 .../Tango/scalable/places/gnome-fs-ssh.svg}        |    0
 .../scalable/places/gnome-fs-trash-empty.svg}      |    0
 .../Tango/scalable/places/gnome-main-menu.svg}     |    0
 .../places/gnome-mime-x-directory-nfs-server.svg}  |    0
 .../places/gnome-mime-x-directory-smb-server.svg}  |    0
 .../places/gnome-mime-x-directory-smb-share.svg}   |    0
 .../gnome-mime-x-directory-smb-workgroup.svg}      |    0
 .../Tango/scalable/places/gnome-stock-trash.svg}   |    0
 .../Tango/scalable/places/gtk-directory.icon}      |    0
 .../Tango/scalable/places/gtk-directory.svg}       |    0
 .../Tango/scalable/places/gtk-network.svg}         |    0
 .../Tango/scalable/places/inode-directory.icon}    |    0
 .../Tango/scalable/places/inode-directory.svg}     |    0
 .../Tango/scalable}/places/network-server.svg      |    0
 .../Tango/scalable}/places/network-workgroup.svg   |    0
 .../Tango/scalable/places/network.svg}             |    0
 .../Tango/scalable/places/network_local.svg}       |    0
 .../Tango/scalable/places/novell-button.svg}       |    0
 .../scalable/places/redhat-network-server.svg}     |    0
 .../Tango/scalable/places/server.svg}              |    0
 .../Tango/scalable}/places/start-here.svg          |    0
 .../Tango/scalable/places/stock_folder.icon}       |    0
 .../Tango/scalable/places/stock_folder.svg}        |    0
 .../Tango/scalable/places/trashcan_empty.svg}      |    0
 .../Tango/scalable}/places/user-desktop.svg        |    0
 .../Tango/scalable}/places/user-home.svg           |    0
 .../Tango/scalable}/places/user-trash.svg          |    0
 .../Tango/scalable/places/xfce-trash_empty.svg}    |    0
 .../Tango/scalable}/status/audio-volume-high.svg   |    0
 .../Tango/scalable}/status/audio-volume-low.svg    |    0
 .../Tango/scalable}/status/audio-volume-medium.svg |    0
 .../Tango/scalable}/status/audio-volume-muted.svg  |    0
 .../Tango/scalable}/status/battery-caution.svg     |    0
 .../Tango/scalable/status/connect_creating.svg}    |    0
 .../Tango/scalable/status/connect_established.svg} |    0
 .../Tango/scalable/status/connect_no.svg}          |    0
 .../Tango/scalable}/status/dialog-error.svg        |    0
 .../Tango/scalable}/status/dialog-information.svg  |    0
 .../Tango/scalable}/status/dialog-warning.svg      |    0
 .../Tango/scalable/status/edittrash.svg}           |    0
 .../Tango/scalable/status/error.svg}               |    0
 .../Tango/scalable}/status/folder-drag-accept.icon |    0
 .../Tango/scalable}/status/folder-drag-accept.svg  |    0
 .../Tango/scalable}/status/folder-open.svg         |    0
 .../Tango/scalable}/status/folder-visiting.icon    |    0
 .../Tango/scalable}/status/folder-visiting.svg     |    0
 .../Tango/scalable/status/folder_open.svg}         |    0
 .../status/gnome-dev-wavelan-encrypted.svg}        |    0
 .../status/gnome-fs-directory-accept.icon}         |    0
 .../scalable/status/gnome-fs-directory-accept.svg} |    0
 .../status/gnome-fs-directory-visiting.icon}       |    0
 .../status/gnome-fs-directory-visiting.svg}        |    0
 .../scalable/status/gnome-fs-loading-icon.svg}     |    0
 .../Tango/scalable/status/gnome-fs-trash-full.svg} |    0
 .../scalable/status/gnome-netstatus-disconn.svg}   |    0
 .../scalable/status/gnome-netstatus-error.svg}     |    0
 .../scalable/status/gnome-netstatus-idle.svg}      |    0
 .../Tango/scalable/status/gnome-netstatus-rx.svg}  |    0
 .../Tango/scalable/status/gnome-netstatus-tx.svg}  |    0
 .../scalable/status/gnome-netstatus-txrx.svg}      |    0
 .../scalable/status/gnome-stock-trash-full.svg}    |    0
 .../Tango/scalable/status/gtk-dialog-error.svg}    |    0
 .../Tango/scalable/status/gtk-dialog-info.svg}     |    0
 .../Tango/scalable/status/gtk-dialog-warning.svg}  |    0
 .../Tango/scalable/status/gtk-directory.svg}       |    0
 .../Tango/scalable/status/gtk-missing-image.svg}   |    0
 .../Tango/scalable}/status/image-loading.svg       |    0
 .../Tango/scalable}/status/image-missing.svg       |    0
 .../Tango/scalable/status/important.svg}           |    0
 .../Tango/scalable/status/info.svg}                |    0
 .../Tango/scalable}/status/mail-attachment.svg     |    0
 .../Tango/scalable/status/messagebox_critical.svg} |    0
 .../Tango/scalable/status/messagebox_info.svg}     |    0
 .../Tango/scalable/status/messagebox_warning.svg}  |    0
 .../Tango/scalable}/status/network-error.svg       |    0
 .../Tango/scalable}/status/network-idle.svg        |    0
 .../Tango/scalable}/status/network-offline.svg     |    0
 .../Tango/scalable}/status/network-receive.svg     |    0
 .../scalable}/status/network-transmit-receive.svg  |    0
 .../Tango/scalable}/status/network-transmit.svg    |    0
 .../status/network-wireless-encrypted.svg          |    0
 .../Tango/scalable/status/nm-no-connection.svg}    |    0
 .../Tango/scalable}/status/printer-error.svg       |    0
 .../scalable}/status/software-update-available.svg |    0
 .../scalable}/status/software-update-urgent.svg    |    0
 .../Tango/scalable/status/stock_attach.svg}        |    0
 .../Tango/scalable/status/stock_dialog-error.svg}  |    0
 .../Tango/scalable/status/stock_dialog-info.svg}   |    0
 .../scalable/status/stock_dialog-warning.svg}      |    0
 .../Tango/scalable/status/stock_open.svg}          |    0
 .../Tango/scalable/status/stock_trash_full.svg}    |    0
 .../Tango/scalable/status/stock_volume-0.svg}      |    0
 .../Tango/scalable/status/stock_volume-max.svg}    |    0
 .../Tango/scalable/status/stock_volume-med.svg}    |    0
 .../Tango/scalable/status/stock_volume-min.svg}    |    0
 .../Tango/scalable/status/stock_volume-mute.svg}   |    0
 .../Tango/scalable/status/stock_volume.svg}        |    0
 .../scalable/status/stock_weather-cloudy.svg}      |    0
 .../scalable/status/stock_weather-few-clouds.svg}  |    0
 .../scalable/status/stock_weather-night-clear.svg} |    0
 .../status/stock_weather-night-few-clouds.svg}     |    0
 .../scalable/status/stock_weather-showers.svg}     |    0
 .../Tango/scalable/status/stock_weather-snow.svg}  |    0
 .../Tango/scalable/status/stock_weather-storm.svg} |    0
 .../Tango/scalable/status/stock_weather-sunny.svg} |    0
 .../Tango/scalable/status/sunny.svg}               |    0
 .../Tango/scalable/status/trashcan_full.svg}       |    0
 .../Tango/scalable}/status/user-trash-full.svg     |    0
 .../Tango/scalable}/status/weather-clear-night.svg |    0
 .../Tango/scalable}/status/weather-clear.svg       |    0
 .../scalable}/status/weather-few-clouds-night.svg  |    0
 .../Tango/scalable}/status/weather-few-clouds.svg  |    0
 .../Tango/scalable}/status/weather-overcast.svg    |    0
 .../scalable}/status/weather-severe-alert.svg      |    0
 .../scalable}/status/weather-showers-scattered.svg |    0
 .../Tango/scalable}/status/weather-showers.svg     |    0
 .../Tango/scalable}/status/weather-snow.svg        |    0
 .../Tango/scalable}/status/weather-storm.svg       |    0
 .../Tango/scalable/status/xfce-trash_full.svg}     |    0
 lib/taurus/qt/qtgui/icon/__init__.py               |   32 +
 lib/taurus/qt/qtgui/icon/_rrze-icons.path          |    9 +
 lib/taurus/qt/qtgui/icon/_tango-icons.path         |   11 +
 lib/taurus/qt/qtgui/icon/_taurus-icons.path        |   13 +
 lib/taurus/qt/qtgui/icon/catalog.py                |  170 ++
 .../qt/qtgui/{resource => icon}/external/class.png |  Bin
 .../qtgui/{resource => icon}/external/function.png |  Bin
 .../qtgui/{resource => icon}/external/ipython.png  |  Bin
 .../{resource => icon}/external/jive/class.png     |  Bin
 .../{resource => icon}/external/jive/device.png    |  Bin
 .../{resource => icon}/external/jive/server.png    |  Bin
 .../{resource => icon}/external/python-console.png |  Bin
 .../{resource => icon}/external/python-file.png    |  Bin
 .../{resource => icon}/external/python-module.png  |  Bin
 .../{resource => icon}/external/python-package.png |  Bin
 .../qtgui/{resource => icon}/external/python.png   |  Bin
 .../external/pythonw-console.png                   |  Bin
 .../qt/qtgui/{resource => icon}/external/tango.png |  Bin
 .../extra-icons/actions/collapse-all.svg           |    0
 .../extra-icons/actions/collapse-selection.png     |  Bin
 .../extra-icons/actions/collapse.png               |  Bin
 .../extra-icons/actions/expand-all.svg             |    0
 .../extra-icons/actions/expand-selection.png       |  Bin
 .../extra-icons/actions/expand.png                 |  Bin
 .../extra-icons/actions/go-backward.svg            |    0
 .../extra-icons/actions/go-forward.svg             |    0
 .../actions/media-seek-backward-green.svg          |    0
 .../actions/media-seek-forward-green.svg           |    0
 .../actions/media_playback_backward.svg            |    0
 .../extra-icons/actions/media_playback_pause.svg   |    0
 .../extra-icons/actions/media_playback_start.svg   |    0
 .../extra-icons/actions/media_playback_stop.svg    |    0
 .../actions/media_playback_stop_green.svg          |    0
 .../extra-icons/actions/media_seek_backward.svg    |    0
 .../extra-icons/actions/media_seek_forward.svg     |    0
 .../extra-icons/actions/media_skip_backward.svg    |    0
 .../extra-icons/actions/media_skip_forward.svg     |    0
 .../extra-icons/actions/stop.svg                   |    0
 .../{resource => icon}/extra-icons/arrow01.svg     |    0
 .../{resource => icon}/extra-icons/color-fill.svg  |    0
 .../extra-icons/designer/arrayedit.png             |  Bin
 .../extra-icons/designer/back.png                  |  Bin
 .../extra-icons/designer/calendarwidget.png        |  Bin
 .../extra-icons/designer/checkbox.png              |  Bin
 .../extra-icons/designer/circular_gauge.png        |  Bin
 .../extra-icons/designer/columnview.png            |  Bin
 .../extra-icons/designer/combobox.png              |  Bin
 .../extra-icons/designer/commandlinkbutton.png     |  Bin
 .../extra-icons/designer/compression.png           |  Bin
 .../extra-icons/designer/dateedit.png              |  Bin
 .../extra-icons/designer/datetimeedit.png          |  Bin
 .../extra-icons/designer/devs_table.png            |  Bin
 .../extra-icons/designer/devs_tree.png             |  Bin
 .../extra-icons/designer/dial.png                  |  Bin
 .../extra-icons/designer/dialogbuttonbox.png       |  Bin
 .../extra-icons/designer/dockwidget.png            |  Bin
 .../extra-icons/designer/doublespinbox.png         |  Bin
 .../extra-icons/designer/down.png                  |  Bin
 .../extra-icons/designer/editdelete.png            |  Bin
 .../extra-icons/designer/extra_motor.png           |  Bin
 .../extra-icons/designer/filereader.png            |  Bin
 .../extra-icons/designer/fontcombobox.png          |  Bin
 .../extra-icons/designer/forward.png               |  Bin
 .../extra-icons/designer/frame.png                 |  Bin
 .../extra-icons/designer/graphicsview.png          |  Bin
 .../extra-icons/designer/grid.png                  |  Bin
 .../extra-icons/designer/groupbox.png              |  Bin
 .../extra-icons/designer/groupboxcollapsible.png   |  Bin
 .../extra-icons/designer/groupwidget.png           |  Bin
 .../designer/horizontal_linear_gauge.png           |  Bin
 .../extra-icons/designer/hscrollbar.png            |  Bin
 .../extra-icons/designer/hslider.png               |  Bin
 .../extra-icons/designer/hsplit.png                |  Bin
 .../extra-icons/designer/label.png                 |  Bin
 .../extra-icons/designer/lcdnumber.png             |  Bin
 .../extra-icons/designer/ledgreen.png              |  Bin
 .../extra-icons/designer/ledred.png                |  Bin
 .../extra-icons/designer/line.png                  |  Bin
 .../extra-icons/designer/lineedit.png              |  Bin
 .../extra-icons/designer/listbox.png               |  Bin
 .../extra-icons/designer/listview.png              |  Bin
 .../extra-icons/designer/macroserver.png           |  Bin
 .../extra-icons/designer/mdiarea.png               |  Bin
 .../extra-icons/designer/minus.png                 |  Bin
 .../extra-icons/designer/plaintextedit.png         |  Bin
 .../extra-icons/designer/plus.png                  |  Bin
 .../extra-icons/designer/progress.png              |  Bin
 .../extra-icons/designer/props_table.png           |  Bin
 .../extra-icons/designer/pushbutton.png            |  Bin
 .../extra-icons/designer/qwtplot.png               |  Bin
 .../extra-icons/designer/radiobutton.png           |  Bin
 .../extra-icons/designer/scheduler.png             |  Bin
 .../extra-icons/designer/scrollarea.png            |  Bin
 .../extra-icons/designer/spacer.png                |  Bin
 .../extra-icons/designer/spinbox.png               |  Bin
 .../extra-icons/designer/state.png                 |  Bin
 .../extra-icons/designer/tabbar.png                |  Bin
 .../extra-icons/designer/table.png                 |  Bin
 .../extra-icons/designer/tabwidget.png             |  Bin
 .../extra-icons/designer/tau.png                   |  Bin
 .../extra-icons/designer/taurus.png                |  Bin
 .../extra-icons/designer/textedit.png              |  Bin
 .../extra-icons/designer/timeedit.png              |  Bin
 .../extra-icons/designer/toolbox.png               |  Bin
 .../extra-icons/designer/toolbutton.png            |  Bin
 .../{resource => icon}/extra-icons/designer/up.png |  Bin
 .../extra-icons/designer/vertical_linear_gauge.png |  Bin
 .../extra-icons/designer/vline.png                 |  Bin
 .../extra-icons/designer/vscrollbar.png            |  Bin
 .../extra-icons/designer/vslider.png               |  Bin
 .../extra-icons/designer/vspacer.png               |  Bin
 .../extra-icons/designer/wheeledit.png             |  Bin
 .../extra-icons/designer/widget.png                |  Bin
 .../extra-icons/designer/widgetstack.png           |  Bin
 .../extra-icons/designer/wizard.png                |  Bin
 .../extra-icons/designer/zoomin.png                |  Bin
 .../extra-icons/designer/zoomout.png               |  Bin
 .../extra-icons/leds/images24/ledblue.png          |  Bin
 .../extra-icons/leds/images24/ledblueoff.png       |  Bin
 .../extra-icons/leds/images24/ledgreen.png         |  Bin
 .../extra-icons/leds/images24/ledgreenoff.png      |  Bin
 .../extra-icons/leds/images24/ledorange.png        |  Bin
 .../extra-icons/leds/images24/ledorangeoff.png     |  Bin
 .../extra-icons/leds/images24/ledred.png           |  Bin
 .../extra-icons/leds/images24/ledredoff.png        |  Bin
 .../extra-icons/leds/images24/ledyellow.png        |  Bin
 .../extra-icons/leds/images24/ledyellowoff.png     |  Bin
 .../extra-icons/leds/images256/led_black_off.png   |  Bin
 .../extra-icons/leds/images256/led_black_on.png    |  Bin
 .../extra-icons/leds/images256/led_blue_off.png    |  Bin
 .../extra-icons/leds/images256/led_blue_on.png     |  Bin
 .../extra-icons/leds/images256/led_green_off.png   |  Bin
 .../extra-icons/leds/images256/led_green_on.png    |  Bin
 .../leds/images256/led_grenoble_off.png            |  Bin
 .../extra-icons/leds/images256/led_grenoble_on.png |  Bin
 .../extra-icons/leds/images256/led_magenta_off.png |  Bin
 .../extra-icons/leds/images256/led_magenta_on.png  |  Bin
 .../extra-icons/leds/images256/led_off.png         |  Bin
 .../extra-icons/leds/images256/led_orange_off.png  |  Bin
 .../extra-icons/leds/images256/led_orange_on.png   |  Bin
 .../extra-icons/leds/images256/led_red_off.png     |  Bin
 .../extra-icons/leds/images256/led_red_on.png      |  Bin
 .../extra-icons/leds/images256/led_white_off.png   |  Bin
 .../extra-icons/leds/images256/led_white_on.png    |  Bin
 .../extra-icons/leds/images256/led_yellow_off.png  |  Bin
 .../extra-icons/leds/images256/led_yellow_on.png   |  Bin
 .../extra-icons/leds/images48/ledblue.png          |  Bin
 .../extra-icons/leds/images48/ledblueoff.png       |  Bin
 .../extra-icons/leds/images48/ledgreen.png         |  Bin
 .../extra-icons/leds/images48/ledgreenoff.png      |  Bin
 .../extra-icons/leds/images48/ledorange.png        |  Bin
 .../extra-icons/leds/images48/ledorangeoff.png     |  Bin
 .../extra-icons/leds/images48/ledred.png           |  Bin
 .../extra-icons/leds/images48/ledredoff.png        |  Bin
 .../extra-icons/leds/images48/ledyellow.png        |  Bin
 .../extra-icons/leds/images48/ledyellowoff.png     |  Bin
 .../{resource => icon}/extra-icons/lock_locked.svg |    0
 .../extra-icons/lock_locked_unpreviledged.svg      |    0
 .../extra-icons/lock_unknown.svg                   |    0
 .../extra-icons/lock_unlocked.svg                  |    0
 .../extra-icons/titlebar_close.png                 |  Bin
 .../extra-icons/titlebar_close_black.png           |  Bin
 .../extra-icons/titlebar_close_gray.png            |  Bin
 .../extra-icons/titlebar_close_white.png           |  Bin
 .../extra-icons/titlebar_undock.png                |  Bin
 .../extra-icons/titlebar_undock_black.png          |  Bin
 .../extra-icons/titlebar_undock_gray.png           |  Bin
 .../extra-icons/titlebar_undock_white.png          |  Bin
 lib/taurus/qt/qtgui/icon/icon.py                   |  361 ++++
 .../{resource => icon}/large/TaurusSplash.png      |  Bin
 .../large/snapshot/SardanaEditor.png               |  Bin
 .../large/snapshot/TaurusArrayEditor.png           |  Bin
 .../large/snapshot/TaurusDbTreeWidget.png          |  Bin
 .../large/snapshot/TaurusDevicePanel.png           |  Bin
 .../large/snapshot/TaurusForm.png                  |  Bin
 .../large/snapshot/TaurusImageDialog.png           |  Bin
 .../large/snapshot/TaurusJDrawSynopticsView.png    |  Bin
 .../large/snapshot/TaurusNeXusBrowser.png          |  Bin
 .../large/snapshot/TaurusPlot.png                  |  Bin
 .../large/snapshot/TaurusQubDataImageDisplay.png   |  Bin
 .../large/snapshot/TaurusShell.png                 |  Bin
 .../large/snapshot/TaurusTrend.png                 |  Bin
 .../large/snapshot/TaurusTrend2DDialog.png         |  Bin
 .../qt/qtgui/{resource => icon/logos}/tau.png      |  Bin
 .../qt/qtgui/{resource => icon/logos}/taurus.png   |  Bin
 .../qt/qtgui/{resource => icon/logos}/taurus.svg   |    0
 .../rrze-icons/actions/action-undo.svg             |    0
 .../rrze-icons/actions/add-participant.svg         |    0
 .../{resource => icon}/rrze-icons/actions/add.svg  |    0
 .../rrze-icons/actions/approval.svg                |    0
 .../rrze-icons/actions/arrange-boxes.svg           |    0
 .../rrze-icons/actions/back-to-ou.svg              |    0
 .../rrze-icons/actions/data-transfer.svg           |    0
 .../rrze-icons/actions/delete-all-participants.svg |    0
 .../rrze-icons/actions/dial-in.svg                 |    0
 .../rrze-icons/actions/down-grey.svg               |    0
 .../{resource => icon}/rrze-icons/actions/down.svg |    0
 .../rrze-icons/actions/download.svg                |    0
 .../rrze-icons/actions/dynamic-blue-down.svg       |    0
 .../rrze-icons/actions/dynamic-blue-left.svg       |    0
 .../rrze-icons/actions/dynamic-blue-right.svg      |    0
 .../rrze-icons/actions/dynamic-blue-up.svg         |    0
 .../rrze-icons/actions/email-not-available.svg     |    0
 .../rrze-icons/actions/filter.svg                  |    0
 .../rrze-icons/actions/go-bottom.svg               |    0
 .../rrze-icons/actions/go-top.svg                  |    0
 .../{resource => icon}/rrze-icons/actions/hide.svg |    0
 .../rrze-icons/actions/left-grey.svg               |    0
 .../{resource => icon}/rrze-icons/actions/left.svg |    0
 .../rrze-icons/actions/list-all-participants.svg   |    0
 .../rrze-icons/actions/load-settings.svg           |    0
 .../rrze-icons/actions/log-in.svg                  |    0
 .../rrze-icons/actions/log-out.svg                 |    0
 .../rrze-icons/actions/manage-settings.svg         |    0
 .../rrze-icons/actions/merge-affiliation.svg       |    0
 .../rrze-icons/actions/monitoring.svg              |    0
 .../move-participant-to-waiting-red-grey.svg       |    0
 .../actions/move-participant-to-waiting-red.svg    |    0
 .../rrze-icons/actions/move-waiting-down-grey.svg  |    0
 .../rrze-icons/actions/move-waiting-down.svg       |    0
 .../move-waiting-to-participant-green-arrow.svg    |    0
 .../rrze-icons/actions/move-waiting-up-grey.svg    |    0
 .../rrze-icons/actions/move-waiting-up.svg         |    0
 .../rrze-icons/actions/print.svg                   |    0
 .../rrze-icons/actions/refuse.svg                  |    0
 .../rrze-icons/actions/right-grey.svg              |    0
 .../rrze-icons/actions/right.svg                   |    0
 .../{resource => icon}/rrze-icons/actions/run.svg  |    0
 .../rrze-icons/actions/send-email-group.svg        |    0
 .../rrze-icons/actions/send-email-user-other.svg   |    0
 .../rrze-icons/actions/send-email-user.svg         |    0
 .../rrze-icons/actions/send-email.svg              |    0
 .../{resource => icon}/rrze-icons/actions/show.svg |    0
 .../rrze-icons/actions/sort-down-green.svg         |    0
 .../rrze-icons/actions/sort-down-red.svg           |    0
 .../rrze-icons/actions/sort-down.svg               |    0
 .../rrze-icons/actions/sort-neutral-green.svg      |    0
 .../rrze-icons/actions/sort-neutral-red.svg        |    0
 .../rrze-icons/actions/sort-neutral.svg            |    0
 .../rrze-icons/actions/sort-up-green.svg           |    0
 .../rrze-icons/actions/sort-up-red.svg             |    0
 .../rrze-icons/actions/sort-up.svg                 |    0
 .../rrze-icons/actions/split-affiliation.svg       |    0
 .../rrze-icons/actions/switch-course-book-grey.svg |    0
 .../rrze-icons/actions/switch-course-book.svg      |    0
 .../rrze-icons/actions/switch-course-grey.svg      |    0
 .../rrze-icons/actions/switch-course.svg           |    0
 .../rrze-icons/actions/transfer-down_up.svg        |    0
 .../rrze-icons/actions/transfer-left_right.svg     |    0
 .../rrze-icons/actions/transfer-right_left.svg     |    0
 .../rrze-icons/actions/transfer-up_down.svg        |    0
 .../rrze-icons/actions/up-grey.svg                 |    0
 .../{resource => icon}/rrze-icons/actions/up.svg   |    0
 .../rrze-icons/actions/upload.svg                  |    0
 .../{resource => icon}/rrze-icons/actions/view.svg |    0
 .../rrze-icons/actions/workflow.svg                |    0
 .../rrze-icons/categories/affiliation-employee.svg |    0
 .../rrze-icons/categories/affiliation-guest.svg    |    0
 .../rrze-icons/categories/affiliation-student.svg  |    0
 .../rrze-icons/categories/alumni-group.svg         |    0
 .../rrze-icons/categories/book-marks.svg           |    0
 .../rrze-icons/categories/book.svg                 |    0
 .../rrze-icons/categories/bookmark.svg             |    0
 .../rrze-icons/categories/icon-inspector.svg       |    0
 .../rrze-icons/categories/magnifying-glass.svg     |    0
 .../rrze-icons/categories/mood-level-green.svg     |    0
 .../rrze-icons/categories/mood-level-red.svg       |    0
 .../rrze-icons/categories/mood-level-yellow.svg    |    0
 .../rrze-icons/categories/user-admin-gear.svg      |    0
 .../rrze-icons/categories/user-admin.svg           |    0
 .../rrze-icons/categories/user-business.svg        |    0
 .../rrze-icons/categories/user-customer.svg        |    0
 .../rrze-icons/categories/user-digital-person.svg  |    0
 .../rrze-icons/categories/user-disabled.svg        |    0
 .../rrze-icons/categories/user-employee.svg        |    0
 .../rrze-icons/categories/user-endcustomer.svg     |    0
 .../rrze-icons/categories/user-enrolee.svg         |    0
 .../rrze-icons/categories/user-examiner-group.svg  |    0
 .../rrze-icons/categories/user-examiner.svg        |    0
 .../rrze-icons/categories/user-expert.svg          |    0
 .../rrze-icons/categories/user-group.svg           |    0
 .../rrze-icons/categories/user-helpdesk-faq.svg    |    0
 .../rrze-icons/categories/user-helpdesk.svg        |    0
 .../rrze-icons/categories/user-library.svg         |    0
 .../rrze-icons/categories/user-manager.svg         |    0
 .../rrze-icons/categories/user-other-business.svg  |    0
 .../rrze-icons/categories/user-other-female.svg    |    0
 .../rrze-icons/categories/user-other-new.svg       |    0
 .../rrze-icons/categories/user-other.svg           |    0
 .../rrze-icons/categories/user-partner.svg         |    0
 .../rrze-icons/categories/user-phd-group.svg       |    0
 .../rrze-icons/categories/user-phd.svg             |    0
 .../rrze-icons/categories/user-real-person.svg     |    0
 .../categories/user-student-assistant.svg          |    0
 .../rrze-icons/categories/user-student.svg         |    0
 .../rrze-icons/categories/user-unknown.svg         |    0
 .../rrze-icons/devices/database-locked.svg         |    0
 .../rrze-icons/devices/modem.svg                   |    0
 .../rrze-icons/devices/router.svg                  |    0
 .../rrze-icons/devices/server-access.svg           |    0
 .../rrze-icons/devices/server-accounting.svg       |    0
 .../rrze-icons/devices/server-blades.svg           |    0
 .../rrze-icons/devices/server-book.svg             |    0
 .../devices/server-database-firebird.svg           |    0
 .../rrze-icons/devices/server-database-green.svg   |    0
 .../rrze-icons/devices/server-database-mysql.svg   |    0
 .../rrze-icons/devices/server-database-otrs.svg    |    0
 .../devices/server-database-postgres.svg           |    0
 .../rrze-icons/devices/server-database-yellow.svg  |    0
 .../rrze-icons/devices/server-database.svg         |    0
 .../rrze-icons/devices/server-directory-green.svg  |    0
 .../rrze-icons/devices/server-directory-yellow.svg |    0
 .../rrze-icons/devices/server-directory.svg        |    0
 .../rrze-icons/devices/server-email-relay.svg      |    0
 .../rrze-icons/devices/server-email.svg            |    0
 .../rrze-icons/devices/server-file.svg             |    0
 .../rrze-icons/devices/server-firewall.svg         |    0
 .../rrze-icons/devices/server-green.svg            |    0
 .../rrze-icons/devices/server-monitoring.svg       |    0
 .../rrze-icons/devices/server-multiple.svg         |    0
 .../rrze-icons/devices/server-print.svg            |    0
 .../rrze-icons/devices/server-radius.svg           |    0
 .../rrze-icons/devices/server-red.svg              |    0
 .../rrze-icons/devices/server-subversion.svg       |    0
 .../rrze-icons/devices/server-user.svg             |    0
 .../rrze-icons/devices/server-vpn.svg              |    0
 .../rrze-icons/devices/server-web-green.svg        |    0
 .../rrze-icons/devices/server-web-secure.svg       |    0
 .../rrze-icons/devices/server-web-yellow.svg       |    0
 .../rrze-icons/devices/server-web.svg              |    0
 .../rrze-icons/devices/server-yellow.svg           |    0
 .../rrze-icons/devices/server.svg                  |    0
 .../rrze-icons/devices/switch.svg                  |    0
 .../rrze-icons/devices/wlan-access-point.svg       |    0
 .../rrze-icons/devices/wlan-controller.svg         |    0
 .../rrze-icons/devices/workstation.svg             |    0
 .../rrze-icons/emblems/account-delete.svg          |    0
 .../rrze-icons/emblems/account-edit.svg            |    0
 .../rrze-icons/emblems/account-new.svg             |    0
 .../rrze-icons/emblems/affiliation-abstract.svg    |    0
 .../rrze-icons/emblems/affiliation.svg             |    0
 .../rrze-icons/emblems/affirmation.svg             |    0
 .../rrze-icons/emblems/all-per-page.svg            |    0
 .../{resource => icon}/rrze-icons/emblems/at.svg   |    0
 .../rrze-icons/emblems/audio-itunes-u.svg          |    0
 .../rrze-icons/emblems/audio-itunes.svg            |    0
 .../rrze-icons/emblems/audio-visual-slide.svg      |    0
 .../rrze-icons/emblems/bridge-stone-delete.svg     |    0
 .../rrze-icons/emblems/bridge-stone-new.svg        |    0
 .../rrze-icons/emblems/bridge-stone.svg            |    0
 .../rrze-icons/emblems/database-firebird.svg       |    0
 .../rrze-icons/emblems/database-mysql.svg          |    0
 .../rrze-icons/emblems/database-openldap.svg       |    0
 .../rrze-icons/emblems/database-otrs.svg           |    0
 .../rrze-icons/emblems/database-postgres.svg       |    0
 .../rrze-icons/emblems/database-vcs-subversion.svg |    0
 .../rrze-icons/emblems/database.svg                |    0
 .../rrze-icons/emblems/directory-attribute.svg     |    0
 .../rrze-icons/emblems/directory-object-class.svg  |    0
 .../rrze-icons/emblems/directory-object.svg        |    0
 .../rrze-icons/emblems/directory-schema.svg        |    0
 .../rrze-icons/emblems/directory-syntax.svg        |    0
 .../rrze-icons/emblems/directory.svg               |    0
 .../rrze-icons/emblems/doctoral-cap.svg            |    0
 .../rrze-icons/emblems/email.svg                   |    0
 .../rrze-icons/emblems/entitlement.svg             |    0
 .../rrze-icons/emblems/export.svg                  |    0
 .../rrze-icons/emblems/fifty-per-page.svg          |    0
 .../rrze-icons/emblems/firewall.svg                |    0
 .../rrze-icons/emblems/floppy-disc-green.svg       |    0
 .../rrze-icons/emblems/folder.svg                  |    0
 .../rrze-icons/emblems/footnote-delete.svg         |    0
 .../rrze-icons/emblems/footnote-edit.svg           |    0
 .../rrze-icons/emblems/footnote-new.svg            |    0
 .../rrze-icons/emblems/footnote.svg                |    0
 .../rrze-icons/emblems/for-free.svg                |    0
 .../rrze-icons/emblems/geo-id.svg                  |    0
 .../rrze-icons/emblems/globe.svg                   |    0
 .../{resource => icon}/rrze-icons/emblems/id.svg   |    0
 .../rrze-icons/emblems/index.svg                   |    0
 .../rrze-icons/emblems/information.svg             |    0
 .../rrze-icons/emblems/inspector-hat.svg           |    0
 .../{resource => icon}/rrze-icons/emblems/lock.svg |    0
 .../rrze-icons/emblems/mailbox.svg                 |    0
 .../rrze-icons/emblems/media-film.svg              |    0
 .../rrze-icons/emblems/media-floppy-green.svg      |    0
 .../rrze-icons/emblems/message-new.svg             |    0
 .../rrze-icons/emblems/money.svg                   |    0
 .../rrze-icons/emblems/movie-audio.svg             |    0
 .../rrze-icons/emblems/network-cloud.svg           |    0
 .../{resource => icon}/rrze-icons/emblems/note.svg |    0
 .../rrze-icons/emblems/office-excel.svg            |    0
 .../rrze-icons/emblems/office-word.svg             |    0
 .../emblems/organisational-unit-tree.svg           |    0
 .../rrze-icons/emblems/organizational-unit.svg     |    0
 .../rrze-icons/emblems/page-25.svg                 |    0
 .../rrze-icons/emblems/page-50.svg                 |    0
 .../rrze-icons/emblems/page-all.svg                |    0
 .../rrze-icons/emblems/peace-sign.svg              |    0
 .../{resource => icon}/rrze-icons/emblems/pen.svg  |    0
 .../rrze-icons/emblems/phone.svg                   |    0
 .../rrze-icons/emblems/promotion-data.svg          |    0
 .../rrze-icons/emblems/relay.svg                   |    0
 .../rrze-icons/emblems/report-delete.svg           |    0
 .../rrze-icons/emblems/report-edit.svg             |    0
 .../rrze-icons/emblems/report-new.svg              |    0
 .../rrze-icons/emblems/report-run.svg              |    0
 .../rrze-icons/emblems/report-upload.svg           |    0
 .../rrze-icons/emblems/report.svg                  |    0
 .../rrze-icons/emblems/rss-feed.svg                |    0
 .../rrze-icons/emblems/single-sign-on.svg          |    0
 .../rrze-icons/emblems/slide-audio.svg             |    0
 .../rrze-icons/emblems/slide.svg                   |    0
 .../rrze-icons/emblems/statistic.svg               |    0
 .../emblems/structured-program-stay-abroad.svg     |    0
 .../rrze-icons/emblems/subversion-logo             |    0
 .../rrze-icons/emblems/subversion-logo.svg         |    0
 .../rrze-icons/emblems/subversion.svg              |    0
 .../rrze-icons/emblems/table.svg                   |    0
 .../{resource => icon}/rrze-icons/emblems/task.svg |    0
 .../rrze-icons/emblems/template.svg                |    0
 .../rrze-icons/emblems/ten-per-page.svg            |    0
 .../rrze-icons/emblems/tomcat.svg                  |    0
 .../rrze-icons/emblems/tree-diagramm-delete.svg    |    0
 .../rrze-icons/emblems/tree-diagramm-move.svg      |    0
 .../rrze-icons/emblems/tree-diagramm-new.svg       |    0
 .../rrze-icons/emblems/tree-diagramm.svg           |    0
 .../rrze-icons/emblems/twenty-five-per-page.svg    |    0
 .../{resource => icon}/rrze-icons/emblems/unix.svg |    0
 .../rrze-icons/emblems/video-film.svg              |    0
 .../rrze-icons/emblems/webview.svg                 |    0
 .../emblems/wide-area-network-connection.svg       |    0
 .../rrze-icons/emblems/wide-area-network-link.svg  |    0
 .../{resource => icon}/rrze-icons/emblems/wifi.svg |    0
 .../rrze-icons/emblems/zipper.svg                  |    0
 .../rrze-icons/mime-types/audio-mp3.svg            |    0
 .../rrze-icons/mime-types/audio-mp4.svg            |    0
 .../rrze-icons/mime-types/document-pdf.svg         |    0
 .../rrze-icons/mime-types/media-audio-itunes-u.svg |    0
 .../rrze-icons/mime-types/media-audio-itunes.svg   |    0
 .../mime-types/media-audio-visual-slide.svg        |    0
 .../rrze-icons/mime-types/media-movie-audio.svg    |    0
 .../rrze-icons/mime-types/media-movie.svg          |    0
 .../rrze-icons/mime-types/media-slide-audio.svg    |    0
 .../rrze-icons/mime-types/media-video-film.svg     |    0
 .../rrze-icons/mime-types/office-ms-excel.svg      |    0
 .../rrze-icons/mime-types/office-ms-word.svg       |    0
 .../rrze-icons/mime-types/text-csv-text.svg        |    0
 .../rrze-icons/mime-types/video-m4v.svg            |    0
 .../rrze-icons/mime-types/video-mov.svg            |    0
 .../rrze-icons/status/available.svg                |    0
 .../rrze-icons/status/awaiting-plus.svg            |    0
 .../rrze-icons/status/awaiting.svg                 |    0
 .../rrze-icons/status/binational.svg               |    0
 .../{resource => icon}/rrze-icons/status/error.svg |    0
 .../rrze-icons/status/exclamation-mark.svg         |    0
 .../rrze-icons/status/expired.svg                  |    0
 .../{resource => icon}/rrze-icons/status/false.svg |    0
 .../rrze-icons/status/female.svg                   |    0
 .../rrze-icons/status/flag-green-clock.svg         |    0
 .../rrze-icons/status/flag-green-mail.svg          |    0
 .../rrze-icons/status/flag-green.svg               |    0
 .../rrze-icons/status/flag-red-clock.svg           |    0
 .../rrze-icons/status/flag-red-mail.svg            |    0
 .../rrze-icons/status/flag-red.svg                 |    0
 .../rrze-icons/status/flag-yellow-clock.svg        |    0
 .../rrze-icons/status/flag-yellow-mail.svg         |    0
 .../rrze-icons/status/flag-yellow.svg              |    0
 .../rrze-icons/status/hourglass.svg                |    0
 .../rrze-icons/status/important.svg                |    0
 .../rrze-icons/status/maintenance-time.svg         |    0
 .../{resource => icon}/rrze-icons/status/male.svg  |    0
 .../rrze-icons/status/not-available.svg            |    0
 .../rrze-icons/status/not-known.svg                |    0
 .../rrze-icons/status/not-specified.svg            |    0
 .../rrze-icons/status/not-synchronized.svg         |    0
 .../rrze-icons/status/synchronized.svg             |    0
 .../status/temporarily-not-available-clock.svg     |    0
 .../status/temporarily-not-available.svg           |    0
 .../rrze-icons/status/true-orange.svg              |    0
 .../{resource => icon}/rrze-icons/status/true.svg  |    0
 .../rrze-icons/status/unlocked.svg                 |    0
 .../rrze-icons/status/warning.svg                  |    0
 lib/taurus/qt/qtgui/image/__init__.py              |   37 -
 lib/taurus/qt/qtgui/image/taurusqub.py             |  205 ---
 lib/taurus/qt/qtgui/input/__init__.py              |   36 +-
 lib/taurus/qt/qtgui/input/choicedlg.py             |  203 ++-
 lib/taurus/qt/qtgui/input/qwheel.py                |  488 ++---
 lib/taurus/qt/qtgui/input/tauruscheckbox.py        |   44 +-
 lib/taurus/qt/qtgui/input/tauruscombobox.py        |  273 +--
 lib/taurus/qt/qtgui/input/tauruslineedit.py        |  346 ++--
 lib/taurus/qt/qtgui/input/taurusspinbox.py         |  138 +-
 lib/taurus/qt/qtgui/input/tauruswheel.py           |   79 +-
 lib/taurus/qt/qtgui/model/__init__.py              |   36 +-
 lib/taurus/qt/qtgui/model/qbasemodel.py            |  214 ++-
 lib/taurus/qt/qtgui/panel/__init__.py              |   38 +-
 lib/taurus/qt/qtgui/panel/qdataexportdialog.py     |  230 ++-
 lib/taurus/qt/qtgui/panel/qdoublelist.py           |  109 +-
 lib/taurus/qt/qtgui/panel/qrawdatachooser.py       |   86 +-
 lib/taurus/qt/qtgui/panel/report/__init__.py       |   37 +-
 lib/taurus/qt/qtgui/panel/report/albareport.py     |   26 +-
 lib/taurus/qt/qtgui/panel/report/basicreport.py    |   38 +-
 .../qt/qtgui/panel/taurusattributechooser.py       |  215 ---
 lib/taurus/qt/qtgui/panel/taurusconfigbrowser.py   |  156 --
 lib/taurus/qt/qtgui/panel/taurusconfigeditor.py    |  342 ++--
 .../qt/qtgui/panel/taurusconfigurationpanel.py     |  243 ++-
 lib/taurus/qt/qtgui/panel/taurusdevicepanel.py     |  709 ++++----
 lib/taurus/qt/qtgui/panel/taurusfilterpanel.py     |  415 +++--
 lib/taurus/qt/qtgui/panel/taurusform.py            |  806 ++++----
 lib/taurus/qt/qtgui/panel/taurusinputpanel.py      |  124 +-
 lib/taurus/qt/qtgui/panel/taurusmessagepanel.py    |   85 +-
 lib/taurus/qt/qtgui/panel/taurusmodelchooser.py    |  268 +--
 lib/taurus/qt/qtgui/panel/taurusmodellist.py       |  376 ++--
 lib/taurus/qt/qtgui/panel/taurusvalue.py           | 1176 ++++++------
 lib/taurus/qt/qtgui/panel/test/__init__.py         |   26 +-
 lib/taurus/qt/qtgui/panel/test/test_taurusform.py  |   33 +-
 lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py |   97 +-
 lib/taurus/qt/qtgui/panel/ui/QDataExportDialog.ui  |    0
 lib/taurus/qt/qtgui/panel/ui/QDoubleListDlg.ui     |    0
 lib/taurus/qt/qtgui/panel/ui/QRawDataWidget.ui     |    0
 .../qt/qtgui/panel/ui/TaurusAttributeChooser.ui    |  246 ---
 .../qt/qtgui/panel/ui/TaurusConfigurationPanel.ui  |   28 +-
 lib/taurus/qt/qtgui/panel/ui/TaurusDevPanel.ui     |    0
 lib/taurus/qt/qtgui/panel/ui/TaurusFilterPanel.ui  |    0
 lib/taurus/qt/qtgui/plot/__init__.py               |   38 +-
 lib/taurus/qt/qtgui/plot/arrayedit.py              |  510 +++---
 lib/taurus/qt/qtgui/plot/curveStatsDlg.py          |  252 +--
 lib/taurus/qt/qtgui/plot/curveprops.py             |  686 ++++---
 .../qt/qtgui/plot/curvesAppearanceChooserDlg.py    |  587 +++---
 lib/taurus/qt/qtgui/plot/monitor.py                |  110 +-
 lib/taurus/qt/qtgui/plot/qwtdialog.py              |  504 ++---
 lib/taurus/qt/qtgui/plot/qwtplot.py                |   40 +-
 lib/taurus/qt/qtgui/plot/scales.py                 |  471 ++---
 lib/taurus/qt/qtgui/plot/taurusarrayedit.py        |  230 +--
 lib/taurus/qt/qtgui/plot/taurusplot.py             | 1779 ++++++++++--------
 lib/taurus/qt/qtgui/plot/taurusplotconf.py         |  212 +--
 lib/taurus/qt/qtgui/plot/taurustrend.py            | 1406 +++++++-------
 lib/taurus/qt/qtgui/plot/ui/ArrayEditor.ui         |    2 +-
 .../qt/qtgui/plot/ui/CurvesAppearanceChooser.ui    |    0
 lib/taurus/qt/qtgui/plot/ui/TaurusPlotConfDlg.ui   |    0
 lib/taurus/qt/qtgui/resource/__init__.py           |   43 +-
 .../resource/tango-icons/actions/edit-delete.svg   |  792 --------
 .../tango-icons/actions/mail-mark-not-junk.svg     |  324 ----
 .../resource/tango-icons/emotes/face-cool.svg      |  282 ---
 .../qt/qtgui/resource/taurus_resource_utils.py     |  486 ++---
 lib/taurus/qt/qtgui/style/__init__.py              |   47 +-
 lib/taurus/qt/qtgui/style/nebula.py                |   60 +-
 lib/taurus/qt/qtgui/table/__init__.py              |   36 +-
 lib/taurus/qt/qtgui/table/qdictionary.py           |  376 ++--
 lib/taurus/qt/qtgui/table/qlogtable.py             |  216 +--
 lib/taurus/qt/qtgui/table/qtable.py                |   26 +-
 lib/taurus/qt/qtgui/table/taurusdbtable.py         |   93 +-
 .../qt/qtgui/table/taurusdevicepropertytable.py    |  401 ++--
 lib/taurus/qt/qtgui/table/taurusgrid.py            |  984 +++++-----
 lib/taurus/qt/qtgui/table/taurustable.py           |   26 +-
 lib/taurus/qt/qtgui/table/taurusvaluestable.py     |  837 +++++----
 lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py  |  159 --
 .../qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py |   44 +-
 lib/taurus/qt/qtgui/taurusgui/__init__.py          |   54 +-
 lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py |  688 +++----
 lib/taurus/qt/qtgui/taurusgui/conf/__init__.py     |   34 +-
 lib/taurus/qt/qtgui/taurusgui/conf/gui_noconf.py   |   41 +-
 lib/taurus/qt/qtgui/taurusgui/conf/gui_pureconf.py |   45 +-
 lib/taurus/qt/qtgui/taurusgui/conf/gui_selfconf.py |   40 +-
 .../taurusgui/conf/tgconf_example01/__init__.py    |   34 +-
 .../taurusgui/conf/tgconf_example01/config.py      |  164 +-
 .../taurusgui/conf/tgconf_macrogui/__init__.py     |   34 +-
 .../qtgui/taurusgui/conf/tgconf_macrogui/config.py |   84 +-
 lib/taurus/qt/qtgui/taurusgui/macrolistener.py     |  428 ++---
 .../qt/qtgui/taurusgui/paneldescriptionwizard.py   |  563 +++---
 lib/taurus/qt/qtgui/taurusgui/taurusgui.py         |  806 ++++----
 .../qt/qtgui/taurusgui/ui/AssociationDialog.ui     |    0
 lib/taurus/qt/qtgui/taurusgui/utils.py             |  273 +--
 lib/taurus/qt/qtgui/test/__init__.py               |   26 +-
 lib/taurus/qt/qtgui/test/base.py                   |   69 +-
 lib/taurus/qt/qtgui/tree/__init__.py               |   38 +-
 lib/taurus/qt/qtgui/tree/qtree.py                  |  123 +-
 lib/taurus/qt/qtgui/tree/taurusdbtree.py           |  205 ++-
 lib/taurus/qt/qtgui/tree/taurusdevicetree.py       | 1696 +++++++++--------
 lib/taurus/qt/qtgui/tree/taurustree.py             |   36 +-
 lib/taurus/qt/qtgui/util/__init__.py               |   37 +-
 lib/taurus/qt/qtgui/util/qdraganddropdebug.py      |   61 +-
 lib/taurus/qt/qtgui/util/taurusaction.py           |  224 +--
 lib/taurus/qt/qtgui/util/taurusactionfactory.py    |   75 +-
 lib/taurus/qt/qtgui/util/tauruscolor.py            |   58 +-
 lib/taurus/qt/qtgui/util/taurusropepatch.py        |   54 +-
 lib/taurus/qt/qtgui/util/taurusscreenshot.py       |   65 +-
 lib/taurus/qt/qtgui/util/tauruswidget_template     |  107 +-
 lib/taurus/qt/qtgui/util/tauruswidgetfactory.py    |   99 +-
 lib/taurus/qt/qtgui/util/tauruswidgettree.py       |   90 +-
 lib/taurus/qt/qtgui/util/test/__init__.py          |   34 +-
 lib/taurus/qt/qtgui/util/test/test_ui/__init__.py  |   36 +-
 .../qtgui/util/test/test_ui/mywidget3/__init__.py  |   31 +-
 lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py   |   41 +-
 lib/taurus/qt/qtgui/util/ui.py                     |   57 +-
 lib/taurus/qt/qtgui/util/validator.py              |  122 ++
 lib/taurus/qt/qtgui/util/widgetgen.py              |   69 +-
 lib/taurus/qt/qtopengl/__init__.py                 |   28 -
 lib/taurus/qt/uic/__init__.py                      |  219 ---
 lib/taurus/qt/uic/pyuic4/taurus.py                 |   56 -
 lib/taurus/qt/uic/tau2taurus_map.py                |  145 --
 lib/taurus/tauruscustomsettings.py                 |   89 +-
 lib/taurus/test/__init__.py                        |   27 +-
 lib/taurus/test/base.py                            |   96 +-
 lib/taurus/test/fuzzytest.py                       |  103 +-
 lib/taurus/test/moduleexplorer.py                  |   67 +-
 lib/taurus/test/resource.py                        |   34 +-
 lib/taurus/test/skip.py                            |   29 +-
 lib/taurus/test/test_import.py                     |   30 +-
 lib/taurus/test/testsuite.py                       |  103 +-
 lib/taurus/web/__init__.py                         |   29 -
 lib/taurus/web/examples/tornado/countclient.html   |  130 --
 lib/taurus/web/examples/tornado/countserver.py     |  148 --
 lib/taurus/web/examples/tornado/demo.html          |   16 -
 lib/taurus/web/examples/tornado/demo.py            |   54 -
 lib/taurus/web/examples/tornado/demo1.html         |  189 --
 lib/taurus/web/examples/tornado/demo2.html         |   91 -
 lib/taurus/web/examples/tornado/demo3.html         |   91 -
 lib/taurus/web/examples/tornado/demo4.html         |   59 -
 lib/taurus/web/examples/tornado/machinestatus.html |  184 --
 lib/taurus/web/examples/tornado/machinestatus.py   |   48 -
 .../web/examples/tornado/static/css/demo.css       |   83 -
 .../examples/tornado/static/css/machinestatus.css  |   76 -
 .../examples/tornado/static/js/countclient.coffee  |   75 -
 .../web/examples/tornado/static/js/countclient.js  |   94 -
 lib/taurus/web/examples/tornado/static/js/demo.js  |   14 -
 lib/taurus/web/examples/tornado/static/js/demo1.js |   14 -
 lib/taurus/web/examples/tornado/static/js/demo2.js |   41 -
 lib/taurus/web/examples/tornado/static/js/demo3.js |   44 -
 lib/taurus/web/examples/tornado/static/js/demo4.js |   14 -
 .../tornado/static/js/machinestatus.coffee         |    9 -
 .../examples/tornado/static/js/machinestatus.js    |   14 -
 lib/taurus/web/static/css/digital.ttf              |  Bin 23200 -> 0 bytes
 lib/taurus/web/static/css/taurus.css               |    5 -
 lib/taurus/web/static/favicon.ico                  |  Bin 1226 -> 0 bytes
 lib/taurus/web/static/js/taurus.coffee             |   42 -
 lib/taurus/web/static/js/taurus.js                 |   95 -
 lib/taurus/web/taurustornado.py                    |  253 ---
 lib/taurus/web/template/index.html                 |   11 -
 scripts/tau2taurus                                 |   74 -
 scripts/taurusconfigbrowser                        |   27 -
 scripts/tauruscurve                                |   30 -
 scripts/taurusdemo                                 |  142 --
 scripts/taurusdesigner                             |   35 -
 scripts/taurusdevicepanel                          |   27 -
 scripts/taurusdoc                                  |  217 ---
 scripts/taurusform                                 |   27 -
 scripts/taurusgui                                  |   27 -
 scripts/taurusimage                                |   30 -
 scripts/tauruspanel                                |   27 -
 scripts/taurusplot                                 |   27 -
 scripts/taurusremotelogmonitor                     |   94 -
 scripts/taurustrend                                |   27 -
 scripts/taurustrend1d                              |   30 -
 scripts/taurustrend2d                              |   30 -
 scripts/taurusui                                   |   56 -
 scripts/taurusuic4                                 |  318 ----
 setup.cfg                                          |    5 +
 setup.py                                           | 1164 ++----------
 1883 files changed, 43319 insertions(+), 39812 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..8e75c6d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,159 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/).
+This file follows the formats and conventions from [keepachangelog.com]
+
+Note: changes in the [support-3.x] branch (which was split from 
+the master branch after [3.7.1] and maintained in parallel to the 
+develop branch)  won't be reflected in this file. 
+
+## [Unreleased]
+
+
+## [4.0.1] - 2016-07-19
+Jul16 milestone. 
+First release of the Taurus 4 series.
+Largely (but not 100%) compatible with taurus 3 series.
+For a full log of commits since Jan16, run (in your git repo):
+`git log 3.7.0..4.0.1` 
+
+### Added
+- Quantities (units) support ([TEP14])
+- Scheme-agnostic core helpers ([TEP3])
+- Model fragment support ([TEP14])
+- PyQt new-style signals support (#187)
+- support for guiqwt >= 3 (#270)
+- New icon API (taurus.qt.qtgui.icon) (#280) 
+- New `taurusiconcatalog` application (#280)
+- Backwards compatibility layer for migration from Taurus 3.x ([TEP14])
+- New deprecation API (`Logger.deprecated` and `deprecation_decorator`)
+- new unit tests (from ~50 to ~550 unit tests)
+- This CHANGELOG.md file
+
+### Changed
+- Tango dependency is now **optional** ([TEP3])
+- Improved and simplified core API ([TEP3], [TEP14]):
+    - Configuration and Attribute Models are now merged into Attribute
+    - Taurus model base classes are now scheme-agnostic
+    - Improved model name validators (enforcing RFC3986 -compliant model 
+    names)
+- Eval scheme improved (more natural and powerful syntax) ([TEP14])
+- Epics scheme plugin improved (and is now installed) (#215)
+- Improved installation and distribution scripts (now using setuptools),
+(#279)
+- Improved testsuite (new `taurustestsuite` command allowing regexp 
+exclusions)
+- Improved Icon Theme support (also for windows)
+- taurus.qt now depends on PyQt>=4.8 (before was 4.4)
+- taurus.qt.qtgui.extra_nexus now depends on PyMca5 (before was 4.7)
+- Updated documentation (#221)
+
+### Deprecated
+- Support for old-style signals
+- Support for PyQt API1
+- Taurus3.x tango-centric API (see [TEP3], [TEP14])
+- old-style tango and eval model names (non-RFC3986 compliant)
+- taurus.qt.qtgui.resource module
+- taurus.external.ordereddict
+
+### Removed
+- Deprecated modules (see #234 for details & replacements)
+    - taurus.core.utils
+    - taurus.core.util.decorator.deprecated
+    - taurus.qt.qtgui.table.taurusvaluestable_ro
+    - taurus.qt.qtgui.panel.taurusattributechooser
+    - taurus.qt.qtgui.panel.taurusconfigbrowser
+    - taurus.qt.qtgui.base.taurusqattribute
+    - taurus.qt.gtgui.extra_xterm
+    - taurus.qt.gtgui.extra_pool
+    - taurus.qt.gtgui.extra_macroexecutor
+    - taurus.qt.gtgui.extra_sardana
+    - taurus.qt.gtgui.gauge
+    - taurus.qt.qtgui.image
+    - taurus.qt.qtopengl
+    - taurus.qt.uic
+    - taurus.web
+- `spec` scheme plugin (#216)
+- `sim` scheme plugin (#217)
+- Obsolete `setup.py` commands (`build_resources`, `build_doc`,...) 
+(#279)
+- Icon resource files (but the icons are still available and accessible)
+(#280)
+
+### Fixed
+- Installation now possible with pip (no need of --egg workaround)
+- Documentation generation issues (#288, #273, #221)
+- Several bugs and feature-req in TaurusTrend2D 
+- Issues in TaurusArrayEditor (#260, #261) 
+- TaurusTrend Export to ASCII issues (#300, #277, #253)
+- `resource` scheme plugin (#218)
+- windows installer (#278)
+- [Many other issues](https://sf.net/p/tauruslib/tickets/milestone/Jul16/)
+
+
+## [3.7.1] - 2016-03-17
+Hotfix for RTD (no library changes)
+
+### Fixed
+- RTD issue (bug 273)  
+
+
+## [3.7.0] - 2016-02-17 
+Jan16 milestone. 
+For a full log of commits since Jul15, run (in your git repo):
+`git log 3.6.0..3.7.0` 
+
+### Added
+- Support for sqlite DB in Tango (ticket #148)
+
+### Fixed
+- Many usability bugs in TaurusTrend2D and other
+  guiqwt-based widgets (#238, #240, #244, #247, #251, #258)
+- Issues with "export to ASCII" feature of plots
+- Issues with PLY optimization (#262)
+- "taurus-polling-period" argument works for evaluation
+  attributes now too (#249)
+- [Many other issues](http://sf.net/p/tauruslib/tickets/milestone/Jan16/)
+    
+
+## [3.6.1] - 2015-10-01
+Hotfix for docs (no library changes)
+
+### Fixed
+- documentation issues (#181, #191, #194)
+
+
+## [3.6.0] - 2015-07-22 
+Jul15 milestone. 
+For a full log of commits since Jan15, run (in your git repo):
+`git log 3.4.0..3.6.0` 
+
+### Added
+- support of user creation/removal of custom external application
+launchers at run time (see #158)
+- support of LimaCCDs DS (see #175) and improvements in the codecs
+
+### Changed
+- taurusplot/trend uses the same order than the legend for exported
+data (see #161)
+- Docs: several improvements and made ReadTheDocs-compliant
+
+### Fixed
+- Fixed memory leaks in plots/trends (see #171)
+- [fixed many bugs in TaurusPlot,  TaurusWheel,  TaurusImageDialog,
+and several other places](https://sf.net/p/tauruslib/tickets/milestone/Jul15/)
+
+
+
+[keepachangelog.com]: http://keepachangelog.com
+[TEP3]: https://sf.net/p/tauruslib/wiki/TEP3/
+[TEP14]: https://sf.net/p/tauruslib/wiki/TEP14/
+[Unreleased]: https://sf.net/p/tauruslib/taurus.git/ci/develop/tree/
+[4.0.1]: https://sf.net/p/tauruslib/taurus.git/ci/4.0.0/tree/
+[3.7.1]: https://sf.net/p/tauruslib/taurus.git/ci/3.7.1/tree/
+[3.7.0]: https://sf.net/p/tauruslib/taurus.git/ci/3.7.0/tree/
+[3.6.0]: https://sf.net/p/tauruslib/taurus.git/ci/3.6.0/tree/
+[support-3.x]: https://sf.net/p/tauruslib/taurus.git/ci/support-3.x/tree/
+
+
+
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..a11c82a
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,8 @@
+graft doc
+graft lib/taurus
+global-exclude *.pyc
+include LICENSE.txt
+include CHANGELOG.md
+include taurus.bmp
+include taurus.png
+include taurus.svg
\ No newline at end of file
diff --git a/PKG-INFO b/PKG-INFO
index 1cb8573..81b85ab 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,20 +1,19 @@
 Metadata-Version: 1.1
 Name: taurus
-Version: 3.7.0
+Version: 4.0.1
 Summary: A framework for scientific/industrial CLIs and GUIs
 Home-page: http://www.taurus-scada.org
-Author: Carlos Pascual-Izarra
-Author-email: cpascual at cells.es
+Author: Taurus Community
+Author-email: tauruslib-devel at lists.sourceforge.net
 License: LGPL
 Download-URL: http://pypi.python.org/packages/source/t/taurus
-Description: Taurus is a python framework for control and data 
-        acquisition CLIs and GUIs in scientific/industrial environments. 
-        It supports multiple control systems or data sources: Tango, EPICS, spec... 
+Description: Taurus is a python framework for control and data
+        acquisition CLIs and GUIs in scientific/industrial environments.
+        It supports multiple control systems or data sources: Tango, EPICS, spec...
         New control system libraries can be integrated through plugins.
-Keywords: CLI,GUI,PyTango,Tango,Shell
+Keywords: CLI,GUI,PyTango,Tango,Shell,Epics
 Platform: Linux
-Platform: Windows XP/2000/NT
-Platform: Windows 95/98/ME
+Platform: Windows
 Classifier: Development Status :: 3 - Alpha
 Classifier: Environment :: Console
 Classifier: Environment :: X11 Applications :: Qt
@@ -28,17 +27,19 @@ Classifier: Operating System :: POSIX :: Linux
 Classifier: Operating System :: Unix
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Scientific/Engineering
 Classifier: Topic :: Software Development :: Libraries
 Classifier: Topic :: Software Development :: User Interfaces
 Classifier: Topic :: Software Development :: Widget Sets
 Requires: numpy (>=1.1)
 Requires: PyTango (>=7.1)
-Requires: PyQt4 (>=4.4)
+Requires: PyQt4 (>=4.8)
 Requires: PyQt4.Qwt5 (>=5.2.0)
 Requires: ply (>=2.3)
 Requires: lxml (>=2.1)
 Requires: spyder (>=2.2)
+Requires: guiqwt (==2.3.1)
 Provides: taurus
 Provides: taurus.core
 Provides: taurus.qt
diff --git a/doc/auto_rst4api.py b/doc/auto_rst4api.py
index a21dbcb..ce31ddf 100644
--- a/doc/auto_rst4api.py
+++ b/doc/auto_rst4api.py
@@ -3,34 +3,36 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
-''' Creates a tree of dirs and restructured text stub files for documenting 
+''' Creates a tree of dirs and restructured text stub files for documenting
 the API of a python module with sphinx'''
 
-import sys, os
+import sys
+import os
 import imp
 from jinja2 import Environment, FileSystemLoader
 
+
 def taurusabspath(*path):
     """A method to determine absolute path for a given relative path to the
     directory where the setup.py script is located"""
@@ -38,7 +40,7 @@ def taurusabspath(*path):
     setup_dir = os.path.abspath(os.path.join(this_dir, os.pardir))
     return os.path.join(setup_dir, *path)
 
-#import moduleexplorer from the sources, and without importing taurus
+# import moduleexplorer from the sources, and without importing taurus
 __name = "moduleexplorer"
 __path = taurusabspath('lib', 'taurus', 'test', 'moduleexplorer.py')
 ModuleExplorer = imp.load_source(__name, __path).ModuleExplorer
@@ -46,8 +48,8 @@ ModuleExplorer = imp.load_source(__name, __path).ModuleExplorer
 
 class Auto_rst4API_Creator(object):
     AUTOGEN_SIGNATURE = '.. AUTO_RST4API'
-    AUTOGEN_MESSAGE ='.. This file was generated by auto_rst4api.py. Changes may be lost'
-    
+    AUTOGEN_MESSAGE = '.. This file was generated by auto_rst4api.py. Changes may be lost'
+
     def __init__(self, templatespath='./', moduletemplate='api_module.rst', classtemplate='api_class.rst',
                  classindextemplate='api_AllClasses.rst', exclude_patterns=(), verbose=True, overwrite_old=False):
         '''
@@ -57,148 +59,166 @@ class Auto_rst4API_Creator(object):
         :param classindextemplate: (str) name of the template to be used for class index page
         :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.overwrite_old = overwrite_old
-    
+
     def _isautogeneratedfile(self, fname):
         ret = False
-        f = open(fname,'r')
+        f = open(fname, 'r')
         lines = f.readlines()
         for l in lines:
             if l.startswith(self.AUTOGEN_SIGNATURE):
                 ret = True
                 break
         f.close()
-        
+
         return ret
-    
+
     def cleanAutogenerated(self, apipath):
-        '''Removes any previously autogenerated rst file in the given path 
+        '''Removes any previously autogenerated rst file in the given path
         or its subdirectories
-        
+
         :param apipath: (str) directory to clean
         '''
-        for dirpath,dirnames,filenames in os.walk(apipath):
+        for dirpath, dirnames, filenames in os.walk(apipath):
             for f in filenames:
                 if f.endswith('.rst'):
-                    fullname = os.path.join(dirpath,f)
-                    try :
+                    fullname = os.path.join(dirpath, f)
+                    try:
                         if self._isautogeneratedfile(fullname):
-                            print "Removing %s"%fullname
+                            print "Removing %s" % fullname
                             os.remove(fullname)
                     except Exception, e:
-                        print 'Error accessing %s:%s'%(fullname,repr(e))
-        
-    def createClassIndex(self, info, ofname ):
+                        print 'Error accessing %s:%s' % (fullname, repr(e))
+
+    def createClassIndex(self, info, ofname):
         '''
         Creates a class index page using the classindextemplate.
-        
+
         :param info: (dict) dictionary containing the information about the
-                     items to document for this module (as generated by 
+                     items to document for this module (as generated by
                      :meth:`exploreModule`
-        :param ofname: (str) output file name       
+        :param ofname: (str) output file name
         '''
-        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, 
+        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,
         if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)):
             text = self.classindextemplate.render(info=info, classes=classes)
             f = open(ofname, "w")
             f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
             f.close()
-            if self.verbose: print ' ok.'
+            if self.verbose:
+                print ' ok.'
         else:
-            if self.verbose: print ' skipping (file already exists)'
-    
+            if self.verbose:
+                print ' skipping (file already exists)'
+
     def createStubs(self, info, docparentpath):
         '''creates rst stub files for modules and classes according to the
         information contained in info.
 
         :param info: (dict) dictionary containing the information about the
-                     items to document for this module (as generated by 
+                     items to document for this module (as generated by
                      :meth:`exploreModule`)
-        :docparentpath: (str) path to the directory in which the documentation 
-                        files will be written   
+        :docparentpath: (str) path to the directory in which the documentation
+                        files will be written
         '''
-        #create the module doc dir if it didn't exist
-        absdocpath = os.path.join(docparentpath, info['basemodulename'])   
+        # create the module doc dir if it didn't exist
+        absdocpath = os.path.join(docparentpath, info['basemodulename'])
         if not os.path.exists(absdocpath):
             os.makedirs(absdocpath, mode=0755)
-        #create module index stub in doc parent dir
-        ofname = os.path.join(docparentpath,"%s.rst"%info['basemodulename'])
-        if self.verbose: print 'creating "%s" ...'%ofname, 
+        # create module index stub in doc parent dir
+        ofname = os.path.join(docparentpath, "%s.rst" % info['basemodulename'])
+        if self.verbose:
+            print 'creating "%s" ...' % ofname,
         if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)):
             text = self.moduletemplate.render(info=info)
             f = open(ofname, "w")
             f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
             f.close()
-            if self.verbose: print ' ok.'
+            if self.verbose:
+                print ' ok.'
         else:
-            if self.verbose: print ' skipping (file already exists)'
-        #create class stubs
+            if self.verbose:
+                print ' skipping (file already exists)'
+        # create class stubs
         for name in info['localclassnames']:
-            ofname = os.path.join(absdocpath,"_%s.rst"%name)
-            if self.verbose: print 'creating "%s" ...'%ofname, 
+            ofname = os.path.join(absdocpath, "_%s.rst" % name)
+            if self.verbose:
+                print 'creating "%s" ...' % ofname,
             if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)):
                 text = self.classtemplate.render(info=info, classname=name)
                 f = open(ofname, "w")
-                f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
+                f.write(
+                    '\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
                 f.close()
-                if self.verbose: print ' ok.'
+                if self.verbose:
+                    print ' ok.'
             else:
-                if self.verbose: print ' skipping (file already exists)'
-        #recurse for submodules
+                if self.verbose:
+                    print ' skipping (file already exists)'
+        # recurse for submodules
         for sminfo in info['submodules'].itervalues():
             self.createStubs(sminfo, absdocpath)
-    
+
     def documentModule(self, modulename, docparentpath, exclude_patterns=None):
         '''
         recursive function that walks on the module structure and generates
         documentation files for the given module and its submodules. It also
         creates a class index for the root module
-        
+
         :param modulename: (str) name of the module to document
-        :docparentpath: (str) path to the directory in which the documentation 
+        :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 
+                 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 
+
+        :return: (list<str>) list of warning messages
         '''
-        if self.verbose: print "\nDocumenting %s..."%modulename
+        if self.verbose:
+            print "\nDocumenting %s..." % modulename
         if exclude_patterns is None:
             exclude_patterns = self.exclude_patterns
-        moduleinfo, w = ModuleExplorer.explore(modulename, 
-                                               exclude_patterns=exclude_patterns, 
+        moduleinfo, w = ModuleExplorer.explore(modulename,
+                                               exclude_patterns=exclude_patterns,
                                                verbose=self.verbose)
         self.createStubs(moduleinfo, docparentpath)
-        self.createClassIndex(moduleinfo, os.path.join(docparentpath,"%s_AllClasses.rst"%modulename))
-        if len (w) == 0: return []
-        else: return zip(*w)[1]
-              
-        
-def main():    
+        self.createClassIndex(moduleinfo, os.path.join(
+            docparentpath, "%s_AllClasses.rst" % modulename))
+        if len(w) == 0:
+            return []
+        else:
+            return zip(*w)[1]
+
+
+def main():
     import sys
     if len(sys.argv) != 3:
-        print 'Usage:\n\t%s modulename docpreffix\n\n'%sys.argv[0]
-        sys.exit(1)            
+        print 'Usage:\n\t%s modulename docpreffix\n\n' % sys.argv[0]
+        sys.exit(1)
     modulename, docparentpath = sys.argv[1:]
     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))
+    r = creator.documentModule(
+        modulename, docparentpath, exclude_patterns=['.*\.test'])
+    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__":    
-    main() 
\ No newline at end of file
+    print '*' * 50 + '\n'
+
+if __name__ == "__main__":
+    main()
diff --git a/doc/buildmock.py b/doc/buildmock.py
index acff6c4..7047c00 100644
--- a/doc/buildmock.py
+++ b/doc/buildmock.py
@@ -3,36 +3,36 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 class also borrows much code from the build_mock_qt.py script from
 # qarbon (http://qarbon.rtfd.org/)
-# 
+#
 # Copyright (c) 2013 European Synchrotron Radiation Facility, Grenoble, France
 #
-# ---------------------------------------------------------------------------- 
+# ----------------------------------------------------------------------------
 
-''' Creates a tree of dirs and restructured text stub files for documenting 
+''' Creates a tree of dirs and restructured text stub files for documenting
 the API of a python module with sphinx'''
 
 from __future__ import with_statement
@@ -76,7 +76,7 @@ class _Mock(object):
     def __oct__(*a, **kw): return 1
     def __hex__(*a, **kw): return 0x1
     def __long__(*a, **kw): return long(1)
-    def __index__(*a, **kw): return 1       
+    def __index__(*a, **kw): return 1
 """
 
 import_template = """import {name} as {asname}"""
@@ -99,10 +99,12 @@ def abspath(*path):
     this_dir = os.path.dirname(os.path.abspath(__file__))
     return os.path.abspath(os.path.join(this_dir, *path))
 
+
 def _import(name):
     __import__(name)
     return sys.modules[name]
 
+
 def _is_pseudo_enum(obj):
     if not isinstance(obj, int):
         return False
@@ -111,17 +113,20 @@ def _is_pseudo_enum(obj):
         return False
     except:
         return True
-    
+
+
 def _is_special_float(obj):
     if not isinstance(obj, float):
         return False
     return repr(obj) in ('inf', 'nan', '-inf')
 
+
 def _discard_element(name, exclude, include):
     if name in include:
         return False
     return name in exclude or name.startswith("__")
-    
+
+
 def build_class(k_name, k, exclude=(), include=()):
     '''return the source text for a mock class based on a given class'''
     methods = []
@@ -138,9 +143,9 @@ def build_class(k_name, k, exclude=(), include=()):
             members.append(specialfloats_template.format(name=element_name,
                                                          value=element))
         elif isinstance(element, (int, float, bool, str, unicode)):
-            try: # make sure that the repr makes sense
+            try:  # make sure that the repr makes sense
                 type(element)(repr(element))
-            except: # skip it (the _Mock.__getattr__ will deal with it)
+            except:  # skip it (the _Mock.__getattr__ will deal with it)
                 continue
             members.append(member_template.format(name=element_name,
                                                   value=element))
@@ -151,6 +156,7 @@ def build_class(k_name, k, exclude=(), include=()):
                                       members=members)
     return klass_str
 
+
 def build_module(module_name, imports=(), out_prefix='mock',
                  exclude=(), include=()):
     '''generate a mock package for a given module'''
@@ -171,21 +177,21 @@ def build_module(module_name, imports=(), out_prefix='mock',
             continue
         element = getattr(module, element_name)
         # internal imports (from the same package)
-        if (inspect.ismodule(element) and 
-            element.__name__.split('.')[0] == module_name.split('.')[0]):
+        if (inspect.ismodule(element) and
+                element.__name__.split('.')[0] == module_name.split('.')[0]):
             # add the module to the imports set #@TODO: this does not work
-            #imports.add(import_template.format(name=element.__name__, 
+            # imports.add(import_template.format(name=element.__name__,
             #                                    asname=element_name))
             # @todo: The above lines were commented because they created
             # problems with circular imports. So for now we just mock them
             mocks.append(mock_template.format(name=element_name))
             # make sure that the module is built
-            build_module(element.__name__, imports=(), 
+            build_module(element.__name__, imports=(),
                          out_prefix=out_prefix, exclude=exclude,
                          include=include)
         # classes
         elif inspect.isclass(element):
-            klasses.append(build_class(element_name, element, 
+            klasses.append(build_class(element_name, element,
                                        exclude=exclude, include=include))
         # inf, and NaN constants
         elif _is_special_float(element):
@@ -196,18 +202,17 @@ def build_module(module_name, imports=(), out_prefix='mock',
             constants.append(mock_template.format(name=element_name))
         # constants
         elif isinstance(element, (int, float, bool, str, unicode)):
-            try: # make sure that the repr makes sense
+            try:  # make sure that the repr makes sense
                 type(element)(repr(element))
             except:  # cannot write anything better than a mock
                 constants.append(mock_template.format(name=element_name))
-            constants.append(constant_template.format(name=element_name, 
+            constants.append(constant_template.format(name=element_name,
                                                       value=element))
         # final catch-all: it covers modules, functions and other elements
         # that aren't caught by any of the above
         elif (element_name not in imports):
             mocks.append(mock_template.format(name=element_name))
 
-        
     imports = "\n".join(sorted(imports))
 
     module_init = module_init_template.format(imports=imports)
@@ -223,7 +228,8 @@ def build_module(module_name, imports=(), out_prefix='mock',
         f.write("\n\n")
         f.write(klasses)
         f.write("\n\n")
-    
+
+
 def guess_submodules_from_package(module_name, exclude=(), include=()):
     '''returns a list of submodule names found in a given package name.
     If module_name is not implemented as a package, it returns an empty list'''
@@ -234,10 +240,10 @@ def guess_submodules_from_package(module_name, exclude=(), include=()):
         modulefile = inspect.getfile(module)
     except TypeError:
         return []
-    if not (modulefile.endswith('__init__.py') or 
-            modulefile.endswith('__init__.pyc') ):
+    if not (modulefile.endswith('__init__.py') or
+            modulefile.endswith('__init__.pyc')):
         return []
-    
+
     pkgdir, _ = os.path.split(modulefile)
     # explore pkgdir to find subdirs with __init__.py files
     g = glob.glob(os.path.join(pkgdir, '*', '__init__.py'))
@@ -251,13 +257,14 @@ def guess_submodules_from_package(module_name, exclude=(), include=()):
     # explore pkgdir to find .so files
     g = glob.glob(os.path.join(pkgdir, '*.so'))
     names += [re.findall(r".+\/(.*).so", s)[0] for s in g]
-    # build list with full module names and filter out non-importable submodules
+    # build list with full module names and filter out non-importable
+    # submodules
     full_module_names = []
     for sm_name in names:
         name = '.'.join((module_name, sm_name))
         # skip __main__ and __init__, etc and excluded (unless included)
-        if ( name not in include and 
-             (name in exclude or sm_name.startswith('__')) ):
+        if (name not in include and
+                (name in exclude or sm_name.startswith('__'))):
             continue
         # check if the module is indeed importable
         try:
@@ -269,6 +276,7 @@ def guess_submodules_from_package(module_name, exclude=(), include=()):
             pass
     return full_module_names
 
+
 def build_full_module(module_name, exclude=(), include=(), out_prefix='mock'):
     '''build a full mocked package (modules and submodules, recursively) for the
     given module'''
@@ -276,15 +284,16 @@ def build_full_module(module_name, exclude=(), include=(), out_prefix='mock'):
     abs_dir = abspath(out_prefix, *rel_dir)
     if os.path.isdir(abs_dir):
         shutil.rmtree(abs_dir)
-    
+
     build_module(module_name, imports=(), exclude=exclude, include=include,
                  out_prefix=out_prefix)
-    
-    #recursive call for submodules
+
+    # recursive call for submodules
     for name in guess_submodules_from_package(module_name, exclude=exclude):
-        build_full_module(name, exclude=exclude, include=include, 
+        build_full_module(name, exclude=exclude, include=include,
                           out_prefix=out_prefix)
 
+
 def _zipdir(basedir, archivename):
     '''function to zip directories. Adapted from:
     http://stackoverflow.com/questions/296499
@@ -294,31 +303,32 @@ def _zipdir(basedir, archivename):
     assert os.path.isdir(basedir)
     with closing(ZipFile(archivename, "w", ZIP_DEFLATED)) as z:
         for root, dirs, files in os.walk(basedir):
-            #NOTE: ignore empty directories
+            # NOTE: ignore empty directories
             for fn in files:
                 absfn = os.path.join(root, fn)
-                zfn = absfn[len(basedir)+len(os.sep):] #XXX: relative path
+                zfn = absfn[len(basedir) + len(os.sep):]  # XXX: relative path
                 z.write(absfn, zfn)
-         
+
+
 def build_mocks_for_taurus(output='mock.zip'):
-    '''builds mocks for the packages required by taurus. The mocks are written 
+    '''builds mocks for the packages required by taurus. The mocks are written
     into the given output directory (or a zip file if output ends with ".zip")
-    ''' 
+    '''
     import sys
     import tempfile
-    
+
     if output.endswith('.zip'):
         zfile, outdir = output, tempfile.mkdtemp()
     else:
         zfile, outdir = None, output
 
-    module_names = ['PyTango', 'PyMca', 'numpy', 'PyQt4', 'sip', 'lxml',
-                    'guidata', 'guiqwt', 'spyderlib', 'IPython', 'ply'] 
+    module_names = ['PyTango', 'PyMca5', 'numpy', 'PyQt4', 'sip', 'lxml',
+                    'guidata', 'guiqwt', 'spyderlib', 'IPython', 'ply']
     #module_names = ['numpy']
-    
+
     exclude = ['exec', 'None',
-               'spyderlib.scientific_startup', 
-               'spyderlib.spyder', 
+               'spyderlib.scientific_startup',
+               'spyderlib.spyder',
                'spyderlib.widgets.externalshell.start_ipython_kernel']
     include = ['__version__']
 
@@ -326,11 +336,10 @@ def build_mocks_for_taurus(output='mock.zip'):
         build_full_module(module_name, exclude=exclude, include=include,
                           out_prefix=outdir)
     if zfile:
-        _zipdir(outdir, zfile) # compress the dir into the zip file 
-        shutil.rmtree(outdir) # delete the dir
+        _zipdir(outdir, zfile)  # compress the dir into the zip file
+        shutil.rmtree(outdir)  # delete the dir
     print '\nMocks written in %s' % output
-    
-    
 
-if __name__ == "__main__": 
-    build_mocks_for_taurus() 
\ No newline at end of file
+
+if __name__ == "__main__":
+    build_mocks_for_taurus()
diff --git a/doc/makeman b/doc/makeman
index ae81e75..256c9f6 100755
--- a/doc/makeman
+++ b/doc/makeman
@@ -26,13 +26,30 @@
 #This is a quick-and-dirty solution for taurus maintenance only --don't complain about bugs!
 
 DOCDIR=`pwd`
-SCRIPTSDIR="$DOCDIR/../scripts"
+SETUPDIR="$DOCDIR/../"
 
+# Install into a temp dir to get the scripts
+TMPDIR=`mktemp -d`
+echo $TMPDIR
+TMPLIBDIR=$TMPDIR/lib
+TMPBINDIR=$TMPDIR/bin
+cd $SETUPDIR
+export PYTHONPATH=$TMPLIBDIR:$PYTHONPATH
+python setup.py install --root=$TMPDIR --install-lib=lib --install-scripts=bin
+
+
+SCRIPTSDIR=$TMPBINDIR
 cd $SCRIPTSDIR
 
+rm $DOCDIR/*.1
+
 echo $SCRIPTSDIR
 for f in `ls`
   do echo "--------------------"
-  echo help2man -N -o "$DOCDIR/man/$f.1" $f
-  help2man -N -o "$DOCDIR/man/$f.1" $f
-  done
\ No newline at end of file
+  echo help2man -N -o "$DOCDIR/man/$f.1" ./$f
+  help2man -N -o "$DOCDIR/man/$f.1" ./$f
+  done
+
+cd $DOCDIR
+
+rm -rf $TMPDIR
diff --git a/doc/man/tau2taurus.1 b/doc/man/tau2taurus.1
deleted file mode 100644
index 1b73f3b..0000000
--- a/doc/man/tau2taurus.1
+++ /dev/null
@@ -1,19 +0,0 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAU2TAURUS "1" "February 2016" "tau2taurus 3.7.0" "User Commands"
-.SH NAME
-tau2taurus \- manual page for tau2taurus 3.7.0
-.SH SYNOPSIS
-.B tau2taurus
-[\fI\,options\/\fR] \fI\,inputfile\/\fR
-.SH DESCRIPTION
-tau to taurus ui file translator
-.SH OPTIONS
-.TP
-\fB\-\-version\fR
-show program's version number and exit
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-show this help message and exit
-.TP
-\fB\-o\fR FILE, \fB\-\-output\fR=\fI\,FILE\/\fR
-output FILE [default=console]
diff --git a/doc/man/taurusconfigbrowser.1 b/doc/man/taurusconfigbrowser.1
index 9dc02b2..3a5bd55 100644
--- a/doc/man/taurusconfigbrowser.1
+++ b/doc/man/taurusconfigbrowser.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSCONFIGEDITOR "1" "February 2016" "taurusconfigeditor 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSCONFIGEDITOR "1" "July 2016" "taurusconfigeditor 4.0.1" "User Commands"
 .SH NAME
-taurusconfigeditor \- manual page for taurusconfigeditor 3.7.0
+taurusconfigeditor \- manual page for taurusconfigeditor 4.0.1
 .SH SYNOPSIS
 .B taurusconfigbrowser
 [\fI\,options\/\fR] [\fI\,INIFILENAME\/\fR]
diff --git a/doc/man/tauruscurve.1 b/doc/man/tauruscurve.1
index e770927..f08e8a4 100644
--- a/doc/man/tauruscurve.1
+++ b/doc/man/tauruscurve.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUS "1" "February 2016" "Taurus Curve Dialog 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUS "1" "July 2016" "Taurus Curve Dialog 4.0.1" "User Commands"
 .SH NAME
-Taurus \- manual page for Taurus Curve Dialog 3.7.0
+Taurus \- manual page for Taurus Curve Dialog 4.0.1
 .SH SYNOPSIS
 .B tauruscurve
 [\fI\,options\/\fR] [\fI\,<model1> \/\fR[\fI\,<model2>\/\fR] ...]
diff --git a/doc/man/taurusdesigner.1 b/doc/man/taurusdesigner.1
index 1288bd8..3902694 100644
--- a/doc/man/taurusdesigner.1
+++ b/doc/man/taurusdesigner.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSDESIGNER "1" "February 2016" "taurusdesigner 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSDESIGNER "1" "July 2016" "taurusdesigner 4.0.1" "User Commands"
 .SH NAME
-taurusdesigner \- manual page for taurusdesigner 3.7.0
+taurusdesigner \- manual page for taurusdesigner 4.0.1
 .SH SYNOPSIS
 .B taurusdesigner
 [\fI\,options\/\fR] \fI\,<ui file(s)>\/\fR
diff --git a/doc/man/taurusdevicepanel.1 b/doc/man/taurusdevicepanel.1
index 4cf1708..56d9b2d 100644
--- a/doc/man/taurusdevicepanel.1
+++ b/doc/man/taurusdevicepanel.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSDEVICEPANEL "1" "February 2016" "TaurusDevicePanel 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSDEVICEPANEL "1" "July 2016" "TaurusDevicePanel 4.0.1" "User Commands"
 .SH NAME
-TaurusDevicePanel \- manual page for TaurusDevicePanel 3.7.0
+TaurusDevicePanel \- manual page for TaurusDevicePanel 4.0.1
 .SH SYNOPSIS
 .B taurusdevicepanel
 [\fI\,options\/\fR] [\fI\,devname \/\fR[\fI\,attrs\/\fR]]
diff --git a/doc/man/taurusdoc.1 b/doc/man/taurusdoc.1
deleted file mode 100644
index 2431613..0000000
--- a/doc/man/taurusdoc.1
+++ /dev/null
@@ -1,48 +0,0 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSDOC "1" "February 2016" "taurusdoc 3.7.0" "User Commands"
-.SH NAME
-taurusdoc \- manual page for taurusdoc 3.7.0
-.SH SYNOPSIS
-.B taurusdoc
-[\fI\,options\/\fR]
-.SH DESCRIPTION
-a tool to help developers preview the documentation generated by their code
-.SH OPTIONS
-.TP
-\fB\-\-version\fR
-show program's version number and exit
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-show this help message and exit
-.TP
-\fB\-v\fR, \fB\-\-verbose\fR
-display a lot of information [default]
-.TP
-\fB\-q\fR, \fB\-\-quiet\fR
-be really silent
-.TP
-\fB\-\-build\-dir\fR=\fI\,BUILD_DIR\/\fR
-build directory [default=./build]
-.TP
-\fB\-a\fR, \fB\-\-all\-files\fR
-generate from scratch [default]
-.TP
-\fB\-\-cache\fR
-use previously generated files
-.TP
-\fB\-\-format\fR=\fI\,BUILDER\/\fR
-output format [default=html]
-.TP
-\fB\-\-prefix\fR=\fI\,PREFIX\/\fR
-output directory
-.TP
-\fB\-\-class\fR=\fI\,KLASS\/\fR
-full class name to generate doc for (ex.:
-taurus.qt.qtgui.display.TaurusLabel
-.TP
-\fB\-\-package\fR=\fI\,PACKAGE\/\fR
-full package name to generate doc for (ex.:
-taurus.qt.qtgui.display)
-.TP
-\fB\-\-file\fR=\fI\,FILENAME\/\fR
-RST file
diff --git a/doc/man/taurusform.1 b/doc/man/taurusform.1
index 7a5b037..ee9a716 100644
--- a/doc/man/taurusform.1
+++ b/doc/man/taurusform.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSFORM "1" "February 2016" "taurusform 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSFORM "1" "July 2016" "taurusform 4.0.1" "User Commands"
 .SH NAME
-taurusform \- manual page for taurusform 3.7.0
+taurusform \- manual page for taurusform 4.0.1
 .SH SYNOPSIS
 .B taurusform
 [\fI\,options\/\fR] [\fI\,model1 \/\fR[\fI\,model2 \/\fR...]]
diff --git a/doc/man/taurusgui.1 b/doc/man/taurusgui.1
index d2517c8..12f4263 100644
--- a/doc/man/taurusgui.1
+++ b/doc/man/taurusgui.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSGUI "1" "February 2016" "taurusgui 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSGUI "1" "July 2016" "taurusgui 4.0.1" "User Commands"
 .SH NAME
-taurusgui \- manual page for taurusgui 3.7.0
+taurusgui \- manual page for taurusgui 4.0.1
 .SH SYNOPSIS
 .B taurusgui
 [\fI\,options\/\fR] \fI\,confname\/\fR
diff --git a/doc/man/taurusdemo.1 b/doc/man/taurusiconcatalog.1
similarity index 83%
rename from doc/man/taurusdemo.1
rename to doc/man/taurusiconcatalog.1
index bea426a..9e0bea5 100644
--- a/doc/man/taurusdemo.1
+++ b/doc/man/taurusiconcatalog.1
@@ -1,19 +1,17 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSDEMO "1" "February 2016" "taurusdemo 1.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSICONCATALOG "1" "July 2016" "taurusiconcatalog 4.0.1" "User Commands"
 .SH NAME
-taurusdemo \- manual page for taurusdemo 1.0
+taurusiconcatalog \- manual page for taurusiconcatalog 4.0.1
 .SH SYNOPSIS
-.B taurusdemo
+.B taurusiconcatalog
 [\fI\,options\/\fR]
-.SH DESCRIPTION
-A demo application for taurus
 .SH OPTIONS
 .TP
-\fB\-h\fR, \fB\-\-help\fR
-show this help message and exit
-.TP
 \fB\-\-version\fR
 show program's version number and exit
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+show this help message and exit
 .IP
 Taurus Options:
 .IP
diff --git a/doc/man/taurusimage.1 b/doc/man/taurusimage.1
index 21472ed..40f20ff 100644
--- a/doc/man/taurusimage.1
+++ b/doc/man/taurusimage.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUS "1" "February 2016" "Taurus Image Dialog 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUS "1" "July 2016" "Taurus Image Dialog 4.0.1" "User Commands"
 .SH NAME
-Taurus \- manual page for Taurus Image Dialog 3.7.0
+Taurus \- manual page for Taurus Image Dialog 4.0.1
 .SH SYNOPSIS
 .B taurusimage
 [\fI\,options\/\fR] \fI\,<model>\/\fR
diff --git a/doc/man/tauruspanel.1 b/doc/man/tauruspanel.1
index 6303a22..73c5420 100644
--- a/doc/man/tauruspanel.1
+++ b/doc/man/tauruspanel.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSPANEL "1" "February 2016" "tauruspanel 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSPANEL "1" "July 2016" "tauruspanel 4.0.1" "User Commands"
 .SH NAME
-tauruspanel \- manual page for tauruspanel 3.7.0
+tauruspanel \- manual page for tauruspanel 4.0.1
 .SH SYNOPSIS
 .B tauruspanel
 [\fI\,options\/\fR] [\fI\,devname\/\fR]
diff --git a/doc/man/taurusplot.1 b/doc/man/taurusplot.1
index 2f6c794..4d98571 100644
--- a/doc/man/taurusplot.1
+++ b/doc/man/taurusplot.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSPLOT "1" "February 2016" "taurusplot 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSPLOT "1" "July 2016" "taurusplot 4.0.1" "User Commands"
 .SH NAME
-taurusplot \- manual page for taurusplot 3.7.0
+taurusplot \- manual page for taurusplot 4.0.1
 .SH SYNOPSIS
 .B taurusplot
 [\fI\,options\/\fR] [\fI\,<model1> \/\fR[\fI\,<model2>\/\fR] ...]
diff --git a/doc/man/taurusremotelogmonitor.1 b/doc/man/taurusremotelogmonitor.1
deleted file mode 100644
index 2a98d94..0000000
--- a/doc/man/taurusremotelogmonitor.1
+++ /dev/null
@@ -1,56 +0,0 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUS "1" "February 2016" "Taurus remote logger 1.0" "User Commands"
-.SH NAME
-Taurus \- manual page for Taurus remote logger 1.0
-.SH SYNOPSIS
-.B taurusremotelogmonitor
-[\fI\,options\/\fR]
-.SH DESCRIPTION
-Table that displays the taurus logging messages
-.SH OPTIONS
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-show this help message and exit
-.TP
-\fB\-g\fR, \fB\-\-gui\fR
-gui mode [default]
-.TP
-\fB\-c\fR, \fB\-\-console\fR
-console mode
-.TP
-\fB\-\-log\-port\fR=\fI\,LOG_PORT\/\fR
-port where log server is running [default: 9020]
-.TP
-\fB\-\-log\-name\fR=\fI\,LOG_NAME\/\fR
-filter specific log object [default: None, meaning
-don't filter]
-.TP
-\fB\-\-log\-level\fR=\fI\,LOG_LEVEL\/\fR
-filter specific log level.Allowed values are (case
-insensitive): critical, error, warning/warn, info,
-debug, trace [default: debug].
-.TP
-\fB\-\-version\fR
-show program's version number and exit
-.IP
-Taurus Options:
-.IP
-Basic options present in any taurus application
-.TP
-\fB\-\-taurus\-log\-level\fR=\fI\,LEVEL\/\fR
-taurus log level. Allowed values are (case
-insensitive): critical, error, warning/warn, info,
-debug, trace
-.TP
-\fB\-\-taurus\-polling\-period\fR=\fI\,MILLISEC\/\fR
-taurus global polling period in milliseconds
-.TP
-\fB\-\-taurus\-serialization\-mode\fR=\fI\,SERIAL\/\fR
-taurus serialization mode. Allowed values are (case
-insensitive): serial, concurrent (default)
-.TP
-\fB\-\-tango\-host\fR=\fI\,TANGO_HOST\/\fR
-Tango host name
-.TP
-\fB\-\-remote\-console\-port\fR=\fI\,PORT\/\fR
-enables remote debugging using the given port
diff --git a/doc/man/taurustestsuite.1 b/doc/man/taurustestsuite.1
new file mode 100644
index 0000000..8fa739f
--- /dev/null
+++ b/doc/man/taurustestsuite.1
@@ -0,0 +1,24 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSTESTSUITE "1" "July 2016" "taurustestsuite 4.0.1" "User Commands"
+.SH NAME
+taurustestsuite \- manual page for taurustestsuite 4.0.1
+.SH DESCRIPTION
+usage: taurustestsuite [\-h] [\-\-skip\-gui\-tests] [\-e EXCLUDE_PATTERN]
+.IP
+[\-\-version]
+.PP
+Main test suite for Taurus
+.SS "optional arguments:"
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+show this help message and exit
+.TP
+\fB\-\-skip\-gui\-tests\fR
+Do not perform tests requiring GUI
+.TP
+\fB\-e\fR EXCLUDE_PATTERN, \fB\-\-exclude\-pattern\fR EXCLUDE_PATTERN
+regexp pattern matching test ids to be excluded. (e.g.
+\&'taurus\e.core\e..*' would exclude taurus.core tests)
+.TP
+\fB\-\-version\fR
+show program's version number and exit
diff --git a/doc/man/taurustrend.1 b/doc/man/taurustrend.1
index f4d1af2..c655780 100644
--- a/doc/man/taurustrend.1
+++ b/doc/man/taurustrend.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSTREND "1" "February 2016" "taurustrend 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUSTREND "1" "July 2016" "taurustrend 4.0.1" "User Commands"
 .SH NAME
-taurustrend \- manual page for taurustrend 3.7.0
+taurustrend \- manual page for taurustrend 4.0.1
 .SH SYNOPSIS
 .B taurustrend
 [\fI\,options\/\fR] [\fI\,<model1> \/\fR[\fI\,<model2>\/\fR] ...]
diff --git a/doc/man/taurustrend1d.1 b/doc/man/taurustrend1d.1
index ac13e3f..571ffd5 100644
--- a/doc/man/taurustrend1d.1
+++ b/doc/man/taurustrend1d.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUS "1" "February 2016" "Taurus Trend 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUS "1" "July 2016" "Taurus Trend 4.0.1" "User Commands"
 .SH NAME
-Taurus \- manual page for Taurus Trend 3.7.0
+Taurus \- manual page for Taurus Trend 4.0.1
 .SH SYNOPSIS
 .B taurustrend1d
 [\fI\,options\/\fR] \fI\,<model>\/\fR
diff --git a/doc/man/taurustrend2d.1 b/doc/man/taurustrend2d.1
index afa6316..5c93b29 100644
--- a/doc/man/taurustrend2d.1
+++ b/doc/man/taurustrend2d.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUS "1" "February 2016" "Taurus Trend 2D 3.7.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
+.TH TAURUS "1" "July 2016" "Taurus Trend 2D 4.0.1" "User Commands"
 .SH NAME
-Taurus \- manual page for Taurus Trend 2D 3.7.0
+Taurus \- manual page for Taurus Trend 2D 4.0.1
 .SH SYNOPSIS
 .B taurustrend2d
 [\fI\,options\/\fR] \fI\,<model>\/\fR
diff --git a/doc/man/taurusui.1 b/doc/man/taurusui.1
deleted file mode 100644
index 2cf3a8d..0000000
--- a/doc/man/taurusui.1
+++ /dev/null
@@ -1,38 +0,0 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSUI "1" "February 2016" "taurusui 1.0" "User Commands"
-.SH NAME
-taurusui \- manual page for taurusui 1.0
-.SH SYNOPSIS
-.B taurusui
-[\fI\,options\/\fR] \fI\,<ui_file1> \/\fR[\fI\,<ui_file2> \/\fR...]
-.SH DESCRIPTION
-a taurus application that launches GUI(s) for the given .ui file(s)
-.SH OPTIONS
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-show this help message and exit
-.TP
-\fB\-\-version\fR
-show program's version number and exit
-.IP
-Taurus Options:
-.IP
-Basic options present in any taurus application
-.TP
-\fB\-\-taurus\-log\-level\fR=\fI\,LEVEL\/\fR
-taurus log level. Allowed values are (case
-insensitive): critical, error, warning/warn, info,
-debug, trace
-.TP
-\fB\-\-taurus\-polling\-period\fR=\fI\,MILLISEC\/\fR
-taurus global polling period in milliseconds
-.TP
-\fB\-\-taurus\-serialization\-mode\fR=\fI\,SERIAL\/\fR
-taurus serialization mode. Allowed values are (case
-insensitive): serial, concurrent (default)
-.TP
-\fB\-\-tango\-host\fR=\fI\,TANGO_HOST\/\fR
-Tango host name
-.TP
-\fB\-\-remote\-console\-port\fR=\fI\,PORT\/\fR
-enables remote debugging using the given port
diff --git a/doc/man/taurusuic4.1 b/doc/man/taurusuic4.1
deleted file mode 100644
index caa48bf..0000000
--- a/doc/man/taurusuic4.1
+++ /dev/null
@@ -1,47 +0,0 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
-.TH TAURUSUIC4 "1" "February 2016" "taurusuic4 *******************************************************************************" "User Commands"
-.SH NAME
-taurusuic4 \- manual page for taurusuic4 *******************************************************************************
-.SH SYNOPSIS
-.B taurusuic4
-[\fI\,options\/\fR] \fI\,<ui-file>\/\fR
-.SH DESCRIPTION
-*******************************************************************************
-taurusuic4 is deprecated since SEP11 (http://sf.net/p/sardana/wiki/SEP11)
-Consider using the taurus.qt.qtgui.util.UILoadable decorator instead
-*******************************************************************************
-.PP
-a taurus customized pyuic4
-.SH OPTIONS
-.TP
-\fB\-\-version\fR
-show program's version number and exit
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-show this help message and exit
-.HP
-\fB\-p\fR PREVIEW, \fB\-\-preview\fR=\fI\,PREVIEW\/\fR
-.TP
-\fB\-o\fR FILE, \fB\-\-output\fR=\fI\,FILE\/\fR
-write generated code to FILE instead of stdout
-.TP
-\fB\-x\fR, \fB\-\-execute\fR
-generate extra code to test and display the class
-.TP
-\fB\-d\fR, \fB\-\-debug\fR
-show debug output
-.TP
-\fB\-i\fR N, \fB\-\-indent\fR=\fI\,N\/\fR
-set indent width to N spaces, tab if N is 0 (default:
-4)
-.TP
-\fB\-w\fR, \fB\-\-pyqt3\-wrapper\fR
-generate a PyQt v3 style wrapper
-.TP
-\fB\-T\fR
-generate an additional taurus python file
-.PP
-taurusuic4 is deprecated since SEP11 (http://sf.net/p/sardana/wiki/SEP11)
-Consider using the taurus.qt.qtgui.util.UILoadable decorator instead
-*******************************************************************************
-taurusuic4 3.7.0
diff --git a/doc/mock.zip b/doc/mock.zip
index 6dc47bf..f93c672 100644
Binary files a/doc/mock.zip and b/doc/mock.zip differ
diff --git a/doc/source/_static/attributechooser01.png b/doc/source/_static/attributechooser01.png
deleted file mode 100644
index 10930fb..0000000
Binary files a/doc/source/_static/attributechooser01.png and /dev/null differ
diff --git a/doc/source/_static/macros/favouriteeditor01.png b/doc/source/_static/macros/favouriteeditor01.png
deleted file mode 100644
index 808e060..0000000
Binary files a/doc/source/_static/macros/favouriteeditor01.png and /dev/null differ
diff --git a/doc/source/_static/macros/macroexecutor01.odg b/doc/source/_static/macros/macroexecutor01.odg
deleted file mode 100644
index 75113e2..0000000
Binary files a/doc/source/_static/macros/macroexecutor01.odg and /dev/null differ
diff --git a/doc/source/_static/macros/macroexecutor01.png b/doc/source/_static/macros/macroexecutor01.png
deleted file mode 100644
index 055b58f..0000000
Binary files a/doc/source/_static/macros/macroexecutor01.png and /dev/null differ
diff --git a/doc/source/_static/macros/macroexecutor01_raw.png b/doc/source/_static/macros/macroexecutor01_raw.png
deleted file mode 100644
index a244370..0000000
Binary files a/doc/source/_static/macros/macroexecutor01_raw.png and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor01.png b/doc/source/_static/macros/macroparameterseditor01.png
deleted file mode 100644
index 69ba02a..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor01.png and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor02.png b/doc/source/_static/macros/macroparameterseditor02.png
deleted file mode 100644
index 8847a38..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor02.png and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor03.odg b/doc/source/_static/macros/macroparameterseditor03.odg
deleted file mode 100644
index 1002357..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor03.odg and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor03.png b/doc/source/_static/macros/macroparameterseditor03.png
deleted file mode 100644
index 10ed847..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor03.png and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor03_raw.png b/doc/source/_static/macros/macroparameterseditor03_raw.png
deleted file mode 100644
index db86a09..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor03_raw.png and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor04.odg b/doc/source/_static/macros/macroparameterseditor04.odg
deleted file mode 100644
index 244c2a5..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor04.odg and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor04.png b/doc/source/_static/macros/macroparameterseditor04.png
deleted file mode 100644
index c908572..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor04.png and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor04_raw.png b/doc/source/_static/macros/macroparameterseditor04_raw.png
deleted file mode 100644
index 86c2a57..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor04_raw.png and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor05.odg b/doc/source/_static/macros/macroparameterseditor05.odg
deleted file mode 100644
index 8007ac6..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor05.odg and /dev/null differ
diff --git a/doc/source/_static/macros/macroparameterseditor05.png b/doc/source/_static/macros/macroparameterseditor05.png
deleted file mode 100644
index ab65c57..0000000
Binary files a/doc/source/_static/macros/macroparameterseditor05.png and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor01.png b/doc/source/_static/macros/sequenceeditor01.png
deleted file mode 100644
index 34dbcfa..0000000
Binary files a/doc/source/_static/macros/sequenceeditor01.png and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor02.odg b/doc/source/_static/macros/sequenceeditor02.odg
deleted file mode 100644
index 5f4cedb..0000000
Binary files a/doc/source/_static/macros/sequenceeditor02.odg and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor02.png b/doc/source/_static/macros/sequenceeditor02.png
deleted file mode 100644
index 89b9db3..0000000
Binary files a/doc/source/_static/macros/sequenceeditor02.png and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor02_raw.png b/doc/source/_static/macros/sequenceeditor02_raw.png
deleted file mode 100644
index 34dbcfa..0000000
Binary files a/doc/source/_static/macros/sequenceeditor02_raw.png and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor03.odg b/doc/source/_static/macros/sequenceeditor03.odg
deleted file mode 100644
index 497a5f6..0000000
Binary files a/doc/source/_static/macros/sequenceeditor03.odg and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor03.png b/doc/source/_static/macros/sequenceeditor03.png
deleted file mode 100644
index b51ab80..0000000
Binary files a/doc/source/_static/macros/sequenceeditor03.png and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor03_raw.png b/doc/source/_static/macros/sequenceeditor03_raw.png
deleted file mode 100644
index 06acb0b..0000000
Binary files a/doc/source/_static/macros/sequenceeditor03_raw.png and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor04.odg b/doc/source/_static/macros/sequenceeditor04.odg
deleted file mode 100644
index 3493675..0000000
Binary files a/doc/source/_static/macros/sequenceeditor04.odg and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor04.png b/doc/source/_static/macros/sequenceeditor04.png
deleted file mode 100644
index cada20e..0000000
Binary files a/doc/source/_static/macros/sequenceeditor04.png and /dev/null differ
diff --git a/doc/source/_static/macros/sequenceeditor05_raw.png b/doc/source/_static/macros/sequenceeditor05_raw.png
deleted file mode 100644
index abc285c..0000000
Binary files a/doc/source/_static/macros/sequenceeditor05_raw.png and /dev/null differ
diff --git a/doc/source/_static/macros/sequencer01.odg b/doc/source/_static/macros/sequencer01.odg
deleted file mode 100644
index 37868ec..0000000
Binary files a/doc/source/_static/macros/sequencer01.odg and /dev/null differ
diff --git a/doc/source/_static/macros/sequencer01.png b/doc/source/_static/macros/sequencer01.png
deleted file mode 100644
index 8a563d8..0000000
Binary files a/doc/source/_static/macros/sequencer01.png and /dev/null differ
diff --git a/doc/source/_static/macros/sequencer01_raw.png b/doc/source/_static/macros/sequencer01_raw.png
deleted file mode 100644
index a14b78c..0000000
Binary files a/doc/source/_static/macros/sequencer01_raw.png and /dev/null differ
diff --git a/doc/source/_static/taurusgui-newgui01.png b/doc/source/_static/taurusgui-newgui01.png
new file mode 100644
index 0000000..3005fa9
Binary files /dev/null and b/doc/source/_static/taurusgui-newgui01.png differ
diff --git a/doc/source/_static/taurusiconcatalog-01.png b/doc/source/_static/taurusiconcatalog-01.png
new file mode 100644
index 0000000..c83143d
Binary files /dev/null and b/doc/source/_static/taurusiconcatalog-01.png differ
diff --git a/doc/source/_static/taurusiconcatalog-details01.png b/doc/source/_static/taurusiconcatalog-details01.png
new file mode 100644
index 0000000..551b85a
Binary files /dev/null and b/doc/source/_static/taurusiconcatalog-details01.png differ
diff --git a/doc/source/_templates/layout.html b/doc/source/_templates/layout.html
deleted file mode 100644
index 4ce9dd6..0000000
--- a/doc/source/_templates/layout.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{% extends "sphinxdoc/layout.html" %}
-
-{% block rootrellink %}
-    <li><a href="http://taurus-scada.org">home</a>| </li>
-    <li><a href="http://sourceforge.net/projects/sardana/">project</a>| </li>
-    <li><a href="https://pypi.python.org/pypi/taurus">download</a>| </li>
-    <li><a href="http://taurus.readthedocs.org">documentation </a> »</li>
-{% endblock %}
-
-{% block relbar1 %}
-{{ super() }}
-{% endblock %}
\ No newline at end of file
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 6057dc9..aa48060 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -3,33 +3,34 @@
 
 ##############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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, os
+import sys
+import os
 
 
 # declare some useful absolute paths
 _this_dir = os.path.dirname(os.path.abspath(__file__))
-_setup_dir = os.path.abspath(os.path.join(_this_dir, os.path.pardir, 
-                             os.path.pardir))
+_setup_dir = os.path.abspath(os.path.join(_this_dir, os.path.pardir,
+                                          os.path.pardir))
 _lib_dir = os.path.join(_setup_dir, 'lib')
 _doc_dir = os.path.join(_setup_dir, 'doc')
 _api_dir = os.path.join(_doc_dir, 'source', 'devel', 'api')
@@ -38,7 +39,7 @@ _mock_path = os.path.join(_doc_dir, 'mock.zip')
 
 # append mock dir to the sys path (mocks will be used if needed)
 sys.path.append(_mock_path)
-    
+
 # Import code from src distribution
 sys.path.insert(0, os.path.abspath(_lib_dir))
 
@@ -49,60 +50,41 @@ import taurus
 # documentation root, use os.path.abspath to make it absolute, like shown here.
 sys.path.append(os.path.abspath('sphinxext'))
 
-# -- RTD hack -----------------------------------------------------------------
-# This code is to allow RTD to build the catalog and the api
-# it has no effect on local builds
-
-on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
-if on_rtd:    
+# generate the api dir
+def _build_doc_api():
     import imp
-
-    def _build_catalog():
-        #import setup.py as a module
-        name = 'setup'
-        data = imp.find_module(name, [_setup_dir])
-        setupmod = imp.load_module(name, *data)
-        catalog = setupmod.build_catalog()
-        #build
-        fname = os.path.join(_doc_dir, 'source', 'devel', 'catalog.html')
-        catalog.fname = fname
-        catalog.builder_target_dir = _this_dir
-        catalog.thumbnails_source = os.path.join(_doc_dir, 'thumbnails.zip')
-        catalog.verbose = True
-        catalog.out = sys.stdout
-        catalog.run()
-        
-    def _build_doc_api():
-        #import auto_rst4api from the doc dir
-        name = 'auto_rst4api'
-        data = imp.find_module(name, [_doc_dir])
-        auto_rst4api = imp.load_module(name, *data)
-        API_Creator = auto_rst4api.Auto_rst4API_Creator
-        # prepare api creator
-        excl = ['_[^\.]*[^_]', '.*.extra_sardana', '.*.extra_pool', 
-                '.*.extra_macroexecutor', 'taurus.external']
-        rstCreator = API_Creator(exclude_patterns=excl,
-                                 templatespath=_doc_dir,
-                                 overwrite_old=True,
-                                 verbose=True)
-        # clean previously existing rst files
-        rstCreator.cleanAutogenerated(_api_dir)
-        # generate api
-        import taurus
-        r = rstCreator.documentModule('taurus', _api_dir)
-        # report
-        print("Auto Creation of API docs Finished with %i warnings:" % len(r))
-        for i in r:
-            print(i)
-        
-    #build the api and the catalog    
-    _build_catalog()
-    _build_doc_api()
-
-# ------------------------------------------------------------------------------
-
-
-# -- General configuration -----------------------------------------------------
+    # import auto_rst4api from the doc dir
+    name = 'auto_rst4api'
+    data = imp.find_module(name, [_doc_dir])
+    auto_rst4api = imp.load_module(name, *data)
+    API_Creator = auto_rst4api.Auto_rst4API_Creator
+    # prepare api creator
+    excl = ['_[^\.]*[^_]',
+            '.*\.test',
+            'taurus\.external',
+            'taurus\.qt\.qtgui\.extra_sardana',
+            'taurus\.qt\.qtgui\.extra_pool',
+            'taurus\.qt\.qtgui\.extra_macroexecutor',
+            'taurus\.qt\.qtgui\.resource',
+            'taurus\.qt\.qtgui\.taurusgui\.conf',
+            ]
+    rstCreator = API_Creator(exclude_patterns=excl,
+                             templatespath=_doc_dir,
+                             overwrite_old=True,
+                             verbose=True)
+    # clean previously existing rst files
+    rstCreator.cleanAutogenerated(_api_dir)
+    # generate api
+    import taurus
+    r = rstCreator.documentModule('taurus', _api_dir)
+    # report
+    print("Auto Creation of API docs Finished with %i warnings:" % len(r))
+    for i in r:
+        print(i)
+
+_build_doc_api()
+
+# -- General configuration -----------------------------------------------
 
 #autosummary_generate = True
 
@@ -120,7 +102,7 @@ extensions = ['sphinx.ext.pngmath',
               'taurusextension']
 
 # Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+#templates_path = ['_templates']
 
 # The suffix of source filenames.
 source_suffix = '.rst'
@@ -137,7 +119,8 @@ copyright = u'2011, ALBA - CELLS, Creative Commons Attribution-Share Alike 3.0'
 copyright = u"""Except where otherwise noted, content on this site is
 licensed under a Creative Commons Attribution 3.0 License"""
 
-#Ideally we would like to put the following html code for copyright... but how?
+# Ideally we would like to put the following html code for copyright...
+# but how?
 '''<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/es/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/es/88x31.png" /></a><br /><span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type">Taurus Documentation</span> by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">CELLS - ALBA</span> is licensed under a <a rel="lic [...]
 
 # The version info for the project you're documenting, acts as replacement for
@@ -187,12 +170,13 @@ pygments_style = 'sphinx'
 #modindex_common_prefix = []
 
 
-# -- Options for HTML output ---------------------------------------------------
+# -- Options for HTML output ---------------------------------------------
 
 # The theme to use for HTML and HTML Help pages.  Major themes that come with
 # Sphinx are currently 'default' and 'sphinxdoc'.
 #html_theme = 'default'
-html_theme = 'default'
+#html_theme = 'alabaster'
+html_theme = 'sphinx_rtd_theme'
 
 # Theme options are theme-specific and customize the look and feel of a theme
 # further.  For a list of options available for each theme, see the
@@ -200,7 +184,7 @@ html_theme = 'default'
 #html_theme_options = {}
 
 # Add any paths that contain custom themes here, relative to this directory.
-html_theme_path = []
+#html_theme_path = []
 #html_theme_path = ['themes']
 
 # The name for this set of Sphinx documents.  If None, it defaults to
@@ -263,7 +247,7 @@ html_static_path = ['_static']
 htmlhelp_basename = 'taurusdoc'
 
 
-# -- Options for LaTeX output --------------------------------------------------
+# -- Options for LaTeX output --------------------------------------------
 
 # The paper size ('letter' or 'a4').
 #latex_paper_size = 'letter'
@@ -274,8 +258,8 @@ htmlhelp_basename = 'taurusdoc'
 # Grouping the document tree into LaTeX files. List of tuples
 # (source start file, target name, title, author, documentclass [howto/manual]).
 latex_documents = [
-  ('index', 'taurus.tex', u'taurus Documentation',
-   u'taurus team', 'manual'),
+    ('index', 'taurus.tex', u'taurus Documentation',
+     u'taurus team', 'manual'),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
@@ -297,24 +281,24 @@ latex_documents = [
 
 todo_include_todos = True
 
-# -- Options for Graphviz  -----------------------------------------------------
+# -- Options for Graphviz  -----------------------------------------------
 
-inheritance_node_attrs = dict(shape='box', fontcolor='black', 
+inheritance_node_attrs = dict(shape='box', fontcolor='black',
                               height=0.5,
                               color='dodgerblue1', style='rounded')
 
 inheritance_graph_attrs = dict(rankdir="UD", ratio='compress')
 
-#inheritance_graph_attrs = dict(rankdir="LR", size='"6.0, 8.0"',
+# inheritance_graph_attrs = dict(rankdir="LR", size='"6.0, 8.0"',
 #                               fontsize=14, ratio='compress')
 
-# -- Options for reference to other documentation ------------------------------
+# -- Options for reference to other documentation ------------------------
 
 intersphinx_mapping = {
-    'http://docs.python.org/dev': None,
-    'http://docs.scipy.org/doc/scipy/reference' : None,
-    'http://docs.scipy.org/doc/numpy' : None,
-    'http://www.esrf.fr/computing/cs/tango/tango_doc/kernel_doc/pytango/latest/': None,
-    'http://pyqt.sourceforge.net/Docs/PyQt4/' : None,
+    'python': ('http://docs.python.org/dev', None),
+    'numpy': ('http://www.numpy.org', None),
+    'sardana': ('http://www.sardana-controls.org/en/stable/', None),
+    'pint': ('http://pint.readthedocs.io/en/stable/', None),
+    'PyTango': ('http://www.esrf.fr/computing/cs/tango/tango_doc/kernel_doc/pytango/latest/', None),
+    'PyQt4': ('http://pyqt.sourceforge.net/Docs/PyQt4/', None),
 }
-
diff --git a/doc/source/devel/coding_guide.rst b/doc/source/devel/coding_guide.rst
index 3ac9bbe..ee9aca6 100644
--- a/doc/source/devel/coding_guide.rst
+++ b/doc/source/devel/coding_guide.rst
@@ -14,20 +14,14 @@ development of taurus. So if you want to help out, read on!
 How to contribute to 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) is managed within the Sardana `Sardana
-sourceforge project <https://sourceforge.net/projects/sardana/>`_.
 
-The Taurus source code is now hosted in a `subdirectory
-<http://sourceforge.net/p/sardana/sardana.git/ci/master/tree/taurus/>`_ of the
-`main Sardana git repository <http://sourceforge.net/p/sardana/sardana.git>`_. 
+Taurus is Free Software developed in open way. Contributions to code,
+documentation, etc. are always welcome.
 
-See `instructions from Sardana about cloning and forking the sardana git
-repository <http://www.sardana-controls.org/devel/guide_coding.html>`_.
+The "official" Taurus source code is hosted in a `git repository
+<http://sf.net/p/tauruslib/taurus.git>`_.
+
+The details in how to contribute are described in the TEP7_ document.
 
 
 Documentation
@@ -43,51 +37,57 @@ to this format.
 Coding conventions
 ------------------
 
-* In general, we try to follow the standard Python style conventions as
-  described in
-  `Style Guide for Python Code  <http://www.python.org/peps/pep-0008.html>`_
-* Code **must** be python 2.6 compatible
-* Use 4 spaces for indentation
-* In the same file, different classes should be separated by 2 lines
-* use ``lowercase`` for module names. If possible prefix module names with the
-  word ``taurus`` (like :file:`taurusutil.py`) to avoid import mistakes.
-* use ``CamelCase`` for class names
-* python module first line should be::
-
-    #!/usr/bin/env python
-* python module should contain license information (see template below)
-* avoid poluting namespace by making private definitions private (``__`` prefix)
+- Code in Taurus should follow the standard Python style conventions as
+  described in PEP8_. Specially:
+
+  - Use 4 spaces for indentation
+  - Respect the maximum of 79 characters per line
+  - Surround top-level function and class definitions with two blank lines.
+  - use ``lower_case`` for module names. If possible prefix module names with the
+    word ``taurus`` (like :file:`taurusutil.py`) to avoid import mistakes.
+  - use ``CamelCase`` for class names
+  - use ``lower_case`` for method names, except in the context of taurus.qt
+    where the prevailing convention is ``mixedCase`` due to influence from PyQt
+
+- Code must be python 2.7 compatible, and, if possible, new contributions
+  should also consider being compatible with python3.5 (to prepare for
+  python3 support)
+- Every python module file should contain license information (see template below).
+  The preferred license is the LGPL_. If you need/want to use a different one,
+  it should be compatible with the LGPL v3+.
+- avoid polluting namespace by making private definitions private (``__`` prefix)
   or/and implementing ``__all__`` (see template below)
-* whenever a python module can be executed from the command line, it should 
+- whenever a python module can be executed from the command line, it should
   contain a ``main`` function and a call to it in a ``if __name__ == "__main__"``
   like statement (see template below)
-* document all code using Sphinx_ extension to reStructuredText_
+- All public API code should be documented (modules, classes and public API) using
+  Sphinx_ extension to reStructuredText_
 
-The following code can serve as a template for writting new python modules to
+The following code can serve as a template for writing new python modules to
 taurus::
 
     #!/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
+    # This file is part of Taurus
+    ##
+    # http://taurus-scada.org
+    ##
+    # Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
     ##
-    ## 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/>.
+    # 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/>.
     ##
     #############################################################################
 
@@ -110,17 +110,16 @@ Special notes about Qt programming
 -----------------------------------
 
 The following Qt guidelines are intended to ensure compatibility between all 
-PyQt4/PySide versions.
+PyQt4, PyQt5 and PySide versions.
 
-1. Avoid importing PyQt4/PySide directly.
-   Imports like::
+1. Avoid importing PyQt / PySide directly. Imports like::
    
-       from PyQt4 import Qt
-       from PyQt4 import QtCore
-       from PyQt4 import QtGui
-       from PyQt4 import QtNetwork
-       from PyQt4 import QtWebKit
-       from PyQt4 import Qwt5
+        from PyQt4 import Qt
+        from PyQt4 import QtCore
+        from PyQt4 import QtGui
+        from PyQt4 import QtNetwork
+        from PyQt4 import QtWebKit
+        from PyQt4 import Qwt5
    
    Should be replaced by::
    
@@ -131,66 +130,81 @@ PyQt4/PySide versions.
        from taurus.external.qt import QtWebKit
        from taurus.external.qt import Qwt5
 
-2. Usage of :class:`~PyQt4.QString` is **discouraged**. You should always use
-   :class:`str`. QString objects don't exist in PySide or in the new PyQt4
-   API 2. Code like::
-   
-       my_string = Qt.QString(" hello ")
-       my_string2 = my_string.trimmed()
-       label.setText(my_string2)
-       print label.text()
-   
-   Should be replaced by::
-   
-       my_string = " hello "
-       my_string2 = my_string.strip()
-       label.setText(my_string2)
-       print str(label.text())         # never assume Qt objects return str.
-
-   For compatibility reasons, QString and QStringList are always available
-   (even when using PySide or PyQt4 with API >=2) from 
-   :mod:`taurus.external.qt.Qt`.
-   Note that if you are using PySide or PyQt4 with API >=2 then QString is 
-   actually :class:`str` and QStringList is actually :class:`list`!
-   
-3. Usage of :class:`~PyQt4.QVariant` is **discouraged**. QVariant objects
-   don't exist in PySide or in the new PyQt4 API 2. Code like::
-   
-       def setData(self, index, qvalue, role=Qt.Qt.EditRole):
-           value = qvalue.toString()
-           self.buffer[index.column()] = value
-       
-       def data(self, index, role=Qt.Qt.DisplayRole):
-           value = self.buffer[index.column()]
-           
-           if role == Qt.Qt.DisplayRole:
-               return Qt.QVariant(value)
-           else:
-               return Qt.QVariant()
+2. Since Taurus v>=4.0, Qt-based code in Taurus may assume
+   that `PyQt API v2`_ is used. PyQt API 1 code, which was supported by Taurus 3,
+   is no longer guaranteed to work.
+
+   - Use standard python strings (e.g., use :class:`str` for Qt strings instead of
+     :class:`QString`). Code like::
+
+         my_string = Qt.QString(" hello ")
+         my_string2 = my_string.trimmed()
+
+     Should be replaced by::
+
+         my_string = " hello "
+         my_string2 = my_string.strip()
+
+
+   - Do not use :class:`QVariant`. QVariant objects don't exist in
+     PySide or in the new PyQt4 API 2. Code like::
+
+          def setData(self, index, qvalue, role=Qt.Qt.EditRole):
+              value = qvalue.toString()  # this assumes qvalue to be a :class:`QVariant`
+              self.buffer[index.column()] = value
+
+          def data(self, index, role=Qt.Qt.DisplayRole):
+              value = self.buffer[index.column()]
+
+              if role == Qt.Qt.DisplayRole:
+                  return Qt.QVariant(value)
+              else:
+                  return Qt.QVariant()
+
+     Should be replaced by::
+
+          def setData(self, index, value, role=Qt.Qt.EditRole):
+              self.buffer[index.column()] = value  # value is already a python object
+
+          def data(self, index, role=Qt.Qt.DisplayRole):
+              value = self.buffer[index.column()]
+
+              if role == Qt.Qt.DisplayRole:
+                  return value
+              else:
+                  return None
+
+     For compatibility reasons, :func:`~taurus.external.qt.Qt` defines `QVariant` and
+     `from_qvariant` which is internally used used to write code that supports both
+     API v1 and v2 for QVariant. But new code in Taurus v>=4 may assume v2 only.
+
+3. Use `new-style signals`_.
+   Old-style code like the following::
+
+       class MyWidget(Qt.QWidget):
+
+       def foo(self):
+           self.connect(self, Qt.SIGNAL('mySignal(int)', self.bar))
+           self.emit(Qt.SIGNAL('mySignal(int)', 123))
 
    Should be replaced by::
-   
-       def setData(self, index, qvalue, role=Qt.Qt.EditRole):
-           value = Qt.from_qvariant(qvalue, str)
-           self.buffer[index.column()] = value
-       
-       def data(self, index, role=Qt.Qt.DisplayRole):
-           value = self.buffer[index.column()]
-           
-           if role == Qt.Qt.DisplayRole:
-               return Qt.to_qvariant(value)
-           else:
-               return Qt.from_qvariant()
-
-   For compatibility reasons, QVariant are always available
-   (even when using PySide or PyQt4 with API >=2) from 
-   :mod:`taurus.external.qt.Qt`.
-   Note that if you are using PySide or PyQt4 with API >=2 then QVariant(pyobj)
-   if function that returns actually pyobj (exactly the same as
-   :func:`~taurus.external.qt.Qt.from_qvariant`.)
-
-.. _Tango: http://www.tango-controls.org/
-.. _Sardana: http://www.sardana-controls.org/
-.. _tango_cs: https://sourceforge.net/projects/tango-cs/
+
+       class MyWidget(Qt.QWidget):
+
+           mySignal = Qt.pyqtSignal(int)
+
+           def foo(self):
+               self.mySignal.connect(self.bar)
+               self.mySignal.emit(123)
+
+4. Use of :class:`taurus.qt.qtgui.application.TaurusApplication` instead of
+   :class:`QApplication` is recommended (it takes care of various
+   initialization and exit tasks that are convenient).
+
 .. _reStructuredText:  http://docutils.sourceforge.net/rst.html
-.. _Sphinx: http://sphinx.pocoo.org/
+.. _Sphinx: http://www.sphinx-doc.org
+.. _TEP7: http://sf.net/p/tauruslib/wiki/TEP7/
+.. _PEP8: http://www.python.org/peps/pep-0008.html
+.. _LGPL: http://www.gnu.org/licenses/lgpl.html
+.. _`PyQt API v2`: http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html
+.. _`new-style signals`: http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html
\ No newline at end of file
diff --git a/doc/source/devel/color_guide.rst b/doc/source/devel/color_guide.rst
deleted file mode 100644
index 061c723..0000000
--- a/doc/source/devel/color_guide.rst
+++ /dev/null
@@ -1,108 +0,0 @@
-.. _color-guide:
-
-===================
-Taurus color guide
-===================
-
-Taurus follows the ATK_ color scheme. The colors correspond to the tango DEV_STATE 
-data type and to the tango attibute quality.
-
-.. _state-color-guide:
-
-State
--------
-
-.. raw:: html
-
-    <html>
-    <head>
-    <title>Taurus color guide</title>
-    <style type="text/css">
-    .ON      { background: rgb(  0, 255,   0); color: rgb(  0,   0,   0); text-align: center; }
-    .OFF     { background: rgb(255, 255, 255); color: rgb(  0,   0,   0); text-align: center; }
-    .CLOSE   { background: rgb(255, 255, 255); color: rgb(  0, 128,   0); text-align: center; }
-    .OPEN    { background: rgb(  0, 255,   0); color: rgb(  0,   0,   0); text-align: center; }
-    .INSERT  { background: rgb(255, 255, 255); color: rgb(  0,   0,   0); text-align: center; }
-    .EXTRACT { background: rgb(  0, 255,   0); color: rgb(  0,   0,   0); text-align: center; }
-    .MOVING  { background: rgb(128, 160, 255); color: rgb(  0,   0,   0); text-align: center; }
-    .STANDBY { background: rgb(255, 255,   0); color: rgb(  0,   0,   0); text-align: center; }
-    .FAULT   { background: rgb(255,   0,   0); color: rgb(  0,   0,   0); text-align: center; }
-    .INIT    { background: rgb(204, 204, 122); color: rgb(  0,   0,   0); text-align: center; }
-    .RUNNING { background: rgb(128, 160, 255); color: rgb(  0,   0,   0); text-align: center; }
-    .ALARM   { background: rgb(255, 140,   0); color: rgb(255, 255, 255); text-align: center; }
-    .DISABLE { background: rgb(255,   0, 255); color: rgb(  0,   0,   0); text-align: center; }
-    .UNKNOWN { background: rgb(128, 128, 128); color: rgb(  0,   0,   0); text-align: center; }
-    .NONE    { background: rgb(128, 128, 128); color: rgb(  0,   0,   0); text-align: center; }
-    tr.state_row   { height: 40px; }
-    </style>
-    </head>
-    <body align="center">
-    <table width="100%" border="1" cellspacing="0" cellpadding="2">
-    <caption>color scheme for the State</caption>
-    <tr><th>State</th><th>Background</th><th>Foreground</th><th width="80">Preview</th></tr>
-    <tr class="state_row"><td>ON</td><td>Dead Frog Green (0,255,0)</td><td>Black (0,0,0)</td><td class="ON">ON</td></tr>
-    <tr class="state_row"><td>OFF</td><td>White (255,255,255)</td><td>Black (0,0,0)</td><td class="OFF">OFF</td></tr>
-    <tr class="state_row"><td>CLOSE</td><td>White (255,255,255)</td><td>Green (0,128,0)</td><td class="CLOSE">CLOSE</td></tr>
-    <tr class="state_row"><td>OPEN</td><td>Dead Frog Green (0,255,0)</td><td>Black (0,0,0)</td><td class="OPEN">OPEN</td></tr>
-    <tr class="state_row"><td>INSERT</td><td>White (255,255,255)</td><td>Black (0,0,0)</td><td class="INSERT">INSERT</td></tr>
-    <tr class="state_row"><td>EXTRACT</td><td>Dead Frog Green (0,255,0)</td><td>Black (0,0,0)</td><td class="EXTRACT">EXTRACT</td></tr>
-    <tr class="state_row"><td>MOVING</td><td>Light Blue (128,160,255)</td><td>Black (0,0,0)</td><td class="MOVING">MOVING</td></tr>
-    <tr class="state_row"><td>STANDBY</td><td>Yellow (255,255,0)</td><td>Black (0,0,0)</td><td class="STANDBY">STANDBY</td></tr>
-    <tr class="state_row"><td>FAULT</td><td>Red (255,0,0)</td><td>Black (0,0,0)</td><td class="FAULT">FAULT</td></tr>
-    <tr class="state_row"><td>INIT</td><td>Grenoble (204,204,122)</td><td>Black (0,0,0)</td><td class="INIT">INIT</td></tr>
-    <tr class="state_row"><td>RUNNING</td><td>Light Blue (128,160,255)</td><td>Black (0,0,0)</td><td class="RUNNING">RUNNING</td></tr>
-    <tr class="state_row"><td>ALARM</td><td>Orange (255,140,0)</td><td>White (255,255,255)</td><td class="ALARM">ALARM</td></tr>
-    <tr class="state_row"><td>DISABLE</td><td>Magenta (255,0,255)</td><td>Black (0,0,0)</td><td class="DISABLE">DISABLE</td></tr>
-    <tr class="state_row"><td>UNKNOWN</td><td>Gray (128,128,128)</td><td>Black (0,0,0)</td><td class="UNKNOWN">UNKNOWN</td></tr>
-    <tr class="state_row"><td>None</td><td>Gray (128,128,128)</td><td>Black (0,0,0)</td><td class="NONE">-----</td></tr>
-    </table>
-    </body>
-    </html>
-
-.. _quality-color-guide:
-
-Attribute quality
------------------
-
-.. raw:: html
-
-    <html>
-    <head>
-    <title>Taurus color guide</title>
-    <style type="text/css">
-    .ATTR_INVALID  { background: rgb(128, 128, 128); color: rgb(255, 255, 255); text-align: right; }
-    .ATTR_VALID    { background: rgb(0,   255,   0); color: rgb(  0,   0,   0); text-align: right; }
-    .ATTR_ALARM    { background: rgb(255, 140,   0); color: rgb(255, 255, 255); text-align: right; }
-    .ATTR_WARNING  { background: rgb(255, 140,   0); color: rgb(  0,   0,   0); text-align: right; }
-    .ATTR_CHANGING { background: rgb(128, 160, 255); color: rgb(  0,   0,   0); text-align: right; }
-    .ATTR_UNKNOWN  { background: rgb(128, 128, 128); color: rgb(  0,   0,   0); text-align: right; }
-    .ATTR_NONE     { background: rgb(128, 128, 128); color: rgb(  0,   0,   0); text-align: right; }
-    tr.quality_row { height: 40px; }
-    </style>
-    </head>
-    <body>
-    <table width="100%" border="1" cellspacing="0" cellpadding="2">
-    <caption>color scheme for the quality</caption>
-    <tr><th>Quality</th><th>Background</th><th>Foreground</th><th width="80">Preview</th></tr>
-    <tr class="quality_row"><td>ATTR_INVALID</td><td>Gray (128,128,128)</td><td>White (255,255,255)</td><td class="ATTR_INVALID">-----</td></tr>
-    <tr class="quality_row"><td>ATTR_VALID</td><td>Dead Frog Green (0,255,0)</td><td>Black (0,0,0)</td><td class="ATTR_VALID">10.89 mV</td></tr>
-    <tr class="quality_row"><td>ATTR_ALARM</td><td>Orange (255,140,0)</td><td>White (255,255,255)</td><td class="ATTR_ALARM">76.54 mV</td></tr>
-    <tr class="quality_row"><td>ATTR_WARNING</td><td>Orange (255,140,0)</td><td>Black (0,0,0)</td><td class="ATTR_WARNING">64.23 mV</td></tr>
-    <tr class="quality_row"><td>ATTR_CHANGING</td><td>Light Blue (128,160,255)</td><td>Black (0,0,0)</td><td class="ATTR_CHANGING">20.45 mV</td></tr>
-    <tr class="quality_row"><td>None</td><td>Gray (128,128,128)</td><td>Black (0,0,0)</td><td class="ATTR_NONE">-----</td></tr>
-    </table>
-    </body>
-    </html>
-    
-
-.. _Tango: http://www.tango-controls.org/
-.. _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
-.. _Qt: http://qt.nokia.com/products/
-.. _PyQt: http://www.riverbankcomputing.co.uk/software/pyqt/
-.. _PyQwt: http://pyqwt.sourceforge.net/
-.. _IPython: http://ipython.scipy.org/
-.. _ATK: http://www.tango-controls.org/Documents/gui/atk/tango-application-toolkit
-.. _Qub: http://www.blissgarden.org/projects/qub/
-.. _ESRF: http://www.esrf.eu/
diff --git a/doc/source/devel/core_tutorial.rst b/doc/source/devel/core_tutorial.rst
index f7c666c..db25dc1 100644
--- a/doc/source/devel/core_tutorial.rst
+++ b/doc/source/devel/core_tutorial.rst
@@ -7,167 +7,192 @@
 taurus core tutorial
 =====================
 
-The core module, besides other things, is a container for models (we will use 
-the term "model" to refer to the model component in an MVC driven architecture).
+The core has been designed to provide a model-based abstraction to the various 
+sources of data and/or control objects supported via the Taurus schemes (we use 
+the term "model" to refer to the model component in an MVC driven architecture). 
 
-The core as been designed to provide models for Tango_ but can also be extended 
-to provide models for other libraries like SPEC_ or EPICS_. That is why you will
-never find yourself writting code to create Device objects directly.
-Instead, all requests for taurus objects should go through one of the two major 
-``taurus.core`` components:
+An scheme is a plugin for Taurus that provides the glue between Taurus and a
+given source of data and/or of objects that can be controlled. For example, 
+schemes exist for various control system libraries (such as
+Tango_, or EPICS_) as well as for processing data (e.g. the
+:mod:`taurus.core.evaluation` scheme).
 
-  - :class:`taurus.core.TaurusManager`
-  - :class:`taurus.core.TaurusFactory`
-
-An important aspect of the core is that it is only dependent on PyTango_. This
-means that you could potentially use taurus.core inside your python device server
-to access any other tango elements (database, devices, attributes...)
-
-But before I show you how to access these objects, a word on the taurus concept of
-model.
+Each scheme implements at least a Factory (derived from 
+:class:`taurus.core.TaurusFactory`) which provides Taurus model objects ,
+for a given model name.
 
 .. _model-concept:
 
-model concept
+Model concept
 -------------
 
-The model in taurus is tipically any server based object like Database, Device, 
-Attribute. Each model has a unique name (model name). This name is a string 
-with a Uniform Resouce Identifier (URI) format.
+All Taurus Elements (Devices, Attributes, etc) are model objects with an 
+associated unique name. The model name is an URI (as defined in RFC3986_).
 
-::
+In practice, the URIs have the following form (for a complete and rigorous 
+description refer to RFC3986_):
 
-    foo://username:password@example.com:8042/over/there/index.dtb;type=animal?name=ferret#nose
-    \ /   \________________/\_________/ \__/\_________/ \___/ \_/ \_________/ \_________/ \__/
-     |           |               |        |     |         |     |       |            |     |
-  scheme     userinfo         hostname  port  path  filename extension parameter(s) query fragment
-          \________________________________/
-                      authority
+[<scheme>:][<authority>][<path>][?<query>][#<fragment>]
 
-For Tango:
+Notes: 
 
-- The 'scheme' must be the string "tango" (lowercase mandatory)
+- The <authority>, if present, starts by '//'
+- The <path>, if present, starts by '/' (except for relative URIs)
 
-- The 'authority' is the Tango database (<hostname> and <port> mandatory)
+A model object (also referred to occasionally as Taurus Element) is an instance 
+of a class derived from one of :class:`taurus.core.TaurusAuthority`, 
+:class:`taurus.core.TaurusDevice`, :class:`taurus.core.TaurusAttribute`.
 
-- The 'path' is the Tango object, which can be a Device or Attribute.
-  For device it must have the format _/_/_ or alias 
-  For attribute it must have the format _/_/_/_ or devalias/_
-  
-- The 'filename' and 'extension' are always empty
 
-- The 'parameter' is always empty
+Examples of model names
+-----------------------
 
-- The 'the query' is valid when the 'path' corresponds to an Attribute. Valid
-  queries must have the format configuration=<config param>. Valid 
-  configuration parameters are: label, format, description, unit, display_unit, 
-  standard_unit, max_value, min_value, max_alarm, min_alarm, 
-  max_warning, min_warning. in this case the Tango object is a Configuration
+Different schemes may choose different conventions to name the models that they
+provide. 
 
-So, for example, the full model name for the tango device `sys/tg_test/1` is: 
+The following are some examples for the :mod:`taurus.core.tango` scheme:
+
+The full Taurus model name for a Tango device `sys/tg_test/1` registered in
+a Tango Database running on `machine:10000` is:
 
 ``tango://machine:10000/sys/tg_test/1``
 
-taurus uses the tango scheme by default so the previous name can be shortened to:
+Now, if we assume that:
 
-``machine:10000/sys/tg_test/1``
+  - ``tango`` is set as the default scheme and that
+  - ``machine:10000`` is set as the default TANGO_HOST
+  - and that ``tgtest1`` is set as an alias of ``sys/tg_test/1``
 
-and if you have a TANGO_HOST (or tango.rc) pointing to `machine:10000` you can
-even reduce the previous name to a shorter one:
+then the same Tango device could be accessed as:
 
-``sys/tg_test/1``
+``tgtest1``
 
-Below follows a non exaustive list of taurus models that convers 99% of the needs:
+In the case of Tango attributes, here are some equivalent examples given the
+above assumptions:
+  
+``tango://machine:10000/sys/tg_test/1/double_scalar``,
+ 
+``sys/tg_test/1/double_scalar``,
 
-- *scheme*: the URI scheme (aka protocol)
+``tango:tgtest1/double_scalar``,
 
-  - Syntax: ``<string>://``
-  - For tango is always: ``tango://``
-  
-- *database*
+``tgtest1/double_scalar``
 
-  - For tango: ``[<scheme>]<host>:<port>``
-  - example: ``tango://machine:10000``
-  
-- *device*
+See :mod:`taurus.core.tango` for a more exhaustive description and more
+examples related to Tango.
 
-  - For tango: ``[<database>/]<string>/<string>/<string> | [<database>/]<string>``
-  - examples: ``tango://machine:10000/sys/tg_test/1``, ``sys/tg_test/1``, ``tango://tg_test1``, ``tg_test1``
-  
-- *attribute*
+The following are some examples for the :mod:`taurus.core.evaluation` scheme:
 
-  - For tango: ``<device>/<string>``
-  - examples: ``tango://machine:10000/sys/tg_test/1/position``, ``sys/tg_test/1/double_scalar``, ``tango://tg_test1/double_scalar``, ``tg_test1/double_scalar``
+An evaluation attribute that generates an array of dimensionless random
+values when read:
+    
+``eval:rand(256)``
 
-- *attribute configuration parameter*
+An evaluation attribute that applies a multiplication factor to an existing 
+tango attribute (and which is updated every time that the tango attribute 
+changes):
 
-  - For tango: ``<attribute>?configuration=<string>``
-  - example: ``sys/tg_test/1/double_scalar?configuration=label``
+``eval:123.4*{tango:sys/tg_test/1/double_scalar}``
 
-model access
-------------
+Or one that adds noise to a tango image attribute:
+    
+``eval:img={tango:sys/tg_test/1/short_image_ro};img+10*rand(*img.shape)``
 
-As mentioned above, a model object is obtained through the :class:`taurus.core.TaurusManager` 
-and :class:`taurus.core.TaurusFactory` classes.
-To simplify the API, taurus provides some functions that hide the access to the
-:class:`taurus.core.TaurusManager` and :class:`taurus.core.TaurusFactory` classes. So here is 
-how you get a model object for a device called `sys/tg_test/1`::
+See :mod:`taurus.core.evaluation` for a more exhaustive description and some 
+tricks with the Evaluation scheme (e.g. creating custom evaluators to run 
+arbitrary python code).
 
-    import taurus
-    tautest = taurus.Device('sys/tg_test/1')
+Now an example for the :mod:`taurus.core.epics` scheme. The model name for the 
+EPICS process variable (PV) "my:example.RBV" is:
 
-At first you may think that this code contradicts what I said before about not 
-creating taurus models directly. This is because taurus.Device is a function, not a 
-python class. Here is the equivalent code accessing the low level taurus library::
+``epics:my:example.RBV``
 
-    import taurus.core
-    manager = taurus.core.TaurusManager()
-    factory = manager.getFactory() # by default the factory scheme is 'tango'
-    tautest = factory.getDevice('sys/tg_test/1')
+Note that you can create your own schemes and add them to taurus (e.g., an 
+scheme to access your own home-brew control system). Some schemes that are in 
+our TO-DO list are:
 
-In line 2 taurus gives you a reference to the singleton object of class 
-:class:`taurus.core.TaurusManager`. In line 3 the manager gives you a singleton 
-reference to a tango implementation of the class :class:`taurus.core.TaurusFactory` 
-(should be :class:`taurus.core.tango.TangoFactory`). In line 4, the factory gives 
-you a tango implementation of the class :class:`taurus.core.TaurusDevice` (should be
-:class:`taurus.core.tango.TangoDevice`).
+- A scheme to access datasets in HDF5 files as Taurus attributes
+- A scheme to access ranges of cells in a spreadsheet file as Taurus attributes
+- A scheme to access column/row data in ASCII files as Taurus attributes
+- A scheme to access data from mySQL databases as Taurus attributes
+- A scheme to access Tango-archived data as Taurus attributes
+ 
+model access
+------------
 
-If you don't know which type of object your model name represents, you can use::
+Taurus users are encouraged to write code that is "scheme-agnostic",
+that is, that it neither assumes the availability of certain schemes nor uses
+any scheme-specific feature. For this, Taurus provides several high-level 
+scheme-agnostic helpers to obtain the Taurus Element associated to a given 
+model name:
+
+- :func:`taurus.Authority`
+- :func:`taurus.Device`
+- :func:`taurus.Attribute`
+- :func:`taurus.Object`
+
+The first four helpers require you to know which type of Element (e.g., 
+Attribute, Device,...) is represented by the model name. If you do not know that
+beforehand, you can use :meth:`taurus.Object` which will automatically find the 
+type and provide you with the corresponding model object (but of course this is 
+slightly less efficient than using one of the first three helpers).
+
+These helpers will automatically find out which scheme corresponds to the given 
+model and will delegate the creation of the model object to the corresponding 
+scheme-specific Factory. Therefore, the returned model object will be of a 
+specialized subclass of the corresponding Taurus generic Element and it 
+will expose the scheme-agnostic API plus optionally some scheme-specific 
+methods (e.g., :class:`taurus.core.tango.TangoDevice` objects provide all the 
+API of a :class:`taurus.core.TaurusDevice` but they also provide all the methods 
+from a :class:`PyTango.DeviceProxy`)
+
+For example, obtaining the device model object for a TangoTest Device
+can be done as follows::
 
     import taurus
-    tautest = taurus.Object('sys/tg_test/1')
-
-or the equivalent low level API::
+    testDev = taurus.Device('sys/tg_test/1')
+    
+or, using :meth:`taurus.Object`::
+ 
+    import taurus
+    testDev = taurus.Object('sys/tg_test/1')
+    
+Also for example, obtaining the Taurus Attribute model corresponding to the 
+EPICS Process Variable called "my:example.RBV" is just::
 
-    import taurus.core
-    manager = taurus.core.TaurusManager()
-    tautest = manager.getObject('sys/tg_test/1')
+    import taurus
+    testDev = taurus.Attribute('epics:my:example.RBV')
 
-Note, however, that that using the Object API is slightly slower since you are
-implicitly asking taurus to search for the appropriate model type that corresponds
-to the model name you gave.
+Taurus also provides other helpers to access lower level objects for dealing
+with models:
 
-Similarly, if you need access to an attribute (say double_scalar) the code should be::
+- :func:`taurus.Factory`
+- :func:`taurus.Manager`
 
-    import taurus
-    position = taurus.Attribute('sys/tg_test/1/double_scalar')
+And also some useful methods to validate names, find out the element type(s) 
+for a given name and other related tasks:
 
-or if you have already a taurus device::
+- :func:`taurus.isValidName`
+- :func:`taurus.getValidTypesForName`
+- :func:`taurus.getSchemeFromName`
 
-    import taurus
-    tautest = taurus.Device('sys/tg_test/1')
-    position = tautest.getAttribute('double_scalar')
 
-Advantages over PyTango
------------------------
+Advantages of accessing Tango via Taurus over PyTango
+-----------------------------------------------------
 
 If you are familiar with PyTango_ you may be asking yourself what is the real 
-advantage of using taurus instead of PyTango_ directly. There are actually many 
-benefits from using taurus. Here is a list of the most important ones.
+advantage of using taurus instead of PyTango_ directly for accessing Tango 
+objects. There are actually many benefits from using taurus. Here is a list of 
+the most important ones.
+
+*integration with other schemes*
+    Taurus is not just Tango. For example, you can treat a Tango Attribute just 
+    as you would treat an EPICS attribute, and use them both in the same 
+    application. 
 
 *model unicity:*
-    you may request as many times as you like for the same model name and taurus
-    will give you the same object::
+    you may request the same model many times without performance hit, since
+    taurus will give you the same object::
         
         >>> import taurus
         >>> sim1 = taurus.Device('sys/tg_test/1')
@@ -184,13 +209,13 @@ benefits from using taurus. Here is a list of the most important ones.
         >>> print sim1 == sim2
         False
 
-*model inteligence:*
-    taurus is clever enough to know that, for example, 'sys/tg_test/1' represents
-    the same model as 'tango://SYS/Tg_TEST/1' so::
+*model intelligence:*
+    taurus is clever enough to know that, for example, 'sys/tg_test/1' 
+    represents the same model as 'tango:SYS/Tg_TEST/1' so::
     
         >>> import taurus
         >>> sim1 = taurus.Device('sys/tg_test/1')
-        >>> sim2 = taurus.Device('tango://SYS/Tg_TEST/1')
+        >>> sim2 = taurus.Device('tango:SYS/Tg_TEST/1')
         >>> print sim1 == sim2
         True
     
@@ -206,14 +231,5 @@ benefits from using taurus. Here is a list of the most important ones.
     
 .. _Tango: http://www.tango-controls.org/
 .. _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
-.. _Qt: http://qt.nokia.com/products/
-.. _PyQt: http://www.riverbankcomputing.co.uk/software/pyqt/
-.. _PyQwt: http://pyqwt.sourceforge.net/
-.. _IPython: http://ipython.scipy.org/
-.. _ATK: http://www.tango-controls.org/Documents/gui/atk/tango-application-toolkit
-.. _Qub: http://www.blissgarden.org/projects/qub/
-.. _numpy: http://numpy.scipy.org/
-.. _SPEC: http://www.certif.com/
-.. _EPICS: http://www.aps.anl.gov/epics/
\ No newline at end of file
+.. _EPICS: http://www.aps.anl.gov/epics/
+.. _RFC3986: https://tools.ietf.org/html/rfc3986
\ No newline at end of file
diff --git a/doc/source/devel/designer_tutorial.rst b/doc/source/devel/designer_tutorial.rst
index 3c51760..1443543 100644
--- a/doc/source/devel/designer_tutorial.rst
+++ b/doc/source/devel/designer_tutorial.rst
@@ -4,10 +4,13 @@
 Taurus Qt Designer tutorial
 ============================
 
-The Taurus Qt Designer tutorial is the first tutorial in the documentation 
-because it will allow you to create GUIs without writting any code at all!
+Taurus widgets behave just as any other Qt widget, and as such, they can be used
+to create GUIs in a regular way, both programmatically or using the Qt designer.
+For convenience, Taurus provides the `taurusdesigner` command that launches the
+standard Qt designer application extended to show also the widgets provided by
+Taurus.
 
-You should start the designer by executing on the command line::
+To launch it, just execute::
   
   taurusdesigner
 
@@ -15,150 +18,28 @@ You should start the designer by executing on the command line::
 
   ``--help`` argument will give you the complete list of options
 
-This script will configure the qt designer environment to be used with taurus.
-After the designer is started you should see something like this (Note: the 
-display may not be exactly the same depending on OS, Window manager and 
-Qt designer version):
 
 .. figure:: /_static/designer01.png
   :scale: 75
 
 You can then design your application/widget using not only the standard Qt
-widgets but also the taurus widgets. 
-
-.. _generate-code:
-
-Generating code
-----------------  
-
-The Qt designer will produce a .ui file that is an XML representation of the
-application/widget that you designed.
-To generate python code you should use the **taurusuic4** tool instead of
-pyqt's pyuic4 tool. 
-Suppose you created a GUI called MyGUI.ui and you want to generate python code.
-All you have to do is simply execute in the command line::
-    
-  taurusuic4 -x -o ui_MyGUI.py MyGUI.ui
-
-.. tip::
-
-  ``--help`` argument will give you the complete list of options
-  
-This will generate an executable python file called MyGUI.py. You can test the
-code by doing::
-
-  python MyGUI.py
-  
-How to create custom QtDesigner enabled taurus widgets
---------------------------------------------------------
-
-It is possible to create new taurus widgets using qt designer and make them
-automatically visible in the qt designer's widget catalog the next time you start
-qt designer.
-
-The first thing you must do is create a new widget from an existing Taurus widget
-containter:
-
-.. figure:: /_static/designer02.png
-    :scale: 80
-    
-    Qt designer widget creation dialog
-    
-Then give the name of the frame the widget class name (let's say you call it
-MyWidget):
-
-.. figure:: /_static/designer03.png
-
-    Qt designer widget property editor panel 
- 
-After you are done designing the widget save it as a .ui file (let's say
-you called it mywidget.ui):
-
-.. figure:: /_static/designer04.png
-
-    Sample widget created in the Qt designer
-
-and generate python code like it was described in :ref:`generate-code`::
-
-  taurusuic4 -x -o ui_mywidget.py mywidget.ui
-
-.. note::
-    You MUST use the '-o' option if you want to enable creation of taurus widget
-    code since the generated python taurus code will import the file you supply
-    in the -o parameter. This means that using the syntax::
-    
-        taurusuic4 -x mywidget.ui > ui_mywidget.py 
-  
-    will work but it will NOT trigger taurus code generation (just the uic4 code
-    generation).
-
-The taurusuic4 tool will recognize that the code being generated could be a
-taurus widget and it offers to generate an additional file for it::
-
-    $ taurusuic4 -x -o ui_mywidget.py mywidget.ui
-    
-    Do you whish to generate a Taurus widget (N/y) ? y
-    Python file name (mywidget.py) ?
-    Python package name (mywidget) ?
-    Python class name (MyWidget) ?
-    Python super class name (TaurusWidget) ?
-    Generate Qt designer info (Y/n) ? y
-    Qt group (Taurus Containers) ? My Taurus
-    Qt icon (:/designer/widget.png) ?
-    Qt container (N/y) ?
-
-At this time, several questions are asked, all of them have default values:
-
-    - Do you whish to generate a Taurus widget (N/y)
-        - if you answer no then no taurus code file is generated.
-        
-    - Python file name (mywidget.py) ?
-        - which will be the name of the taurus python file. 
-          Defaults to the widget class name in lower case.
-    
-    - Python package name (mywidget) ?
-        - full python package name. If you would be doing a standard taurus widget,
-          it would be 'taurus.qt.qtgui'
-          
-    - Python class name (MyWidget) ?
-        - which will be the name of the taurus class. Defaults to the frame object name.
-          You may desire to give a different name if the final widget needs some extra logic.
-          In this case you can name it MyWidgetBase and afterward manually create in your code
-          a subclass called MyWidget that adds all the extra logic.
-          
-    - Python super class name (TaurusWidget) ?
-        - the python super class. Just in case you want to override the default
-          super class. Use a non different class only if you are sure of what
-          you are doing.
-        
-    - If you choose to generate qt designer information:
-        - Qt group (Taurus Containers) ?
-            - in which group of widgets should your widget appear in the designer
-        - Qt icon (:/designer/widget.png) ?
-            - which would be the icon in the designer
-        - Qt container (Y/n) ?
-            - wheater or not the widget you created is a container widget.
-      
-You should now be able to start the designer again::
-
-    taurusdesigner --taurus-path=/home/tcoutinho/workspace/mytauruslib
-    
-and you should see your new widget:
-
-.. figure:: /_static/designer05.png
-
-  Qt designer widget catalog panel
-  
-    
-
-
-
+widgets but also the taurus widgets.
 
+You can use the Taurus Qt Designer to define a full GUI, but instead
+we recommend to create the GUIs using the
+:ref:`TaurusGUI framework <taurusgui_newgui>` and use the
+Taurus Qt Designer just for creating widgets to be inserted as panels in a
+:class:`taurus.qt.qtgui.taurusgui.TaurusGui`-based GUI.
 
 
 
+Using the .ui file
+-------------------
 
+The Qt designer will produce a .ui file that is an XML representation of the
+application/widget that you designed.
 
+This .ui file can then be used in your own widget by using the
+:func:`taurus.qt.qtgui.util.UILoadable` decorator.
 
-  
-      
\ No newline at end of file
+See `TEP11 <http://sf.net/p/sardana/wiki/SEP11/>`_ for more details.
\ No newline at end of file
diff --git a/doc/source/devel/examples.rst b/doc/source/devel/examples.rst
index 23a4dca..e352709 100644
--- a/doc/source/devel/examples.rst
+++ b/doc/source/devel/examples.rst
@@ -109,13 +109,13 @@ code::
     w1, w2 = TaurusLabel(), TaurusLabel()
     layout.addWidget(w1)
     layout.addWidget(w2)
-    w1.model, w1.bgRole = 'sys/taurustest/1/position?configuration=label', ''
+    w1.model, w1.bgRole = 'sys/taurustest/1/position#label', ''
     w2.model = 'sys/taurustest/1/position'
     
 *Much better indeed!*
 
-Display attribute value with label and units
---------------------------------------------
+Display attribute value with label and separate units
+-----------------------------------------------------
 
 And little bit more... add the units.
 
@@ -131,9 +131,9 @@ code::
     layout.addWidget(w1)
     layout.addWidget(w2)
     layout.addWidget(w3)
-    w1.model, w1.bgRole = 'sys/taurustest/1/position?configuration=label', ''
-    w2.model = 'sys/taurustest/1/position'
-    w3.model, w3.bgRole = 'sys/taurustest/1/position?configuration=unit', ''
+    w1.model, w1.bgRole = 'sys/taurustest/1/position#label', ''
+    w2.model = 'sys/taurustest/1/position#rvalue.magnitude'
+    w3.model, w3.bgRole = 'sys/taurustest/1/position#rvalue.units', ''
 
 *Nice isn't it?*
 
@@ -172,10 +172,10 @@ code::
     layout.addWidget(w2)
     layout.addWidget(w3)
     layout.addWidget(w4)
-    w1.model, w1.bgRole = 'sys/taurustest/1/position?configuration=label', ''
+    w1.model, w1.bgRole = 'sys/taurustest/1/position#label', ''
     w2.model = 'sys/taurustest/1/position'
     w3.model = 'sys/taurustest/1/position'
-    w4.model, w4.bgRole = 'sys/taurustest/1/position?configuration=unit', ''
+    w4.model, w4.bgRole = 'sys/taurustest/1/position#rvalue.units', ''
     
 *Now it seems a little bit more useful, doesn't it?*
 
@@ -336,7 +336,7 @@ formula!
 Plotting Trends
 """""""""""""""
 
-Many times we are interested in showing how an scalar attribute evolves with
+Many times we are interested in showing how a scalar attribute evolves with
 time. A close-cousin of the TaurusPlot called :class:`plot.TaurusTrend`
 is here to help you:
 
@@ -369,6 +369,5 @@ a few clicks. You can try it out by running::
 
 	taurusgui --new-gui
 	
-For more details and tricks regarding TaurusGui, check the 
-:mod:`taurus.qt.qtgui.taurusgui` module
+For more details and tricks regarding TaurusGui, check :ref:`this <taurusgui_newgui>`.
 
diff --git a/doc/source/devel/examples/TaurusTest.py b/doc/source/devel/examples/TaurusTest.py
index 246ae5d..9e5b523 100644
--- a/doc/source/devel/examples/TaurusTest.py
+++ b/doc/source/devel/examples/TaurusTest.py
@@ -2,14 +2,15 @@ import PyTango
 import sys
 import math
 
+
 class TaurusTest(PyTango.Device_4Impl):
 
-    def __init__(self,cl, name):
-        PyTango.Device_4Impl.__init__(self,cl,name)
+    def __init__(self, cl, name):
+        PyTango.Device_4Impl.__init__(self, cl, name)
         TaurusTest.init_device(self)
 
     def delete_device(self):
-        print "[Device delete_device method] for device",self.get_name()
+        print "[Device delete_device method] for device", self.get_name()
 
     def init_device(self):
         print "In ", self.get_name(), "::init_device()"
@@ -19,14 +20,13 @@ class TaurusTest(PyTango.Device_4Impl):
         self._velocity = 20.0
         self._acceleration = 4.0
         self._simulation_mode = False
-        self._abscissas = [x/50.0 for x in xrange(1024)]
+        self._abscissas = [x / 50.0 for x in xrange(1024)]
         self._curve = [math.sin(x) for x in self._abscissas]
-        
 
     def always_executed_hook(self):
         print "In ", self.get_name(), "::always_excuted_hook()"
 
-    def read_attr_hardware(self,data):
+    def read_attr_hardware(self, data):
         print "In ", self.get_name(), "::read_attr_hardware()"
 
     def read_Position(self, attr):
@@ -39,7 +39,8 @@ class TaurusTest(PyTango.Device_4Impl):
         attr.set_value(self._velocity)
 
     def is_Velocity_allowed(self, req_type):
-        if req_type == PyTango.AttReqType.WRITE_REQ: return True
+        if req_type == PyTango.AttReqType.WRITE_REQ:
+            return True
         return self._velocity < 5
 
     def write_Velocity(self, attr):
@@ -56,19 +57,19 @@ class TaurusTest(PyTango.Device_4Impl):
 
     def write_SimulationMode(self, attr):
         self._simulation_mode = attr.get_write_value()
-    
+
     def read_Abscissas(self, attr):
-        attr.set_value(self._abscissas)    
-    
+        attr.set_value(self._abscissas)
+
     def read_Curve(self, attr):
         attr.set_value(self._curve)
-        
+
     def write_Curve(self, attr):
         self._curve = attr.get_write_value()
-    
+
     def create_device_cb(self, device_name):
-        print "About to create device",device_name
-    
+        print "About to create device", device_name
+
     def CreateTaurusTestDevice(self, device_name):
         klass = self.get_device_class()
         klass.create_device(device_name, cb=self.create_device_cb)
@@ -82,112 +83,109 @@ class TaurusTestClass(PyTango.DeviceClass):
 
     #    Class Properties
     class_property_list = {
-        }
-
+    }
 
     #    Device Properties
     device_property_list = {
-        }
-
+    }
 
     #    Command definitions
     cmd_list = {
         'CreateTaurusTestDevice':
-            [ [PyTango.DevString, 'device name'],
-              [PyTango.DevVoid, ""] ],
+            [[PyTango.DevString, 'device name'],
+             [PyTango.DevVoid, ""]],
         'DeleteTaurusTestDevice':
-            [ [PyTango.DevString, 'device name'],
-              [PyTango.DevVoid, ""] ],
-        }
-
+            [[PyTango.DevString, 'device name'],
+             [PyTango.DevVoid, ""]],
+    }
 
     #    Attribute definitions
     attr_list = {
         'Position':
             [[PyTango.DevDouble,
-            PyTango.SCALAR,
-            PyTango.READ_WRITE],
-            {
-                'label':"Gap",
-                'unit':"mm",
-                'format':"%8.3f",
-                'max value':1000,
-                'min value':-1000,
-                'max alarm':900,
-                'min alarm':-900,
-                'max warning':800,
-                'min warning':-800,
-            } ],
+              PyTango.SCALAR,
+              PyTango.READ_WRITE],
+             {
+                'label': "Gap",
+                'unit': "mm",
+                'format': "%8.3f",
+                'max value': 1000,
+                'min value': -1000,
+                'max alarm': 900,
+                'min alarm': -900,
+                'max warning': 800,
+                'min warning': -800,
+            }],
         'Velocity':
             [[PyTango.DevDouble,
-            PyTango.SCALAR,
-            PyTango.READ_WRITE],
-            {
-                'label':"Speed",
-                'unit':"nm/s",
-                'format':"%6.2f",
-                'max value':100,
-                'min value':0,
-                'max alarm':95,
-                'min alarm':5,
-                'max warning':90,
-                'min warning':10,
-            } ],
+              PyTango.SCALAR,
+              PyTango.READ_WRITE],
+             {
+                'label': "Speed",
+                'unit': "nm/s",
+                'format': "%6.2f",
+                'max value': 100,
+                'min value': 0,
+                'max alarm': 95,
+                'min alarm': 5,
+                'max warning': 90,
+                'min warning': 10,
+            }],
         'Acceleration':
             [[PyTango.DevDouble,
-            PyTango.SCALAR,
-            PyTango.READ_WRITE],
-            {
-                'label':"Acceleration",
-                'unit':"nm/s/s",
-                'format':"%6.2f",
-                'max value':100,
-                'min value':0,
-                'max alarm':95,
-                'min alarm':2,
-                'max warning':90,
-                'min warning':1,
-            } ],
+              PyTango.SCALAR,
+              PyTango.READ_WRITE],
+             {
+                'label': "Acceleration",
+                'unit': "nm/s/s",
+                'format': "%6.2f",
+                'max value': 100,
+                'min value': 0,
+                'max alarm': 95,
+                'min alarm': 2,
+                'max warning': 90,
+                'min warning': 1,
+            }],
         'SimulationMode':
             [[PyTango.DevBoolean,
-            PyTango.SCALAR,
-            PyTango.READ_WRITE],
-            {
-                'label':"Simulation mode",
-            } ],
+              PyTango.SCALAR,
+              PyTango.READ_WRITE],
+             {
+                'label': "Simulation mode",
+            }],
         'Abscissas':
             [[PyTango.DevDouble,
-            PyTango.SPECTRUM,
-            PyTango.READ, 1024],
-            {
-                'label':"X values for Curve 1",
-            } ],
+              PyTango.SPECTRUM,
+              PyTango.READ, 1024],
+             {
+                'label': "X values for Curve 1",
+            }],
         'Curve':
             [[PyTango.DevDouble,
-            PyTango.SPECTRUM,
-            PyTango.READ_WRITE, 1024],
-            {
-                'label':"Curve 1",
-            } ],
+              PyTango.SPECTRUM,
+              PyTango.READ_WRITE, 1024],
+             {
+                'label': "Curve 1",
+            }],
 
-        }
+    }
 
     def __init__(self, name):
         PyTango.DeviceClass.__init__(self, name)
-        self.set_type(name);
+        self.set_type(name)
         print "In TaurusTestClass  constructor"
 
 
 if __name__ == '__main__':
     try:
         py = PyTango.Util(sys.argv)
-        py.add_TgClass(TaurusTestClass,TaurusTest,'TaurusTest')
+        py.add_TgClass(TaurusTestClass, TaurusTest, 'TaurusTest')
 
         U = PyTango.Util.instance()
         U.server_init()
         U.server_run()
 
-    except PyTango.DevFailed,e:
-        print '-------> Received a DevFailed exception:',e
-    except Exception,e:
-        print '-------> An unforeseen exception occured....',e
+    except PyTango.DevFailed, e:
+        print '-------> Received a DevFailed exception:', e
+    except Exception, e:
+        print '-------> An unforeseen exception occured....', e
diff --git a/doc/source/devel/examples/edit01.py b/doc/source/devel/examples/edit01.py
index 99b3c10..decdd82 100644
--- a/doc/source/devel/examples/edit01.py
+++ b/doc/source/devel/examples/edit01.py
@@ -12,16 +12,16 @@ from taurus.qt.qtgui.input import TaurusValueLineEdit, TaurusValueSpinBox, Tauru
 
 w1 = TaurusLabel()
 w2 = TaurusLabel()
-w3 = TaurusValueLineEdit() # or TaurusValueSpinBox or TaurusWheelEdit
+w3 = TaurusValueLineEdit()  # or TaurusValueSpinBox or TaurusWheelEdit
 w4 = TaurusLabel()
 layout.addWidget(w1)
 layout.addWidget(w2)
 layout.addWidget(w3)
 layout.addWidget(w4)
-w1.model, w1.bgRole = 'sys/tg_test/1/double_scalar?configuration=label', ''
+w1.model, w1.bgRole = 'sys/tg_test/1/double_scalar#label', ''
 w2.model = 'sys/tg_test/1/double_scalar'
 w3.model = 'sys/tg_test/1/double_scalar'
-w4.model, w4.bgRole = 'sys/tg_test/1/double_scalar?configuration=unit', ''
+w4.model, w4.bgRole = 'sys/tg_test/1/double_scalar#unit', ''
 
 panel.show()
-sys.exit(app.exec_())
\ No newline at end of file
+sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/edit02.py b/doc/source/devel/examples/edit02.py
index 956bb9e..300a210 100644
--- a/doc/source/devel/examples/edit02.py
+++ b/doc/source/devel/examples/edit02.py
@@ -1,7 +1,7 @@
 import sys
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.container import TaurusWidget
-from taurus.qt.qtgui.display import TaurusValueLabel, TaurusConfigLabel
+from taurus.qt.qtgui.display import TaurusLabel
 from taurus.qt.qtgui.input import TaurusValueSpinBox
 
 app = Qt.QApplication(sys.argv)
@@ -10,10 +10,10 @@ panel = TaurusWidget()
 layout = Qt.QHBoxLayout()
 panel.setLayout(layout)
 
-w1 = TaurusConfigLabel()
-w2 = TaurusValueLabel()
+w1 = TaurusLabel()
+w2 = TaurusLabel()
 w3 = TaurusValueSpinBox()
-w4 = TaurusConfigLabel()
+w4 = TaurusLabel()
 layout.addWidget(w1)
 layout.addWidget(w2)
 layout.addWidget(w3)
@@ -23,10 +23,10 @@ w2.setUseParentModel(True)
 w3.setUseParentModel(True)
 w4.setUseParentModel(True)
 panel.setModel('sys/taurustest/1')
-w1.setModel('/position?configuration=label')
+w1.setModel('/position#label')
 w2.setModel('/position')
 w3.setModel('/position')
-w4.setModel('/position?configuration=unit')
+w4.setModel('/position#unit')
 
 panel.show()
-sys.exit(app.exec_())
\ No newline at end of file
+sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/edit03.py b/doc/source/devel/examples/edit03.py
index d8c9536..242e0ee 100644
--- a/doc/source/devel/examples/edit03.py
+++ b/doc/source/devel/examples/edit03.py
@@ -1,7 +1,7 @@
 import sys
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.container import TaurusWidget
-from taurus.qt.qtgui.display import TaurusValueLabel, TaurusConfigLabel
+from taurus.qt.qtgui.display import TaurusLabel
 from taurus.qt.qtgui.input import TaurusWheelEdit
 
 app = Qt.QApplication(sys.argv)
@@ -10,10 +10,10 @@ panel = TaurusWidget()
 layout = Qt.QHBoxLayout()
 panel.setLayout(layout)
 
-w1 = TaurusConfigLabel()
-w2 = TaurusValueLabel()
+w1 = TaurusLabel()
+w2 = TaurusLabel()
 w3 = TaurusWheelEdit()
-w4 = TaurusConfigLabel()
+w4 = TaurusLabel()
 layout.addWidget(w1)
 layout.addWidget(w2)
 layout.addWidget(w3)
@@ -23,10 +23,10 @@ w2.setUseParentModel(True)
 w3.setUseParentModel(True)
 w4.setUseParentModel(True)
 panel.setModel('sys/taurustest/1')
-w1.setModel('/position?configuration=label')
+w1.setModel('/position#label')
 w2.setModel('/position')
 w3.setModel('/position')
-w4.setModel('/position?configuration=unit')
+w4.setModel('/position#unit')
 
 panel.show()
-sys.exit(app.exec_())
\ No newline at end of file
+sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/forms01.py b/doc/source/devel/examples/forms01.py
index 220b836..2352994 100644
--- a/doc/source/devel/examples/forms01.py
+++ b/doc/source/devel/examples/forms01.py
@@ -5,8 +5,8 @@ from taurus.qt.qtgui.panel import TaurusForm
 app = Qt.QApplication(sys.argv)
 
 panel = TaurusForm()
-props = [ 'state', 'status', 'position', 'velocity', 'acceleration' ]
-model = [ 'sys/taurustest/1/%s' % p for p in props ]
+props = ['state', 'status', 'position', 'velocity', 'acceleration']
+model = ['sys/taurustest/1/%s' % p for p in props]
 panel.setModel(model)
 panel.show()
 sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/forms02.py b/doc/source/devel/examples/forms02.py
index 136a826..3dd1a7f 100644
--- a/doc/source/devel/examples/forms02.py
+++ b/doc/source/devel/examples/forms02.py
@@ -1,16 +1,16 @@
 import sys
 from taurus.qt.qtgui.panel import TaurusForm
-from taurus.qt.qtgui.display import TaurusValueLabel
+from taurus.qt.qtgui.display import TaurusLabel
 from taurus.qt.qtgui.application import TaurusApplication
 
 app = TaurusApplication(sys.argv)
 
 panel = TaurusForm()
-props = [ 'state', 'status', 'position', 'velocity', 'acceleration' ]
-model = [ 'sys/taurustest/1/%s' % p for p in props ]
+props = ['state', 'status', 'position', 'velocity', 'acceleration']
+model = ['sys/taurustest/1/%s' % p for p in props]
 panel.setModel(model)
-panel[0].readWidgetClass = TaurusValueLabel
-panel[2].writeWidgetClass='TaurusWheelEdit'
+panel[0].readWidgetClass = TaurusLabel
+panel[2].writeWidgetClass = 'TaurusWheelEdit'
 
 panel.show()
 sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/label02.py b/doc/source/devel/examples/label02.py
index 0b7fce4..9a8915e 100644
--- a/doc/source/devel/examples/label02.py
+++ b/doc/source/devel/examples/label02.py
@@ -12,9 +12,9 @@ w1 = TaurusLabel()
 w2 = TaurusLabel()
 layout.addWidget(w1)
 layout.addWidget(w2)
-w1.model = 'sys/tg_test/1/double_scalar?configuration=label'
+w1.model = 'sys/tg_test/1/double_scalar#label'
 w1.bgRole = ''
 w2.model = 'sys/tg_test/1/double_scalar'
 
 panel.show()
-sys.exit(app.exec_())
\ No newline at end of file
+sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/label03.py b/doc/source/devel/examples/label03.py
index d5a482a..ef3655f 100644
--- a/doc/source/devel/examples/label03.py
+++ b/doc/source/devel/examples/label03.py
@@ -13,9 +13,9 @@ w1, w2, w3 = TaurusLabel(), TaurusLabel(), TaurusLabel()
 layout.addWidget(w1)
 layout.addWidget(w2)
 layout.addWidget(w3)
-w1.model, w1.bgRole = 'sys/tg_test/1/double_scalar?configuration=label', ''
+w1.model, w1.bgRole = 'sys/tg_test/1/double_scalar#label', ''
 w2.model = 'sys/tg_test/1/double_scalar'
-w3.model, w3.bgRole = 'sys/tg_test/1/double_scalar?configuration=unit', ''
+w3.model, w3.bgRole = 'sys/tg_test/1/double_scalar#unit', ''
 
 panel.show()
-sys.exit(app.exec_())
\ No newline at end of file
+sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/label04.py b/doc/source/devel/examples/label04.py
index 6f2f290..64f86aa 100644
--- a/doc/source/devel/examples/label04.py
+++ b/doc/source/devel/examples/label04.py
@@ -1,16 +1,16 @@
 import sys
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.container import TaurusWidget
-from taurus.qt.qtgui.display import TaurusValueLabel, TaurusConfigLabel
+from taurus.qt.qtgui.display import TaurusLabel
 
 app = Qt.QApplication(sys.argv)
 panel = TaurusWidget()
 layout = Qt.QVBoxLayout()
 panel.setLayout(layout)
 panel.setModel('sys/taurustest/1')
-w1 = TaurusValueLabel()
-w2 = TaurusValueLabel()
-w3 = TaurusValueLabel()
+w1 = TaurusLabel()
+w2 = TaurusLabel()
+w3 = TaurusLabel()
 w1.setUseParentModel(True)
 w2.setUseParentModel(True)
 w3.setUseParentModel(True)
diff --git a/doc/source/devel/examples/label05.py b/doc/source/devel/examples/label05.py
index 861272f..2bb638b 100644
--- a/doc/source/devel/examples/label05.py
+++ b/doc/source/devel/examples/label05.py
@@ -1,10 +1,10 @@
 import sys
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.display import TaurusStateLabel
+from taurus.qt.qtgui.display import TaurusLabel
 
 app = Qt.QApplication(sys.argv)
 panel = Qt.QWidget()
-w = TaurusStateLabel(panel)
+w = TaurusLabel(panel)
 w.setModel('sys/taurustest/1/state')
 panel.show()
 
diff --git a/doc/source/devel/examples/label06.py b/doc/source/devel/examples/label06.py
index 5820a0b..840c5ba 100644
--- a/doc/source/devel/examples/label06.py
+++ b/doc/source/devel/examples/label06.py
@@ -1,6 +1,6 @@
 import sys
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.display import TaurusStateLabel
+from taurus.qt.qtgui.display import TaurusLabel
 
 app = Qt.QApplication(sys.argv)
 panel = Qt.QWidget()
@@ -8,11 +8,11 @@ layout = Qt.QGridLayout()
 panel.setLayout(layout)
 for y in range(4):
     for x in range(2):
-        w = TaurusStateLabel()
-        w.setModel('sys/taurustest/%d/state' % ((y+1)+4*x))
+        w = TaurusLabel()
+        w.setModel('sys/taurustest/%d/state' % ((y + 1) + 4 * x))
         w.setShowText(False)
-        #w.setShowQualityForeground(False)
-        layout.addWidget(w,x,y)
+        w.setBgRole('state')
+        layout.addWidget(w, x, y)
 panel.show()
 
 sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/parentmodel_issue_demo.py b/doc/source/devel/examples/parentmodel_issue_demo.py
index abf4aa7..dd48207 100644
--- a/doc/source/devel/examples/parentmodel_issue_demo.py
+++ b/doc/source/devel/examples/parentmodel_issue_demo.py
@@ -11,52 +11,52 @@ You can do it right after calling the setupUi method.
 
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.container import TaurusWidget
-from taurus.qt.qtgui.display import TaurusValueLabel
+from taurus.qt.qtgui.display import TaurusLabel
 import sys
 
 app = Qt.QApplication(sys.argv)
 
-##The problem arises in some situations when the Taurus parenting is not the same
-##as the Qt parenting. For demonstration we use 3 widgets:  
-##p <-- m <--c (the arrows indicate the *Qt* parent) 
-## note that "m" not being a Taurus widget, implies that the *Taurus* parent of c is p 
-## also note that we are not giving the parent in the constructor, but we rely on
-## doing it later on when adding to layout
+# The problem arises in some situations when the Taurus parenting is not the same
+# as the Qt parenting. For demonstration we use 3 widgets:
+# p <-- m <--c (the arrows indicate the *Qt* parent)
+# note that "m" not being a Taurus widget, implies that the *Taurus* parent of c is p
+# also note that we are not giving the parent in the constructor, but we rely on
+# doing it later on when adding to layout
 
-p = TaurusWidget()     #Taurus parent
-m = Qt.QWidget()    #midle widget (non Taurus)
-c = TaurusValueLabel() #Taurus child
+p = TaurusWidget()  # Taurus parent
+m = Qt.QWidget()  # midle widget (non Taurus)
+c = TaurusLabel()  # Taurus child
 
-##here we call setUseParentModel before the parent is known!
+# here we call setUseParentModel before the parent is known!
 
 c.setUseParentModel(True)
 
-##we prepare the layouts
+# we prepare the layouts
 
 m.setLayout(Qt.QVBoxLayout())
 p.setLayout(Qt.QVBoxLayout())
 
-##Now, by adding the widgets to the layout we are actually reparenting them. 
-## The order in which we reparent determines success/failure: 
-##if we do m-->p and then c-->m, it works, but if we do it in the opposite
-##order, we trigger the error. 
-##(i.e., if we had called "p.layout().addWidget(m)" it would work work)
+# Now, by adding the widgets to the layout we are actually reparenting them.
+# The order in which we reparent determines success/failure:
+# if we do m-->p and then c-->m, it works, but if we do it in the opposite
+# order, we trigger the error.
+# (i.e., if we had called "p.layout().addWidget(m)" it would work work)
 m.layout().addWidget(c)
 p.layout().addWidget(m)
 
-##the problem arises because the Taurus ancestry of c is only checked when: 
-##   a) c.setUseParentModel() is called (and it effectively changes something) or
-##   b) when c is Qt-reparented
+# the problem arises because the Taurus ancestry of c is only checked when:
+# a) c.setUseParentModel() is called (and it effectively changes something) or
+# b) when c is Qt-reparented
 ##
-## In this example, c is reparented before m, so when it checks for a Taurus
-## ancestor, none is found. Then m is reparented and c now would find its right
-## Taurus ancestor (p)... but c never gets notified! 
+# In this example, c is reparented before m, so when it checks for a Taurus
+# ancestor, none is found. Then m is reparented and c now would find its right
+# Taurus ancestor (p)... but c never gets notified!
 
-##Manually calling c.recheckTaurusParent() after the parenting has changed is
-##another way to work around this issue (you can test by uncommenting 
-## the following line):
+# Manually calling c.recheckTaurusParent() after the parenting has changed is
+# another way to work around this issue (you can test by uncommenting
+# the following line):
 
-#c.recheckTaurusParent()
+# c.recheckTaurusParent()
 
 p.setModel('sys/tg_test/1/state')
 print 'p model:', p.getModelName()
@@ -65,4 +65,3 @@ print 'c model:', c.getModelName()
 
 p.show()
 sys.exit(app.exec_())
-
diff --git a/doc/source/devel/examples/pyqwt_issue_test.py b/doc/source/devel/examples/pyqwt_issue_test.py
index 3db0d41..cc2e790 100644
--- a/doc/source/devel/examples/pyqwt_issue_test.py
+++ b/doc/source/devel/examples/pyqwt_issue_test.py
@@ -2,27 +2,31 @@
 This code checks if a known bug in some PyQwt versions affects your installation.
 Simply run this script and see the diagnosis in the std output.
 
-If you are affected, the solution is to install/compile a newer version of PyQwt/SIP 
+If you are affected, the solution is to install/compile a newer version of PyQwt/SIP
 
-Notably, the python-qwt5-qt4 package originally shipped with 
+Notably, the python-qwt5-qt4 package originally shipped with
 Ubuntu 10.10 and Debian 6 is affected
 
-In some systems, the bug produces a segfault while in some others it 
+In some systems, the bug produces a segfault while in some others it
 produces an Assertion error similar to the following:
 python: /build/buildd/sip4-qt3-4.10.5/siplib/siplib.c:2600: sip_api_parse_result: Assertion `assign_helper != ((void *)0)' failed.
 
-See also: 
+See also:
 https://bugs.launchpad.net/ubuntu/+source/pyqwt5/+bug/672509
 http://www.esrf.eu/mail_archives/tango/archive/msg04025.html
 '''
 
 from PyQt4 import Qt, Qwt5
 
+
 class MyScaleDrawSafe(Qwt5.QwtScaleDraw):
+
     def __init__(self):
         Qwt5.QwtScaleDraw.__init__(self)
 
+
 class MyScaleDrawDanger(Qwt5.QwtScaleDraw):
+
     def __init__(self):
         Qwt5.QwtScaleDraw.__init__(self)
 
@@ -31,18 +35,19 @@ class MyScaleDrawDanger(Qwt5.QwtScaleDraw):
 
 
 class MyPlot(Qwt5.QwtPlot):
-    def __init__(self, parent = None):
+
+    def __init__(self, parent=None):
         Qwt5.QwtPlot.__init__(self, parent)
         self.setAxisScaleDraw(Qwt5.QwtPlot.xBottom, MyScaleDrawSafe())
         print "Replotting with MyScaleDrawSafe:..."
-        self.replot() 
+        self.replot()
         print "ok"
         self.setAxisScaleDraw(Qwt5.QwtPlot.xBottom, MyScaleDrawDanger())
         print "Replotting with MyScaleDrawDanger (if it crashes now you are affected by the bug) :..."
-        self.replot() 
+        self.replot()
         print "SAFE!!!"
         print "if this is printed, the sip/PyQwt bug does not affect you"
 
-app=Qt.QApplication([])
-p=MyPlot()
+app = Qt.QApplication([])
+p = MyPlot()
 p.show()
diff --git a/doc/source/devel/examples/taurusplot01.py b/doc/source/devel/examples/taurusplot01.py
index 5b06833..3f14240 100644
--- a/doc/source/devel/examples/taurusplot01.py
+++ b/doc/source/devel/examples/taurusplot01.py
@@ -6,15 +6,15 @@ from taurus.qt.qtgui.plot import TaurusPlot
 
 app = Qt.QApplication(sys.argv)
 ##########################
-#BEGUIN EXAMPLE CODE
+# BEGUIN EXAMPLE CODE
 ##########################
 
 panel = TaurusPlot()
-model = ['sys/taurustest/1/abscissas','sys/taurustest/1/curve']
+model = ['sys/taurustest/1/abscissas', 'sys/taurustest/1/curve']
 panel.setModel(model)
 
 ########################
-#END EXAMPLE CODE
+# END EXAMPLE CODE
 ########################
 panel.show()
 sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/taurusplot02.py b/doc/source/devel/examples/taurusplot02.py
index 6975d1c..af8500c 100644
--- a/doc/source/devel/examples/taurusplot02.py
+++ b/doc/source/devel/examples/taurusplot02.py
@@ -6,7 +6,7 @@ from taurus.qt.qtgui.plot import TaurusPlot
 
 app = Qt.QApplication(sys.argv)
 ##########################
-#BEGUIN EXAMPLE CODE
+# BEGUIN EXAMPLE CODE
 ##########################
 
 panel = TaurusPlot()
@@ -14,7 +14,7 @@ model = ['sys/taurustest/1/abscissas|sys/taurustest/1/curve']
 panel.setModel(model)
 
 ########################
-#END EXAMPLE CODE
+# END EXAMPLE CODE
 ########################
 panel.show()
 sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/taurusplot03.py b/doc/source/devel/examples/taurusplot03.py
index 4e3948c..41a3042 100644
--- a/doc/source/devel/examples/taurusplot03.py
+++ b/doc/source/devel/examples/taurusplot03.py
@@ -6,7 +6,7 @@ from taurus.qt.qtgui.plot import TaurusPlot, CurveAppearanceProperties
 
 app = Qt.QApplication(sys.argv)
 ##########################
-#BEGIN EXAMPLE CODE
+# BEGIN EXAMPLE CODE
 ##########################
 
 import numpy
@@ -14,9 +14,9 @@ from taurus.qt import Qwt5
 
 panel = TaurusPlot()
 
-rawdata1 = {"y":5*numpy.random.random(10), "name":"Random"}
-rawdata2 = {"x":[1, 2, 5, 7], "y":[2, 3, 1, 4], "name":"Hand-written"}
-rawdata3 = {"x":numpy.arange(0,10,0.1), "f(x)":"sqrt(x)"}
+rawdata1 = {"y": 5 * numpy.random.random(10), "name": "Random"}
+rawdata2 = {"x": [1, 2, 5, 7], "y": [2, 3, 1, 4], "name": "Hand-written"}
+rawdata3 = {"x": numpy.arange(0, 10, 0.1), "f(x)": "sqrt(x)"}
 
 p1 = CurveAppearanceProperties(sStyle=Qwt5.QwtSymbol.Rect,
                                sSize=5,
@@ -36,9 +36,8 @@ panel.attachRawData(rawdata2, properties=p2)
 panel.attachRawData(rawdata3)
 
 
-
 ########################
-#END EXAMPLE CODE
+# END EXAMPLE CODE
 ########################
 panel.show()
 sys.exit(app.exec_())
diff --git a/doc/source/devel/examples/taurustrend01.py b/doc/source/devel/examples/taurustrend01.py
index a0f0657..2756f55 100644
--- a/doc/source/devel/examples/taurustrend01.py
+++ b/doc/source/devel/examples/taurustrend01.py
@@ -6,16 +6,16 @@ from taurus.qt.qtgui.plot import TaurusTrend
 
 app = Qt.QApplication(sys.argv)
 ##########################
-#BEGIN EXAMPLE CODE
+# BEGIN EXAMPLE CODE
 ##########################
 
 panel = TaurusTrend()
 model = ['sys/taurustest/1/position']
-panel.setXIsTime(True) #to show the x values as time
+panel.setXIsTime(True)  # to show the x values as time
 panel.setModel(model)
 
 ########################
-#END EXAMPLE CODE
+# END EXAMPLE CODE
 ########################
 panel.show()
 sys.exit(app.exec_())
diff --git a/doc/source/devel/icon_example.py b/doc/source/devel/icon_example.py
index 2ee250f..e6ed4b1 100644
--- a/doc/source/devel/icon_example.py
+++ b/doc/source/devel/icon_example.py
@@ -1,22 +1,29 @@
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.resource import getThemeIcon
+from taurus.qt.qtgui.application import TaurusApplication
+
 
 class MyGUI(Qt.QMainWindow):
-    
+
     def __init__(self, parent=None):
         Qt.QMainWindow.__init__(self, parent)
         toolbar = self.addToolBar("Tools")
-        open_icon = getThemeIcon("document-open")
-        toolbar.addAction(open_icon, "Open HDF5", self.open_file)
-        
+
+        # get icon from theme
+        icon1 = Qt.QIcon.fromTheme("document-open")
+
+        # get icon using prefix + filename
+        icon2 = Qt.QIcon("actions:exit.svg")
+
+        toolbar.addAction(icon1, "Open HDF5", self.open_file)
+        toolbar.addAction(icon2, "Exit", self.close)
+
+
     def open_file(self):
-        fileName = Qt.QFileDialog.getOpenFileName(self, "Open HDF5", "/home/homer",
-                                                  "HDF5 Files (*.h5)")
-        # do something
+        pass   # do something
 
 if __name__ == "__main__":
     import sys
-    app = Qt.QApplication(sys.argv)
+    app = TaurusApplication()
     gui = MyGUI()
     gui.show()
-    sys.exit(app.exec_())
\ No newline at end of file
+    sys.exit(app.exec_())
diff --git a/doc/source/devel/icon_guide.rst b/doc/source/devel/icon_guide.rst
index ba40179..c7c0c6c 100644
--- a/doc/source/devel/icon_guide.rst
+++ b/doc/source/devel/icon_guide.rst
@@ -7,29 +7,41 @@ Taurus icon guide
 Usually the application/widget you are developing will require some icons.
 Some of these icons will be used to represent a standard actions, applications,
 places or status like "open a file", "desktop" or "preferences".
-Each of these actions have already an associated icon that is supplied by the
-operating system according to the active theme.
 
-To aid you in the process of adding icons, taurus provides a small 
-API (:mod:`taurus.qt.qtgui.resource`) which you can use to easly insert 
-standard icons into your widgets.
+Qt (and therefore, Taurus) supports `theme icons`_ for many common cases.
+You can access them via the standard :meth:`QIcon.fromTheme` method. Using theme icons will make
+your application be more integrated with the rest of the system, but keep in mind
+that different people will see the icons differently depending on their default
+theme (so do not use a theme icon for something not related to its `specification`_
+just because in *your* theme it happens to look as what you want)
 
-For example, suppose you want to add a toolbox in your application's main window
-where the first button triggers an "open file dialog". All you have to do is 
-search for the icon name representing the action of your button in the 
-:ref:`catalog <icon-catalog>` (in our case it should be **document-open**),
-get the icon from taurus using :func:`taurus.qt.qtugui.resource.getThemeIcon`
-and insert it into your widget. Here is an example code:
+Apart from the theme icons, Taurus provides some collections of icons (and you can
+add more (see :mod:`taurus.qt.qtgui.icon`). The paths containing these collections
+are automatically added to `QDir`'s search paths under various prefixes when you
+import `taurus.qt.qtgui` (or any of its submodules).
+
+The following example shows how to use theme and non-theme icons in your
+application:
 
 .. literalinclude:: icon_example.py
 
-The list of available standard icon names is described in 
-`Icon Naming Specification <http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html>`_ 
 
 .. _icon-catalog:
 
 Taurus icon catalog
 -------------------
 
-.. raw:: html
-  :file: catalog.html
\ No newline at end of file
+In order to explore the icon collections provided by Taurus, you can use the
+`taurusiconcatalog` application, which will let you browse the icons.
+
+.. figure:: /_static/taurusiconcatalog-01.png
+  :align: center
+
+By clicking on an icon of the catalog, you will obtain a larger view of the icon as well as
+detailed information on how to access it from your application.
+
+.. figure:: /_static/taurusiconcatalog-details01.png
+  :align: center
+
+.. _theme icons: https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
+.. _specification: http://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
diff --git a/doc/source/devel/index.rst b/doc/source/devel/index.rst
index e22109f..e917c7b 100644
--- a/doc/source/devel/index.rst
+++ b/doc/source/devel/index.rst
@@ -7,15 +7,14 @@ Developer's Guide
 .. toctree::
     :maxdepth: 2
     
-    tau to taurus migration guide <tau2taurus_migration_guide>
+    Taurus 3.x to Taurus 4.x migration guide <taurus3to4>
     Development guidelines <coding_guide>
-    Color guide <color_guide>
-    Icon guide <icon_guide>
+    Creating GUIs with the TaurusGUI framework <taurusgui_newgui>
     Designer tutorial <designer_tutorial>
+    Icon guide <icon_guide>
     Core tutorial <core_tutorial>
-    Widget tutorial <widget_tutorial>
-    Popup menu tutorial <popupmenu_tutorial>
+    Taurus Custom Settings <tauruscustomsettings>
+    Examples <examples>
     API <api/taurus>
     All Classes <api/taurus_AllClasses.rst>
-    Examples <examples>
-    
\ No newline at end of file
+    
diff --git a/doc/source/devel/popupmenu_tutorial.rst b/doc/source/devel/popupmenu_tutorial.rst
deleted file mode 100644
index 9b09aa8..0000000
--- a/doc/source/devel/popupmenu_tutorial.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-
-.. currentmodule:: taurus.qt
-
-.. _popupmenu-tutorial:
-
-===========================
-taurus popup menu tutorial
-===========================
-
-.. todo::
-    taurus popup menu tutorial
\ No newline at end of file
diff --git a/doc/source/devel/tau2taurus_migration_guide.rst b/doc/source/devel/tau2taurus_migration_guide.rst
deleted file mode 100644
index 2085c5d..0000000
--- a/doc/source/devel/tau2taurus_migration_guide.rst
+++ /dev/null
@@ -1,768 +0,0 @@
-.. _tau2taurus-guide:
-
-==============================
-Tau to Taurus migration guide
-==============================
-
-This chapter explains how to migrate from an application written using tau
-to taurus.
-
-.. _migrate-ui:
-
-Migrate project .ui files
-----------------------------
-
-The first step in the migration is to translate the .ui files created with the
-Qt designer using the tau widgets. The .ui file generated by the designer is
-basically just an XML file describing the GUI you designed.
-Taurus comes with a tool called ``tau2taurus`` which can be located in the scripts
-directory.
-
-.. hint:
-    executing tau2taurus --help gives you help on command line parameters
-
-This tool receives as parameters an output .ui file and an input .ui file. When
-executed, it replaces all occurences of tau with the proper taurus. It uses the
-tau2taurus.csv file to identify which new taurus class replaces the old tau class.
-Let's say your project contains an .ui file called *mainwindow.ui* that was created
-using the designer with the tau widgets and you want to migrate it to taurus. On
-the command line just execute::
-
-    tau2taurus -o mainwindow2.ui mainwindow.ui
-
-.. caution::
-    the output file **CAN** be the same as the input file. However we advise to
-    use different files to be able to go back to the old .ui file if necessary
-
-You should now reopen the generated file with ``taurusdesigner`` to fix any
-problems (some widget properties may have ceased to exist).
-
-Generate the python code from the .ui files
---------------------------------------------
-
-Now that you have successfully converted all .ui files it's time to regenerate
-the python code from them.
-Taurus comes with a tool called ``taurusuic4`` [1]_ that converts the .ui file 
-into python code.
-
-.. hint::
-    executing ``tau2taurus --help`` gives you help on command line parameters
-
-Continuing with the previous example, just type in the command line::
-
-    taurusuic4 -x -o ui_mainwindow.py mainwindow2.ui
-
-.. important::
-    taurusuic4 uses pyuic4 behind the scenes. In order to make it work properly
-    it has to do some nasty code changes depending on the pyuic4 version you
-    have installed. Therefore, for taurusuic4 to work as expected, you **MUST**
-    give the .ui input file as the last parameter in the command line
-
-.. hint::
-    giving -x option makes the python code executable from the command line.
-    This makes it possible to execute the generated python file directly from the
-    command line::
-        
-        python ui_mainwindow.py
-
-Migrate your code
------------------
-
-The third step and final step in the migration is to change your python code to
-replace all references to tau with taurus.
-Unfortunately there is no tool to do this so this step must be done manually by
-you.
-The following table describes the replacement classes.
-
-.. raw:: html
-    <HTML>
-    <HEAD></HEAD>
-
-    <BODY>
-    <TABLE CELLSPACING=0 BORDER=1>
-        <TBODY>
-            <TR><TH>Old package</TH><TH>Old class</TH><TH>New package</TH><TH>New class</TH></TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau</TD>
-                <TD  ALIGN=LEFT>*</TD>
-                <TD  ALIGN=LEFT>taurus</TD>
-                <TD  ALIGN=LEFT>*</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.core</TD>
-                <TD  ALIGN=LEFT>Tau*</TD>
-                <TD  ALIGN=LEFT>taurus.core</TD>
-                <TD  ALIGN=LEFT>Taurus*</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.core</TD>
-                <TD  ALIGN=LEFT>*</TD>
-                <TD  ALIGN=LEFT>taurus.core</TD>
-                <TD  ALIGN=LEFT>*</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.core.resources</TD>
-                <TD  ALIGN=LEFT>*</TD>
-                <TD  ALIGN=LEFT>taurus.core.resource</TD>
-                <TD  ALIGN=LEFT>*</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.core.simulation</TD>
-                <TD  ALIGN=LEFT>*</TD>
-                <TD  ALIGN=LEFT>taurus.core.simulation</TD>
-                <TD  ALIGN=LEFT>*</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.core.tango</TD>
-                <TD  ALIGN=LEFT>*</TD>
-                <TD  ALIGN=LEFT>taurus.core.tango</TD>
-                <TD  ALIGN=LEFT>*</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.core.utils</TD>
-                <TD  ALIGN=LEFT>*</TD>
-                <TD  ALIGN=LEFT>taurus.core.util</TD>
-                <TD  ALIGN=LEFT>*</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD  ALIGN=LEFT>AbstractGraphicsFactory</TD>
-                <TD  ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD  ALIGN=LEFT>TaurusBaseGraphicsFactory</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>ActionFactory</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>ActionFactory</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>BaseConfigurableClass</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtcore.configuration</TD>
-                <TD ALIGN=LEFT>BaseConfigurableClass</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>Led</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>QLed</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>LedColor</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>LedColor</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>LedSize</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>LedSize</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>LedStatus</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>LedStatus</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>QT_ATTRIBUTE_QUALITY_PALETTE</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>QT_ATTRIBUTE_QUALITY_PALETTE</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>QT_DEVICE_STATE_PALETTE</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>QT_DEVICE_STATE_PALETTE</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>Release</TD>
-                <TD ALIGN=LEFT>taurus.core</TD>
-                <TD ALIGN=LEFT>Release</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauAttrForm</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.panel</TD>
-                <TD ALIGN=LEFT>TaurusAttrForm</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauAttrListComboBox</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.input</TD>
-                <TD ALIGN=LEFT>TaurusAttrListComboBox</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauBaseComponent</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.base</TD>
-                <TD ALIGN=LEFT>TaurusBaseComponent</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauBaseConfigurableClass</TD>
-                <TD ALIGN=LEFT>None</TD>
-                <TD ALIGN=LEFT>None</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauBaseContainer</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.container</TD>
-                <TD ALIGN=LEFT>TaurusBaseContainer</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauBaseWidget</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.base</TD>
-                <TD ALIGN=LEFT>TaurusBaseWidget</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauBaseWritableWidget</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.base</TD>
-                <TD ALIGN=LEFT>TaurusBaseWritableWidget</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauBoolLed</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>TaurusLed [2]_</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauButtonBox</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.button</TD>
-                <TD ALIGN=LEFT>QButtonBox</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauCircularGauge</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.gauge</TD>
-                <TD ALIGN=LEFT>TaurusCircularGauge</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauClassTable</TD>
-                <TD ALIGN=LEFT>None</TD>
-                <TD ALIGN=LEFT>None</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauCommandButton</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.button</TD>
-                <TD ALIGN=LEFT>TaurusCommandButton</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauCommandsForm</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.panel</TD>
-                <TD ALIGN=LEFT>TaurusCommandsForm</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauConfigLabel</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>TaurusLabel [3]_</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauConfigLineEdit</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.input</TD>
-                <TD ALIGN=LEFT>TaurusConfigLineEdit</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauDevTree</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.tree</TD>
-                <TD ALIGN=LEFT>TaurusDevtree</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauEllipseStateItem</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusEllipseStateItem</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauForm</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.panel</TD>
-                <TD ALIGN=LEFT>TaurusForm</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauFrame</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.container</TD>
-                <TD ALIGN=LEFT>TaurusFrame</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauGraphicsAttributeItem</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusGraphicsAttributeItem</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauGraphicsItem</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusGraphicsItem</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauGraphicsScene</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusGraphicsScene</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauGraphicsStateItem</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusGraphicsStateItem</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauGraphicsView</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusGraphicsView</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauGrid</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.table</TD>
-                <TD ALIGN=LEFT>TaurusGrid</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauGroupBox</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.container</TD>
-                <TD ALIGN=LEFT>TaurusGroupBox</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauGroupStateItem</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusGroupStateItem</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauJDrawSynopticsView</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusJDrawSynopticsView</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauLCDValue</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>TaurusLCD</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauLauncherButton</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.button</TD>
-                <TD ALIGN=LEFT>TaurusLauncherButton</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauLimitSwitch</TD>
-                <TD ALIGN=LEFT>taurus.qt.qgui.display</TD>
-                <TD ALIGN=LEFT>TaurusLed [2]_</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauLinearGauge</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.gauge</TD>
-                <TD ALIGN=LEFT>TaurusLinearGauge</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauLoggerTable</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.table</TD>
-                <TD ALIGN=LEFT>TaurusLoggerTable</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauLoggerWidget</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.table</TD>
-                <TD ALIGN=LEFT>TaurusLoggerWidget</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauLogo</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>QLogo</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauMainWindow</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.container</TD>
-                <TD ALIGN=LEFT>TaurusMainWindow</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauPolygonStateItem</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusPolygonStateItem</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauPropTable</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.table</TD>
-                <TD ALIGN=LEFT>TaurusPropTable</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauQueryComboBox</TD>
-                <TD ALIGN=LEFT>None</TD>
-                <TD ALIGN=LEFT>None</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauRectStateItem</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusRectStateItem</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauScrollArea</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.container</TD>
-                <TD ALIGN=LEFT>TaurusScrollArea</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauStateLabel</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>TaurusLabel [4]_</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauStateLed</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>TaurusLed [2]_</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauTextAttributeItem</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusTextAttributeItem</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauTextStateItem</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.graphic</TD>
-                <TD ALIGN=LEFT>TaurusTextStateItem</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauValue</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.panel</TD>
-                <TD ALIGN=LEFT>TaurusValue</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauValueCheckBox</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.input</TD>
-                <TD ALIGN=LEFT>TaurusValueCheckBox</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauValueComboBox</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.input</TD>
-                <TD ALIGN=LEFT>TaurusValueComboBox</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauValueLabel</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.display</TD>
-                <TD ALIGN=LEFT>TaurusLabel [4]_</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauValueLineEdit</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.input</TD>
-                <TD ALIGN=LEFT>TaurusValueLineEdit</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauValueSpinBox</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.input</TD>
-                <TD ALIGN=LEFT>TaurusValueSpinBox</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauValuesFrame</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.container</TD>
-                <TD ALIGN=LEFT>TaurusValuesFrame</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauValuesTable</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.table</TD>
-                <TD ALIGN=LEFT>TaurusValuesTable</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauWheelEdit</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.input</TD>
-                <TD ALIGN=LEFT>TaurusWheelEdit</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauWidget</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.container</TD>
-                <TD ALIGN=LEFT>TaurusWidget</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget</TD>
-                <TD ALIGN=LEFT>TauWidgetFactory</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>TaurusWidgetFactory</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>AttributeAllConfigAction</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>AttributeAllConfigAction</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>AttributeDisplayAction</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>AttributeDisplayAction</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>AttributeHistoryAction</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>AttributeHistoryAction</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>AttributeImageDisplayAction</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>AttributeImageDisplayAction</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>AttributeMenu</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>AttributeMenu</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>AttributeMonitorDeviceAction</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>AttributeMonitorDeviceAction</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>AttributeRangesAction </TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>AttributeRangesAction </TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>AttributeUnitsAction</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>AttributeUnitsAction</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>ConfigurationMenu</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>ConfigurationMenu</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>SeparatorAction</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>SeparatorAction</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>TauAction</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>TauAction</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.actions</TD>
-                <TD ALIGN=LEFT>TauMenu</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.util</TD>
-                <TD ALIGN=LEFT>TauMenu</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.configbrowser</TD>
-                <TD ALIGN=LEFT>ConfigViewer</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.panel</TD>
-                <TD ALIGN=LEFT>QConfigViewer</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.dialog</TD>
-                <TD ALIGN=LEFT>AttrChooser</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.panel</TD>
-                <TD ALIGN=LEFT>TaurusAttributeChooser</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.dialog</TD>
-                <TD ALIGN=LEFT>DataExportDlg</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.panel</TD>
-                <TD ALIGN=LEFT>QDataExportDialog</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.dialog</TD>
-                <TD ALIGN=LEFT>RawDataWidget</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.panel</TD>
-                <TD ALIGN=LEFT>QRawDataWidget</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.edit</TD>
-                <TD ALIGN=LEFT>WheelEdit</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.input</TD>
-                <TD ALIGN=LEFT>QWheelEdit</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.qwt</TD>
-                <TD ALIGN=LEFT>TauArrayEditor</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.plot</TD>
-                <TD ALIGN=LEFT>TaurusArrayEditor</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.qwt</TD>
-                <TD ALIGN=LEFT>TauPlot</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.plot</TD>
-                <TD ALIGN=LEFT>TaurusPlot</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.qwt</TD>
-                <TD ALIGN=LEFT>TauTrend</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.plot</TD>
-                <TD ALIGN=LEFT>TaurusTrend</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.utils</TD>
-                <TD ALIGN=LEFT>initTauQtLogger</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtcore.util</TD>
-                <TD ALIGN=LEFT>initTaurusQtLogger</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.utils</TD>
-                <TD ALIGN=LEFT>getQtLogger</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtcore.util</TD>
-                <TD ALIGN=LEFT>getQtLogger</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.extra_xterm</TD>
-                <TD ALIGN=LEFT>XTermWidget</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_xterm</TD>
-                <TD ALIGN=LEFT>QXTermWidget</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.extra_tauservers</TD>
-                <TD ALIGN=LEFT>TauServersWidget</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_tauservers</TD>
-                <TD ALIGN=LEFT>TaurusServersWidget</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.extra_motor</TD>
-                <TD ALIGN=LEFT>TauMotorH</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_pool</TD>
-                <TD ALIGN=LEFT>TaurusMotorH</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.extra_motor</TD>
-                <TD ALIGN=LEFT>TauMotorH2</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_pool</TD>
-                <TD ALIGN=LEFT>TaurusMotorH2</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.extra_motor</TD>
-                <TD ALIGN=LEFT>TauMotorV</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_pool</TD>
-                <TD ALIGN=LEFT>TaurusMotorV</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.extra_motor</TD>
-                <TD ALIGN=LEFT>TauMotorV2</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_pool</TD>
-                <TD ALIGN=LEFT>TaurusMotorV2</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.extra_motor</TD>
-                <TD ALIGN=LEFT>PoolMotorSlim</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_pool</TD>
-                <TD ALIGN=LEFT>PoolMotorSlim</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.macroexecutor</TD>
-                <TD ALIGN=LEFT>TauMacroExecutorWidget</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_macroexecutor</TD>
-                <TD ALIGN=LEFT>TaurusMacroExecutorWidget</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.macroexecutor</TD>
-                <TD ALIGN=LEFT>TauMacroExecutor</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_macroexecutor</TD>
-                <TD ALIGN=LEFT>TaurusMacroExecutor</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.macroexecutor</TD>
-                <TD ALIGN=LEFT>TauSequencer</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_macroexecutor</TD>
-                <TD ALIGN=LEFT>TaurusSequencer</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.macroexecutor</TD>
-                <TD ALIGN=LEFT>TauMacroConfigurationDialog</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_macroexecutor</TD>
-                <TD ALIGN=LEFT>TaurusMacroConfigurationDialog</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.macroexecutor</TD>
-                <TD ALIGN=LEFT>TauMacroDescriptionViewer</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_macroexecutor</TD>
-                <TD ALIGN=LEFT>TaurusMacroDescriptionViewer</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.macroexecutor</TD>
-                <TD ALIGN=LEFT>DoorOutput</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_macroexecutor</TD>
-                <TD ALIGN=LEFT>DoorOutput</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.macroexecutor</TD>
-                <TD ALIGN=LEFT>DoorDebug</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_macroexecutor</TD>
-                <TD ALIGN=LEFT>DoorDebug</TD>
-            </TR>
-            <TR>
-                <TD  ALIGN=LEFT>tau.widget.macroexecutor</TD>
-                <TD ALIGN=LEFT>DoorResult</TD>
-                <TD ALIGN=LEFT>taurus.qt.qtgui.extra_macroexecutor</TD>
-                <TD ALIGN=LEFT>DoorResult</TD>
-            </TR>
-        </TBODY>
-    </TABLE>
-    </BODY>
-
-    </HTML>
-
-.. rubric : Footnotes
-
-.. [1] This tool must be used instead of the standard pyuic4 because of some issues
-       regarding the code generation for taurus widgets that don't inherit directly from
-       a standard Qt widget but from another taurus widget.
-
-.. [2] **TaurusLed** no longer has the property *ledSize*. Use the widget size to 
-       set the led size.
-       The property *boolIndex* has been replaced by *modelIndex*
-
-.. [3] When **TaurusLabel** is used to display an attribute configuration, the model
-       name should remain the same (ex: 'a/b/c/attr?configuration=label') and
-       the property "bgRole" should be set to the string "None" or "" to avoid
-       having a background color related to the attribute quality.
-
-.. [4] **TaurusLabel** no longer has the property *showState*/*showQuality* features.
-       To decide the origin of the background color, set the property *bgRole* to
-       'quality' (default), 'state' or 'None'/''. 
\ No newline at end of file
diff --git a/doc/source/devel/taurus3to4.rst b/doc/source/devel/taurus3to4.rst
new file mode 100644
index 0000000..46fdb5e
--- /dev/null
+++ b/doc/source/devel/taurus3to4.rst
@@ -0,0 +1,25 @@
+.. _migration_to_taurus4:
+
+==================================
+Taurus 3.x to 4.x migration guide
+==================================
+
+This chapter explains how to migrate from an application written using Taurus 3.x
+to Taurus 4.x.
+
+.. todo::
+    This section needs to be expanded. **Help wanted!**.
+    In the meanwhile, the following documents may be useful:
+
+    - TEP3_
+    - TEP14_
+    - `Taurus 4 API changes`_
+    - `Taurus 4 slides`_
+
+
+
+
+.. _TEP3: http://sf.net/p/tauruslib/wiki/TEP3
+.. _TEP14: http://sf.net/p/tauruslib/wiki/TEP14
+.. _`Taurus 4 API changes`: http://sf.net/p/tauruslib/wiki/Taurus4-API_changes
+.. _`Taurus 4 slides`: https://indico.esrf.fr/indico/event/4/session/6/contribution/17/material/slides/
\ No newline at end of file
diff --git a/doc/source/devel/tauruscustomsettings.rst b/doc/source/devel/tauruscustomsettings.rst
new file mode 100644
index 0000000..274d0cb
--- /dev/null
+++ b/doc/source/devel/tauruscustomsettings.rst
@@ -0,0 +1,14 @@
+
+.. _tauruscustomsettings:
+
+=======================
+Taurus custom settings
+=======================
+
+
+Taurus provides a module located at its root directory called
+`tauruscustomsettings`.
+
+.. automodule:: taurus.tauruscustomsettings
+   :members:
+   :undoc-members:
diff --git a/doc/source/devel/taurusgui_newgui.rst b/doc/source/devel/taurusgui_newgui.rst
new file mode 100644
index 0000000..2ae5a2f
--- /dev/null
+++ b/doc/source/devel/taurusgui_newgui.rst
@@ -0,0 +1,60 @@
+.. currentmodule:: taurus.qt.qtgui.taurusgui
+
+.. _taurusgui_newgui:
+
+Creating GUIs with the TaurusGUI framework
+==========================================
+
+The easiest way to create a new GUI using Taurus is by invoking::
+
+    taurusgui --new-gui
+
+This shows a "wizard" application that will guide you through
+the process of creating a :class:`TaurusGui`-based GUI in a few minutes
+without having to program a single line of code.
+
+.. figure:: /_static/taurusgui-newgui01.png
+  :align: center
+  :width: 100%
+
+The taurus GUI thus created can be populated with *panels* containing
+any Qt widget (typically from Taurus, but it may also be from any
+other arbitrary module).
+
+The GUI can also be modified and extended at execution time asexplained
+in :ref:`this section of the user guide <taurusgui_ui>`
+
+The Taurus widgets can be associated with models when they are added
+to the GUI and, in many cases, they may also accept drag & drop of the
+model name(s) from other widgets (or from a model selector) at any time,
+e.g.: the user can start plotting the time evolution of a given value by
+just dragging its name from a TaurusForm and “dropping” it into a
+TaurusTrend widget.
+
+Advanced control over the GUI
+-----------------------------
+
+While the procedure described above is enough in many cases, sometimes more
+control over the GUI contents, appearance and behaviour is required. This
+more advanced control can be exerted at several levels:
+
+- First, it is possible to edit the configuration files that define a
+  TaurusGUI-based application. These are declarative python and XML files
+  (editable as plain text) complemented by Qt settings files (editable with
+  the provided :ref:`taurusconfigbrowser <configurations>` application).
+
+- On a lower level, custom specific widgets (created either programmatically, as in
+  the :ref:`examples` or via the :ref:`Qt designer <taurusqtdesigner-tutorial>`)
+  can be added as panels to a TaurusGUI application.
+
+- At the same level, it is also possible to do simple inter-panel communication
+  thanks to a :class:`taurus.qt.qtcore.communication.SharedDataManager` broker
+  component instantiated by the GUI.
+
+- Finally, the maximum level of control can be achieved by programmatically
+  accessing the :class:`TaurusGui` class itself. In this way, all the higher
+  level features described before are still available, while there are no
+  limitations on the customizations that can be done.
+
+
+
diff --git a/doc/source/devel/widget_tutorial.rst b/doc/source/devel/widget_tutorial.rst
deleted file mode 100644
index e29c285..0000000
--- a/doc/source/devel/widget_tutorial.rst
+++ /dev/null
@@ -1,197 +0,0 @@
-
-.. currentmodule:: taurus.qt.qtgui
-
-.. _taurus-widget-tutorial:
-
-======================
-taurus widget tutorial
-======================
-
-
-
-.. todo::
-    Update this page to Taurus. In the meanwhile, you can check the :ref:`examples`
-
-..
-    **UNDER CONSTRUCTION: OUT OF DATE**
-    
-    The widget package is a PyQt_ based library of widgets designed to represent 
-    Tango_ data.
-    The widget library provides not only basic widgets like labels, text fields and
-    combo boxes, but also containers like frames, group boxes or graphics and 
-    synoptics.
-    
-    .. _TaurusLabel-tutorial:
-    
-    TaurusLabel tutorial
-    ----------------------
-    
-    The :class:`TaurusLabel` is a taurus widget designed to display the read value
-    of an attribute.
-    
-    .. figure:: /_static/label01.png
-      :align: center
-      
-    Simple display value
-    ~~~~~~~~~~~~~~~~~~~~
-    
-    The simplest example of :class:`TauValueLabel`
-    
-    .. figure:: /_static/label01.png
-      :align: center
-      
-    code::
-    
-        import sys
-        from PyQt4 import Qt
-        import tau.widget
-    
-        app = Qt.QApplication(sys.argv)
-    
-        w = tau.widget.TauValueLabel()
-        w.setModel('sys/tautest/1/position')
-    
-        panel.setVisible(True)
-        sys.exit(app.exec_())
-    
-    Hint:
-        1. Try to execute the code above and place the mouse over the widget. After
-           a couple of seconds an automatically generated tooltip will show up.
-        2. Try to execute the code above and, without closing the tau application,
-           change the format of the position attribute in the sys/tautest/1 from 6.2f 
-           to 8.2f (using Jive, for example). Will will notice that the displayed value
-           will change immediately (tango event system must be online in order for 
-           this to work!).
-    
-    Using parent model
-    ~~~~~~~~~~~~~~~~~~
-    
-    Demonstrates how to use the *showQuality* and *useParentModel* with 
-    :class:`TauValueLabel` being inside another tau container: the :class:`TauWidget`
-    
-    .. figure:: /_static/label04.png
-      :align: center
-    
-    code::
-    
-        import sys
-        from PyQt4 import Qt
-        import tau.widget
-    
-        app = Qt.QApplication(sys.argv)
-        panel = tau.widget.TauWidget()
-        layout = Qt.QVBoxLayout()
-        panel.setLayout(layout)
-        panel.setModel('sys/tautest/1')
-        w1 = tau.widget.TauValueLabel()
-        w2 = tau.widget.TauValueLabel()
-        w3 = tau.widget.TauValueLabel()
-        w1.setUseParentModel(True)
-        w2.setUseParentModel(True)
-        w3.setUseParentModel(True)
-        w1.setModel('/state')
-        w2.setModel('/position')
-        w3.setModel('/simulationmode')
-        w1.setShowQuality(False)
-    
-        layout.addWidget(w1)
-        layout.addWidget(w2)
-        layout.addWidget(w3)
-        panel.setVisible(True)
-    
-        sys.exit(app.exec_())
-    
-    TauStateLabel tutorial
-    ----------------------
-    
-    The :class:`TauStateLabel` is a tau widget designed to display the state of a
-    device both with the background color.
-    
-    .. figure:: /_static/label05.png
-      :align: center
-    
-    Because :class:`TauStateLabel` inherits from :class:`TauValueLabel`, all 
-    :class:`TauValueLabel` properties are available.
-    
-    **model**:
-        The model for the :class:`TauStateLabel` only accepts state attributes!
-    
-    **showQualityForeground**:
-        - *Type*: bool
-        - *Default value:* True
-        - *Description*: When set to True, it uses the attribute quality to display
-          the text foreground color
-    
-    Simple display state
-    ~~~~~~~~~~~~~~~~~~~~
-    
-    The simplest example of :class:`TauStateLabel`
-    
-    .. figure:: /_static/label05.png
-      :align: center
-    
-    code::
-    
-        import sys
-        from PyQt4 import Qt
-        import tau.widget
-    
-        app = Qt.QApplication(sys.argv)
-        panel = Qt.QWidget()
-        layout = Qt.QHBoxLayout()
-        panel.setLayout(layout)
-        w = tau.widget.TauStateLabel()
-        w.setModel('sys/tautest/1/state')
-        layout.addWidget(w)
-        panel.setVisible(True)
-    
-        sys.exit(app.exec_())
-    
-    Array of state display
-    ~~~~~~~~~~~~~~~~~~~~~~
-    
-    This example shows how to display multiple device states using a small area
-    of the GUI.
-    This example assumes there are 8 devices running with names: 'sys/tautest/<1-8>'
-    
-    .. figure:: /_static/label06.png
-      :align: center
-      
-    code::
-    
-        import sys
-        from PyQt4 import Qt
-        import tau.widget
-    
-        app = Qt.QApplication(sys.argv)
-        panel = Qt.QWidget()
-        layout = Qt.QGridLayout()
-        panel.setLayout(layout)
-        for y in range(4):
-            for x in range(2):
-                w = tau.widget.TauStateLabel()
-                w.setModel('sys/tautest/%d/state' % ((y+1)+4*x))
-                w.setShowText(False)
-                layout.addWidget(w,x,y)
-        panel.setVisible(True)
-    
-        sys.exit(app.exec_())
-    
-    TauConfigLabel tutorial
-    -----------------------
-    
-    @TODO
-      
-    .. _Tango: http://www.tango-controls.org/
-    .. _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
-    .. _Qt: http://qt.nokia.com/products/
-    .. _PyQt: http://www.riverbankcomputing.co.uk/software/pyqt/
-    .. _PyQwt: http://pyqwt.sourceforge.net/
-    .. _IPython: http://ipython.scipy.org/
-    .. _ATK: http://www.tango-controls.org/Documents/gui/atk/tango-application-toolkit
-    .. _Qub: http://www.blissgarden.org/projects/qub/
-    .. _numpy: http://numpy.scipy.org/
-    .. _SPEC: http://www.certif.com/
-    .. _EPICS: http://www.aps.anl.gov/epics/
\ No newline at end of file
diff --git a/doc/source/sphinxext/taurusextension.py b/doc/source/sphinxext/taurusextension.py
index 4fe97aa..760dcba 100644
--- a/doc/source/sphinxext/taurusextension.py
+++ b/doc/source/sphinxext/taurusextension.py
@@ -2,24 +2,24 @@
 
 ##############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ##############################################################################
 
@@ -27,76 +27,83 @@
 
 __expr = ('or',)
 
+
 def process_type(t, obj_type='class'):
     t = t.strip()
-    if not t: return ''
-    if t in __expr: return t
+    if not t:
+        return ''
+    if t in __expr:
+        return t
     if t.count(' or '):
-       i = t.index(' or ')
-       return ' '.join(map(process_type, (t[:i],'or', t[i+4:])))
+        i = t.index(' or ')
+        return ' '.join(map(process_type, (t[:i], 'or', t[i + 4:])))
     if not t.count('<') or not t.count('>'):
-        ret = ':%s:~`%s`' % (obj_type, t)
+        ret = ':%s:`~%s`' % (obj_type, t)
         return ret
-    
-    #process a container template
+
+    # process a container template
     start, stop = t.index('<'), t.index('>')
     main_type = t[:start]
     main_type = process_type(main_type)
-    types = t[start+1:stop].split(',')
+    types = t[start + 1:stop].split(',')
     types = ', '.join(map(process_type, types))
     return "%s <%s>" % (main_type, types)
 
+
 def process_param(line):
     new_lines = []
     try:
         prefix, param, desc = line.split(':', 2)
         p, param_name = param.split()
         desc = desc.strip()
-        if desc[0] == '(' :
+        if desc[0] == '(':
             pos = desc.find(')')
             if pos != -1:
                 elem_type = desc[1:pos]
                 klass = process_type(elem_type)
-                desc = desc[pos+1:]
-                new_lines.append('%s:type %s: %s' % (prefix, param_name, klass))
+                desc = desc[pos + 1:]
+                new_lines.append('%s:type %s: %s' %
+                                 (prefix, param_name, klass))
         new_lines.append('%s:param %s: %s' % (prefix, param_name, desc))
     except Exception, e:
         print "Taurus sphinx extension: Not able to process param: '%s'" % line
-        print "      Reason:",str(e)
+        print "      Reason:", str(e)
         new_lines.append(line)
     return new_lines
 
+
 def process_return(line):
     new_lines = []
     try:
         prefix, param, desc = line.split(':', 2)
         desc = desc.strip()
-        if desc[0] == '(' :
+        if desc[0] == '(':
             pos = desc.find(')')
             if pos != -1:
                 elem_type = desc[1:pos]
                 klass = process_type(elem_type)
-                desc = desc[pos+1:]
+                desc = desc[pos + 1:]
                 new_lines.append('%s:rtype: %s' % (prefix, klass))
         new_lines.append('%s:return: %s' % (prefix, desc))
     except Exception, e:
         print "TaurusExtension: Not able to process 'return': '%s'" % line
-        print "      Reason:",str(e)
+        print "      Reason:", str(e)
         new_lines.append(line)
     return new_lines
 
+
 def process_raise(line):
     new_lines = []
     try:
         prefix, param, desc = line.split(':', 2)
         desc = desc.strip()
         klass = ''
-        if desc[0] == '(' :
+        if desc[0] == '(':
             pos = desc.find(')')
             if pos != -1:
                 elem_type = desc[1:pos]
                 klass = "(" + process_type(elem_type, obj_type='exc') + ")"
-                desc = desc[pos+1:]
+                desc = desc[pos + 1:]
         new_lines.append('%s:raise: %s %s' % (prefix, klass, desc))
     except Exception, e:
         print "TaurusExtension: Not able to process 'raise': '%s'" % line
@@ -104,11 +111,13 @@ def process_raise(line):
         new_lines.append(line)
     return new_lines
 
+
 def _is_return(line):
     ret = line.startswith(':return')
     ret |= line.startswith(':returns')
     return ret
 
+
 def _is_param(line):
     ret = line.startswith(':param')
     ret |= line.startswith(':parameter')
@@ -118,11 +127,13 @@ def _is_param(line):
     ret |= line.startswith(':keyword')
     return ret
 
+
 def _is_raise(line):
     ret = line.startswith(':raise')
     ret |= line.startswith(':except')
     return ret
 
+
 def process_signature(app, what, name, obj, options, lines):
     ret = []
     for nb, line in enumerate(lines):
@@ -135,10 +146,10 @@ def process_signature(app, what, name, obj, options, lines):
             ret.extend(process_raise(line))
         else:
             ret.append(line)
-    
+
     del lines[:]
     lines.extend(ret)
-    
-    
+
+
 def setup(app):
-    app.connect('autodoc-process-docstring', process_signature)
\ No newline at end of file
+    app.connect('autodoc-process-docstring', process_signature)
diff --git a/doc/source/users/getting_started.rst b/doc/source/users/getting_started.rst
index 218523d..3a2a734 100644
--- a/doc/source/users/getting_started.rst
+++ b/doc/source/users/getting_started.rst
@@ -13,20 +13,17 @@ Installing
 Installing with pip (platform-independent)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Using pip is the simplest approach. The following command will automatically
-download and install the latest release of Taurus::
+Taurus can be installed using pip. The following command will automatically
+download and install the latest release of Taurus (see pip --help for options)::
 
-       pip install taurus --egg
+       pip install taurus
 
 You can test the installation by running::
 
        python -c "import taurus; print taurus.Release.version"
 
-Note 1: the `--egg` parameter is necessary (see `this ticket
-<https://sourceforge.net/p/tauruslib/tickets/194/>`__). You can also add other
-parameters (e.g. `--user`)
 
-Note 2: pip is already included in python>2.7.9 (or python 3.4.0 for the 3.x series)
+Note: pip is already included in python>2.7.9 (or python 3.4.0 for the 3.x series)
 
 Installing from PyPI manually (platform-independent)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -34,8 +31,8 @@ Installing from PyPI manually (platform-independent)
 You may alternatively install from a downloaded release package:
 
 #. Download the latest release of taurus from http://pypi.python.org/pypi/taurus
-#. Extract the downloaded source into a temporary directory
-#. type::
+#. Extract the downloaded source into a temporary directory and change to it
+#. run::
 
        python setup.py install
 
@@ -51,19 +48,19 @@ 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/>`__)
 
-    
+
 Windows
 ~~~~~~~
 
 #. Download the latest windows binary from http://pypi.python.org/pypi/taurus
-#. Run the installation excecutable
+#. Run the installation executable
 #. test the installation::
-       
-       C:\Python26\python -c "import taurus; print taurus.Release.version"
+
+       C:\Python27\python -c "import taurus; print taurus.Release.version"
 
 Windows installation shortcut
 #############################
@@ -72,8 +69,8 @@ This chapter provides a quick shortcut to all windows packages which are
 necessary to run taurus on your windows machine
 
 #. from `Python(x,y)`_
-    #. Download and install a python 2.6/2.7 compatible version of python(x,y)
-       from `here <http://code.google.com/p/pythonxy>`_
+    #. Download and install a python 2.7 compatible version of python(x,y)
+       from `here <http://python-xy.github.io/>`_
 
 #. from scratch:
     #. Download and install `PyQwt`_ < 6.0 from `PyQwt downdoad page <http://pyqwt.sourceforge.net/download.html>`_
@@ -84,30 +81,23 @@ necessary to run taurus on your windows machine
 #. Finally:
     #. Download and install latest `PLY`_ from `PLY downdoad page <http://www.dabeaz.com/ply>`_ (necessary for jdraw synoptics only)
     #. Download and install latest `PyTango`_ from `PyTango downdoad page <http://pypi.python.org/pypi/PyTango>`_
-    #. Download and install latest taurus from `Taurus downdoad page <http://pypi.python.org/pypi/taurus>`_
+    #. Download and install latest Taurus from `Taurus downdoad page <http://pypi.python.org/pypi/taurus>`_
 
-Working from Git source without installing
-------------------------------------------
+Working from Git source directly (in develop mode)
+--------------------------------------------------
 
-Sometimes it is convenient to work directly from the git source without 
-installing. 
+If you intend to do changes in Taurus itself, it is convenient to work 
+directly from the git source in "develop" mode, so that you do not need 
+to re-install on each change.
 
 You can clone taurus from our main git repository::
 
     git clone git://git.code.sf.net/p/tauruslib/taurus.git taurus
 
-Then, if you decide to work directly from Git code (without installing):
-
-    1. add <taurus_root_dir>/lib to PYTHONPATH
-    2. add <taurus_root_dir>/scripts to PATH
-    3. build the resources::
-    
-        cd <taurus_root_dir>
-        python setup.py build_resources
-        
-
-
+Then, to work on develop mode, just do::
 
+    cd taurus
+    python setup.py develop
 
 .. _dependencies:
 
@@ -118,89 +108,67 @@ Dependencies
 
     digraph dependencies {
         size="8,3";
-        Taurus      [shape=box,label="taurus 2.0"];
-        PyTango     [shape=box,label="PyTango 7.1.0"];
-        Python      [shape=box,label="Python >=2.6"];
+        Taurus      [shape=box,label="taurus 4.0"];
+        Python      [shape=box,label="Python >=2.7"];
         numpy       [shape=box,label="numpy >=1.1.0"];
-        PyQt        [shape=box,label="PyQt >=4.4.3"];
+        PyTango     [shape=box,label="PyTango >=7.1.0"];
+        pyepics     [shape=box,label="pyepics >=3.2.4"];
+        PyQt        [shape=box,label="PyQt >=4.8"];
         PyQwt       [shape=box,label="PyQwt >=5.2.0"];
-        Qub         [shape=box,label="Qub >=1.1.0"];
-        qtcontrols  [shape=box,label="qtcontrols >=1.1.0"];
-        PyMca       [shape=box,label="PyMca >=4.4.1"];
-        ply         [shape=box,label="PLY"];
-        
+        guiqwt      [shape=box,label="guiqwt >=2.3.0"];
+        PyMca5      [shape=box,label="PyMca5 >=5.1.2"];
+        ply         [shape=box,label="PLY >=2.3"];
+
         Taurus -> Python;
-        Taurus -> PyTango;
+        Taurus -> numpy;
+        Taurus -> PyTango      [style=dotted, label="only for using Tango"];
+        Taurus -> pyepics      [style=dotted, label="only for using EPICS"];
         Taurus -> PyQt         [label="taurus.qt only"];
         Taurus -> PyQwt        [label="taurus.qt only"];
-        Taurus -> Qub          [style=dotted, label="taurus.qt.qtgui.image only"];
-        Taurus -> qtcontrols   [style=dotted, label="taurus.qt.qtgui.gauge only"];
-        Taurus -> PyMca        [style=dotted, label="taurus.qt.qtgui.extra_nexus only"];
+        Taurus -> guiqwt       [style=dotted, label="taurus.qt.qtgui.extra_guiqwt only"];
+        Taurus -> PyMca5       [style=dotted, label="taurus.qt.qtgui.extra_nexus only"];
         Taurus -> ply          [style=dotted, label="taurus.qt.qtgui.graphic.jdraw only"];
-        Taurus -> numpy;
-    } 
+    }
 
 Taurus has dependencies on some python libraries. After you installed taurus you
 can check the state of the dependencies by doing::
 
-    >>> import taurus
-    >>> taurus.check_dependencies()
-    Checking required dependencies of taurus.core...
-        Checking for Python >=2.6.0... [OK] (Found 2.6.2)
-        Checking for PyTango >=7.1.0... [OK] (Found 7.1.0)
-    Checking required dependencies of taurus.qt...
-        Checking for PyQt >=4.4.3... [OK] (Found 4.5.0)
-        Checking for PyQwt >=5.2.0... [OK] (Found 5.2.1)
-    Checking OPTIONAL dependencies of taurus.qt...
-        Checking for Qub >=1.0.0... [OK] (Found 1.0.0)
-        Checking for qtcontrols >=1.0.0... [OK] (Found 1.0.0)
+    import taurus
+    taurus.check_dependencies()
     
-- You may already have PyTango_ installed. You will need PyTango 7 or later.
-  You can check by doing::
-
-      python -c 'import PyTango; print PyTango.Release.version'
+- If you want to interact with a Tango controls system, you need PyTango_ 7 or later
+  installed. You can check by doing::
 
-  If that fails or it reports and older version follow the `PyTango installation steps`_
-  to properly install PyTango.
-
-- You may already have PyQt_ installed. You will need PyQt 4.4 or later.
-  You can check by doing::
+    python -c 'import PyTango; print PyTango.Release.version'
+    
+- If you want to interact with an EPICS controls system,you need pyepics_
 
-      python -c 'import PyQt4.Qt; print PyQt4.Qt.QT_VERSION_STR'
+- For using the taurus Qt widgets, you will need PyQt_ 4.8 or later 
+  (PyQt5 support comming soon). You can check by doing::
 
-Optional packages
-~~~~~~~~~~~~~~~~~
+    python -c 'import PyQt4.Qt; print PyQt4.Qt.QT_VERSION_STR'
 
-- The plotting widgets are only available if you have PyQwt_.
-  You may already have PyQwt_ installed. You will need PyQwt 5.2.0 or later.
-  You can check it by doing::
+- The :mod:`taurus.qt.qtgui.plot` module requires PyQwt_ 5.2.0 or later.
+  (this dependency will be dropped soon). You can check it by doing::
 
       python -c 'import PyQt4.Qwt5; print PyQt4.Qwt5.QWT_VERSION_STR'
 
-- 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 image widgets require the guiqwt_ library.
+
+- The JDraw synoptics widgets require the PLY_ package.
 
-- 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
+- The NeXus browser widget requires PyMca5_.
 
 
-.. _numpy: http://numpy.scipy.org/
+.. _numpy: http://numpy.org/
 .. _PLY: http://www.dabeaz.com/ply/
-.. _Python(x,y): http://code.google.com/p/pythonxy/
+.. _Python(x,y): http://python-xy.github.io/
 .. _Tango: http://www.tango-controls.org/
 .. _PyTango: http://packages.python.org/PyTango/
-.. _`PyTango installation steps`: http://packages.python.org/PyTango/start.html#getting-started
-.. _QTango: http://www.tango-controls.org/download/index_html#qtango3
 .. _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/
-.. _PyMca: http://pymca.sourceforge.net/
+.. _guiqwt: https://pypi.python.org/pypi/guiqtw
+.. _IPython: http://ipython.or/g
+.. _PyMca5: http://pymca.sourceforge.net/
+.. _pyepics: http://pypi.python.org/pypi/pyepics
diff --git a/doc/source/users/introduction.rst b/doc/source/users/introduction.rst
index 10922f0..3523dcd 100644
--- a/doc/source/users/introduction.rst
+++ b/doc/source/users/introduction.rst
@@ -4,39 +4,46 @@
 Introduction
 ============
 
-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 was originally conceived as a library for connecting client side
+applications (CLIs and GUIs) to Tango_ device servers. Since v4.0
+the Taurus core became control-system agnostic, and it supports other control
+systems (such as EPICS_) and data sources.
+
+.. note:: due to its Tango origin, this documentation will tend to use many
+          Tango-related examples. We intend to gradually introduce more 
+          non-Tango examples
 
 Taurus was developed within the Sardana_ project, but since it has being found 
-to be useful for other projects not related to Sardana, it has been 
+useful for other projects not related to Sardana, it has been 
 moved to a separate project (although both projects are kept in sync and share 
 most of their developers).
 
-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_.
+Taurus uses the Model-View-Controller (MVC) pattern to build interfaces. 
+
+The :mod:`taurus.core` module uses plugins (known as schemes) to provide TaurusModel 
+objects that abstract the interactions with specific sources of data and/or 
+control objects. Some schemes are already implemented for accessing control system 
+libraries (the "tango" and "epics" schemes) as well as for data-processing via a 
+Python interpreter (the "evaluation" scheme). see the :ref:`taurus-core-tutorial`
+for more information on the taurus core.
+
+The Taurus view and controller components are typically implemented as PyQt_ based
+GUIs, but it may also consist on command line interfaces such as Sardana's spock.
 
-The goals of this library are:
- - 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
- 
+The :mod:`taurus.qt` module provides a set of basic widgets (labels, LEDs, editors, 
+forms, plots, tables, buttons, synoptics,...) that extend related Qt widgets with 
+the capability of attaching to Taurus core models in order to display and/or change 
+their data in pre-defined ways. For example, a TaurusPlot widget will display a curve
+for each attribute model to which it is attached if its value is a one-dimensional 
+numerical array. Similarly, a TaurusForm widget will allow the user to interact with 
+the data represented by its attached models. The actual association of a view (widget) 
+with a model is done by providing the model name to the widget. 
 
-For example, to display the values of four attributes (state, position, velocity, acceleration)
-of a device (motor/icepap/01)::
+The following is an example on how to create a widget that allows to interact with
+four attributes (state, position, velocity, acceleration) of a Tango device 
+(`motor/icepap/01`)::
 
     import sys
-    from taurus.external.qt import Qt
     from taurus.qt.qtgui.panel import TaurusForm
     from taurus.qt.qtgui.application import TaurusApplication
     
@@ -54,42 +61,21 @@ of a device (motor/icepap/01)::
   :scale: 50
   :align: center
   
-  The generated GUI by the above code
+  The GUI resulting from the above code
 
 The above example can even be achieved even without typing any code::
 
     % cd taurus/qt/qtgui/panel
-    % python taurusform.py motor/icepap/01/state motor/icepap/01/position motor/icepap/01/velocity
+    % taurusform motor/icepap/01/state motor/icepap/01/position motor/icepap/01/velocity
   
-In many aspects, taurus follows the same approach as the tango java application 
-toolkit: Tango ATK_. If you know ATK_ you will find many things in taurus familiar.
+For many more examples, See the :ref:`examples` page.
 
-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_, PyQt_ and PyQwt_ to provide good performance even when 
+Taurus is a pure-python module, but it makes heavy use of PyTango_, numpy_,
+PyQt_, etc. 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 
-applications that are able to connect to tango servers with just a few lines of 
-code or even with no code at all!
-
-The concepts were not born from scratch. It is not our intention to reinvent the 
-way applications are written. Many of the concepts were borrowed from the 
-existing java tango library called ATK_. If you have used ATK_ before you will 
-find many concepts familiar.
 
-.. image:: /_static/taurus_layers.png
-  :scale: 80
-  :align: center
 
-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/
@@ -105,4 +91,4 @@ implemented for providing web widgets.
 .. _Qub: http://www.blissgarden.org/projects/qub/
 .. _numpy: http://numpy.scipy.org/
 .. _SPEC: http://www.certif.com/
-.. _EPICS: http://www.aps.anl.gov/epics/
\ No newline at end of file
+.. _EPICS: http://www.aps.anl.gov/epics/
diff --git a/doc/source/users/ui/attributechooser.rst b/doc/source/users/ui/attributechooser.rst
deleted file mode 100644
index 33e6e9b..0000000
--- a/doc/source/users/ui/attributechooser.rst
+++ /dev/null
@@ -1,33 +0,0 @@
-.. currentmodule:: tau.qt.qtgui.panel
-
-.. _attributechooser:
-
-=================================
-AttributeChooser User's Interface
-=================================
-
-.. note:: The AttributeChooser widget has been superseded by the TaurusModelChooser
-          widget. See  :ref:`TaurusModelChooser User's Interface Guide <modelchooser>`
-
-The  :class:`TaurusAttributeChooser` is a widget used by Taurus applications for
-prompting the user to choose one or more attributes of the control system.
-
-.. figure:: /_static/attributechooser01.png
-  :align: center
-
-To select the attributes using :class:`TaurusAttributeChooser`, you typically do the
-following:
-
-1. Select a device from those available in the `Devices` list (#1 in the figure)
-2. Now select one or more attributes of this device from the `Attributes` list
-   (#2 in the figure).
-3. Add them to the `Chosen Attributes` list (#3 in the figure) by either using
-   the `Add` button (the down arrow icon) or by double-clicking in their names in list #2.
-4. Repeat previous steps if you want to add other attributes or use the
-   `Remove` button (the up-arrow icon) to remove attributes from the chosen
-   `Chosen Attributes` list.
-5. Click the `Apply` button to apply the changes when satisfied.
-   
-**Important**: The list of devices (#1 of the figure) can be quite long. You can
-filter it by typing part of the device name in the `Enter path` box (#4 in the
-figure).
diff --git a/doc/source/users/ui/experimentconfiguration.rst b/doc/source/users/ui/experimentconfiguration.rst
deleted file mode 100644
index d6bcd3e..0000000
--- a/doc/source/users/ui/experimentconfiguration.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-.. currentmodule:: sardana.taurus.qt.qtgui.extra_sardana
-
-.. _expconf_ui:
-
-
-=======================================
-Experiment Configuration user interface
-=======================================
-
-.. contents::
-
-.. todo:: 
-    Experiment Configuration documentation to be written  
-
- 
\ No newline at end of file
diff --git a/doc/source/users/ui/forms.rst b/doc/source/users/ui/forms.rst
index bfd464f..0470281 100644
--- a/doc/source/users/ui/forms.rst
+++ b/doc/source/users/ui/forms.rst
@@ -73,21 +73,22 @@ representing its attributes and/or widgets.
   sys/tg_test/1/float_image`
 
 
-For the attributes, TaurusForm checks the type of attribute (whether it is an
+For the attributes, TaurusForm checks the type of attribute (whether it is a
 scalar or an array, whether it is a number or a string or a boolean, whether it
 is writable or read-only, etc.). For certain attributes, more than one widget
 may be adequate, and the form allows the user to switch between them (See the
 `Changing the contents of a form`_ section).
 
-For the devices, the class of the device is searched in the map defined in
-`<taurus>/TaurusCustomSettings.py` and the given widget is used if there is a
+For Tango devices, the Tango Class of the device is searched in the 
+`T_FORM_CUSTOM_WIDGET_MAP` map defined in
+:ref:`tauruscustomsettings` and the given widget is used if there is a
 match. Otherwise, the default device representation is used, which shows a
 button that launches an :class:`AttributeForm` showing *all* the attributes for
 that device.
 
-For an example on how a custom widget can be used for a certain type of device,
-see the :class:`taurus.qt.qtgui.extra_pool.PoolChannelTV` or
-:class:`taurus.qt.qtgui.extra_pool.PoolMotorTV` widgets.
+As an example, Sardana_ makes heavy use of `T_FORM_CUSTOM_WIDGET_MAP` in order
+to display specific widgets for its motor and channel devices.
+
 
 Changing the contents of a form
 -------------------------------
@@ -104,12 +105,19 @@ and *how* it is shown in the form.
     TaurusForm, or a :ref:`TaurusModelChooser <modelchooser>`). See the `Drag and
     Drop support`_ section for more details.
   
-- Regarding *how* it is shown, you can change which widget is used for
-  displaying the read value or the write value of a given item. This is done by
-  right-clicking on the label of the item and selecting the `change Read Widget`
-  (or `change write widget`) option. As before, this will only be possible if user
-  modifications are allowed for the form.
-
+- Regarding *how* it is shown, you can change the following (provided that 
+  user modifications are allowed for this form):
+  
+  - which widget is used for displaying the read value or the write value of a 
+    given item. This is done by right-clicking on the label of the item and 
+    selecting the `change Read Widget` (or `change write widget`) option. 
+  
+  - Whether to use *compact mode* or not. See `Compact mode`_ section for more details
+    
+  - The text shown in the label widget for a value can be customised via the 
+    'Change Label' option in the label's context menu. It can also be changed for 
+    all values in a form with the 'Change Labels' option of the form's context menu.
+    
 .. tip:: You can use the `Modify contents` option to re-order what is shown.
    
 Drag and Drop support
@@ -129,8 +137,26 @@ its current list of displayed models and shows them.
 .. tip:: If you accidentally dropped a model and want to remove the new item,
    just use the `Modify contents` option from the form's context menu.
    
-Interacting with the control system: writing to attributes
-----------------------------------------------------------
+Compact Mode
+------------
+
+When in compact mode, a value in a form is shown with only one column for both 
+the read and write widget. Normally the read widget is shown, and only when 
+the user triggers the edition mode, the write widget is shown. The edit triggers are, 
+tipically:
+
+- the F2 key
+- Double-clicking on the read widget
+
+The edition mode is left when the write widget loses focus, or the changes 
+have been applied. Also, in many cases, when the "ESC" key is pressed.
+
+You can enable/disable the compact mode for a value by right-clicking on its 
+label and selecting 'compact mode'. You can also set the compact mode for all
+values in the form via the context menu of the form.
+   
+Writing to attributes
+----------------------
 
 Taurus attributes can be read-only or allow writing. Those attributes that are
 writable have two values: the *read value* and the *write value*. The read value
@@ -143,6 +169,9 @@ equal. The write value is a "set point", or "desired value" while the read value
 gives the actual value as read by the control system (for example, in a power
 supply device, the read value of its voltage attribute oscillate around the write value
 due to ripple).
+Also note that the units associated to the read and write values may not be the 
+same (In Tango, they are internally the same, but other schemes may have ways of 
+defining them independently)
 
 Since writing wrong values may be dangerous for some equipment, the default
 behaviour of write widgets is not to apply new values directly as you type the
@@ -204,3 +233,6 @@ the same time you will be aware of them.
 
 .. tip:: Remember that you can check the cause of a pending operation by
          consulting the write widget tooltip.
+
+
+.. _Sardana: http://www.sardana-controls.org/
\ No newline at end of file
diff --git a/doc/source/users/ui/index.rst b/doc/source/users/ui/index.rst
index 644fee9..02dde86 100644
--- a/doc/source/users/ui/index.rst
+++ b/doc/source/users/ui/index.rst
@@ -10,7 +10,6 @@ User's Interface
     
     Color meaning <ui_colors>
     Forms <forms>
-    Attribute Chooser <attributechooser>
     Model Chooser <modelchooser>
     Plots <plot>
     Trends <trend>
@@ -18,13 +17,10 @@ User's Interface
     Array Editor <arrayeditor>
     Synoptics <synoptics>
     TaurusPanel & TaurusDevicePanel <devpanels>
-    Macros <macros/index>
     TaurusGui <taurusgui>
     TaurusDemo <taurusdemo>
     Logs <logs>
     Configurations <configurations>
-    Experiment Configuration <experimentconfiguration>
-    Sardana Editor <sardanaeditor>
     
     
 
diff --git a/doc/source/users/ui/macros/index.rst b/doc/source/users/ui/macros/index.rst
deleted file mode 100644
index 78305ec..0000000
--- a/doc/source/users/ui/macros/index.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-.. _users-interface-macros:
-
-=====================
-Macro related widgets
-=====================
-
-.. toctree::
-    :maxdepth: 3
-   
-    MacroExecutor <macroexecutor>
-    Sequencer <sequencer>
\ No newline at end of file
diff --git a/doc/source/users/ui/macros/macroexecutor.rst b/doc/source/users/ui/macros/macroexecutor.rst
deleted file mode 100644
index 57a6067..0000000
--- a/doc/source/users/ui/macros/macroexecutor.rst
+++ /dev/null
@@ -1,152 +0,0 @@
-.. _macroexecutor_ui:
-
-==========================================
-MacroExecutor User's Interface
-==========================================
-
-
-.. contents::
-
-
-*MacroExecutor* provides an user-friendly graphical interface to macro execution.
-It is divided into 3 main areas: `actions bar`, `parameters editor` and `favourites list`. 
-Their functionalities are supported by `Spock command line` and `macro progress bar`.
-User has full control over macros thanks to action buttons: Start(Resume), Stop, Pause located in `actions bar`     
-Graphical `parameters editor` provides a clear way to set and modify macro execution settings (parameters).
-Macros which are more frequently used can be permanently stored in `favourites list`. 
-Once macro was started Door's state led and `macro progress bar` informs user about its status. 
-Current macro settings (parameters) are translated to spock syntax, and represented in non editable
-`spock command line`.
-
-.. figure:: /_static/macros/macroexecutor01.png
-  :align: center
-
-
-.. _macroexecutor_stand-alone:
-
-
-MacroExecutor as a stand-alone application
-------------------------------------------
-
-You may also use *MacroExcutor* as a stand-alone application. In this case it appears embedded
-in window and some extra functionalities are provided. 
-You can launch the stand-alone *MacroExecutor* with the following command::
-
-    macroexecutor [options] [<macro_executor_dev_name> <door_dev_name>]
-	
-Options::
- 
-  --taurus-log-level=LEVEL
-                        taurus log level. Allowed values are (case
-                        insensitive): critical, error, warning/warn, info,
-                        debug, trace
-                        
-  --taurus-polling-period=MILLISEC
-                        taurus global polling period in milliseconds
-                        
-  --taurus-serialization-mode=SERIAL
-                        taurus serialization mode. Allowed values are (case
-                        insensitive): serial, concurrent (default)
-  
-  --tango-host=TANGO_HOST
-                        Tango host name
-
-    
-The model list is optional and is a space-separated list of two device names: macro server and door.
-If not provided at the application startup, models can be later on changed in configuration dialog.   
-   
-Extra functionalities:
-
-- Changing macro configuration
-
-.. todo:: 
-	This chapter is not ready... Sorry for inconvenience.
-	
-- Configuring custom editors
- 
-.. todo:: 
-	This chapter is not ready... Sorry for inconvenience.
-
-	
-.. _editing_macro_parameters:
-
-Editing macro parameters
-------------------------
-
-.. _editing_macro_parameters_standard:
-
-Using standard editor
-'''''''''''''''''''''
-
-If no custom parameter editor is assigned to macro, default editor is used to configure execution settings (parameters).
-Parameters are represented in form of tree (with hidden root node) - every parameter is a separate branch with two columns: 
-parameter name and parameter value.
-Editor is populated with default values of parameters, if this in not a case 'None' values are used. (If macro execution settings 
-were restored e.g. from favourites list, editor is populated with stored values). Values become editable either by double-clicking on them, 
-or by pressing F2 button when value is selected. This action opens default parameter editor (combobox with predefined values, spin box etc.). 
-
-In case of macros with single parameters only, tree has only a one level branch, and then tree representation looks more like a list 
-(because of hidden root node)
-
-.. figure:: /_static/macros/macroparameterseditor01.png
-  :align: center
-
-In case of macros which contain repeat parameters, concept of tree is more visible.  
- 
-.. figure:: /_static/macros/macroparameterseditor02.png
-  :align: center
-  
-- adding new parameter repetition
-
-First select parameter node and if its maximum number of repetition is not exceeded, button with '+' sign appears enabled. 
-After pressing this button child branch with new repetition appears in tree editor.   
-
-.. figure:: /_static/macros/macroparameterseditor03.png
-  :align: center
-  
-- modifying repetition order
-
-First select repetition node (with #<number> text), and buttons with arrows becomes enable (if it is feasible to change order)
-
-.. figure:: /_static/macros/macroparameterseditor04.png
-  :align: center
-
-- removing parameter repetition
-
-First select repetition node (with #<number> text), and if it's minimum number of repetition is not reached, button with '-' sign appears enabled. 
-After pressing this button child branch disappears from tree editor. (see previous picture)
-
-.. figure:: /_static/macros/macroparameterseditor05.png
-  :align: center
-
-.. _editing_macro_parameters_custom:
-
-Using custom editors
-''''''''''''''''''''
-
-.. todo:: 
-	This chapter is not ready... Sorry for inconvenince. 
-
-.. _editing_favourites_list:
-
-Editing favourites list
------------------------
-  
-Once macro parameters are configured they can be easily stored in favourites list for later reuse.   
-
-- adding a favourite 
-
-Clicking in Add to favourites button (the one with yellow star), adds a new entry in favourite list, 
-with current macro and its current settings.
-
-- restoring a favourite
-
-To restore macro from favourites list just select it in the list and macro parameters editor will immediately populate with stored settings.
-
-- modifying favouites list
-
-First select favourite macro and buttons with arrows becomes enable (if it is feasible to change order)
-
-- removing a favourite
-
-First select favourite macro, button with '-' sign appears enabled. After pressing this button, previously selected macro disappears from the list.
\ No newline at end of file
diff --git a/doc/source/users/ui/macros/sequencer.rst b/doc/source/users/ui/macros/sequencer.rst
deleted file mode 100644
index 6eca58d..0000000
--- a/doc/source/users/ui/macros/sequencer.rst
+++ /dev/null
@@ -1,123 +0,0 @@
-.. _sequencer_ui:
-
-==========================================
-Sequencer User's Interface
-==========================================
-
-
-.. contents::
-
-
-`Sequencer` provides an user-friendly interface to compose and execute sequences of macros. Sequence of macros allows execution 
-of ordered set of macros with just one trigger. It also allows using a concept of hooks (macros attached and executed in defined places of other macros).
-It is divided into 3 main areas: `actions bar`, `sequence editor` and `parameters editor`.
-`Sequence editor` allows you modifying sequences in many ways: appending new macros, changing macros locations and removing macros. 
-Graphical `parameters editor` (standard/custom) provides a clear way to set/modify macro execution settings(parameters). 
-Once sequence of macros is in execution phase, `Sequencer` informs user about its state with Door's state led and macros progress bars. 
-User has full control over sequence, with action buttons: Start, Stop, Pause, Resume. 
-If desirable, sequences can be permanently stored into a file and later on restored from there. 
-This functionality is provided thanks to action buttons: Save and Open a sequence.
-
-.. figure:: /_static/macros/sequencer01.png
-  :align: center
-
-
-.. _sequencer_stand-alone:
-
-Sequencer as a stand-alone application
---------------------------------------
-
-You may also use *Sequencer* as a stand-alone application. In this case it appears embedded
-in window and some extra functionalities are provided.  
-You can launch the stand-alone *Sequencer* with the following command::
-
-    sequencer [options] [<macro_executor_dev_name> <door_dev_name>]
-	
-Options::
- 
-  --taurus-log-level=LEVEL
-                        taurus log level. Allowed values are (case
-                        insensitive): critical, error, warning/warn, info,
-                        debug, trace
-                        
-  --taurus-polling-period=MILLISEC
-                        taurus global polling period in milliseconds
-                        
-  --taurus-serialization-mode=SERIAL
-                        taurus serialization mode. Allowed values are (case
-                        insensitive): serial, concurrent (default)
-  
-  --tango-host=TANGO_HOST
-                        Tango host name
-
-    
-The model list is optional and is a space-separated list of two device names: macro server and door.
-If not provided at the application startup, device names can be later on selected from Macro Configuration Dialog.   
-   
-Extra functionalities:
-
-- MacroConfigurationDialog
-
-.. todo:: 
-		This chapter in not ready... Sorry for inconvenience. 
-		 
-- CustomEditorsPathDialog
- 
-.. todo:: 
-		This chapter in not ready... Sorry for inconvenience.
-		
-.. _editing_sequence:
-
-Editing sequence
-----------------
-
-Sequence is represented as a flat list of ordered macros, in this view each macro is represented as a new line with 4 columns: 
-Macro (macro name), Parameters (comma separated parameter values), Progress (macro progress bar) and Pause 
-(pause point before macro execution - not implemented yet). Macros which contain hooks, expand with branched macros. 
-Macro parameters values can be edited from `parameters editor`, to do so select one macro in sequence editor by clicking on it. 
-Selected macro becomes highlighted, and `parameters editor` populate with its current parameters values. 
-
-.. figure:: /_static/macros/sequenceeditor01.png
-  :align: center
-
-- adding a new macro 
-
-First select macro from macro combo box, and when you are sure to add it to the sequence, press '+' button. 
-To add macro as a hook of other macro, before adding it, please select its parent macro in the sequence, and then press '+' button.
-If no macro was selected as a parent, macro will be automatically appended at the end of the list.    
-   
-.. figure:: /_static/macros/sequenceeditor02.png
-  :align: center  
-  
-- reorganizing sequence
-
-Macros which are already part of a sequence, can be freely moved around, either in execution order or in hook place (if new macro accepts hooks).
-To move macro first select it in the sequence by single clicking on it (it will become highlighted). Then a set of buttons with arrows 
-become enabled. Clicking on them will cause selected macro changin its position in the sequence (either vertically - execution order or horizontal
-parent macro - hook macro relationship)
-
-.. figure:: /_static/macros/sequenceeditor03.png
-  :align: center
-  
-- remove macro
-
-Macros which are already part of a sequence, can be freely removed from it. To do so first select macro in a sequence by 
-single clicking on it (it will become highlighted). Then button with '-' becomes enabled. Clicking on it removes selected macro. 
-
-.. figure:: /_static/macros/sequenceeditor04.png
-  :align: center  
-
-- configuring hook execution place
-
-If macro is embedded as a hook in parent macro, please follow these instructions to configure its hook execution place. 
-First select macro in a sequence by single clicking on it (it will become highlighted). 
-Then using right mouse button open context menu, go to 'Hook places' sub-menu and select hook places which interest you 
-(you can select more than one). 
-   
-.. figure:: /_static/macros/sequenceeditor05_raw.png
-  :align: center 
-
-	
-Editing macro parameters
-------------------------
-To obtain information about editing macro parameters, please refer to the following link :ref:`Editing macro parameters <editing_macro_parameters>` 
\ No newline at end of file
diff --git a/doc/source/users/ui/sardanaeditor.rst b/doc/source/users/ui/sardanaeditor.rst
deleted file mode 100644
index fe2e89a..0000000
--- a/doc/source/users/ui/sardanaeditor.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-.. currentmodule:: sardana.taurus.qt.qtgui.extra_sardana
-
-.. _sardanaeditor_ui:
-
-
-==========================
-Sardana Editor's interface
-==========================
-
-.. contents::
-
-.. todo:: 
-    Sardana Editor documentation to be written  
-
- 
\ No newline at end of file
diff --git a/doc/source/users/ui/taurusgui.rst b/doc/source/users/ui/taurusgui.rst
index 0c4ffd1..d678ef9 100644
--- a/doc/source/users/ui/taurusgui.rst
+++ b/doc/source/users/ui/taurusgui.rst
@@ -213,7 +213,7 @@ store your preferred arrangement as a perspective using the
 perspective` option).
 
 .. tip:: If you want to backup your current perspectives, or you want to use
-  some perspectives you created in one computer to another computer (or another
+  some perspectives you created in one computer in another computer (or another
   user of the same computer) you can do so by using the `File->Export Settings`
   option. Similarly, use the `File->Import Settings` option to update the application
   perspectives with those contained in the imported file.
@@ -260,7 +260,7 @@ option of the `Tools->External Applications` menu.
   External application editor. You can associate  a command, a text and
   an icon to a new launcher
 
-Just as with the `custom panels <panelcreation>`, when you close the application
+Just as with the :ref:`custom panels <panelcreation>`, when you close the application
 (or when you save a :ref:`perspective <perspectives>`), a dialog will be
 shown if you have created any custom launchers. In this dialog you can choose
 which of the custom launchers you want to keep for future use and which are
@@ -278,7 +278,7 @@ Sardana integration (Macroserver & Pool)
 Macro execution panels
 ''''''''''''''''''''''''
 
-Many TaurusGui-based applications are used to interact with a Sardana `Pool` and
+Many TaurusGui-based applications are used to interact with a Sardana_ `Pool` and
 `MacroServer` in order to run macros (e.g. scans). In these cases several macro-
 related panels will be available:
 
@@ -318,7 +318,7 @@ Server about the Control System to automatically create :ref:`TaurusForm
 <forms>` panels containing all the controls related to the various instruments
 to be controlled by the GUI. An important characteristic is that, since these
 so-called *instrument panels* are created dynamically when launching the
-application, their number and/or contents may vary ,reflecting changes in the
+application, their number and/or contents may vary, reflecting changes in the
 pool configuration.
 
 .. _taurusguiexamples:
@@ -353,3 +353,6 @@ Cannot drop a panel (it stays floating)
 This typically occurs because there is no enought room to acomodate the panel
 width or height in any of the available "slots". Try to make room by hiding some
 other panel, or tabifying other panels together, or increasing the main window size. 
+
+
+.. _Sardana: http://www.sardana-controls.org/
\ No newline at end of file
diff --git a/doc/source/users/ui/ui_colors.rst b/doc/source/users/ui/ui_colors.rst
index a98f049..fc00023 100644
--- a/doc/source/users/ui/ui_colors.rst
+++ b/doc/source/users/ui/ui_colors.rst
@@ -5,13 +5,92 @@ Taurus colors
 ================
 
 Taurus uses color codes on many of its widgets. Colors are used to represent two
-main things: the state of a device and the quality level of an attribute.
-The state represents the summary condition of a certain device. For example, a
-power supply, maybe report to be *On* if it is working properly, *Off* if it is
-shutdown or *Fault* if there is a communication problem between the software and
-the physical device. Taurus allows for a reduced set of these states, each of which
-has a specified color. The table below shows all possible values for the state
-and their corresponding colors.
+main things: 
+
+- the state of a taurus device 
+- the quality of (the reading of) an attribute.
+
+
+Taurus Device state colors
+---------------------------
+
+Taurus Device states, as defined in :class:`taurus.core.TaurusDevState` are
+represented by the following colors:
+
+
+.. raw:: html
+
+    <html>
+    <head>
+    <title>Taurus color guide</title>
+    <style type="text/css">
+    .Ready      { background: rgb(  0, 255,   0); color: rgb(  0,   0,   0); text-align: center; }
+    .NotReady   { background: rgb(255,   0,   0); color: rgb(  0,   0,   0); text-align: center; }
+    .Undefined  { background: rgb(128, 128, 128); color: rgb(  0,   0,   0); text-align: center; }
+    tr.state_row   { height: 40px; }
+    </style>
+    </head>
+    <body align="center">
+    <table width="100%" border="1" cellspacing="0" cellpadding="2">
+    <caption>Colors for the Taurus Device States (scheme-agnostic)</caption>
+    <tr><th>State</th><th>Background</th><th>Foreground</th><th width="80">Preview</th></tr>
+    <tr class="state_row"><td>Ready</td><td>Green (0,255,0)</td><td>Black (0,0,0)</td><td class="Ready">Ready</td></tr>
+    <tr class="state_row"><td>NotReady</td><td>Red (255,0,0)</td><td>Black (0,0,0)</td><td class="NotReady">NotReady</td></tr>
+    <tr class="state_row"><td>Undefined</td><td>Gray (128,128,128)</td><td>Black (0,0,0)</td><td class="Undefined">Undefined</td></tr>
+    </table>
+    </body>
+    </html>
+
+
+Taurus Attribute Value Quality colors
+-------------------------------------
+
+The quality of an attribute measures the reliability of the current read value for
+that attribute. The meanings of the qualities are:
+
+- *Invalid*: there was some problem when trying to read the attribute (the value should not be trusted)
+- *Valid*: the attribute was read correctly (no reason to suspect its value validity)
+- *Alarm*: the value is valid, but it exceeded its defined alarm limits
+- *Warning*: like *Alarm* but for the warning limits
+- *Changing*: the attribute was read correctly but it is being changed at the time of reading (so its value is
+  likely to differ if re-read)
+
+Taurus Attribute value qualities are represented by the following colors:
+      
+.. raw:: html
+
+    <html>
+    <head>
+    <title>Taurus color guide</title>
+    <style type="text/css">
+    .Invalid  { background: rgb(128, 128, 128); color: rgb(255, 255, 255); text-align: right; }
+    .Valid    { background: rgb(0,   255,   0); color: rgb(  0,   0,   0); text-align: right; }
+    .Alarm    { background: rgb(255, 140,   0); color: rgb(255, 255, 255); text-align: right; }
+    .Warning  { background: rgb(255, 140,   0); color: rgb(255, 255, 255); text-align: right; }
+    .Changing { background: rgb(128, 160, 255); color: rgb(  0,   0,   0); text-align: right; }
+    tr.quality_row { height: 40px; }
+    </style>
+    </head>
+    <body>
+    <table width="100%" border="1" cellspacing="0" cellpadding="2">
+    <caption>Colors for Taurus Attribute quality</caption>
+    <tr><th>Quality</th><th>Background</th><th>Foreground</th><th width="80">Preview</th></tr>
+    <tr class="quality_row"><td>Invalid</td><td>Gray (128,128,128)</td><td>White (255,255,255)</td><td class="Invalid">-----</td></tr>
+    <tr class="quality_row"><td>Valid</td><td>Dead Frog Green (0,255,0)</td><td>Black (0,0,0)</td><td class="Valid">10.89 mV</td></tr>
+    <tr class="quality_row"><td>Alarm</td><td>Orange (255,140,0)</td><td>White (255,255,255)</td><td class="Alarm">76.54 mV</td></tr>
+    <tr class="quality_row"><td>Warning</td><td>Orange (255,140,0)</td><td>White (255,255,255)</td><td class="Warning">64.23 mV</td></tr>
+    <tr class="quality_row"><td>Changing</td><td>Light Blue (128,160,255)</td><td>Black (0,0,0)</td><td class="Changing">20.45 mV</td></tr>
+    </table>
+    </body>
+    </html>
+
+
+Tango-specific Device state colors
+----------------------------------
+
+Tango Device states are richer than the generic ones. The following is a table of 
+the colors used to represent Tango-specific device states handled by the :mod:`taurus.core.tango`
+scheme:
 
 .. raw:: html
 
@@ -61,42 +140,3 @@ and their corresponding colors.
     </html>
 
 
-The quality of an attribute (example, voltage of a power supply) defines it's 
-"state". If the value of an attribute can be read then its quality is *valid*.
-If for some reason there is a problem when trying to read the attribute value
-from the equipement and it cannot be displayed, then the quality is set to
-*invalid*. If the value is below or above the warning or alarm thresolds, then
-the quality is set to *alarm*.
-The quality is set to *changing* when the value is being changed over time
-(example, the position of a motor is changing during a motion).
-      
-.. raw:: html
-
-    <html>
-    <head>
-    <title>Taurus color guide</title>
-    <style type="text/css">
-    .ATTR_INVALID  { background: rgb(128, 128, 128); color: rgb(255, 255, 255); text-align: right; }
-    .ATTR_VALID    { background: rgb(0,   255,   0); color: rgb(  0,   0,   0); text-align: right; }
-    .ATTR_ALARM    { background: rgb(255, 140,   0); color: rgb(255, 255, 255); text-align: right; }
-    .ATTR_WARNING  { background: rgb(255, 140,   0); color: rgb(255, 255, 255); text-align: right; }
-    .ATTR_CHANGING { background: rgb(128, 160, 255); color: rgb(  0,   0,   0); text-align: right; }
-    .ATTR_UNKNOWN  { background: rgb(128, 128, 128); color: rgb(  0,   0,   0); text-align: right; }
-    .ATTR_NONE     { background: rgb(128, 128, 128); color: rgb(  0,   0,   0); text-align: right; }
-    tr.quality_row { height: 40px; }
-    </style>
-    </head>
-    <body>
-    <table width="100%" border="1" cellspacing="0" cellpadding="2">
-    <caption>color scheme for the quality</caption>
-    <tr><th>Quality</th><th>Background</th><th>Foreground</th><th width="80">Preview</th></tr>
-    <tr class="quality_row"><td>Invalid</td><td>Gray (128,128,128)</td><td>White (255,255,255)</td><td class="ATTR_INVALID">-----</td></tr>
-    <tr class="quality_row"><td>Valid</td><td>Dead Frog Green (0,255,0)</td><td>Black (0,0,0)</td><td class="ATTR_VALID">10.89 mV</td></tr>
-    <tr class="quality_row"><td>Alarm</td><td>Orange (255,140,0)</td><td>White (255,255,255)</td><td class="ATTR_ALARM">76.54 mV</td></tr>
-    <tr class="quality_row"><td>Warning</td><td>Orange (255,140,0)</td><td>White (255,255,255)</td><td class="ATTR_WARNING">64.23 mV</td></tr>
-    <tr class="quality_row"><td>Changing</td><td>Light Blue (128,160,255)</td><td>Black (0,0,0)</td><td class="ATTR_CHANGING">20.45 mV</td></tr>
-    <tr class="quality_row"><td><empty></td><td>Gray (128,128,128)</td><td>Black (0,0,0)</td><td class="ATTR_NONE">-----</td></tr>
-    </table>
-    </body>
-    </html>
-
diff --git a/doc/thumbnails.zip b/doc/thumbnails.zip
deleted file mode 100644
index 0cf0971..0000000
Binary files a/doc/thumbnails.zip and /dev/null differ
diff --git a/PKG-INFO b/lib/taurus.egg-info/PKG-INFO
similarity index 80%
copy from PKG-INFO
copy to lib/taurus.egg-info/PKG-INFO
index 1cb8573..81b85ab 100644
--- a/PKG-INFO
+++ b/lib/taurus.egg-info/PKG-INFO
@@ -1,20 +1,19 @@
 Metadata-Version: 1.1
 Name: taurus
-Version: 3.7.0
+Version: 4.0.1
 Summary: A framework for scientific/industrial CLIs and GUIs
 Home-page: http://www.taurus-scada.org
-Author: Carlos Pascual-Izarra
-Author-email: cpascual at cells.es
+Author: Taurus Community
+Author-email: tauruslib-devel at lists.sourceforge.net
 License: LGPL
 Download-URL: http://pypi.python.org/packages/source/t/taurus
-Description: Taurus is a python framework for control and data 
-        acquisition CLIs and GUIs in scientific/industrial environments. 
-        It supports multiple control systems or data sources: Tango, EPICS, spec... 
+Description: Taurus is a python framework for control and data
+        acquisition CLIs and GUIs in scientific/industrial environments.
+        It supports multiple control systems or data sources: Tango, EPICS, spec...
         New control system libraries can be integrated through plugins.
-Keywords: CLI,GUI,PyTango,Tango,Shell
+Keywords: CLI,GUI,PyTango,Tango,Shell,Epics
 Platform: Linux
-Platform: Windows XP/2000/NT
-Platform: Windows 95/98/ME
+Platform: Windows
 Classifier: Development Status :: 3 - Alpha
 Classifier: Environment :: Console
 Classifier: Environment :: X11 Applications :: Qt
@@ -28,17 +27,19 @@ Classifier: Operating System :: POSIX :: Linux
 Classifier: Operating System :: Unix
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Scientific/Engineering
 Classifier: Topic :: Software Development :: Libraries
 Classifier: Topic :: Software Development :: User Interfaces
 Classifier: Topic :: Software Development :: Widget Sets
 Requires: numpy (>=1.1)
 Requires: PyTango (>=7.1)
-Requires: PyQt4 (>=4.4)
+Requires: PyQt4 (>=4.8)
 Requires: PyQt4.Qwt5 (>=5.2.0)
 Requires: ply (>=2.3)
 Requires: lxml (>=2.1)
 Requires: spyder (>=2.2)
+Requires: guiqwt (==2.3.1)
 Provides: taurus
 Provides: taurus.core
 Provides: taurus.qt
diff --git a/lib/taurus.egg-info/SOURCES.txt b/lib/taurus.egg-info/SOURCES.txt
new file mode 100644
index 0000000..b0280bf
--- /dev/null
+++ b/lib/taurus.egg-info/SOURCES.txt
@@ -0,0 +1,1918 @@
+CHANGELOG.md
+LICENSE.txt
+MANIFEST.in
+setup.py
+taurus.bmp
+taurus.png
+taurus.svg
+doc/api_AllClasses.rst
+doc/api_class.rst
+doc/api_class_simple.rst
+doc/api_module.rst
+doc/auto_rst4api.py
+doc/buildmock.py
+doc/makeman
+doc/mock.zip
+doc/man/taurusconfigbrowser.1
+doc/man/tauruscurve.1
+doc/man/taurusdesigner.1
+doc/man/taurusdevicepanel.1
+doc/man/taurusform.1
+doc/man/taurusgui.1
+doc/man/taurusiconcatalog.1
+doc/man/taurusimage.1
+doc/man/tauruspanel.1
+doc/man/taurusplot.1
+doc/man/taurustestsuite.1
+doc/man/taurustrend.1
+doc/man/taurustrend1d.1
+doc/man/taurustrend2d.1
+doc/source/conf.py
+doc/source/docs.rst
+doc/source/index.rst
+doc/source/_static/default.css
+doc/source/_static/designer01.png
+doc/source/_static/designer02.png
+doc/source/_static/designer03.png
+doc/source/_static/designer04.png
+doc/source/_static/designer05.png
+doc/source/_static/designer_plugins01.png
+doc/source/_static/edit01.png
+doc/source/_static/edit02.png
+doc/source/_static/edit03.png
+doc/source/_static/forms-pendingops01.png
+doc/source/_static/forms01.png
+doc/source/_static/forms02.png
+doc/source/_static/forms03.png
+doc/source/_static/intro.png
+doc/source/_static/label01.png
+doc/source/_static/label02.png
+doc/source/_static/label03.png
+doc/source/_static/label04.png
+doc/source/_static/label05.png
+doc/source/_static/label06.png
+doc/source/_static/macrogui01.png
+doc/source/_static/perspectives-toolbar01.png
+doc/source/_static/synoptic01.png
+doc/source/_static/taurus_codelogo01.png
+doc/source/_static/taurus_layers.png
+doc/source/_static/taurus_showcase01.png
+doc/source/_static/taurus_spock01.png
+doc/source/_static/taurus_tree01.png
+doc/source/_static/taurusarrayeditor01.png
+doc/source/_static/taurusconfigbrowser.png
+doc/source/_static/taurusdemo.png
+doc/source/_static/taurusform_example01.png
+doc/source/_static/taurusform_example02.png
+doc/source/_static/taurusgui-extapp.png
+doc/source/_static/taurusgui-newgui01.png
+doc/source/_static/taurusgui-newpanel01.png
+doc/source/_static/taurusgui-permanentpanels01.png
+doc/source/_static/taurusgui01.png
+doc/source/_static/taurusiconcatalog-01.png
+doc/source/_static/taurusiconcatalog-details01.png
+doc/source/_static/taurusimage01.png
+doc/source/_static/taurusmodelchooser01.png
+doc/source/_static/taurusplot-config01.png
+doc/source/_static/taurusplot-context01.png
+doc/source/_static/taurusplot-datainfo01.png
+doc/source/_static/taurusplot-datainfo02.png
+doc/source/_static/taurusplot-datainfo03.png
+doc/source/_static/taurusplot-exportascii01.png
+doc/source/_static/taurusplot-inputdata01.png
+doc/source/_static/taurusplot-inputdata02.png
+doc/source/_static/taurusplot-timesupport01.png
+doc/source/_static/taurusplot-timesupport02.png
+doc/source/_static/taurusplot-timesupport03.png
+doc/source/_static/taurusplot01.png
+doc/source/_static/taurusplot02.png
+doc/source/_static/taurusplot03.png
+doc/source/_static/taurusplot04.png
+doc/source/_static/taurusplot_example01.png
+doc/source/_static/taurustrend-fixedRange01.png
+doc/source/_static/taurustrend01.png
+doc/source/_static/taurustrend02.png
+doc/source/_static/taurustrend03.png
+doc/source/_static/taurustrend2d.png
+doc/source/_static/taurusvalue01.png
+doc/source/_static/whatsthiscursor.png
+doc/source/devel/coding_guide.rst
+doc/source/devel/core_tutorial.rst
+doc/source/devel/designer_tutorial.rst
+doc/source/devel/examples.rst
+doc/source/devel/icon_example.py
+doc/source/devel/icon_guide.rst
+doc/source/devel/index.rst
+doc/source/devel/taurus3to4.rst
+doc/source/devel/tauruscustomsettings.rst
+doc/source/devel/taurusgui_newgui.rst
+doc/source/devel/examples/TaurusTest.py
+doc/source/devel/examples/dumpy-bakeout.jdw
+doc/source/devel/examples/edit01.py
+doc/source/devel/examples/edit02.py
+doc/source/devel/examples/edit03.py
+doc/source/devel/examples/forms01.py
+doc/source/devel/examples/forms02.py
+doc/source/devel/examples/label01.py
+doc/source/devel/examples/label02.py
+doc/source/devel/examples/label03.py
+doc/source/devel/examples/label04.py
+doc/source/devel/examples/label05.py
+doc/source/devel/examples/label06.py
+doc/source/devel/examples/parentmodel_issue_demo.py
+doc/source/devel/examples/pyqwt_issue_test.py
+doc/source/devel/examples/taurusplot01.py
+doc/source/devel/examples/taurusplot02.py
+doc/source/devel/examples/taurusplot03.py
+doc/source/devel/examples/taurustrend01.py
+doc/source/devel/examples/taurusvalue01.py
+doc/source/sphinxext/taurusextension.py
+doc/source/users/getting_started.rst
+doc/source/users/index.rst
+doc/source/users/introduction.rst
+doc/source/users/screenshots.rst
+doc/source/users/ui/arrayeditor.rst
+doc/source/users/ui/configurations.rst
+doc/source/users/ui/devpanels.rst
+doc/source/users/ui/forms.rst
+doc/source/users/ui/index.rst
+doc/source/users/ui/logs.rst
+doc/source/users/ui/modelchooser.rst
+doc/source/users/ui/plot.rst
+doc/source/users/ui/synoptics.rst
+doc/source/users/ui/taurusdemo.rst
+doc/source/users/ui/taurusgui.rst
+doc/source/users/ui/taurusimage.rst
+doc/source/users/ui/trend.rst
+doc/source/users/ui/ui_colors.rst
+lib/taurus/__init__.py
+lib/taurus/tauruscustomsettings.py
+lib/taurus.egg-info/PKG-INFO
+lib/taurus.egg-info/SOURCES.txt
+lib/taurus.egg-info/dependency_links.txt
+lib/taurus.egg-info/entry_points.txt
+lib/taurus.egg-info/top_level.txt
+lib/taurus/console/__init__.py
+lib/taurus/console/enums.py
+lib/taurus/console/list.py
+lib/taurus/console/table.py
+lib/taurus/console/util/__init__.py
+lib/taurus/core/__init__.py
+lib/taurus/core/init_bkcomp.py
+lib/taurus/core/init_lightweight.py
+lib/taurus/core/release.py
+lib/taurus/core/taurusattribute.py
+lib/taurus/core/taurusauthority.py
+lib/taurus/core/taurusbasetypes.py
+lib/taurus/core/taurusconfiguration.py
+lib/taurus/core/taurusdatabase.py
+lib/taurus/core/taurusdevice.py
+lib/taurus/core/taurusexception.py
+lib/taurus/core/taurusfactory.py
+lib/taurus/core/taurushelper.py
+lib/taurus/core/tauruslistener.py
+lib/taurus/core/taurusmanager.py
+lib/taurus/core/taurusmodel.py
+lib/taurus/core/taurusoperation.py
+lib/taurus/core/tauruspollingtimer.py
+lib/taurus/core/taurusvalidator.py
+lib/taurus/core/epics/__init__.py
+lib/taurus/core/epics/__taurus_plugin__
+lib/taurus/core/epics/epicsattribute.py
+lib/taurus/core/epics/epicsauthority.py
+lib/taurus/core/epics/epicsdevice.py
+lib/taurus/core/epics/epicsfactory.py
+lib/taurus/core/epics/epicsvalidator.py
+lib/taurus/core/epics/test/__init__.py
+lib/taurus/core/epics/test/test_epicsattribute.py
+lib/taurus/core/epics/test/test_epicsvalidator.py
+lib/taurus/core/epics/test/res/__init__.py
+lib/taurus/core/epics/test/res/epics_test.db
+lib/taurus/core/evaluation/__init__.py
+lib/taurus/core/evaluation/__taurus_plugin__
+lib/taurus/core/evaluation/dev_example.py
+lib/taurus/core/evaluation/evalattribute.py
+lib/taurus/core/evaluation/evalauthority.py
+lib/taurus/core/evaluation/evaldevice.py
+lib/taurus/core/evaluation/evalfactory.py
+lib/taurus/core/evaluation/evalvalidator.py
+lib/taurus/core/evaluation/ipap_example.py
+lib/taurus/core/evaluation/test/__init__.py
+lib/taurus/core/evaluation/test/test_evalattribute.py
+lib/taurus/core/evaluation/test/test_evalfactory.py
+lib/taurus/core/evaluation/test/test_evalvalidator.py
+lib/taurus/core/resource/__init__.py
+lib/taurus/core/resource/__taurus_plugin__
+lib/taurus/core/resource/resfactory.py
+lib/taurus/core/resource/resvalidator.py
+lib/taurus/core/resource/test/__init__.py
+lib/taurus/core/resource/test/test_resfactory.py
+lib/taurus/core/resource/test/test_resvalidator.py
+lib/taurus/core/resource/test/res/__init__.py
+lib/taurus/core/resource/test/res/attr_resources_file.py
+lib/taurus/core/tango/__init__.py
+lib/taurus/core/tango/__taurus_plugin__
+lib/taurus/core/tango/enums.py
+lib/taurus/core/tango/search.py
+lib/taurus/core/tango/starter.py
+lib/taurus/core/tango/tangoattribute.py
+lib/taurus/core/tango/tangoconfiguration.py
+lib/taurus/core/tango/tangodatabase.py
+lib/taurus/core/tango/tangodevice.py
+lib/taurus/core/tango/tangofactory.py
+lib/taurus/core/tango/tangovalidator.py
+lib/taurus/core/tango/img/__init__.py
+lib/taurus/core/tango/img/img.py
+lib/taurus/core/tango/test/__init__.py
+lib/taurus/core/tango/test/test_modelequality.py
+lib/taurus/core/tango/test/test_tangoattribute.py
+lib/taurus/core/tango/test/test_tangovalidator.py
+lib/taurus/core/tango/test/tgtestds.py
+lib/taurus/core/tango/test/res/TangoSchemeTest
+lib/taurus/core/tango/test/res/__init__.py
+lib/taurus/core/tango/util/__init__.py
+lib/taurus/core/tango/util/tango_taurus.py
+lib/taurus/core/test/__init__.py
+lib/taurus/core/test/basevalidator.py
+lib/taurus/core/test/modelequality.py
+lib/taurus/core/test/modulemanager.py
+lib/taurus/core/test/test_tauruscoreindependent.py
+lib/taurus/core/test/test_taurushelper.py
+lib/taurus/core/util/__init__.py
+lib/taurus/core/util/codecs.py
+lib/taurus/core/util/colors.py
+lib/taurus/core/util/console.py
+lib/taurus/core/util/constant.py
+lib/taurus/core/util/containers.py
+lib/taurus/core/util/enumeration.py
+lib/taurus/core/util/event.py
+lib/taurus/core/util/eventfilters.py
+lib/taurus/core/util/excepthook.py
+lib/taurus/core/util/init_bkcomp.py
+lib/taurus/core/util/init_lightweight.py
+lib/taurus/core/util/lock.py
+lib/taurus/core/util/log.py
+lib/taurus/core/util/object.py
+lib/taurus/core/util/prop.py
+lib/taurus/core/util/property_parser.py
+lib/taurus/core/util/propertyfile.py
+lib/taurus/core/util/remotelogmonitor.py
+lib/taurus/core/util/safeeval.py
+lib/taurus/core/util/singleton.py
+lib/taurus/core/util/sourcecode.py
+lib/taurus/core/util/tablepprint.py
+lib/taurus/core/util/tb.py
+lib/taurus/core/util/threadpool.py
+lib/taurus/core/util/timer.py
+lib/taurus/core/util/user.py
+lib/taurus/core/util/whichexecutable.py
+lib/taurus/core/util/wrap.py
+lib/taurus/core/util/argparse/__init__.py
+lib/taurus/core/util/argparse/taurusargparse.py
+lib/taurus/core/util/decorator/__init__.py
+lib/taurus/core/util/decorator/decorator.py
+lib/taurus/core/util/decorator/memoize.py
+lib/taurus/core/util/decorator/typecheck.py
+lib/taurus/core/util/report/__init__.py
+lib/taurus/core/util/report/report.py
+lib/taurus/core/util/test/__init__.py
+lib/taurus/core/util/test/test_codecs.py
+lib/taurus/core/util/test/test_timer.py
+lib/taurus/external/__init__.py
+lib/taurus/external/argparse/LICENSE.txt
+lib/taurus/external/argparse/__init__.py
+lib/taurus/external/argparse/argparse_local.py
+lib/taurus/external/enum/__init__.py
+lib/taurus/external/enum/enum/__init__.py
+lib/taurus/external/ordereddict/__init__.py
+lib/taurus/external/ordereddict/ordereddict.py
+lib/taurus/external/pint/__init__.py
+lib/taurus/external/pint/pint_local/AUTHORS
+lib/taurus/external/pint/pint_local/LICENSE
+lib/taurus/external/pint/pint_local/__init__.py
+lib/taurus/external/pint/pint_local/constants_en.txt
+lib/taurus/external/pint/pint_local/context.py
+lib/taurus/external/pint/pint_local/converters.py
+lib/taurus/external/pint/pint_local/default_en.txt
+lib/taurus/external/pint/pint_local/definitions.py
+lib/taurus/external/pint/pint_local/errors.py
+lib/taurus/external/pint/pint_local/formatting.py
+lib/taurus/external/pint/pint_local/measurement.py
+lib/taurus/external/pint/pint_local/pint_eval.py
+lib/taurus/external/pint/pint_local/quantity.py
+lib/taurus/external/pint/pint_local/systems.py
+lib/taurus/external/pint/pint_local/unit.py
+lib/taurus/external/pint/pint_local/util.py
+lib/taurus/external/pint/pint_local/compat/__init__.py
+lib/taurus/external/pint/pint_local/compat/chainmap.py
+lib/taurus/external/pint/pint_local/compat/lrucache.py
+lib/taurus/external/pint/pint_local/compat/nullhandler.py
+lib/taurus/external/pint/pint_local/compat/tokenize.py
+lib/taurus/external/qt/Qt.py
+lib/taurus/external/qt/QtCore.py
+lib/taurus/external/qt/QtDesigner.py
+lib/taurus/external/qt/QtGui.py
+lib/taurus/external/qt/QtHelp.py
+lib/taurus/external/qt/QtNetwork.py
+lib/taurus/external/qt/QtSvg.py
+lib/taurus/external/qt/QtUiTools.py
+lib/taurus/external/qt/QtWebKit.py
+lib/taurus/external/qt/Qwt5.py
+lib/taurus/external/qt/__init__.py
+lib/taurus/external/qt/uic.py
+lib/taurus/external/test/__init__.py
+lib/taurus/external/test/test_qt.py
+lib/taurus/external/unittest/__init__.py
+lib/taurus/qt/Qt.py
+lib/taurus/qt/QtCore.py
+lib/taurus/qt/QtDesigner.py
+lib/taurus/qt/QtGui.py
+lib/taurus/qt/QtNetwork.py
+lib/taurus/qt/QtSvg.py
+lib/taurus/qt/QtUiTools.py
+lib/taurus/qt/QtWebKit.py
+lib/taurus/qt/Qwt5.py
+lib/taurus/qt/__init__.py
+lib/taurus/qt/qtcore/__init__.py
+lib/taurus/qt/qtcore/taurusqlistener.py
+lib/taurus/qt/qtcore/communication/__init__.py
+lib/taurus/qt/qtcore/communication/communication.py
+lib/taurus/qt/qtcore/configuration/__init__.py
+lib/taurus/qt/qtcore/configuration/configuration.py
+lib/taurus/qt/qtcore/mimetypes/__init__.py
+lib/taurus/qt/qtcore/mimetypes/mimetypes.py
+lib/taurus/qt/qtcore/model/__init__.py
+lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
+lib/taurus/qt/qtcore/model/taurusmodel.py
+lib/taurus/qt/qtcore/tango/__init__.py
+lib/taurus/qt/qtcore/util/__init__.py
+lib/taurus/qt/qtcore/util/emitter.py
+lib/taurus/qt/qtcore/util/properties.py
+lib/taurus/qt/qtcore/util/signal.py
+lib/taurus/qt/qtcore/util/tauruslog.py
+lib/taurus/qt/qtdesigner/__init__.py
+lib/taurus/qt/qtdesigner/containerplugin.py
+lib/taurus/qt/qtdesigner/extraguiqwtplugin.py
+lib/taurus/qt/qtdesigner/taurusdesigner.py
+lib/taurus/qt/qtdesigner/tauruspluginplugin.py
+lib/taurus/qt/qtdesigner/taurusplugin/__init__.py
+lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
+lib/taurus/qt/qtgui/__init__.py
+lib/taurus/qt/qtgui/application/__init__.py
+lib/taurus/qt/qtgui/application/taurusapplication.py
+lib/taurus/qt/qtgui/base/__init__.py
+lib/taurus/qt/qtgui/base/taurusbase.py
+lib/taurus/qt/qtgui/base/tauruscontroller.py
+lib/taurus/qt/qtgui/base/test/__init__.py
+lib/taurus/qt/qtgui/base/test/test_taurusbase.py
+lib/taurus/qt/qtgui/button/__init__.py
+lib/taurus/qt/qtgui/button/qbuttonbox.py
+lib/taurus/qt/qtgui/button/taurusbutton.py
+lib/taurus/qt/qtgui/button/test/__init__.py
+lib/taurus/qt/qtgui/button/test/test_taurusbutton.py
+lib/taurus/qt/qtgui/button/test/res/Timeout
+lib/taurus/qt/qtgui/button/test/res/__init__.py
+lib/taurus/qt/qtgui/compact/__init__.py
+lib/taurus/qt/qtgui/compact/abstractswitcher.py
+lib/taurus/qt/qtgui/compact/basicswitcher.py
+lib/taurus/qt/qtgui/console/__init__.py
+lib/taurus/qt/qtgui/console/taurusconsole.py
+lib/taurus/qt/qtgui/console/taurusconsoleapplication.py
+lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
+lib/taurus/qt/qtgui/console/taurusconsolefactory.py
+lib/taurus/qt/qtgui/console/taurusconsolewidget.py
+lib/taurus/qt/qtgui/console/taurusconsolewindow.py
+lib/taurus/qt/qtgui/container/__init__.py
+lib/taurus/qt/qtgui/container/qcontainer.py
+lib/taurus/qt/qtgui/container/taurusbasecontainer.py
+lib/taurus/qt/qtgui/container/taurusframe.py
+lib/taurus/qt/qtgui/container/taurusgroupbox.py
+lib/taurus/qt/qtgui/container/taurusgroupwidget.py
+lib/taurus/qt/qtgui/container/taurusmainwindow.py
+lib/taurus/qt/qtgui/container/taurusscrollarea.py
+lib/taurus/qt/qtgui/container/tauruswidget.py
+lib/taurus/qt/qtgui/dialog/__init__.py
+lib/taurus/qt/qtgui/dialog/taurusconfigurationdialog.py
+lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
+lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
+lib/taurus/qt/qtgui/display/__init__.py
+lib/taurus/qt/qtgui/display/qfallback.py
+lib/taurus/qt/qtgui/display/qled.py
+lib/taurus/qt/qtgui/display/qlogo.py
+lib/taurus/qt/qtgui/display/qpixmapwidget.py
+lib/taurus/qt/qtgui/display/qsevensegment.py
+lib/taurus/qt/qtgui/display/tauruslabel.py
+lib/taurus/qt/qtgui/display/tauruslcd.py
+lib/taurus/qt/qtgui/display/taurusled.py
+lib/taurus/qt/qtgui/display/demo/__init__.py
+lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py
+lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py
+lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py
+lib/taurus/qt/qtgui/display/demo/taurusleddemo.py
+lib/taurus/qt/qtgui/display/test/__init__.py
+lib/taurus/qt/qtgui/display/test/test_tauruslabel.py
+lib/taurus/qt/qtgui/editor/__init__.py
+lib/taurus/qt/qtgui/editor/tauruseditor.py
+lib/taurus/qt/qtgui/extra_guiqwt/__init__.py
+lib/taurus/qt/qtgui/extra_guiqwt/builder.py
+lib/taurus/qt/qtgui/extra_guiqwt/curve.py
+lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
+lib/taurus/qt/qtgui/extra_guiqwt/image.py
+lib/taurus/qt/qtgui/extra_guiqwt/plot.py
+lib/taurus/qt/qtgui/extra_guiqwt/styles.py
+lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
+lib/taurus/qt/qtgui/extra_guiqwt/tools.py
+lib/taurus/qt/qtgui/extra_guiqwt/ui/CurveItemConfDlg.ui
+lib/taurus/qt/qtgui/extra_macroexecutor/__init__.py
+lib/taurus/qt/qtgui/extra_nexus/__init__.py
+lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py
+lib/taurus/qt/qtgui/extra_pool/__init__.py
+lib/taurus/qt/qtgui/extra_sardana/__init__.py
+lib/taurus/qt/qtgui/graphic/__init__.py
+lib/taurus/qt/qtgui/graphic/taurusgraphic.py
+lib/taurus/qt/qtgui/graphic/taurusgraphicview.py
+lib/taurus/qt/qtgui/graphic/jdraw/__init__.py
+lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
+lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
+lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
+lib/taurus/qt/qtgui/graphic/jdraw/test/__init__.py
+lib/taurus/qt/qtgui/graphic/jdraw/test/res/SimpleScalarViewer.jdw
+lib/taurus/qt/qtgui/graphic/jdraw/test/res/__init__.py
+lib/taurus/qt/qtgui/graphic/jdraw/test/res/styles.jdw
+lib/taurus/qt/qtgui/help/__init__.py
+lib/taurus/qt/qtgui/help/aboutdialog.py
+lib/taurus/qt/qtgui/help/assistant.py
+lib/taurus/qt/qtgui/help/helppanel.py
+lib/taurus/qt/qtgui/help/ui/AboutDialog.ui
+lib/taurus/qt/qtgui/icon/__init__.py
+lib/taurus/qt/qtgui/icon/_rrze-icons.path
+lib/taurus/qt/qtgui/icon/_tango-icons.path
+lib/taurus/qt/qtgui/icon/_taurus-icons.path
+lib/taurus/qt/qtgui/icon/catalog.py
+lib/taurus/qt/qtgui/icon/icon.py
+lib/taurus/qt/qtgui/icon/Tango/index.theme
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/add.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/address-book-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/appointment-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/appointment.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/back.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bookmark-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bookmark_add.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bookmarks_list_add.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bottom.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/centrejust.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/contact-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-open.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-print-preview.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-print.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-properties.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-save-as.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-save.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/down.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-clear.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-copy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-cut.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-delete.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-find-replace.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-find.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-paste.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-redo.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-select-all.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-undo.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editclear.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editcopy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editcut.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editdelete.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editpaste.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/exit.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filefind.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filenew.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/fileopen.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/fileprint.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filequickprint.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filesave.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filesaveas.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/find.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/finish.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/folder-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/folder_new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-indent-less.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-indent-more.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-center.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-fill.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-left.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-right.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-bold.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-italic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-strikethrough.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-underline.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/forward.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-lockscreen.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-logout.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-searchtool.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-session-logout.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-shutdown.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-mail-fwd.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-mail-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-mail-rpl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-text-indent.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-text-unindent.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-bottom.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-down.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-first.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-home.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-jump.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-last.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-next.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-previous.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-top.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-up.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gohome.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-add.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-bold.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-cancel.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-clear.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-copy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-cut.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-delete.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-find-and-replace.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-find.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-fullscreen.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-back-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-back-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-down.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-forward-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-forward-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-up.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-bottom.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-first-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-first-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-last-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-last-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-top.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-home.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-indent-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-indent-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-italic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-jump-to-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-jump-to-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-center.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-fill.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-left.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-right.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-forward-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-forward-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-next-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-next-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-pause.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-play-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-previous-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-previous-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-record.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-rewind-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-rewind-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-stop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-open.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-paste.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-print-preview.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-print.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-properties.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-redo-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-refresh.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-remove.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-save-as.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-save.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-select-all.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-stop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-strikethrough.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-underline.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-undo-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-unindent-ltr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-unindent-rtl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/kfind.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/kfm_home.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/leftjust.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/list-add.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/list-remove.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/lock.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-forward.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-mark-junk.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-message-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-reply-all.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-reply-sender.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-send-receive.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_forward.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_reply.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_replyall.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_spam.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-eject.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-playback-pause.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-playback-start.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-playback-stop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-record.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-seek-backward.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-seek-forward.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-skip-backward.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-skip-forward.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/next.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_eject.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_end.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_fwd.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_pause.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_play.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_record.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_rew.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_start.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_stop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/previous.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/process-stop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/redhat-home.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/redo.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload3.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload_all_tabs.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload_page.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/remove.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/rightjust.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/search.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/start.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_add-bookmark.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_bottom.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_copy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_cut.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_delete.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_down.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_file-properites.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_first.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_fullscreen.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_help-add-bookmark.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_home.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_last.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_left.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-compose.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-forward.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-reply-to-all.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-reply.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-send-receive.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-fwd.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-next.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-pause.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-play.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-prev.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-rec.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-rew.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-stop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-address-book.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-appointment.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-bcard.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-dir.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-tab.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-text.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-window.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_paste.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_print-preview.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_print.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_properties.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_redo.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_refresh.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_right.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_save-as.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_save.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_search-and-replace.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_search.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_select-all.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_spam.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_stop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text-strikethrough.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_bold.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_center.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_indent.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_italic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_justify.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_left.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_right.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_underlined.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_unindent.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_top.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_undo.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_up.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-lock-screen.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-log-out.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-search.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-shutdown.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/tab-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/tab_new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_bold.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_italic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_strike.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_under.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/top.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/undo.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/up.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/view-fullscreen.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/view-refresh.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/window-new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/window_fullscreen.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/window_new.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/actions/xfce-system-lock.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/access.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessibility-directory.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessories-calculator.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessories-character-map.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessories-text-editor.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/background.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/browser.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/calc.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/config-language.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/config-users.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/date.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/email.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/file-manager.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/fonts.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-calculator.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-character-map.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-help.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-monitor.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-remote-desktop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-session.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-accessibility-technologies.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-background.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-font.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-keybindings.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-theme.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-terminal.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-window-manager.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gucharmap.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/help-browser.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-group-chat.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-mail.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-news-reader.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-web-browser.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kcalc.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kcharselect.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kcmkwm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kedit.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/key_bindings.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kfm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/khelpcenter.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/konsole.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/krfb.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kscreensaver.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/ksysguard.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kuser.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kwin.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/locale.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/mail_generic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/office-calendar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/openterm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-accessibility.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-assistive-technology.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-font.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-keyboard-shortcuts.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-locale.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-multimedia.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-remote-desktop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-screensaver.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-theme.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-wallpaper.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-system-network-proxy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-system-session.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-system-windows.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/proxy-config.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/proxy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/redhat-email.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/redhat-filemanager.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/redhat-web-browser.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/screensaver.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/stock_proxy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/style.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/susehelpcenter.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-config-users.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-file-manager.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-installer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-software-update.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-users.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/terminal.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/text-editor.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/update-manager.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/utilities-system-monitor.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/utilities-terminal.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/wallpaper.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/web-browser.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfcalendar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-edit.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-filemanager.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-mail.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-man.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-terminal.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce4-backdrop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce4-session.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce4-ui.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfwm4.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/ximian-evolution-calendar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xscreensaver.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/apps/zen-icon.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-accessories.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-development.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-games.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-graphics.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-internet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-multimedia.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-office.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-other.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-system.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-applications.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-control-center.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-devel.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-globe.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-graphics.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-joystick.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-multimedia.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-other.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-settings.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-system.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-util.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gtk-preferences.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/input_devices_settings.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/kcontrol.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_development.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_games.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_graphics.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_multimedia.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_network.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_office.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_settings.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_system.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_utilities.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/preferences-desktop-peripherals.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/preferences-desktop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/preferences-system.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-accessories.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-games.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-graphics.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-internet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-office.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-preferences.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-programming.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-sound_video.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-system_settings.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-system_tools.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/stock_internet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-devel.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-games.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-graphics.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-internet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-multimedia.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-office.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-system-settings.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-system.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-utils.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce4-settings.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/3floppy_unmount.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/audio-card.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/audio-input-microphone.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/battery.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera-photo.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera-video.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera_unmount.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/cdrom_unmount.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/cdwriter_unmount.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/chardevice.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/computer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/display.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-cdrom.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-harddisk.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-optical.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-removable-media.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/dvd_unmount.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-battery.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-cdrom-audio.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-cdrom.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-computer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-cdr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-cdrw.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdr-plus.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdram.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdrom.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdrw.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-dvd.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-ethernet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-floppy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-harddisk-1394.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-harddisk-usb.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-harddisk.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-ipod.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-keyboard.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-cf.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-ms.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-sdmmc.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-sm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-mouse-ball.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-mouse-optical.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-printer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-removable-1394.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-removable-usb.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-removable.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-wavelan.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-fs-client.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-stock-mic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gtk-cdrom.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gtk-floppy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gtk-harddisk.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/harddrive.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/hdd_unmount.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/input-gaming.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/input-keyboard.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/input-mouse.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/ipod_mount.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/joystick.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/keyboard.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/kjobviewer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/kxkb.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-cdrom.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-flash.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-floppy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-optical.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/mouse.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/multimedia-player.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/network-wired.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/network-wireless.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/nm-adhoc.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/nm-device-wired.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/nm-device-wireless.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printer-remote.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printer1.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printmgr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/stock_mic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/stock_printers.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/system-floppy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/system.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/usbpendrive_unmount.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/video-display.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce-printer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce4-display.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce4-keyboard.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce4-mouse.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_HD.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_idetude.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_joystick.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_mouse.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_printer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_soundcard.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-favorite.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-important.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-noread.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-nowrite.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-photos.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-readonly.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-symbolic-link.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-system.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-unreadable.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-angel.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-crying.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-devilish.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-glasses.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-grin.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-kiss.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-monkey.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-plain.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-sad.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-smile-big.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-smile.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-surprise.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-wink.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-1.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-11.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-13.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-18.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-2.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-22.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-3.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-4.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-5.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-6.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-7.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-8.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-certificate.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.ms-excel.sheet.macroEnabled.12.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.ms-powerpoint.presentation.macroEnabled.12.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.ms-word.document.macroEnabled.12.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.presentationml.presentation.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.presentationml.template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.spreadsheetml.sheet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.spreadsheetml.template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.wordprocessingml.template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-x-executable.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/ascii.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/audio-x-generic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/binary.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/contents2.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/deb.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/document.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/empty.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/exec.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/folder_tar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font-x-generic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font_bitmap.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font_truetype.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font_type1.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-fs-executable.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-magicpoint.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-msword.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-ogg.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-pdf.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-postscript.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-rtf.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.lotus-1-2-3.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.ms-excel.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.ms-powerpoint.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.graphics-template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.graphics.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.image.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.presentation-template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.presentation.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.spreadsheet-template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.spreadsheet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.text-template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.text-web.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.text.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.rn-realmedia-secure.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.rn-realmedia-vbr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.rn-realmedia.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.stardivision.calc.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.stardivision.impress.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.stardivision.writer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.calc.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.calc.template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.draw.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.draw.template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.impress.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.impress.template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.writer.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.writer.template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-wordperfect.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-7z-compressed.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-abiword.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-applix-spreadsheet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-applix-word.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-archive.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-arj.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-bzip-compressed-tar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-bzip.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-compress.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-compressed-tar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-cpio-compressed.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-cpio.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-deb.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-dvi.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-executable.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-afm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-bdf.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-linux-psf.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-pcf.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-sunos-news.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-ttf.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-gnumeric.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-gzip.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-gzpostscript.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-jar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-killustrator.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-kpresenter.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-kspread.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-kword.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lha.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lhz.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lzma-compressed-tar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lzma.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-ms-dos-executable.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-perl.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-php.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-python-bytecode.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-rar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-rpm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-scribus.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-shellscript.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-shockwave-flash.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-stuffit.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-tar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-tarz.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-tex.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-xhtml+xml.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-zip.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-audio.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-image.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-html.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-vnd.wap.wml.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-csh.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-python.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-sh.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-vcalendar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-vcard.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-zsh.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-video.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-x-font-afm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-package.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/html.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/image-x-generic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/image.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/kpresenter_kpr.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/mime_ascii.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/misc.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package-x-generic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package_editors.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package_wordprocessing.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/plan.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/rpm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/shellscript.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/sound.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/spreadsheet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_addressbook.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_calendar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_certificate.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_script.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/tar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/template_source.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-html.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-x-generic-template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-x-generic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-x-script.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/tgz.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/txt.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/txt2.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/unknown.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/vcalendar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/vcard.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/video-x-generic.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/video.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/wordprocessing.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/www.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-address-book.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-calendar.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-document-template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-document.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-drawing-template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-drawing.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-presentation-template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-presentation.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-spreadsheet-template.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-spreadsheet.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/zip.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/application-x-gnome-saved-search.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/desktop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/distributor-logo.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/emptytrash.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder-remote.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder-saved-search.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder.icon
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder_home.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-desktop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-directory.icon
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-directory.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-ftp.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-home.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-network.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-nfs.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-server.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-share.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-smb.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-ssh.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-trash-empty.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-main-menu.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-nfs-server.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-smb-server.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-smb-share.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-smb-workgroup.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-stock-trash.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gtk-directory.icon
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gtk-directory.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/gtk-network.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/inode-directory.icon
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/inode-directory.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/network-server.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/network-workgroup.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/network.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/network_local.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/novell-button.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/redhat-network-server.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/server.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/start-here.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/stock_folder.icon
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/stock_folder.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/trashcan_empty.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/user-desktop.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/user-home.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/user-trash.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/places/xfce-trash_empty.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-high.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-low.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-medium.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-muted.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/battery-caution.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/connect_creating.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/connect_established.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/connect_no.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/dialog-error.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/dialog-information.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/dialog-warning.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/edittrash.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/error.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-drag-accept.icon
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-drag-accept.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-open.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-visiting.icon
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-visiting.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder_open.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-dev-wavelan-encrypted.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-accept.icon
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-accept.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-visiting.icon
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-visiting.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-loading-icon.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-trash-full.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-disconn.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-error.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-idle.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-rx.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-tx.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-txrx.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-stock-trash-full.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-dialog-error.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-dialog-info.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-dialog-warning.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-directory.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-missing-image.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/image-loading.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/image-missing.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/important.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/info.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/mail-attachment.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/messagebox_critical.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/messagebox_info.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/messagebox_warning.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-error.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-idle.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-offline.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-receive.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-transmit-receive.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-transmit.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-wireless-encrypted.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/nm-no-connection.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/printer-error.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/software-update-available.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/software-update-urgent.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_attach.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_dialog-error.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_dialog-info.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_dialog-warning.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_open.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_trash_full.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-0.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-max.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-med.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-min.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-mute.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-cloudy.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-few-clouds.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-night-clear.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-night-few-clouds.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-showers.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-snow.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-storm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-sunny.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/sunny.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/trashcan_full.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/user-trash-full.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-clear-night.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-clear.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-few-clouds-night.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-few-clouds.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-overcast.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-severe-alert.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-showers-scattered.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-showers.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-snow.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-storm.svg
+lib/taurus/qt/qtgui/icon/Tango/scalable/status/xfce-trash_full.svg
+lib/taurus/qt/qtgui/icon/external/class.png
+lib/taurus/qt/qtgui/icon/external/function.png
+lib/taurus/qt/qtgui/icon/external/ipython.png
+lib/taurus/qt/qtgui/icon/external/python-console.png
+lib/taurus/qt/qtgui/icon/external/python-file.png
+lib/taurus/qt/qtgui/icon/external/python-module.png
+lib/taurus/qt/qtgui/icon/external/python-package.png
+lib/taurus/qt/qtgui/icon/external/python.png
+lib/taurus/qt/qtgui/icon/external/pythonw-console.png
+lib/taurus/qt/qtgui/icon/external/tango.png
+lib/taurus/qt/qtgui/icon/external/jive/class.png
+lib/taurus/qt/qtgui/icon/external/jive/device.png
+lib/taurus/qt/qtgui/icon/external/jive/server.png
+lib/taurus/qt/qtgui/icon/extra-icons/arrow01.svg
+lib/taurus/qt/qtgui/icon/extra-icons/color-fill.svg
+lib/taurus/qt/qtgui/icon/extra-icons/lock_locked.svg
+lib/taurus/qt/qtgui/icon/extra-icons/lock_locked_unpreviledged.svg
+lib/taurus/qt/qtgui/icon/extra-icons/lock_unknown.svg
+lib/taurus/qt/qtgui/icon/extra-icons/lock_unlocked.svg
+lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close.png
+lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close_black.png
+lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close_gray.png
+lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close_white.png
+lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock.png
+lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock_black.png
+lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock_gray.png
+lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock_white.png
+lib/taurus/qt/qtgui/icon/extra-icons/actions/collapse-all.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/collapse-selection.png
+lib/taurus/qt/qtgui/icon/extra-icons/actions/collapse.png
+lib/taurus/qt/qtgui/icon/extra-icons/actions/expand-all.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/expand-selection.png
+lib/taurus/qt/qtgui/icon/extra-icons/actions/expand.png
+lib/taurus/qt/qtgui/icon/extra-icons/actions/go-backward.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/go-forward.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media-seek-backward-green.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media-seek-forward-green.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_backward.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_pause.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_start.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_stop.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_stop_green.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media_seek_backward.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media_seek_forward.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media_skip_backward.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/media_skip_forward.svg
+lib/taurus/qt/qtgui/icon/extra-icons/actions/stop.svg
+lib/taurus/qt/qtgui/icon/extra-icons/designer/arrayedit.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/back.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/calendarwidget.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/checkbox.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/circular_gauge.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/columnview.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/combobox.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/commandlinkbutton.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/compression.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/dateedit.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/datetimeedit.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/devs_table.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/devs_tree.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/dial.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/dialogbuttonbox.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/dockwidget.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/doublespinbox.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/down.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/editdelete.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/extra_motor.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/filereader.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/fontcombobox.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/forward.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/frame.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/graphicsview.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/grid.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/groupbox.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/groupboxcollapsible.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/groupwidget.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/horizontal_linear_gauge.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/hscrollbar.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/hslider.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/hsplit.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/label.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/lcdnumber.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/ledgreen.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/ledred.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/line.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/lineedit.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/listbox.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/listview.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/macroserver.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/mdiarea.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/minus.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/plaintextedit.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/plus.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/progress.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/props_table.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/pushbutton.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/qwtplot.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/radiobutton.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/scheduler.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/scrollarea.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/spacer.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/spinbox.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/state.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/tabbar.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/table.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/tabwidget.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/tau.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/taurus.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/textedit.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/timeedit.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/toolbox.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/toolbutton.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/up.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/vertical_linear_gauge.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/vline.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/vscrollbar.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/vslider.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/vspacer.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/wheeledit.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/widget.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/widgetstack.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/wizard.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/zoomin.png
+lib/taurus/qt/qtgui/icon/extra-icons/designer/zoomout.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledblue.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledblueoff.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledgreen.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledgreenoff.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledorange.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledorangeoff.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledred.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledredoff.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledyellow.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledyellowoff.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_black_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_black_on.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_blue_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_blue_on.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_green_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_green_on.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_grenoble_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_grenoble_on.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_magenta_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_magenta_on.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_orange_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_orange_on.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_red_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_red_on.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_white_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_white_on.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_yellow_off.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_yellow_on.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledblue.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledblueoff.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledgreen.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledgreenoff.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledorange.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledorangeoff.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledred.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledredoff.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledyellow.png
+lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledyellowoff.png
+lib/taurus/qt/qtgui/icon/large/TaurusSplash.png
+lib/taurus/qt/qtgui/icon/large/snapshot/SardanaEditor.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusArrayEditor.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusDbTreeWidget.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusDevicePanel.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusForm.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusImageDialog.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusJDrawSynopticsView.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusNeXusBrowser.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusPlot.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusQubDataImageDisplay.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusShell.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusTrend.png
+lib/taurus/qt/qtgui/icon/large/snapshot/TaurusTrend2DDialog.png
+lib/taurus/qt/qtgui/icon/logos/tau.png
+lib/taurus/qt/qtgui/icon/logos/taurus.png
+lib/taurus/qt/qtgui/icon/logos/taurus.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/action-undo.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/add-participant.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/add.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/approval.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/arrange-boxes.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/back-to-ou.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/data-transfer.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/delete-all-participants.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/dial-in.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/down-grey.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/down.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/download.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-down.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-left.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-right.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-up.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/email-not-available.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/filter.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/go-bottom.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/go-top.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/hide.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/left-grey.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/left.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/list-all-participants.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/load-settings.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/log-in.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/log-out.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/manage-settings.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/merge-affiliation.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/monitoring.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-participant-to-waiting-red-grey.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-participant-to-waiting-red.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-down-grey.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-down.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-to-participant-green-arrow.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-up-grey.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-up.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/print.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/refuse.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/right-grey.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/right.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/run.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email-group.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email-user-other.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email-user.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/show.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-down-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-down-red.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-down.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-neutral-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-neutral-red.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-neutral.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-up-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-up-red.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-up.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/split-affiliation.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course-book-grey.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course-book.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course-grey.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-down_up.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-left_right.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-right_left.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-up_down.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/up-grey.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/up.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/upload.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/view.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/actions/workflow.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/affiliation-employee.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/affiliation-guest.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/affiliation-student.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/alumni-group.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/book-marks.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/book.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/bookmark.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/icon-inspector.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/magnifying-glass.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/mood-level-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/mood-level-red.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/mood-level-yellow.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-admin-gear.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-admin.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-business.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-customer.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-digital-person.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-disabled.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-employee.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-endcustomer.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-enrolee.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-examiner-group.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-examiner.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-expert.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-group.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-helpdesk-faq.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-helpdesk.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-library.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-manager.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other-business.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other-female.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other-new.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-partner.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-phd-group.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-phd.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-real-person.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-student-assistant.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-student.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-unknown.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/database-locked.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/modem.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/router.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-access.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-accounting.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-blades.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-book.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-firebird.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-mysql.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-otrs.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-postgres.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-yellow.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-directory-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-directory-yellow.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-directory.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-email-relay.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-email.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-file.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-firewall.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-monitoring.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-multiple.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-print.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-radius.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-red.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-subversion.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-user.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-vpn.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web-secure.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web-yellow.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-yellow.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/server.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/switch.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/wlan-access-point.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/wlan-controller.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/devices/workstation.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/account-delete.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/account-edit.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/account-new.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/affiliation-abstract.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/affiliation.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/affirmation.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/all-per-page.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/at.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/audio-itunes-u.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/audio-itunes.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/audio-visual-slide.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/bridge-stone-delete.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/bridge-stone-new.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/bridge-stone.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-firebird.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-mysql.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-openldap.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-otrs.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-postgres.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-vcs-subversion.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-attribute.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-object-class.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-object.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-schema.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-syntax.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/doctoral-cap.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/email.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/entitlement.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/export.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/fifty-per-page.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/firewall.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/floppy-disc-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/folder.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote-delete.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote-edit.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote-new.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/for-free.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/geo-id.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/globe.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/id.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/index.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/information.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/inspector-hat.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/lock.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/mailbox.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/media-film.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/media-floppy-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/message-new.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/money.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/movie-audio.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/network-cloud.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/note.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/office-excel.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/office-word.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/organisational-unit-tree.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/organizational-unit.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/page-25.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/page-50.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/page-all.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/peace-sign.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/pen.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/phone.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/promotion-data.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/relay.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-delete.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-edit.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-new.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-run.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-upload.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/rss-feed.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/single-sign-on.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/slide-audio.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/slide.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/statistic.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/structured-program-stay-abroad.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/subversion-logo
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/subversion-logo.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/subversion.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/table.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/task.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/template.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/ten-per-page.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tomcat.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm-delete.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm-move.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm-new.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/twenty-five-per-page.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/unix.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/video-film.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/webview.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/wide-area-network-connection.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/wide-area-network-link.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/wifi.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/emblems/zipper.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/audio-mp3.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/audio-mp4.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/document-pdf.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-audio-itunes-u.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-audio-itunes.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-audio-visual-slide.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-movie-audio.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-movie.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-slide-audio.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-video-film.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/office-ms-excel.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/office-ms-word.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/text-csv-text.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/video-m4v.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/video-mov.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/available.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/awaiting-plus.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/awaiting.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/binational.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/error.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/exclamation-mark.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/expired.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/false.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/female.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-green-clock.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-green-mail.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-green.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-red-clock.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-red-mail.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-red.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-yellow-clock.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-yellow-mail.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-yellow.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/hourglass.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/important.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/maintenance-time.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/male.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/not-available.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/not-known.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/not-specified.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/not-synchronized.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/synchronized.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/temporarily-not-available-clock.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/temporarily-not-available.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/true-orange.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/true.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/unlocked.svg
+lib/taurus/qt/qtgui/icon/rrze-icons/status/warning.svg
+lib/taurus/qt/qtgui/input/__init__.py
+lib/taurus/qt/qtgui/input/choicedlg.py
+lib/taurus/qt/qtgui/input/qwheel.py
+lib/taurus/qt/qtgui/input/tauruscheckbox.py
+lib/taurus/qt/qtgui/input/tauruscombobox.py
+lib/taurus/qt/qtgui/input/tauruslineedit.py
+lib/taurus/qt/qtgui/input/taurusspinbox.py
+lib/taurus/qt/qtgui/input/tauruswheel.py
+lib/taurus/qt/qtgui/model/__init__.py
+lib/taurus/qt/qtgui/model/qbasemodel.py
+lib/taurus/qt/qtgui/panel/__init__.py
+lib/taurus/qt/qtgui/panel/qdataexportdialog.py
+lib/taurus/qt/qtgui/panel/qdoublelist.py
+lib/taurus/qt/qtgui/panel/qrawdatachooser.py
+lib/taurus/qt/qtgui/panel/taurusconfigeditor.py
+lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py
+lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
+lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
+lib/taurus/qt/qtgui/panel/taurusform.py
+lib/taurus/qt/qtgui/panel/taurusinputpanel.py
+lib/taurus/qt/qtgui/panel/taurusmessagepanel.py
+lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
+lib/taurus/qt/qtgui/panel/taurusmodellist.py
+lib/taurus/qt/qtgui/panel/taurusvalue.py
+lib/taurus/qt/qtgui/panel/report/__init__.py
+lib/taurus/qt/qtgui/panel/report/albareport.py
+lib/taurus/qt/qtgui/panel/report/basicreport.py
+lib/taurus/qt/qtgui/panel/report/ui/SendMailForm.ui
+lib/taurus/qt/qtgui/panel/test/__init__.py
+lib/taurus/qt/qtgui/panel/test/test_taurusform.py
+lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py
+lib/taurus/qt/qtgui/panel/ui/QDataExportDialog.ui
+lib/taurus/qt/qtgui/panel/ui/QDoubleListDlg.ui
+lib/taurus/qt/qtgui/panel/ui/QRawDataWidget.ui
+lib/taurus/qt/qtgui/panel/ui/TaurusConfigurationPanel.ui
+lib/taurus/qt/qtgui/panel/ui/TaurusDevPanel.ui
+lib/taurus/qt/qtgui/panel/ui/TaurusFilterPanel.ui
+lib/taurus/qt/qtgui/panel/ui/TaurusInputPanel.ui
+lib/taurus/qt/qtgui/panel/ui/TaurusMessagePanel.ui
+lib/taurus/qt/qtgui/plot/__init__.py
+lib/taurus/qt/qtgui/plot/arrayedit.py
+lib/taurus/qt/qtgui/plot/curveStatsDlg.py
+lib/taurus/qt/qtgui/plot/curveprops.py
+lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
+lib/taurus/qt/qtgui/plot/monitor.py
+lib/taurus/qt/qtgui/plot/qwtdialog.py
+lib/taurus/qt/qtgui/plot/qwtplot.py
+lib/taurus/qt/qtgui/plot/scales.py
+lib/taurus/qt/qtgui/plot/taurusarrayedit.py
+lib/taurus/qt/qtgui/plot/taurusplot.py
+lib/taurus/qt/qtgui/plot/taurusplotconf.py
+lib/taurus/qt/qtgui/plot/taurustrend.py
+lib/taurus/qt/qtgui/plot/ui/AddCPointsDialog.ui
+lib/taurus/qt/qtgui/plot/ui/ArrayEditor.ui
+lib/taurus/qt/qtgui/plot/ui/ControllerBox.ui
+lib/taurus/qt/qtgui/plot/ui/CurvePropertiesView.ui
+lib/taurus/qt/qtgui/plot/ui/CurveStatsDialog.ui
+lib/taurus/qt/qtgui/plot/ui/CurvesAppearanceChooser.ui
+lib/taurus/qt/qtgui/plot/ui/EditCPointsDialog.ui
+lib/taurus/qt/qtgui/plot/ui/TaurusPlotConfDlg.ui
+lib/taurus/qt/qtgui/plot/ui/TaurusPlotConfigDialog.ui
+lib/taurus/qt/qtgui/resource/__init__.py
+lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
+lib/taurus/qt/qtgui/style/__init__.py
+lib/taurus/qt/qtgui/style/nebula.py
+lib/taurus/qt/qtgui/table/__init__.py
+lib/taurus/qt/qtgui/table/qdictionary.py
+lib/taurus/qt/qtgui/table/qlogtable.py
+lib/taurus/qt/qtgui/table/qtable.py
+lib/taurus/qt/qtgui/table/taurusdbtable.py
+lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
+lib/taurus/qt/qtgui/table/taurusgrid.py
+lib/taurus/qt/qtgui/table/taurustable.py
+lib/taurus/qt/qtgui/table/taurusvaluestable.py
+lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py
+lib/taurus/qt/qtgui/taurusgui/__init__.py
+lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
+lib/taurus/qt/qtgui/taurusgui/macrolistener.py
+lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py
+lib/taurus/qt/qtgui/taurusgui/taurusgui.py
+lib/taurus/qt/qtgui/taurusgui/utils.py
+lib/taurus/qt/qtgui/taurusgui/conf/__init__.py
+lib/taurus/qt/qtgui/taurusgui/conf/gui_noconf.py
+lib/taurus/qt/qtgui/taurusgui/conf/gui_pureconf.py
+lib/taurus/qt/qtgui/taurusgui/conf/gui_selfconf.py
+lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py
+lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py
+lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/images/example01.jdw
+lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/images/example01.jpg
+lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/images/syn2.jdw
+lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/images/syn2.jpg
+lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py
+lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py
+lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/tgconf_macrogui.ini
+lib/taurus/qt/qtgui/taurusgui/ui/AssociationDialog.ui
+lib/taurus/qt/qtgui/test/__init__.py
+lib/taurus/qt/qtgui/test/base.py
+lib/taurus/qt/qtgui/tree/__init__.py
+lib/taurus/qt/qtgui/tree/qtree.py
+lib/taurus/qt/qtgui/tree/taurusdbtree.py
+lib/taurus/qt/qtgui/tree/taurusdevicetree.py
+lib/taurus/qt/qtgui/tree/taurustree.py
+lib/taurus/qt/qtgui/ui/DevMainVariable.ui
+lib/taurus/qt/qtgui/ui/SaveDataDir.ui
+lib/taurus/qt/qtgui/util/__init__.py
+lib/taurus/qt/qtgui/util/qdraganddropdebug.py
+lib/taurus/qt/qtgui/util/taurusaction.py
+lib/taurus/qt/qtgui/util/taurusactionfactory.py
+lib/taurus/qt/qtgui/util/tauruscolor.py
+lib/taurus/qt/qtgui/util/taurusropepatch.py
+lib/taurus/qt/qtgui/util/taurusscreenshot.py
+lib/taurus/qt/qtgui/util/tauruswidget_qtdesignerplugin_template
+lib/taurus/qt/qtgui/util/tauruswidget_template
+lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
+lib/taurus/qt/qtgui/util/tauruswidgettree.py
+lib/taurus/qt/qtgui/util/ui.py
+lib/taurus/qt/qtgui/util/validator.py
+lib/taurus/qt/qtgui/util/widgetgen.py
+lib/taurus/qt/qtgui/util/test/__init__.py
+lib/taurus/qt/qtgui/util/test/test_ui/__init__.py
+lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py
+lib/taurus/qt/qtgui/util/test/test_ui/mywidget3/__init__.py
+lib/taurus/qt/qtgui/util/test/test_ui/mywidget3/ui/MyWidget3.ui
+lib/taurus/qt/qtgui/util/test/test_ui/ui/MyWidget1.ui
+lib/taurus/qt/qtgui/util/test/test_ui/ui/mywidget2/mywidget2_custom.ui
+lib/taurus/test/__init__.py
+lib/taurus/test/base.py
+lib/taurus/test/fuzzytest.py
+lib/taurus/test/moduleexplorer.py
+lib/taurus/test/resource.py
+lib/taurus/test/skip.py
+lib/taurus/test/test_import.py
+lib/taurus/test/testsuite.py
\ No newline at end of file
diff --git a/lib/taurus.egg-info/dependency_links.txt b/lib/taurus.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/lib/taurus.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/lib/taurus.egg-info/entry_points.txt b/lib/taurus.egg-info/entry_points.txt
new file mode 100644
index 0000000..eb2788d
--- /dev/null
+++ b/lib/taurus.egg-info/entry_points.txt
@@ -0,0 +1,18 @@
+[console_scripts]
+taurustestsuite = taurus.test.testsuite:main
+
+[gui_scripts]
+taurusconfigbrowser = taurus.qt.qtgui.panel.taurusconfigeditor:main
+tauruscurve = taurus.qt.qtgui.extra_guiqwt.plot:taurusCurveDlgMain
+taurusdesigner = taurus.qt.qtdesigner.taurusdesigner:main
+taurusdevicepanel = taurus.qt.qtgui.panel.taurusdevicepanel:TaurusDevicePanelMain
+taurusform = taurus.qt.qtgui.panel.taurusform:taurusFormMain
+taurusgui = taurus.qt.qtgui.taurusgui.taurusgui:main
+taurusiconcatalog = taurus.qt.qtgui.icon.catalog:main
+taurusimage = taurus.qt.qtgui.extra_guiqwt.plot:taurusImageDlgMain
+tauruspanel = taurus.qt.qtgui.panel.taurusdevicepanel:TaurusPanelMain
+taurusplot = taurus.qt.qtgui.plot.taurusplot:main
+taurustrend = taurus.qt.qtgui.plot.taurustrend:main
+taurustrend1d = taurus.qt.qtgui.extra_guiqwt.plot:taurusTrendDlgMain
+taurustrend2d = taurus.qt.qtgui.extra_guiqwt.taurustrend2d:taurusTrend2DMain
+
diff --git a/lib/taurus.egg-info/top_level.txt b/lib/taurus.egg-info/top_level.txt
new file mode 100644
index 0000000..08754dc
--- /dev/null
+++ b/lib/taurus.egg-info/top_level.txt
@@ -0,0 +1 @@
+taurus
diff --git a/lib/taurus/__init__.py b/lib/taurus/__init__.py
index 0c1a58d..3ed3928 100644
--- a/lib/taurus/__init__.py
+++ b/lib/taurus/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -28,6 +28,7 @@ real taurus model classes and information regarding the current release."""
 
 from .core import release as __R
 
+
 class Release:
     pass
 
diff --git a/lib/taurus/console/__init__.py b/lib/taurus/console/__init__.py
index ca26083..f243005 100644
--- a/lib/taurus/console/__init__.py
+++ b/lib/taurus/console/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/console/enums.py b/lib/taurus/console/enums.py
index d12aae3..58b2ab2 100644
--- a/lib/taurus/console/enums.py
+++ b/lib/taurus/console/enums.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -33,11 +33,11 @@ from taurus.core.util.enumeration import Enumeration
 
 #: Flaggable alignment for both horizontal and vertical text
 #: Conflicting combinations of flags have undefined meanings.
-Alignment = Enumeration("Alignment", ( \
+Alignment = Enumeration("Alignment", (
     ("Left",    0x0001),
     ("Right",   0x0002),
     ("HCenter", 0x0004),
     ("Top",     0x0020),
     ("Bottom",  0x0040),
     ("VCenter", 0x0080),
-    ("Center",  0x0004 | 0x0080 ) ) )
\ No newline at end of file
+    ("Center",  0x0004 | 0x0080)))
diff --git a/lib/taurus/console/list.py b/lib/taurus/console/list.py
index 80b8208..035f135 100644
--- a/lib/taurus/console/list.py
+++ b/lib/taurus/console/list.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,89 +34,90 @@ import operator
 
 from enums import Alignment
 
+
 class List(list):
-    
+
     HeaderSeparator = "-"
     RowSeparator = None
-    
+
     MaxColumnWidth = -1
     TextAlignment = Alignment.Right | Alignment.Top
-    
-    def __init__(self, header, header_separator = HeaderSeparator,
-                 row_separator = RowSeparator,
-                 max_col_width = MaxColumnWidth,
-                 text_alignment = TextAlignment):
-                 
+
+    def __init__(self, header, header_separator=HeaderSeparator,
+                 row_separator=RowSeparator,
+                 max_col_width=MaxColumnWidth,
+                 text_alignment=TextAlignment):
+
         self.col_nb = col_nb = len(header)
         self.cur_col_width = col_nb * [0]
-        
+
         self.header_separator = header_separator
         self.row_separator = row_separator
         self.max_column_width = max_col_width
         self.text_alignment = text_alignment
-        
+
         if header is not None:
             self.append(header)
-    
+
     def setHeaderSeparator(self, header_separator):
         if isinstance(header_separator, (str, unicode)):
             header_separator = self.col_nb * [header_separator]
         self.HeaderSeparator = header_separator
-    
+
     def getHeaderSeparator(self):
         return self.HeaderSeparator
-    
+
     header_separator = property(getHeaderSeparator, setHeaderSeparator)
 
     def setRowSeparator(self, row_separator):
         if isinstance(row_separator, (str, unicode)):
             row_separator = self.col_nb * [row_separator]
         self.RowSeparator = row_separator
-        
+
     def getRowSeparator(self):
         return self.RowSeparator
-    
+
     row_separator = property(getRowSeparator, setRowSeparator)
-    
+
     def setMaxColumnWidth(self, max_col_width):
         if max_col_width is None:
             max_col_width = -1
         if not operator.isSequenceType(max_col_width):
-            max_col_width = self.col_nb*[max_col_width]
+            max_col_width = self.col_nb * [max_col_width]
         self.MaxColumnWidth = max_col_width
-        
+
     def getMaxColumnWidth(self):
         return self.MaxColumnWidth
-    
+
     max_column_width = property(getMaxColumnWidth, setMaxColumnWidth)
 
     def setTextAlignment(self, text_alignment):
         if not operator.isSequenceType(text_alignment):
-            text_alignment = self.col_nb*[text_alignment]
+            text_alignment = self.col_nb * [text_alignment]
         self.TextAlignment = text_alignment
-    
+
     def getTextAlignment(self):
         return self.TextAlignment
-    
+
     text_alignment = property(getTextAlignment, setTextAlignment)
-    
+
     def _transform_row(self, row):
         return map(str, row[:self.col_nb])
-        
+
     def __setitem__(self, i, row):
-        return list.__setitem__(self, i, self._transform_row(row) )
-    
+        return list.__setitem__(self, i, self._transform_row(row))
+
     def append(self, row):
-        return list.append(self, self._transform_row(row) )
-    
+        return list.append(self, self._transform_row(row))
+
     appendRow = append
-    
+
     def putRow(self, row, idx):
         self[idx] = row
-        
+
     def _calc_column_widths(self):
         cur_col_width, max_col_width = self.cur_col_width, self.MaxColumnWidth
-        
+
         for row_index, row in enumerate(self):
             for column_index, cell in enumerate(row):
                 size = len(cell) + 3
@@ -127,20 +128,20 @@ class List(list):
                 if max_width >= 0:
                     col_width = min(max_width, col_width)
                 cur_col_width[column_index] = col_width
-    
+
     def genOutput(self):
         return self.lines()
-    
+
     def _get_separator_row(self, separator):
         columns = []
         for i, width in enumerate(self.cur_col_width):
             if isinstance(separator[i], str):
-                column = " " + (width - 1)*separator[i]
+                column = " " + (width - 1) * separator[i]
             else:
-                column = " " + separator[i][:width-1]
+                column = " " + separator[i][:width - 1]
             columns.append(column)
         return "".join(columns)
-    
+
     def lines(self):
         self._calc_column_widths()
         cur_col_width = self.cur_col_width
@@ -157,32 +158,32 @@ class List(list):
                 cells = wrapper.wrap(cell)
                 for i, c in enumerate(cells):
                     if align & Alignment.Left:
-                        cells[i] = " " + c.ljust(width-1)
+                        cells[i] = " " + c.ljust(width - 1)
                     elif align & Alignment.Right:
                         cells[i] = c.rjust(width)
                     elif align & Alignment.HCenter:
                         cells[i] = c.center(width)
                 row_nb = max(len(cells), row_nb)
                 text_columns.append(cells)
-            
-            text_rows = row_nb*['']
+
+            text_rows = row_nb * ['']
             for column_index, cells in enumerate(text_columns):
                 for i in range(row_nb):
                     if i < len(cells):
                         text_rows[i] = text_rows[i] + cells[i]
                     else:
                         width = cur_col_width[column_index]
-                        text_rows[i] = text_rows[i] + width*" "
+                        text_rows[i] = text_rows[i] + width * " "
             ret.extend(text_rows)
             if row_index > 0 and self.row_separator is not None:
                 ret.append(self._get_separator_row(self.RowSeparator))
-        
+
         if self.header_separator is not None:
             ret.insert(1, self._get_separator_row(self.HeaderSeparator))
         return ret
-    
+
     def str(self):
         return "\n".join(self.lines())
-    
+
     def __str__(self):
-        return self.str()
\ No newline at end of file
+        return self.str()
diff --git a/lib/taurus/console/table.py b/lib/taurus/console/table.py
index 238d12d..dfdf794 100644
--- a/lib/taurus/console/table.py
+++ b/lib/taurus/console/table.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,8 +34,8 @@ class Table:
 
     DefTermWidth = 80
 
-    PrettyOpts   = {'col_sep': ' |', 'col_head_sep': '-', 'border': '='}
-    
+    PrettyOpts = {'col_sep': ' |', 'col_head_sep': '-', 'border': '='}
+
     def __init__(self, elem_list, elem_fmt=None, term_width=None,
                  row_head_str=None, row_head_fmt='%-*s', row_head_width=None,
                  col_head_str=None, col_head_fmt='%*s',  col_head_width=None,
@@ -44,21 +44,21 @@ class Table:
         self.nr_col = len(elem_list)
         self.nr_row = len(elem_list[0])
         self.elem_list = elem_list
-        
+
         if elem_fmt is None:
             elem_fmt = self.nr_row * ['%*s']
         if len(elem_fmt) == 1:
             elem_fmt *= self.nr_row
-        self.elem_fmt  = elem_fmt
-        
-        self.term_width   = term_width or Table.DefTermWidth
-        self.col_sep      = col_sep
-        self.row_sep      = row_sep
+        self.elem_fmt = elem_fmt
+
+        self.term_width = term_width or Table.DefTermWidth
+        self.col_sep = col_sep
+        self.row_sep = row_sep
         self.col_head_sep = col_head_sep
-        self.border       = border
-        
+        self.border = border
+
         max_len_fn = lambda x: reduce(max, map(len, x))
-        
+
         self.row_head_str = row_head_str
         self.row_head_fmt = row_head_fmt
         if row_head_str is not None and len(row_head_str) != self.nr_row:
@@ -71,7 +71,7 @@ class Table:
             else:
                 row_head_width = 0
         self.row_head_width = row_head_width
-            
+
         self.col_head_str = col_head_str
         self.col_head_fmt = col_head_fmt
         if col_head_str is not None and len(col_head_str) != self.nr_col:
@@ -88,18 +88,18 @@ class Table:
             self.col_head_lines = len(col_head_str[0])
         else:
             self.col_head_lines = 0
-        
+
     def updateElem(self, elem_list):
         new_col, new_row = len(elem_list), len(elem_list[0])
         if new_col != self.nr_col or new_row != self.nr_row:
             raise 'Invalid new elem list size %dx%d, was %dx%d' % \
                   (new_col, new_row, self.nr_col, self.nr_row)
         self.elem_list = elem_list
-        
+
     def genOutput(self, term_width=None):
         if term_width is None:
             term_width = self.term_width
-        
+
         rhw, chw = self.row_head_width, self.col_head_width
         chl = self.col_head_lines
         lcs = len(self.col_sep)
@@ -111,7 +111,7 @@ class Table:
         tot_rows = chl + self.nr_row
         if rhw > 0:
             tot_width += rhw + lcs
-            
+
         output = []
 
         if self.row_head_str is not None:
@@ -140,10 +140,10 @@ class Table:
                     fmt = self.col_head_fmt
                     for k in xrange(chl):
                         line[k] += fmt % (chw, col_head[k])
-                        
+
                 for k in xrange(self.nr_row):
                     fmt = self.elem_fmt[k]
-                    line[chl+k] += fmt % (chw, elem[k])
+                    line[chl + k] += fmt % (chw, elem[k])
 
             max_width = reduce(max, map(len, line))
             if self.border is not None:
@@ -160,5 +160,3 @@ class Table:
                 output.append(self.border * nr_border)
 
         return output
-
-
diff --git a/lib/taurus/console/util/__init__.py b/lib/taurus/console/util/__init__.py
index 9a620ef..fe05347 100644
--- a/lib/taurus/console/util/__init__.py
+++ b/lib/taurus/console/util/__init__.py
@@ -2,25 +2,25 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
-""" """
\ No newline at end of file
+""" """
diff --git a/lib/taurus/core/__init__.py b/lib/taurus/core/__init__.py
index 0295f9b..0ef1314 100644
--- a/lib/taurus/core/__init__.py
+++ b/lib/taurus/core/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,9 +29,10 @@ __docformat__ = "restructuredtext"
 
 import taurus.tauruscustomsettings
 
-LIGHTWEIGHT_IMPORTS = getattr(taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False)
+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
+    from init_bkcomp import *
diff --git a/lib/taurus/core/epics/__init__.py b/lib/taurus/core/epics/__init__.py
index 5ae00d2..0861774 100644
--- a/lib/taurus/core/epics/__init__.py
+++ b/lib/taurus/core/epics/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -28,42 +28,43 @@
 
 Epics extension for taurus core model.
 
-The epics extension provides access to Epics control system objects 
+The epics extension provides access to Epics control system objects via Channel
+Access
 
-.. note:: The Epics scheme is only a proof of concept. The final syntax of the models is
-          not yet set in stone and only basic functionality is implemented.  
+.. note:: The Epics scheme is only a proof of concept. The final syntax of
+          the model names is not yet set in stone and only basic functionality
+          is implemented.
 
 
 The Epics extension implements :mod:`taurus.core` objects that connect to Epics
-objects. The scheme prefix for epics objects is 'epics://'.
+PVs. The scheme name for channel access epics models is 'ca' ('epics' also
+works at this moment).
 
-You should never create objects of epics classes directly. Instead you
-should use the :class:`taurus.core.taurusmanager.TaurusManager` and 
+You should never instantiate models from epics model classes directly. Instead,
+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::
+For example, to get a reference to the epics process variable (PV)
+"my:example.RBV" you should do something like::
 
     >>> import taurus
-    >>> myattr = taurus.Attribute('epics://my:example.RBV')
+    >>> myattr = taurus.Attribute('ca:my:example.RBV')
 
 Epics attributes (should) work just as other Taurus attributes and can be
 referred by their model name wherever a Taurus Attribute model is expected. For
 example, you can launch a `TaurusForm` with an epics attribute::
 
-    $> taurusform epics://my:example.RBV
+    $> taurusform ca:my:example
 
 Similarly, you can combine epics attributes with attributes from other schemes::
 
-    $> taurusform 'epics://my:example.RBV' 'tango://sys/tg_test/1/float_scalar'\ 
-       'eval://{epics://my:example.RBV}*{tango://sys/tg_test/1/float_scalar}'
+    $> taurusform 'ca:my:example' 'tango:sys/tg_test/1/float_scalar'\
+       'eval:{ca:my:example}*{tango:sys/tg_test/1/float_scalar}'
 
 Currently, the taurus epics scheme just supports epics PVs, implementing them as
-taurus attributes (with configuration objects as well). Other taurus classes
-such as the Database, and Device classes are just convenience dummy objects in
-the epics scheme at this point. Epics records may eventually be mapped as
-Devices.
-
+taurus attributes. Other model types such as the Authority, and Device classes
+are just convenience dummy objects in the epics scheme at this point.
+Epics records may eventually be mapped as Devices.
 """
 
 from epicsfactory import *
diff --git a/lib/taurus/core/epics/epicsattribute.py b/lib/taurus/core/epics/epicsattribute.py
new file mode 100644
index 0000000..ffdba7a
--- /dev/null
+++ b/lib/taurus/core/epics/epicsattribute.py
@@ -0,0 +1,261 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+'''
+Epics module. See __init__.py for more detailed documentation
+'''
+__all__ = ['EpicsAttribute']
+
+
+import numpy
+from taurus.external.pint import Quantity
+
+from taurus.core.taurusbasetypes import (TaurusEventType, TaurusAttrValue,
+                                         TaurusTimeVal, AttrQuality, DataType,
+                                         DataFormat)
+from taurus.core.taurusattribute import TaurusAttribute
+
+import epics
+from epics.ca import ChannelAccessException
+from epics import dbr
+
+# map for epics DBR types to Taurus Types.
+Dbr2TaurusType = {dbr.STRING: DataType.String,
+                  dbr.INT: DataType.Integer,
+                  dbr.SHORT: DataType.Integer,
+                  dbr.FLOAT: DataType.Float,
+                  # dbr.ENUM: DataType.Integer,  # TODO: Support enum
+                  dbr.CHAR: DataType.Bytes,
+                  dbr.LONG: DataType.Integer,
+                  dbr.DOUBLE: DataType.Float,
+                  # TODO: if a time type is added to DataType, change the next
+                  dbr.TIME_STRING: DataType.String,
+                  dbr.TIME_INT: DataType.Integer,
+                  dbr.TIME_SHORT: DataType.Integer,
+                  dbr.TIME_FLOAT: DataType.Float,
+                  # dbr.TIME_ENUM: DataType.Integer,  # TODO: Support enum
+                  dbr.TIME_CHAR: DataType.Bytes,
+                  dbr.TIME_LONG: DataType.Integer,
+                  dbr.TIME_DOUBLE: DataType.Float,
+                  dbr.CTRL_STRING: DataType.String,
+                  dbr.CTRL_INT: DataType.Integer,
+                  dbr.CTRL_SHORT: DataType.Integer,
+                  dbr.CTRL_FLOAT: DataType.Float,
+                  # dbr.CTRL_ENUM: DataType.Integer,  # TODO: Support enum
+                  dbr.CTRL_CHAR: DataType.Bytes,
+                  dbr.CTRL_LONG: DataType.Integer,
+                  dbr.CTRL_DOUBLE: DataType.Float,
+                  }
+
+
+class EpicsAttribute(TaurusAttribute):
+    """
+    A :class:`TaurusAttribute` that gives access to an Epics Process Variable.
+
+    .. seealso:: :mod:`taurus.core.epics`
+
+    .. warning:: In most cases this class should not be instantiated directly.
+                 Instead it should be done via the
+                 :meth:`EpicsFactory.getAttribute`
+    """
+    # TODO: support non-numerical PVs
+
+    def __init__(self, name, parent, storeCallback=None):
+        self.call__init__(TaurusAttribute, name, parent,
+                          storeCallback=storeCallback)
+
+        self._label = self.getSimpleName()
+        self._value = None
+        self.data_format = None
+        self.type = None
+        self._range = [None, None]
+        self._alarm = [None, None]
+        self._warning = [None, None]
+
+        self.__pv = epics.PV(self.getNormalName(), callback=self.onEpicsEvent,
+                             form='ctrl',
+                             connection_callback=self.onEpicsConnectionEvent)
+        self.__pv.wait_for_connection()
+
+    def getPV(self):
+        """Returns the underlying :obj:`epics.PV` object
+        """
+        return self.__pv
+
+    def onEpicsEvent(self, **kwargs):
+        """callback for PV changes"""
+        # this is called from the ca thread.
+        # TODO: Consider doing the following on a different thread
+        self._value = self.decode(self.__pv)
+        self.fireEvent(TaurusEventType.Change, self._value)
+
+    def onEpicsConnectionEvent(self, **kwargs):
+        """callback for PV connection changes"""
+        if kwargs['conn']:
+            self.debug('(re)connected to epics PV')
+            if self._value is not None:
+                self._value.error = None
+        else:
+            self.warning('Connection to epics PV lost')
+            self._value.error = ChannelAccessException('PV "%s" not connected' %
+                                                       kwargs['pvname'])
+        self.fireEvent(TaurusEventType.Change, self._value)
+
+    # ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # Necessary to overwrite from TaurusAttribute
+    # ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    def isNumeric(self):
+        return self.type in (DataType.Integer, DataType.Float)
+
+    def isState(self):
+        return False  # TODO implement generic
+
+    def encode(self, value):
+        """encodes the value passed to the write method into
+        a representation that can be written with :meth:`epics.PV.put`
+        """
+        if isinstance(value, Quantity):
+            # convert to units of the PV
+            value = value.to(self.__pv.units).magnitude
+        return value
+
+    def decode(self, pv):
+        """Decodes an epics PV object into a TaurusValue, and also updates other
+         properties of the Attribute object
+        """
+        attr_value = TaurusAttrValue()
+        if not pv.connected:
+            attr_value.error = ChannelAccessException('PV "%s" not connected' %
+                                                      pv.pvname)
+            return attr_value
+        v = pv.value
+        # type
+        try:
+            self.type = Dbr2TaurusType[pv.ftype]
+        except KeyError:
+            raise ValueError('Unsupported epics type "%s"' % pv.type)
+        # writable
+        self.writable = pv.write_access
+        # data_format
+        if numpy.isscalar(v):
+            self.data_format = DataFormat._0D
+        else:
+            self.data_format = DataFormat(len(numpy.shape(v)))
+        # units and limits support
+        if self.type in (DataType.Integer, DataType.Float):
+            v = Quantity(v, pv.units)
+            self._range = self.__decode_limit(pv.lower_ctrl_limit,
+                                              pv.upper_ctrl_limit)
+            self._alarm = self.__decode_limit(pv.lower_alarm_limit,
+                                              pv.upper_alarm_limit)
+            self._warning = self.__decode_limit(pv.lower_warning_limit,
+                                                pv.upper_warning_limit)
+
+        # rvalue
+        attr_value.rvalue = v
+        # wvalue
+        if pv.write_access:
+            attr_value.wvalue = v
+        # time
+        if pv.timestamp is None:
+            attr_value.time = TaurusTimeVal.now()
+        else:
+            attr_value.time = TaurusTimeVal.fromtimestamp(pv.timestamp)
+        # quality
+        if pv.severity > 0:
+            attr_value.quality = AttrQuality.ATTR_ALARM
+        else:
+            attr_value.quality = AttrQuality.ATTR_VALID
+        return attr_value
+
+    def __decode_limit(self, l, h):
+        units = self.__pv.units
+        if l is None or numpy.isnan(l):
+            l = None
+        else:
+            l = Quantity(l, units)
+        if l is None or numpy.isnan(h):
+            h = None
+        else:
+            h = Quantity(h, units)
+        return [l, h]
+
+    def write(self, value, with_read=True):
+        value = self.encode(value)
+        self.__pv.put(value, wait=True)
+        if with_read:
+            return self.read(cache=False)
+
+    def read(self, cache=True):
+        """returns the value of the attribute.
+
+        :param cache: (bool) If True (default), the last calculated value will
+                      be returned. If False, the referenced values will be re-
+                      read and the transformation string will be re-evaluated
+
+        :return: attribute value
+        """
+        if not cache:
+            self.__pv.get(use_monitor=False)
+            self._value = self.decode(self.__pv)
+        return self._value
+
+    def poll(self):
+        v = self.read(cache=False)
+        self.fireEvent(TaurusEventType.Periodic, v)
+
+    def isUsingEvents(self):
+        return True  # TODO: implement this
+
+    def _subscribeEvents(self):
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute._subscribeEvents")
+
+    def _unsubscribeEvents(self):
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute._unsubscribeEvents")
+# ------------------------------------------------------------------------------
+
+    def factory(self):
+        from epicsfactory import EpicsFactory
+        return EpicsFactory()
+
+    @classmethod
+    def getNameValidator(cls):
+        from epicsvalidator import EpicsAttributeNameValidator
+        return EpicsAttributeNameValidator()
+
+
+if __name__ == '__main__':
+    a = EpicsAttribute('ca:XXX:a', None)
+    b = EpicsAttribute('ca:XXX:b', None)
+    s = EpicsAttribute('ca:XXX:sum', None)
+
+    a.write(3.)
+    b.write(4.)
+    s.read()
+
+    print "!$!", s.read(cache=False)
+    print "a,b,s", a.read().rvalue, b.read().rvalue, s.read().rvalue
+    print "DF=", a.getDataFormat(), DataFormat.whatis(a.getDataFormat())
diff --git a/lib/taurus/core/epics/epicsauthority.py b/lib/taurus/core/epics/epicsauthority.py
new file mode 100644
index 0000000..59c0f20
--- /dev/null
+++ b/lib/taurus/core/epics/epicsauthority.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+'''
+epics authority. See __init__.py for more detailed documentation
+'''
+__all__ = ['EpicsAuthority']
+
+
+from taurus.core.taurusauthority import TaurusAuthority
+
+
+class EpicsAuthority(TaurusAuthority):
+    '''
+    Dummy authority class for Epics
+    (the authority concept is not yet used in the Epics scheme)
+
+    .. warning:: In most cases this class should not be instantiated directly.
+                 Instead it should be done via the
+                    :meth:`EpicsFactory.getAuthority`
+    '''
+    _factory = None
+    _scheme = 'ca'
diff --git a/lib/taurus/core/epics/epicsdevice.py b/lib/taurus/core/epics/epicsdevice.py
new file mode 100644
index 0000000..ef5614f
--- /dev/null
+++ b/lib/taurus/core/epics/epicsdevice.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+'''
+epics device. See __init__.py for more detailed documentation
+'''
+__all__ = ['EpicsDevice']
+
+
+from taurus.core.taurusdevice import TaurusDevice
+
+
+class EpicsDevice(TaurusDevice):
+    '''
+    Dummy device class for Epics
+    (the device concept is not yet used in the Epics scheme)
+
+    .. warning:: In most cases this class should not be instantiated directly.
+                 Instead it should be done via the
+                    :meth:`EpicsFactory.getDevice`
+    '''
+    _factory = None
+    _scheme = 'ca'
diff --git a/lib/taurus/core/epics/epicsfactory.py b/lib/taurus/core/epics/epicsfactory.py
index d214c93..5b01b0f 100644
--- a/lib/taurus/core/epics/epicsfactory.py
+++ b/lib/taurus/core/epics/epicsfactory.py
@@ -1,482 +1,68 @@
 #!/usr/bin/env python
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 '''
 Epics module. See __init__.py for more detailed documentation
 '''
-__all__ = ['EpicsFactory', 'EpicsDatabase', 'EpicsDevice', 
-           'EpicsAttribute','EpicsConfiguration', 
-           'EpicsConfigurationNameValidator', 'EpicsDeviceNameValidator', 
-           'EpicsAttributeNameValidator']
+__all__ = ['EpicsFactory']
 
 
+import weakref
 
-import time, re, weakref
-import numpy
+try:
+    import epics
+except ImportError:
+    from taurus.core.util.log import debug
+    debug('cannot import epics module. ' +
+          'Taurus will not support the "epics" scheme')
+    raise
 
-from taurus import Factory
-from taurus.core.taurusexception import TaurusException, DoubleRegistration
+from taurus.core.taurusexception import TaurusException
 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.taurusbasetypes import TaurusElementType
 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
-    from taurus.core.util.log import debug
-    debug('cannot import epics module. Taurus will not support the "epics" scheme')
-    #raise
-
-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 = ''
-    
-    def __init__(self):
-        """ Initialization. Nothing to be done here for now."""
-        pass
-    
-    def init(self, *args, **kwargs):
-        """Singleton instance initialization."""
-        self.name_re = re.compile(self.name_pattern)
-        
-    def isValid(self,s, matchLevel = MatchLevel.ANY):
-        return self.name_re.match(s) is not None
-        
-    def getParams(self, s):
-        m = self.attrname_re.match(s)
-        if m is None:
-            return None
-        return m.groupdict()
-
-    def getNames(self, s, factory=None):
-        """Returns the full, normal and simple names for this object, or None if there is no match'''
-        """
-        raise RuntimeError('Not Allowed to call this method from subclasses')
-    
-    def getDeviceName(self, s, full=True):
-        '''
-        returns the device name for the given attribute name. 
-        The "full" argument is ignored since the DB is never included in the epics models
-        '''
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        devname = m.group('devname') or EpicsFactory.DEFAULT_DEVICE
-        return 'epics://%s%s'%(devname,m.group('base_sep') or self.base_sep )
-    
-    def getDBName(self, s):
-        '''returns the full data base name for the given attribute name.
-        Note: the DB name is not a valid epics URI because the epics scheme does not implement a DB model'''
-        dbname = EpicsFactory.DEFAULT_DATABASE
-        return dbname
-    
-
-class EpicsAttributeNameValidator(AbstractEpicsNameValidator):
-    #The groups in a match object using the regexp below are:
-    #    1: scheme; named as 'scheme'
-    #    2: EPICS PV name (in the case of attribute names) or same as $3 (in the case of device names) 
-    #    3: device name including the trailing base_sep; optional
-    #    4: device name; optional; named as 'devname'
-    #    5: base separator if it appears on the URI; named as 'base_sep'
-    #    6: attribute name;optional; named as 'attrname'
-    #
-    #    Reconstructing the names
-    #    attrname= $6
-    #    devname= $4 or EpicsFactory.DEFAULT_DEVICE
-    #    fullname= "epics://%s"%($2)
-    # 
-    #                1                   2             34                  5                 6
-    name_pattern = '^(?P<scheme>epics)://(?P<epicsname>((?P<devname>[^?#]*)(?P<base_sep>%s))?(?P<attrname>[^?#%s]+))$'%(AbstractEpicsNameValidator.base_sep, AbstractEpicsNameValidator.base_sep)
-    
-#    def isValid(self,s, matchLevel = MatchLevel.ANY):
-#        m = self.name_re.match(s)
-#        return m is not None and m.group('attrname') #the model contains an attrname 
-    
-    def getNames(self, s, factory=None):
-        """Returns the complete, normal and short names.
-        
-        For example::
-        
-            >>> EpicsDeviceNameValidator.getNames("epics://foo:bar:baz")
-            >>> ("epics://foo:bar:baz", "foo:bar:baz", "baz")
-        
-        """
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        #The following comments are for an example name like: "epics://foo:bar:baz"
-        attr_name = m.group('attrname') # attr_name = "baz"
-        normal_name = m.group('epicsname')  #normal_name = "foo:bar:baz"
-        fullname = "%s://%s"%(m.group('scheme'),normal_name) #fullname = "epics://foo:bar:baz"
-        return fullname, normal_name, attr_name
-        
-
-class EpicsDeviceNameValidator(AbstractEpicsNameValidator):
-    '''A validator of names for :class:`EpicsDevice`. By taurusconvention, 
-    the model name for an epics device name *must* end with the base separator
-    (in order to distinguish device names from attribute names)'''
-    
-    name_pattern = '^(?P<scheme>epics)://(?P<epicsname>((?P<devname>[^?#]*)(?P<base_sep>%s)))$'%(AbstractEpicsNameValidator.base_sep)
-    
-#    def isValid(self,s, matchLevel = MatchLevel.ANY):
-#        m = self.name_re.match(s)
-#        return m is not None and not m.group('attrname') #to be a device it must not contain an attribute
-    
-    def getNames(self, s, factory=None):
-        """Returns the complete, normal and short names. (note: complete=normal)
-        
-        :param s: (str) input string describing the device
-        :param factory: (TaurusFactory) [Unused]
-        
-        :return: (tuple<str,str,str> or None) A tuple of complete, normal and
-                 short names, or None if s is an invalid device name
-        """
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        #The following comments are for a name of the type: "epics://foo:bar:" 
-        devname = m.group('devname')  # foo:bar
-        normal_name = m.group('epicsname') #foo:bar:
-        full_name = self.getDeviceName(s, full=True) #epics://foo:bar:
-        return full_name, normal_name, devname
-
-
-class EpicsConfigurationNameValidator(AbstractEpicsNameValidator):
-    '''A validator of names for :class:`EpicsConfiguration`'''
-    # The groups in a match object using the regexp below are the 
-    # same as for the AbstractEpicsNameValidator plus:
-    #   +1: configuration extension
-    #   +2: configuration key;optional; named as 'cfgkey'
-    
-    name_pattern = '^(?P<scheme>epics)://(?P<epicsname>((?P<devname>[^?#]*)(?P<base_sep>%s))?(?P<attrname>[^?#%s]+)\?configuration=?(?P<cfgkey>[^#?]*))$'%(AbstractEpicsNameValidator.base_sep, AbstractEpicsNameValidator.base_sep)
-        
-    def getNames(self, s, factory=None):
-        """Returns the complete, normal and short names"""
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        #The following comments are for an example name like: "epics://foo:bar:baz?configuration=label"
-        cfg_key = m.group('cfgkey') # cfg_key = "label"
-        full_name = s               # "epics://foo:bar:baz?configuration=label"
-        normal_name = full_name     # "epics://foo:bar:baz?configuration=label"
-        return full_name, normal_name, cfg_key
-    
-    def getAttrName(self, s):
-        names = self.getNames(s)
-        if names is None: return None
-        return names[0].rsplit('?configuration')[0]#remove the "?configuration..." substring from the fullname 
-        
-
-class EpicsDatabase(TaurusDatabase):
-    '''
-    Dummy database class for Epics (the Database concept is not used in the Epics scheme)
-    
-    .. warning:: In most cases this class should not be instantiated directly.
-                 Instead it should be done via the :meth:`EpicsFactory.getDataBase`
-    '''
-    def factory(self):
-        return EpicsFactory()
-        
-    def __getattr__(self, name):
-        return "EpicsDatabase object calling %s" % name
-
-
-class EpicsDevice(TaurusDevice):
-    '''
-    An Epics device object. 
-    @todo: For the moment is a dummy object. Eventually we may map it to an epics record.
-    
-    .. seealso:: :mod:`taurus.core.epics`
-    
-    .. warning:: In most cases this class should not be instantiated directly.
-                 Instead it should be done via the :meth:`EpicsFactory.getDevice`
-    '''
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusModel necessary overwrite
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # helper class property that stores a reference to the corresponding factory
-    _factory = None
-    
-    @classmethod
-    def factory(cls):
-        if cls._factory is None:
-            cls._factory = Factory(scheme='epics')
-        return cls._factory
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusDevice necessary overwrite
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    def _createHWObject(self):
-        return 'Epics'
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    def getAttribute(self, attrname):
-        """Returns the attribute object given its name"""
-        full_attrname = "%s%s"%(self.getFullName(), attrname)
-        return self.factory().getAttribute(full_attrname)
-    
-    @classmethod
-    def getNameValidator(cls):
-        return EpicsDeviceNameValidator()
-    
-    def decode(self, event_value):
-        if isinstance(event_value, int): # TaurusSWDevState
-            new_sw_state = event_value
-        else:
-            self.info("Unexpected value to decode: %s" % str(event_value))
-            new_sw_state = TaurusSWDevState.Crash
-        value = TaurusAttrValue() 
-        value.value = new_sw_state
-        return value
-    
-
-class EpicsAttribute(TaurusAttribute):
-    '''
-    A :class:`TaurusAttribute` that gives access to an Epics Process Variable.
-    
-    .. seealso:: :mod:`taurus.core.epics` 
-    
-    .. warning:: In most cases this class should not be instantiated directly.
-                 Instead it should be done via the :meth:`EpicsFactory.getAttribute`
-    '''
-    
-    def __init__(self, name, parent, storeCallback = None):
-        self.call__init__(TaurusAttribute, name, parent, storeCallback=storeCallback)
-               
-        self.__attr_config = None
-        self.__pv = epics.PV(self.getNormalName(), callback=self.onEpicsEvent)
-        connected = self.__pv.wait_for_connection()
-        if connected:
-            self.info('successfully connected to epics PV')
-            self._value = self.decode_pv(self.__pv)
-        else:
-            self.info('connection to epics PV failed')
-            self._value = TaurusAttrValue()
-        
-        #print "INIT",self.__pv, connected
-        
-    def onEpicsEvent(self, **kw):
-        '''callback for PV changes'''
-        self._value = self.decode_epics_evt(kw)
-        self.fireEvent(TaurusEventType.Change, self._value)
-    
-    def __getattr__(self,name):
-        return getattr(self._getRealConfig(), name)
-    
-    def _getRealConfig(self):
-        """ Returns the current configuration of the attribute."""
-        if self.__attr_config is None:
-            cfg_name = "%s?configuration" % self.getFullName()
-            self.__attr_config = EpicsConfiguration(cfg_name, self)
-        return self.__attr_config
-            
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # Necessary to overwrite from TaurusAttribute
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    def isNumeric(self):
-        return True
-        
-    def isBoolean(self):
-        return isinstance(self._value.value, bool)
-    
-    def isState(self):
-        return False
-
-    def getDisplayValue(self,cache=True):
-        return self.__pv.get(as_string=True, use_monitor=cache)
-
-    def encode(self, value):
-        '''encodes the value passed to the write method into 
-        a representation that can be written in epics'''
-        try:
-            typeclass = numpy.dtype(self.__pv.type).type
-            return typeclass(value) #cast the value with the python type for this PV
-        except:
-            return value
-
-    def decode (self, obj):
-        if isinstance(obj, epics.PV):
-            return self.decode_pv(obj)
-        else:
-            return self.decode_epics_evt(obj)
-
-    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 = TaurusAttrValue()
-        attr_value.value = pv.value
-        if pv.write_access:
-            attr_value.w_value = pv.value
-        if pv.timestamp is None: 
-            attr_value.time = TaurusTimeVal.now()
-        else:
-            attr_value.time = TaurusTimeVal.fromtimestamp(pv.timestamp)
-        if pv.severity > 0:
-            attr_value.quality = AttrQuality.ATTR_ALARM
-        else:
-            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 = 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 = TaurusTimeVal.now()
-        else:
-            attr_value.time = TaurusTimeVal.fromtimestamp(timestamp)
-        if evt.get('severity', 1) > 0:
-            attr_value.quality = AttrQuality.ATTR_ALARM
-        else:
-            attr_value.quality = AttrQuality.ATTR_VALID
-        attr_value.config.data_format = len(numpy.shape(attr_value.value))
-        return attr_value
-
-    def write(self, value, with_read=True):
-        value = self.encode(value)
-        self.__pv.put(value)
-        if with_read:
-            return self.decode_pv(self.__pv)
-
-    def read(self, cache=True):
-        '''returns the value of the attribute.
-        
-        :param cache: (bool) If True (default), the last calculated value will
-                      be returned. If False, the referenced values will be re-
-                      read and the transformation string will be re-evaluated
-                      
-        :return: attribute value
-        '''
-        if not cache:
-            self.__pv.get(use_monitor=False)
-            self._value = self.decode_pv(self.__pv)
-        return self._value    
 
-    def poll(self):
-        v = self.read(cache=False)
-        self.fireEvent(TaurusEventType.Periodic, v)
+from epicsattribute import EpicsAttribute
+from epicsdevice import EpicsDevice
+from epicsauthority import EpicsAuthority
 
-    def isUsingEvents(self):
-        return True #@todo
-        
-#------------------------------------------------------------------------------ 
 
-    def isWritable(self, cache=True):
-        return self.__pv.write_access
-    
-    def isWrite(self, cache=True):
-        return self.__pv.write_access
-    
-    def isReadOnly(self, cache=True):
-        return self.__pv.read_access and not self.__pv.write_access
-
-    def isReadWrite(self, cache=True):
-        return self.__pv.read_access and self.__pv.write_access
-
-    def getWritable(self, cache=True):
-        return self.__pv.write_access
-
-
-    def factory(self):
-        return EpicsFactory()
-    
-    @classmethod
-    def getNameValidator(cls):
-        return EpicsAttributeNameValidator()
-
-    
-
-class EpicsConfiguration(TaurusConfiguration):
-    '''
-    A :class:`TaurusConfiguration` 
-    
-    .. seealso:: :mod:`taurus.core.epics` 
-    
-    .. warning:: In most cases this class should not be instantiated directly.
-                 Instead it should be done via the :meth:`EpicsFactory.getConfig`
-    '''
-    def __init__(self, name, parent, storeCallback = None):
-        self.call__init__(TaurusConfiguration, name, parent, storeCallback=storeCallback)
-        
-        #fill the attr info
-        i = parent.read().config
-        a=parent
-        d=self._getDev()
-        # add dev_name, dev_alias, attr_name, attr_full_name
-        i.dev_name = d.getNormalName()
-        i.dev_alias = d.getSimpleName()
-        i.attr_name = a.getSimpleName()
-        i.attr_fullname = a.getNormalName()
-        i.label = a.getSimpleName()
-        self._attr_info = i
-        
-    def __getattr__(self, name): 
-        try:
-            return getattr(self._attr_info,name)
-        except:
-            raise AttributeError("'%s'object has no attribute '%s'"%(self.__class__.__name__, name))
-    @classmethod
-    def getNameValidator(cls):
-        return EpicsConfigurationNameValidator()
-        
-    def _subscribeEvents(self): 
-        pass
-    
-    def _unSubscribeEvents(self):
-        pass   
-    
-    def factory(self):
-        EpicsFactory()
-    
-    def getValueObj(self, cache=True):
-        """ Returns the current configuration for the attribute."""
-        return self._attr_info   
-    
-    
 class EpicsFactory(Singleton, TaurusFactory, Logger):
     """
     A Singleton class that provides Epics related objects.
     """
 
-    schemes = ("epics",)
-    DEFAULT_DEVICE = '_DefaultEpicsDevice'
-    DEFAULT_DATABASE = '_DefaultEpicslDB'
+    schemes = ("ca", "epics",)
+    DEFAULT_DEVICE = 'ca:'
+    DEFAULT_AUTHORITY = 'ca://'
+    caseSensitive = False
+    elementTypesMap = {TaurusElementType.Authority: EpicsAuthority,
+                       TaurusElementType.Device: EpicsDevice,
+                       TaurusElementType.Attribute: EpicsAttribute
+                       }
+
     def __init__(self):
         """ Initialization. Nothing to be done here for now."""
         pass
@@ -486,253 +72,91 @@ class EpicsFactory(Singleton, TaurusFactory, Logger):
         name = self.__class__.__name__
         self.call__init__(Logger, name)
         self.call__init__(TaurusFactory)
+        if EpicsAttribute is None:
+            self.debug('cannot import epics module.'
+                       'Taurus will not support the "epics" scheme')
+            raise Exception('"epics" module is not available')
         self.epics_attrs = weakref.WeakValueDictionary()
         self.epics_devs = weakref.WeakValueDictionary()
-        self.epics_configs = weakref.WeakValueDictionary()
-        
-    def findObjectClass(self, absolute_name):
-        """
-        Obtain the class object corresponding to the given name.
-        """
-        if EpicsConfiguration.isValid(absolute_name):
-            return EpicsConfiguration
-        elif EpicsDevice.isValid(absolute_name):
-            return EpicsDevice
-        elif EpicsAttribute.isValid(absolute_name):
-            return EpicsAttribute
-        else:
-            self.debug("Not able to find Object class for %s" % absolute_name)
-            self.traceback()
-            return None
 
-    def getDatabase(self, db_name=None):
-        """Obtain the EpicsDatabase object.
-        
-        :param db_name: (str) this is ignored because only one dummy database is supported
-                           
-        :return: (EpicsDatabase)
+    def getAuthority(self, name=None):
+        """Obtain the Epics (ca) authority object.
+
+        :param name: (str) only a dummy authority ("ca://") is supported
+
+        :return: (EpicsAuthority)
         """
-        if not hasattr(self, "_db"):
-            self._db = EpicsDatabase(self.DEFAULT_DATABASE)
-        return self._db
+        if name is None:
+            name = 'ca://'
+
+        v = self.getAuthorityNameValidator()
+        if not v.isValid(name):
+            raise TaurusException("Invalid ca authority name %s" % name)
+
+        if not hasattr(self, "_auth"):
+            self._auth = EpicsAuthority(self.DEFAULT_AUTHORITY)
+        return self._auth
 
     def getDevice(self, dev_name):
         """Obtain the EpicsDevice object.
-        
-        :param dev_name: (str) this is ignored because only one dummy device is supported
-                           
+
+        :param dev_name: (str) only one dummy device ("") is supported
+
         :return: (EpicsDevice)
-        
-        .. todo:: Epics records may be implemented as taurus devices...
+
+        .. todo:: epics.Device may be wrapped as taurus device...
         """
-        d = self.epics_devs.get(dev_name, None) #first try with the given name
-        if d is None: #if not, try with the full name
-            validator = EpicsDevice.getNameValidator()
-            names = validator.getNames(dev_name)
-            if names is None:
-                raise TaurusException("Invalid epics device name %s" % dev_name)
-            fullname = names[0]
-            d = self.epics_devs.get(fullname, None)
-            if d is None: #if the full name is not there, create one
-                db = self.getDatabase()
-                d = EpicsDevice(fullname, parent=db, storeCallback=self._storeDev) #use full name
+        validator = self.getDeviceNameValidator()
+        names = validator.getNames(dev_name)
+        if names is None:
+            raise TaurusException("Invalid epics device name %s" % dev_name)
+        fullname = names[0]
+        d = self.epics_devs.get(fullname, None)
+        if d is None:  # if the full name is not there, create one
+            auth = self.getAuthority()
+        d = EpicsDevice(fullname, parent=auth)
+        self.epics_devs[fullname] = d
         return d
-    
+
     def getAttribute(self, attr_name):
-        """Obtain the object corresponding to the given attribute name. If the 
+        """Obtain the object corresponding to the given attribute name. If the
         corresponding attribute already exists, the existing instance is
-        returned. Otherwise a new instance is stored and returned. The 
+        returned. Otherwise a new instance is stored and returned. The
         device associated to this attribute will also be created if necessary.
-           
+
         :param attr_name: (str) the attribute name string. See
                           :mod:`taurus.core.epics` for valid attribute names
-        
-        :return: (EpicsAttribute)
-         
-        @throws TaurusException if the given name is invalid.
-        """
-        a = self.epics_attrs.get(attr_name, None) #first try with the given name
-        if a is None: #if not, try with the full name
-            validator = EpicsAttribute.getNameValidator()
-            names = validator.getNames(attr_name)
-            if names is None:
-                raise TaurusException("Invalid epics attribute name %s" % attr_name)
-            fullname = names[0]
-            a = self.epics_attrs.get(fullname, None)
-            if a is None: #if the full name is not there, create one
-                dev = self.getDevice(validator.getDeviceName(attr_name))
-                a = EpicsAttribute(fullname, parent=dev, storeCallback=self._storeAttr) #use full name
-        return a
-
-    def getConfiguration(self, param):
-        """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.TaurusAttribute object or full configuration name
-           
-        @return a taurus.core.taurusattribute.TaurusAttribute object
-        @throws TaurusException if the given name is invalid.
-        """
-        if isinstance(param, str):
-            return self._getConfigurationFromName(param)
-        return self._getConfigurationFromAttribute(param)
-
-    def _getConfigurationFromName(self, cfg_name):
-        cfg = self.epics_configs.get(cfg_name, None) #first try with the given name
-        if cfg is None: #if not, try with the full name
-            validator = EpicsConfiguration.getNameValidator()
-            names = validator.getNames(cfg_name)
-            if names is None:
-                raise TaurusException("Invalid evaluation configuration name %s" % cfg_name)
-            fullname = names[0]
-            cfg = self.epics_configs.get(fullname, None)
-            if cfg is None: #if the full name is not there, create one
-                attr = self.getAttribute(validator.getAttrName(cfg_name))
-                cfg = EpicsConfiguration(fullname, parent=attr, storeCallback=self._storeConfig) 
-        return cfg
-        
-    def _getConfigurationFromAttribute(self, attr):
-        cfg = attr.getConfig()
-        cfg_name = attr.getFullName() + "?configuration"
-        self.epics_configs[cfg_name] = cfg
-        return cfg
-    
-    def _storeDev(self, dev):
-        name = dev.getFullName()
-        exists = self.epics_devs.get(name)
-        if exists is not None:
-            if exists == dev: 
-                self.debug("%s has already been registered before" % name)
-                raise DoubleRegistration
-            else:
-                self.debug("%s has already been registered before with a different object!" % name)
-                raise DoubleRegistration
-        self.epics_devs[name] = dev
-    
-    def _storeAttr(self, attr):
-        name = attr.getFullName()
-        exists = self.epics_attrs.get(name)
-        if exists is not None:
-            if exists == attr: 
-                self.debug("%s has already been registered before" % name)
-                raise DoubleRegistration
-            else:
-                self.debug("%s has already been registered before with a different object!" % name)
-                raise DoubleRegistration
-        self.epics_attrs[name] = attr
-        
-    def _storeConfig(self, fullname, config):
-        #name = config.getFullName()
-        name = fullname
-        exists = self.epics_configs.get(name)
-        if exists is not None:
-            if exists == config: 
-                self.debug("%s has already been registered before" % name)
-                raise DoubleRegistration
-            else:
-                self.debug("%s has already been registered before with a different object!" % name)
-                raise DoubleRegistration
-        self.epics_configs[name] = config
-        
-    def addAttributeToPolling(self, attribute, period, unsubscribe_evts = False):
-        """Activates the polling (client side) for the given attribute with the
-           given period (seconds).
 
-           :param attribute: (taurus.core.tango.TangoAttribute) attribute name.
-           :param period: (float) polling period (in seconds)
-           :param unsubscribe_evts: (bool) whether or not to unsubscribe from events
-        """
-        tmr = self.polling_timers.get(period, TaurusPollingTimer(period))
-        self.polling_timers[period] = tmr
-        tmr.addAttribute(attribute, self.isPollingEnabled())
-        
-    def removeAttributeFromPolling(self, attribute):
-        """Deactivate the polling (client side) for the given attribute. If the
-           polling of the attribute was not previously enabled, nothing happens.
+        :return: (EpicsAttribute)
 
-           :param attribute: (str) attribute name.
+        :raises: :TaurusException: if the given name is invalid.
         """
-        p = None
-        for period,timer in self.polling_timers.iteritems():
-            if timer.containsAttribute(attribute):
-                timer.removeAttribute(attribute)
-                if timer.getAttributeCount() == 0:
-                    p = period
-                break
-        if p:
-            del self.polling_timers[period]
-            
-
-    
-
-#===============================================================================
-# Just for testing
-#===============================================================================
-def test1():
-    f = EpicsFactory()
-    d = f.getDevice('epics://foo:bar:')
-    a = f.getAttribute('epics://foo:bar:baz')
-    p = a.getParentObj()
-    c = f.getConfiguration('epics://foo:bar:baz?configuration=label')
-#    cp = a.getConfig()
-    print "FACTORY:", f
-    print "DEVICE:", d, d.getSimpleName(), d.getNormalName(), d.getFullName()
-    print "ATTRIBUTE", a, a.getSimpleName(), a.getNormalName(), a.getFullName()
-    print "ATTRIBUTE PARENT", p, p.getSimpleName(), p.getNormalName(), p.getFullName(), p is d
-    print "CONFIGURATION", c, c.getSimpleName(), c.getNormalName(), c.getFullName()
-#    print "CONFIGPROXY", cp, cp.getSimpleName()
-#    print
-#    print c.getValueObj()
-#    print c.getUnit()
-    
-
-def test2():
-    from taurus import Attribute
-    a = Attribute('epics://mp49t:sim1.RBV')
-    class Dummy:
-        n=0
-        def eventReceived(self, s,t,v):
-            print "DUMMY:",self.n, v.value
-            self.n += 1
-    kk = Dummy()
-    a.addListener(kk)
-    while kk.n <= 2:
-        time.sleep(1)
-    a.removeListener(kk)
-    while kk.n <= 20:
-        time.sleep(1)        
-    
-def test3():
-    import sys
-    from taurus.qt.qtgui.application import TaurusApplication
-    from taurus.qt.qtgui.panel import TaurusForm
-    from taurus.qt.qtgui.plot import TaurusTrend
-#    from taurus.qt.qtgui.display import TaurusLabel
-    app = TaurusApplication()
-    
-    w = TaurusForm()
-    w.modifiableByUser=True
-    w2=TaurusTrend()
-#    w=TaurusLabel()
+        validator = self.getAttributeNameValidator()
+        names = validator.getNames(attr_name)
+        if names is None:
+            raise TaurusException(
+                "Invalid epics attribute name %s" % attr_name)
+        fullname = names[0]
+        a = self.epics_attrs.get(fullname, None)
+        if a is None:  # if the full name is not there, create one
+            a = EpicsAttribute(fullname, parent=None)  # note: no parent!
+            self.epics_attrs[fullname] = a
+        return a
 
-    w.setModel(['epics://mp49t:sim1.RBV', 'epics://mp49t:sim1.VAL', 'epics://mp49t:sim1.HIGH'])
-    w2.setModel(['epics://mp49t:sim1.RBV', 'epics://mp49t:sim1.VAL'])
+    def getAuthorityNameValidator(self):
+        """Return EpicsAuthorityNameValidator"""
+        import epicsvalidator
+        return epicsvalidator.EpicsAuthorityNameValidator()
 
-#    a=w.getModelObj()
-#    print a, a.read().value
-    
-#    a=w.getModelObj()
-#    a.setUnit('asd')
-#    c=a.getConfig()
+    def getDeviceNameValidator(self):
+        """Return EpicsDeviceNameValidator"""
+        import epicsvalidator
+        return epicsvalidator.EpicsDeviceNameValidator()
 
-    w.show()
-    w2.show()
-    sys.exit(app.exec_())
+    def getAttributeNameValidator(self):
+        """Return EpicsAttributeNameValidator"""
+        import epicsvalidator
+        return epicsvalidator.EpicsAttributeNameValidator()
 
 if __name__ == "__main__":
-    test3()
-    
-        
+    pass
diff --git a/lib/taurus/core/epics/epicsvalidator.py b/lib/taurus/core/epics/epicsvalidator.py
new file mode 100644
index 0000000..1ca6429
--- /dev/null
+++ b/lib/taurus/core/epics/epicsvalidator.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""
+Epics module. See __init__.py for more detailed documentation
+"""
+__all__ = ['EpicsAuthorityNameValidator', 'EpicsDeviceNameValidator',
+           'EpicsAttributeNameValidator']
+
+import re
+from taurus.core.taurusvalidator import (TaurusAttributeNameValidator,
+                                         TaurusDeviceNameValidator,
+                                         TaurusAuthorityNameValidator)
+
+# legal chars on PV names: a-z A-Z 0-9 _ - : . [ ] < > ;
+# ... but "[" "]" and "." are discouraged:
+# http://www.aps.anl.gov/epics/tech-talk/2006/msg00431.php
+PV_CHARS = r'[a-zA-Z0-9_\-:;\<\>' + r'[\.\[\]]'
+
+
+class EpicsAuthorityNameValidator(TaurusAuthorityNameValidator):
+    """Validator for Epics authority names. For now, the only supported
+    authority is "//":
+    """
+    scheme = '(ca|epics)'
+    authority = '//'
+    path = '(?!)'
+    query = '(?!)'
+    fragment = '(?!)'
+
+    def getNames(self, fullname, factory=None):
+        if self.isValid(fullname):
+            return 'ca://', '//', ''
+        return None
+
+
+class EpicsDeviceNameValidator(TaurusDeviceNameValidator):
+    """Validator for Epics device names. Apart from the standard named
+    groups (scheme, authority, path, query and fragment), the following named
+    groups are created:
+
+     - devname: device name (only empty string allowed for now)
+
+    Note: brackets on the group name indicate that this group will only contain
+    a string if the URI contains it.
+    """
+
+    scheme = '(ca|epics)'
+    authority = EpicsAuthorityNameValidator.authority
+    devname = r'(?P<devname>)'  # (only empty string allowed for now)
+    path = devname
+    query = '(?!)'
+    fragment = '(?!)'
+
+    def getNames(self, fullname, factory=None):
+        if self.isValid(fullname):
+            return 'ca:', '', ''
+        return None
+
+
+class EpicsAttributeNameValidator(TaurusAttributeNameValidator):
+    """Validator for Epics attribute names. Apart from the standard named
+    groups (scheme, authority, path, query and fragment), the following named
+    groups are created:
+
+     - attrname: attribute name (an epics PV name).
+
+    Note: brackets on the group name indicate that this group will only contain
+    a value if the URI contains it.
+    """
+    scheme = '(ca|epics)'
+    authority = EpicsAuthorityNameValidator.authority
+    path = r'(?P<attrname>%s+?(\.(?P<_field>[A-Z]+))?)' % PV_CHARS
+    query = '(?!)'
+    fragment = '[^# ]*'
+
+    def getNames(self, fullname, factory=None, fragment=False):
+        """reimplemented from :class:`TaurusDeviceNameValidator`"""
+
+        groups = self.getUriGroups(fullname)
+        if groups is None:
+            return None
+
+        complete = 'ca:%s' % groups['attrname']
+        normal = groups['attrname']
+        short = normal
+
+        # return fragment if requested
+        if fragment:
+            key = groups.get('fragment', None)
+            return complete, normal, short, key
+        return complete, normal, short
diff --git a/lib/taurus/core/epics/test/__init__.py b/lib/taurus/core/epics/test/__init__.py
new file mode 100644
index 0000000..b5a5672
--- /dev/null
+++ b/lib/taurus/core/epics/test/__init__.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
diff --git a/lib/taurus/core/epics/test/res/__init__.py b/lib/taurus/core/epics/test/res/__init__.py
new file mode 100644
index 0000000..b5a5672
--- /dev/null
+++ b/lib/taurus/core/epics/test/res/__init__.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
diff --git a/lib/taurus/core/epics/test/res/epics_test.db b/lib/taurus/core/epics/test/res/epics_test.db
new file mode 100644
index 0000000..7a1251a
--- /dev/null
+++ b/lib/taurus/core/epics/test/res/epics_test.db
@@ -0,0 +1,44 @@
+record(ao,"$(INST):a"){
+  field(DESC,"Input A")
+  field(DTYP,"Soft Channel")
+  field(PREC,1)
+  field(DRVH,10)
+  field(HOPR,10)
+  field(VAL,0)
+  field(LOPR,-10)
+  field(DRVL,-10)
+  field(UDF,1)
+  field(EGU, "m")
+  field(FLNK,"$(INST):sum")
+}
+record(ao,"$(INST):b"){
+  field(DESC,"Input B")
+  field(DTYP,"Soft Channel")
+  field(PREC,1)
+  field(DRVH,10)
+  field(HOPR,10)
+  field(VAL,0)
+  field(LOPR,-10)
+  field(DRVL,-10)
+  field(UDF,1)
+  field(EGU, "m")
+  field(FLNK,"$(INST):sum")
+}
+record(calc,"$(INST):sum"){
+  field(DESC,"Sum")
+  field(PREC,1)
+  field(INPA,"$(INST):a")
+  field(INPB,"$(INST):b")
+  field(CALC,"A + B")
+  field(EGU, "m")
+  field(HOPR,20)
+  field(HIHI,18)
+  field(HIGH,15)
+  field(LOW,-15)
+  field(LOLO,-18)
+  field(LOPR,-20)
+  field(HHSV,"MAJOR")
+  field(HSV,"MINOR")
+  field(LSV,"MINOR")
+  field(LLSV,"MAJOR")
+}
diff --git a/lib/taurus/core/epics/test/test_epicsattribute.py b/lib/taurus/core/epics/test/test_epicsattribute.py
new file mode 100755
index 0000000..4630379
--- /dev/null
+++ b/lib/taurus/core/epics/test/test_epicsattribute.py
@@ -0,0 +1,152 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for epicsattributes..."""
+
+import os
+import sys
+import numpy
+import subprocess
+from taurus.external import unittest
+from taurus.external.pint import Quantity
+import taurus
+from taurus.test import insertTest, getResourcePath
+from taurus.core.taurusbasetypes import DataType, AttrQuality, DataFormat
+from taurus.core.taurusbasetypes import TaurusAttrValue
+
+
+
+
+ at insertTest(helper_name='write_read_attr',
+            attrname='ca:test:a',
+            setvalue=Quantity('1000mm'),
+            expected=dict(rvalue=Quantity('1m'),
+                          type=DataType.Float,
+                          writable=True,
+                          data_format=DataFormat._0D,
+                          range=[Quantity('-10m'), Quantity('10m')],
+                          alarms=[None, None],
+                          warnings=[None, None],
+                          ),
+            expected_attrv=dict(rvalue=Quantity('1m'),
+                                wvalue=Quantity('1m'),
+                                quality=AttrQuality.ATTR_VALID,
+                                error=None,
+                                ),
+            test_skip='There are troubles in the docker container. '
+                      'This test will be skipped till we fix it'
+            )
+ at unittest.skipIf(sys.modules.has_key('epics') is False,
+                 "epics module is not available")
+class AttributeTestCase(unittest.TestCase):
+    """TestCase for the taurus.Attribute helper"""
+    _process = None
+
+    @classmethod
+    def setUpClass(cls):
+        """Run the epics_test softIoc"""
+        db_name = getResourcePath(
+            'taurus.core.epics.test.res', 'epics_test.db')
+        args = ['softIoc', '-m', 'INST=test', '-d', db_name]
+        dev_null = open(os.devnull, 'wb')
+        cls._process = subprocess.Popen(args, stdout=dev_null, stderr=dev_null)
+
+    @classmethod
+    def tearDownClass(cls):
+        """Terminate the epics_test softIoc process"""
+        if cls._process:
+            cls._process.terminate()
+        else:
+            taurus.warning('Process not started, cannot terminate it.')
+
+    def write_read_attr(self, attrname=None, setvalue=None, expected=None,
+                        expected_attrv=None, expectedshape=None):
+        """check creation and correct write-and-read of an attribute"""
+        if expected is None:
+            expected = {}
+        if expected_attrv is None:
+            expected_attrv = {}
+
+        a = taurus.Attribute(attrname)
+
+        if setvalue is None:
+            read_value = a.read(cache=False)
+        else:
+            read_value = a.write(setvalue,  with_read=True)
+
+        # avoid EpicsAttribute disconnection warning
+        # a.getPV().disconnect()
+        msg = ('read() for "%s" did not return a TaurusAttrValue (got a %s)' %
+               (attrname, read_value.__class__.__name__))
+        self.assertTrue(isinstance(read_value, TaurusAttrValue), msg)
+
+        # Test attribute
+        for k, exp in expected.iteritems():
+            try:
+                got = getattr(a, k)
+            except AttributeError:
+                msg = ('The attribute, "%s" does not provide info on %s' %
+                       (attrname, k))
+                self.fail(msg)
+            msg = ('%s for "%s" should be %r (got %r)' %
+                   (k, attrname,  exp, got))
+            self.__assertValidValue(exp, got, msg)
+
+        # Test attribute value
+        for k, exp in expected_attrv.iteritems():
+            try:
+                got = getattr(read_value, k)
+            except AttributeError:
+                msg = ('The read value for "%s" does not provide info on %s' %
+                       (attrname, k))
+                self.fail(msg)
+            msg = ('%s for the value of %s should be %r (got %r)' %
+                   (k, attrname,  exp, got))
+            self.__assertValidValue(exp, got, msg)
+
+        if expectedshape is not None:
+            msg = ('rvalue.shape for %s should be %r (got %r)' %
+                   (attrname, expectedshape, read_value.rvalue.shape))
+            self.assertEqual(read_value.rvalue.shape, expectedshape, msg)
+
+    def __assertValidValue(self, exp, got, msg):
+        # if we are dealing with quantities, use the magnitude for comparing
+        if isinstance(got, Quantity):
+            got = got.to(Quantity(exp).units).magnitude
+        if isinstance(exp, Quantity):
+            exp = exp.magnitude
+        try:
+            # for those values that can be handled by numpy.allclose()
+            chk = numpy.allclose(got, exp)
+        except:
+            if isinstance(got, numpy.ndarray):
+                # uchars were not handled with allclose
+                # UGLY!! but numpy.all does not work
+                chk = got.tolist() == exp.tolist()
+            else:
+                # for the rest
+                chk = bool(got == exp)
+
+        self.assertTrue(chk, msg)
\ No newline at end of file
diff --git a/lib/taurus/core/epics/test/test_epicsvalidator.py b/lib/taurus/core/epics/test/test_epicsvalidator.py
new file mode 100644
index 0000000..931a007
--- /dev/null
+++ b/lib/taurus/core/epics/test/test_epicsvalidator.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core.epics.test.test_epicsvalidator..."""
+
+
+__docformat__ = 'restructuredtext'
+
+import sys
+
+from taurus.external import unittest
+from taurus.core.test import (valid, invalid, names,
+                              AbstractNameValidatorTestCase)
+from taurus.core.epics.epicsvalidator import (EpicsAuthorityNameValidator,
+                                              EpicsDeviceNameValidator,
+                                              EpicsAttributeNameValidator)
+
+# ==============================================================================
+# Tests for Epics Authority  name validation
+# ==============================================================================
+ at valid(name='ca://', groups=dict(authority='//'))
+ at names(name='ca://', out=('ca://', '//', ''))
+ at names(name='epics://', out=('ca://', '//', ''))
+ at invalid(name='ca:')
+ at invalid(name='ca:/')
+ at invalid(name='ca:///')
+ at invalid(name='ca://a')
+ at unittest.skipIf(sys.modules.has_key('epics') is False,
+                 "epics module is not available")
+class EpicsAuthValidatorTestCase(AbstractNameValidatorTestCase,
+                                 unittest.TestCase):
+    validator = EpicsAuthorityNameValidator
+
+
+# ==============================================================================
+# Tests for Epics Device name validation
+# ==============================================================================
+ at valid(name='ca:', groups=dict(authority=None, devname=''))
+ at valid(name='epics:', groups=dict(authority=None, devname=''))
+ at invalid(name='ca:/')
+ at invalid(name='ca://')  # this is an auth
+ at invalid(name='ca:///')
+ at invalid(name='ca:foo')
+ at invalid(name='ca:@foo')
+ at unittest.skipIf(sys.modules.has_key('epics') is False,
+                 "epics module is not available")
+class EpicsDevValidatorTestCase(AbstractNameValidatorTestCase,
+                                unittest.TestCase):
+    validator = EpicsDeviceNameValidator
+
+
+# ==============================================================================
+# Tests for Epics Attribute name validation
+# ==============================================================================
+ at valid(name='epics:XXX:sum',
+       groups={'scheme': 'epics',
+               'authority': None,
+               'attrname': 'XXX:sum',
+               '__STRICT__': True,
+               'fragment': None}
+       )
+ at valid(name='ca:XXX:sum',
+       groups={'scheme': 'ca',
+               'authority': None,
+               'attrname': 'XXX:sum',
+               '_field': None,
+               '__STRICT__': True,
+               'fragment': None}
+       )
+ at valid(name='ca:XXX:sum.RBV',
+       groups={'scheme': 'ca',
+               'authority': None,
+               'attrname': 'XXX:sum.RBV',
+               '_field': 'RBV',
+               '__STRICT__': True,
+               'fragment': None}
+       )
+ at valid(name='ca:XXX:sum.rbv',
+       groups={'scheme': 'ca',
+               'authority': None,
+               'attrname': 'XXX:sum.rbv',
+               '_field': None,
+               '__STRICT__': True,
+               'fragment': None}
+       )
+ at invalid(name='ca://XXX:sum')  # TODO: Maybe this should be valid?
+ at invalid(name='ca:///XXX:sum')  # TODO: Maybe this should be valid?
+ at valid(name='ca:a.B_c1;d:f-e[g]<h>#i',
+       groups={'attrname': 'a.B_c1;d:f-e[g]<h>',
+               '_field': None,
+               '__STRICT__': True,
+               'fragment': 'i'}
+       )
+ at invalid(name='ca:a$b')
+ at invalid(name='ca:a/b')
+ at invalid(name=r'ca:a\b')
+ at invalid(name='ca:a%b')
+ at invalid(name='ca:a?b')
+ at invalid(name='ca://XXX:sum')
+ at invalid(name='ca://')
+# ==============================================================================
+# Tests for epics attribute  name validation (when passing fragment / cfgkey)
+# ==============================================================================
+ at valid(name='ca:1#')
+ at valid(name='ca:1#units', groups={'fragment': 'units'})
+ at valid(name='ca:a')
+ at names(name='ca:XXX:sum', out=('ca:XXX:sum', 'XXX:sum', 'XXX:sum'))
+ at unittest.skipIf(sys.modules.has_key('epics') is False,
+                 "epics module is not available")
+class EpicsAttrValidatorTestCase(AbstractNameValidatorTestCase,
+                                 unittest.TestCase):
+    validator = EpicsAttributeNameValidator
diff --git a/lib/taurus/core/evaluation/__init__.py b/lib/taurus/core/evaluation/__init__.py
index bb2ee60..7f9dffa 100644
--- a/lib/taurus/core/evaluation/__init__.py
+++ b/lib/taurus/core/evaluation/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,127 +29,104 @@
 Evaluation extension for taurus core model.
 
 The evaluation extension is a special extension that provides evaluation
-objects. The official scheme name is 'eval', but 'evaluation' can be used as a synonym.
+objects. The official scheme name is 'eval'.
 
 The main usage for this extension is to provide a way of performing mathematical
 evaluations with data from other sources.
 
-The Evaluation Factory (:class:`EvaluationFactory`) uses the following object naming for referring to attributes (:class:`EvaluationAttribute`):
-
-    `eval://[db=<databasename>][dev=<devicename>;]<math_expression>[?<symbols>][#<fragment>]`
-    
-    or the following for referring to evaluation devices (:class:`EvaluationDevice`):
-    
-    `eval://[db=<databasename>]dev=<devicename>[?<symbols>]`
-    
-    or the following for referring to an evaluation database (:class:`EvaluationDatabase`):
-    
-    `eval://db=<databasename>`
-    
-    or, finally, the following for referring to an attribute configuration (:class:`EvaluationConfiguration`) item:
-    
-    `eval://[db=<databasename>][dev=<devicename>;]<math_expression>[?<symbols>]?configuration=<configkey>` 
-  
-    where:
-    
-    - The `db=<databasename>;` segment is optional (except when referring to an
-      EvaluationDatabase). If not given it defaults to `db=_DefaultEvalDB;`.
-    
-    - The `dev=<devicename>;` is optional (except when referring to an
-      EvaluationDevice). If not given, it defaults to `dev=_DefaultEvaluator;`.
-      
-    - `<math_expression>` is a mathematical expression (using python syntax)
+The Evaluation Factory (:class:`EvaluationFactory`) uses the following object
+naming for referring to attributes (:class:`EvaluationAttribute`):
+
+    `eval:[//<authority>][@<evaluator>/][<subst>;]<expr>`
+
+or the following for referring to evaluation devices
+(:class:`EvaluationDevice`):
+
+    `eval:[//<authority>]@<evaluator>`
+
+or the following for referring to an evaluation authority
+(:class:`EvaluationAuthority`):
+
+    `eval://<authority>`
+
+where:
+
+    - The `<authority>` segment is optional (except when referring to an
+      EvaluationDatabase). At this point, only `//localhost` is supported.
+
+    - The `@<evaluator>` is optional (except when referring to an
+      EvaluationDevice). If not given, it defaults to `DefaultEvaluator`.
+
+    - `<expr>` is a mathematical expression (using python syntax)
       that may have references to other taurus **attributes** by enclosing them
       between `{` and `}`. Expressions will be evaluated by the evaluator device
-      to which the attribute is assigned. 
-      
-    - The evaluator device inherits from :class:`SafeEvaluator` which by default 
+      to which the attribute is assigned.
+
+    - The evaluator device inherits from :class:`SafeEvaluator` which by default
       includes a large subset of mathematical functions from the :mod:`numpy`
-      module. 
-      
-    - `<devicename>` is a unique identification name for the evaluator device.
-      This allows to use different evaluator objects which may have different
-      symbols available for evaluation. As an alternative approach, it is also
-      possible to use custom-made evaluator devices as long as they inherit from
-      :class:`EvaluationDevice`. To use a custom-made evaluator, you should
-      construct the `<devicename>` as `<modulename>.<classname>` where:
-      
-          - `<modulename>` is a python module name and 
-    
-          - `<classname>` is the name of a class in `<modulename>` that derives 
+      module.
+
+    - `<evaluator>` is a unique identification name for the evaluator device
+      object. This allows to use different evaluator objects which may have
+      different symbols available for evaluation. As an alternative approach, it
+      is also possible to use custom-made evaluator devices as long as they
+      inherit from :class:`EvaluationDevice`. To use a custom-made evaluator,
+      you should construct the `<evaluator>` as `<modulename>.<classname>`
+      where:
+
+          - `<modulename>` is a python module name and
+
+          - `<classname>` is the name of a class in `<modulename>` that derives
             from :class:`EvaluationDevice`
-      
+
       See :file:`<taurus>/core/evaluation/dev_example.py` for an example of a
       custom Evaluator
-        
-    - The optional `?<symbols>` segment is used to provide substitution symbols. 
-      `<symbols>` is a semicolon-separated string of `<key>=<value>` strings.
-      Before evaluation, the `<math_expression>` string will be searched for
-      occurrences of `<key>` which will be replaced by the corresponding
-      `<value>` string. If the `?<symbols>` segment is provided in an attribute
-      name, the symbols affect only this attribute. If they are defined in a
-      device name, they will be available to all attributes of that device. If
-      the same `<key>` is defined both in an attribute and its device, the
-      `value` defined in the attribute is used.
-      
-    - The optional `#<fragment>` segment is not (strictly speaking) part of the
-      attribute name and is not processed by the Factory. It can be used to
-      inform *the client* (e.g. a Taurus widget that uses this attribute as
-      its model) that you are interested only in a given fragment (slice) of
-      the value of the attribute. Note that if the client does not support this
-      convention, this will be silently ignored. The syntax is that of python
-      slices (e.g. `[1:-3]`) and will depend on the dimensionality and type of
-      the attribute value
-      
-    - `<configkey>` is a configuration item key (e.g., `label, `unit`,...) used
-      to identify a given item from the `:class:EvaluationConfiguration` object
-      
-      
+
+    - The optional `<subst>` segment is used to provide substitution symbols.
+      `<subst>` is a semicolon-separated string of `<key>=<value>` strings.
+
 
 Some examples of valid evaluation models are:
 
     - An attribute that multiplies a tango attribute by 2:
-        
-        `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 scheme in taurus)
-      
-        `eval://{a/b/c/d}+{f/g/h/i}`
-    
+
+        `eval:2*{tango:a/b/c/d}`
+
+    - Same as above, but using substitutions:
+
+        `eval:k=2;a={tango:a/b/c/d};k*a`
+
+    - An attribute that adds two tango attributes together (assuming that tango
+      is set as the default scheme)
+
+        `eval:{a/b/c/d}+{f/g/h/i}`
+
     - An attribute that generates an array of random values:
-    
-        `eval://rand(256)`
-        
+
+        `eval:rand(256)`
+
     - An attribute that adds noise to a tango image attribute:
-    
-        `eval://{sys/tg_test/1/short_image_ro}+10*rand(*shape({sys/tg_test/1/short_image_ro}))`
-        
-    - An attribute that uses resources to calculate the voltage from the Intensity and the Resistance:
-    
-        `eval://{res://I}*{res://R}`
-        
-    - An evaluator device named `foo`:
-    
-        `eval://dev=foo`
-        
-    - An evaluator device named `foo` to which 2 custom symbols are assigned 
-      (which can be used by any attribute of this device):
-    
-        `eval://dev=foo?bar={tango://a/b/c/d};blah=23`
-          
-    - An attribute that multiplies `blah` times `bar` (assuming that both `blah`
-      and `bar` are known to device `foo`):
-        
-        `eval://dev=foo;blah*bar`
-        
-    - Same as the previous 2 examples together, but all in one line (the only
-      difference is that the symbols defined in this example affect only to this
-      attribute, whereas in the example above the symbols were permanently stored
-      by the device and thus could be used for other attributes as well):
-    
-        `eval://dev=foo;blah*bar?bar={tango://a/b/c/d};blah=23`
 
+        `eval:img={tango:sys/tg_test/1/short_image_ro};img+10*rand(*img.shape)`
+
+    - A default evaluator device named `foo`:
+
+        `eval:@foo`
+
+    - A custom evaluator device (implemented as class `MyEval` in the `mymod`
+      module):
+
+        `eval:@mymod.MyClass`
+
+
+.. note:: Previous to SEP3, a RFC3986 non-compliant syntax was used for the
+          evaluation scheme (e.g., allowing names such as
+          ``tango://db=foo;dev=bar;a*b?k=2;a={tango:a/b/c/d}``).
+          This syntax is now deprecated and should not be used. Taurus will
+          issue warnings if detected.
 """
-#raise NotImplementedError()
-from evalfactory import *
\ No newline at end of file
+
+from evalfactory import EvaluationFactory
+from evalattribute import EvaluationAttribute
+from evalauthority import EvaluationAuthority
+from evaldevice import EvaluationDevice
diff --git a/lib/taurus/core/evaluation/dev_example.py b/lib/taurus/core/evaluation/dev_example.py
index 811cdc7..ee02658 100644
--- a/lib/taurus/core/evaluation/dev_example.py
+++ b/lib/taurus/core/evaluation/dev_example.py
@@ -1,24 +1,24 @@
 #!/usr/bin/env python
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,53 +29,59 @@ Examples on using the evaluation scheme for exposing arbitrary non-tango quantit
 __all__ = ['FreeSpaceDevice']
 
 from taurus.core.evaluation import EvaluationDevice
-import os, platform, ctypes
+import os
+import platform
+import ctypes
+
 
 class FreeSpaceDevice(EvaluationDevice):
-    '''A simple example of usage of the evaluation scheme for 
+    '''A simple example of usage of the evaluation scheme for
     creating a device that allows to obtain available space in a dir.
-    
+
     Important: note that only those members listed in `_symbols` will be available
     '''
     _symbols = ['getFreeSpace']
-        
+
     def getFreeSpace(self, dir):
-        """ return free space (in bytes). 
+        """ return free space (in bytes).
         (Recipe adapted from `http://stackoverflow.com/questions/51658`)
         """
         if platform.system() == 'Windows':
             free_bytes = ctypes.c_ulonglong(0)
-            ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(dir), None, None, ctypes.pointer(free_bytes))
+            ctypes.windll.kernel32.GetDiskFreeSpaceExW(
+                ctypes.c_wchar_p(dir), None, None, ctypes.pointer(free_bytes))
             return free_bytes.value
         else:
-            s =  os.statvfs(dir)
+            s = os.statvfs(dir)
             return s.f_bsize * s.f_bavail
-        
 
-#===============================================================================
+
+#=========================================================================
 # Just for testing
-#===============================================================================
+#=========================================================================
 
 def test1():
     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
-    
+    # calculates free space in Mb
+    a = taurus.Attribute(
+        'eval:@taurus.core.evaluation.dev_example.FreeSpaceDevice/getFreeSpace("/")/1024/1024')
+    print "Free space: %iMb" % a.read().value
+
+
 def test2():
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.qt.qtgui.display import TaurusLabel
     app = TaurusApplication()
-    
+
     w = TaurusLabel()
-    attrname='eval://dev=taurus.core.evaluation.dev_example.FreeSpaceDevice;getFreeSpace("/")' #calculates free space in Mb
-    
+    # calculates free space in Mb
+    attrname = 'eval:@taurus.core.evaluation.dev_example.FreeSpaceDevice/getFreeSpace("/")'
+
     w.setModel(attrname)
 
     w.show()
     sys.exit(app.exec_())
-    
+
 if __name__ == "__main__":
     test2()
-    
-            
\ No newline at end of file
diff --git a/lib/taurus/core/evaluation/evalattribute.py b/lib/taurus/core/evaluation/evalattribute.py
new file mode 100644
index 0000000..2b06c08
--- /dev/null
+++ b/lib/taurus/core/evaluation/evalattribute.py
@@ -0,0 +1,459 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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__ = ['EvaluationAttribute']
+
+import numpy
+import re
+import weakref
+
+from taurus.external.pint import Quantity
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusbasetypes import SubscriptionState, TaurusEventType, \
+    TaurusAttrValue, TaurusTimeVal, AttrQuality, DataType
+from taurus.core.taurusexception import TaurusException
+from taurus.core.taurushelper import Attribute, Manager
+from taurus.core import DataFormat
+from taurus.core.util.log import debug, taurus4_deprecation
+
+from taurus.core.evaluation.evalvalidator import QUOTED_TEXT_RE, PY_VAR_RE
+
+
+class EvaluationAttrValue(TaurusAttrValue):
+    """Reimplementation of TaurusAttrValue to provide bck-compat via a ref
+
+    """
+    # TODO: remove this class once the standard widgets are adapted to TEP14
+
+    def __init__(self, attr=None, config=None):
+        # config parameter is kept for backwards compatibility only
+        TaurusAttrValue.__init__(self)
+        if config is not None:
+            from taurus.core.util.log import deprecated
+            deprecated(dep='"config" kwarg', alt='"attr"', rel='4.0')
+            attr = config
+        if attr is None:
+            self._attrRef = None
+        else:
+            self._attrRef = weakref.proxy(attr)
+        self.config = self._attrRef
+
+    def __getattr__(self, name):
+        try:
+            ret = getattr(self._attrRef, name)
+        except AttributeError:
+            raise AttributeError('%s has no attribute %s'
+                                 % (self.__class__.__name__, name))
+        # return the attr but only after warning
+        from taurus.core.util.log import deprecated
+        deprecated(dep='EvaluationAttrValue.%s' % name,
+                   alt='EvaluationAttribute.%s' % name, rel='4.0')
+        return ret
+
+    # --------------------------------------------------------
+    # This is for backwards compat with the API of taurus < 4
+    #
+    @taurus4_deprecation(alt='.rvalue')
+    def _get_value(self):
+        '''for backwards compat with taurus < 4'''
+        debug(repr(self))
+        try:
+            return self.__fix_int(self.rvalue.magnitude)
+        except AttributeError:
+            return self.rvalue
+
+    @taurus4_deprecation(alt='.rvalue')
+    def _set_value(self, value):
+        '''for backwards compat with taurus < 4'''
+        debug('Setting %r to %s' % (value, self.name))
+
+        if self.rvalue is None:  # we do not have a previous rvalue
+            import numpy
+            dtype = numpy.array(value).dtype
+            if numpy.issubdtype(dtype, int) or numpy.issubdtype(dtype, float):
+                msg = 'Refusing to set ambiguous value (deprecated .value API)'
+                raise ValueError(msg)
+            else:
+                self.rvalue = value
+        elif hasattr(self.rvalue, 'units'):  # we do have it and is a Quantity
+            self.rvalue = Quantity(value, units=self.rvalue.units)
+        else:  # we do have a previous value and is not a quantity
+            self.rvalue = value
+
+    value = property(_get_value, _set_value)
+
+    @taurus4_deprecation(alt='.wvalue')
+    def _get_w_value(self):
+        '''for backwards compat with taurus < 4'''
+        debug(repr(self))
+        try:
+            return self.__fix_int(self.wvalue.magnitude)
+        except AttributeError:
+            return self.wvalue
+
+    @taurus4_deprecation(alt='.wvalue')
+    def _set_w_value(self, value):
+        '''for backwards compat with taurus < 4'''
+        debug('Setting %r to %s' % (value, self.name))
+
+        if self.wvalue is None:  # we do not have a previous wvalue
+            import numpy
+            dtype = numpy.array(value).dtype
+            if numpy.issubdtype(dtype, int) or numpy.issubdtype(dtype, float):
+                msg = 'Refusing to set ambiguous value (deprecated .value API)'
+                raise ValueError(msg)
+            else:
+                self.wvalue = value
+        elif hasattr(self.wvalue, 'units'):  # we do have it and is a Quantity
+            self.wvalue = Quantity(value, units=self.wvalue.units)
+        else:  # we do have a previous value and is not a quantity
+            self.wvalue = value
+
+    w_value = property(_get_w_value, _set_w_value)
+
+    @property
+    @taurus4_deprecation(alt='.error')
+    def has_failed(self):
+        return self.error
+
+    def __fix_int(self, value):
+        '''cast value to int if  it is an integer.
+        Works on scalar and non-scalar values'''
+        if self.type != DataType.Integer:
+            return value
+        try:
+            return int(value)
+        except TypeError:
+            import numpy
+            return numpy.array(value, dtype='int')
+
+
+class EvaluationAttribute(TaurusAttribute):
+    """A :class:`TaurusAttribute` that can be used to perform mathematical
+    operations involving other arbitrary Taurus attributes. The mathematical
+    operation is described in the attribute name itself. An Evaluation Attribute
+    will keep references to any other attributes being referenced and it will
+    update its own value whenever any of the referenced attributes change.
+
+    .. seealso:: :mod:`taurus.core.evaluation`
+
+    .. warning:: In most cases this class should not be instantiated directly.
+                 Instead it should be done via the
+                 :meth:`EvaluationFactory.getAttribute`
+    """
+    # helper class property that stores a reference to the corresponding
+    # factory
+    _factory = None
+    _scheme = 'eval'
+
+    def __init__(self, name, parent, **kwargs):
+        self.call__init__(TaurusAttribute, name, parent, **kwargs)
+        self._value = EvaluationAttrValue(attr=self)
+
+        # Evaluation Attributes are always read-only (at least for now)
+        self._label = self.getSimpleName()
+        self.writable = False
+        self._references = []
+        self._validator = self.getNameValidator()
+        self._transformation = None
+        self.__subscription_state = SubscriptionState.Unsubscribed
+
+        # This should never be None because the init already ran the validator
+        trstring = self._validator.getExpandedExpr(str(name))
+
+        trstring, ok = self.preProcessTransformation(trstring)
+
+        if ok:
+            self._transformation = trstring
+            self.applyTransformation()
+
+    @staticmethod
+    def getId(obj, idFormat=r'_V%i_'):
+        '''returns an id string for the given object which has the following
+           two properties:
+            - It is unique for this object during all its life
+            - It is a string that can be used as a variable or method name
+
+        :param obj: (object) the python object whose id is requested
+        :param idFormat: (str) a format string containing a "`%i`" which,
+                         when expanded must be a valid variable name
+                         (i.e. it must match
+                         `[a-zA-Z_][a-zA-Z0-9_]*`). The default is `_V%i_`
+        '''
+        return idFormat % id(obj)
+
+    def preProcessTransformation(self, trstring):
+        """
+        parses the transformation string and creates the necessary symbols for
+        the evaluator. It also connects any referenced attributes so that the
+        transformation gets re-evaluated if they change.
+
+        :param trstring: (str) a string to be pre-processed
+
+        :return: (tuple<str,bool>) a tuple containing the processed string
+                 and a boolean indicating if the preprocessing was successful.
+                 if ok==True, the string is ready to be evaluated
+        """
+        # disconnect previously referenced attributes and clean the list
+        for ref in self._references:
+            ref.removeListener(self)
+        self._references = []
+
+        # get symbols
+        evaluator = self.getParentObj()
+
+        # Find references in the string, create references if needed,
+        # connect to them and substitute the references by their id
+        v = self._validator
+        refs = v.getRefs(trstring, ign_quoted=True)
+        for r in refs:
+            symbol = self.__ref2Id(r)
+            trstring = v.replaceUnquotedRef(trstring, '{%s}' % r, symbol)
+
+        # validate the expression (look for missing symbols)
+        safesymbols = evaluator.getSafe().keys()
+        # remove literal text strings from the validation
+        trimmedstring = re.sub(QUOTED_TEXT_RE, '', trstring)
+        for s in set(re.findall(PY_VAR_RE, trimmedstring)):
+            if s not in safesymbols:
+                self.warning('Missing symbol "%s"' % s)
+                return trstring, False
+
+        # If all went ok, enable/disable polling based on whether
+        # there are references or not
+        # TODO: Should we activate polling only if explicit in the expression?
+        wantpolling = not self.isUsingEvents()
+        haspolling = self.isPollingEnabled()
+        if wantpolling:
+            self._activatePolling()
+        elif haspolling and not wantpolling:
+            self.disablePolling()
+
+        return trstring, True
+
+    def __ref2Id(self, ref):
+        """
+        Returns the id of an
+        existing taurus attribute corresponding to the match.
+        The attribute is created if it didn't previously exist.
+
+        :param ref: (str)  string corresponding to a reference. e.g. eval:1
+        """
+        refobj = self.__createReference(ref)
+        return self.getId(refobj)
+
+    def __createReference(self, ref):
+        '''
+        Receives a taurus attribute name and creates/retrieves a reference to
+        the attribute object. If the object was not already referenced, it adds
+        it to the reference list and adds its id and current value to the
+        symbols dictionary of the evaluator.
+
+        :param ref: (str)
+
+        :return: (TaurusAttribute)
+
+        '''
+        refobj = Attribute(ref)
+        if refobj not in self._references:
+            evaluator = self.getParentObj()
+            v = refobj.read().rvalue
+            # add its rvalue to the evaluator symbols
+            evaluator.addSafe({self.getId(refobj): v})
+            # add the object to the reference list
+            self._references.append(refobj)
+        return refobj
+
+    def eventReceived(self, evt_src, evt_type, evt_value):
+        try:
+            v = evt_value.rvalue
+        except AttributeError:
+            self.trace('Ignoring event from %s' % repr(evt_src))
+            return
+        # update the corresponding value
+        evaluator = self.getParentObj()
+        evaluator.addSafe({self.getId(evt_src): v})
+        # re-evaluate
+        self.applyTransformation()
+        # notify listeners that the value changed
+        if self.isUsingEvents():
+            self.fireEvent(evt_type, self._value)
+
+    def applyTransformation(self):
+        if self._transformation is None:
+            return
+        try:
+            evaluator = self.getParentObj()
+            rvalue = evaluator.eval(self._transformation)
+            value_dimension = len(numpy.shape(rvalue))
+            value_dformat = DataFormat(value_dimension)
+            self.data_format = value_dformat
+            self.type = self._encodeType(rvalue, value_dformat)
+            if self.type is None:
+                raise TypeError("Unsupported returned type, %r" % rvalue)
+            if self.type in [DataType.Integer, DataType.Float] and\
+                    not isinstance(rvalue, Quantity):
+                self.debug("Transformation converted to Quantity")
+                rvalue = Quantity(rvalue)
+            elif self.type == DataType.Boolean and value_dimension > 1:
+                self.debug("Transformation converted to numpy.array")
+                rvalue = numpy.array(rvalue)
+            self._value.rvalue = rvalue
+            self._value.time = TaurusTimeVal.now()
+            self._value.quality = AttrQuality.ATTR_VALID
+        except Exception, e:
+            self._value.quality = AttrQuality.ATTR_INVALID
+            msg = " the function '%s' could not be evaluated. Reason: %s" \
+                % (self._transformation, repr(e))
+            self.warning(msg)
+
+    def _encodeType(self, value, dformat):
+        ''' Encode the value type into Taurus data type. In case of non-zero
+        dimension attributes e.g. 1D, 2D the type corresponds to the type of the
+        first element.
+
+        :param value: (obj)
+        :param dformat: (taurus.DataFormat)
+
+        :return: (taurus.DataType)
+        '''
+        # TODO: Should we fall back to DataType.Object instead of None?
+        try:  # handle Quantities
+            value = value.magnitude
+        except AttributeError:
+            pass
+        try:  # handle numpy arrays
+            value = value.item(0)
+        except ValueError:  # for numpy arrays of shape=()
+            value = value.item()
+        except AttributeError:  # for bool, bytes, str, seq<str>...
+            if dformat is DataFormat._1D:
+                value = value[0]
+            elif dformat is DataFormat._2D:
+                value = value[0][0]
+        dataType = type(value)
+        return DataType.from_python_type(dataType)
+
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # Necessary to overwrite from TaurusAttribute
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    def isNumeric(self):
+        return self.type in [DataType.Integer, DataType.Float]
+
+    def isBoolean(self):
+        return isinstance(self._value.rvalue, bool)
+
+    def isState(self):
+        return False
+
+    def getDisplayValue(self, cache=True):
+        return str(self.read(cache=cache).rvalue)
+
+    def encode(self, value):
+        return value
+
+    def decode(self, attr_value):
+        return attr_value
+
+    def write(self, value, with_read=True):
+        raise TaurusException('Evaluation attributes are read-only')
+
+    def read(self, cache=True):
+        '''returns the value of the attribute.
+
+        :param cache: (bool) If True (default), the last calculated value will
+                      be returned. If False, the referenced values will be re-
+                      read and the transformation string will be re-evaluated
+
+        :return: attribute value
+        '''
+        if not cache:
+            symbols = {}
+            for ref in self._references:
+                symbols[self.getId(ref)] = ref.read(cache=False).rvalue
+            evaluator = self.getParentObj()
+            evaluator.addSafe(symbols)
+            self.applyTransformation()
+        return self._value
+
+    def poll(self):
+        v = self.read(cache=False)
+        self.fireEvent(TaurusEventType.Periodic, v)
+
+    def _subscribeEvents(self):
+        pass
+
+    def _unsubscribeEvents(self):
+        pass
+
+    def isUsingEvents(self):
+        # if this attributes depends from others, then we consider it uses
+        # events
+        return bool(len(self._references))
+
+#------------------------------------------------------------------------------
+    def __fireRegisterEvent(self, listener):
+        # fire a first change event
+        try:
+            v = self.read()
+            self.fireEvent(TaurusEventType.Change, v, listener)
+        except:
+            self.fireEvent(TaurusEventType.Error, None, listener)
+
+    def addListener(self, listener):
+        """ Add a TaurusListener object in the listeners list.
+            If it is the first listener, it triggers the subscription to
+            the referenced attributes.
+            If the listener is already registered nothing happens."""
+        initial_subscription_state = self.__subscription_state
+
+        ret = TaurusAttribute.addListener(self, listener)
+
+        if not ret:
+            return ret
+
+        if self.__subscription_state == SubscriptionState.Unsubscribed:
+            for refobj in self._references:
+                # subscribe to the referenced attributes
+                refobj.addListener(self)
+            self.__subscription_state = SubscriptionState.Subscribed
+
+        assert len(self._listeners) >= 1
+        # if initial_subscription_state == SubscriptionState.Subscribed:
+        if len(self._listeners) > 1 and \
+           (initial_subscription_state == SubscriptionState.Subscribed or
+                self.isPollingActive()):
+            Manager().addJob(self.__fireRegisterEvent, None, (listener,))
+        return ret
+
+    def removeListener(self, listener):
+        """ 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 = TaurusAttribute.removeListener(self, listener)
+
+        if ret and not self.hasListeners():
+            self._deactivatePolling()
+            self.__subscription_state = SubscriptionState.Unsubscribed
+        return ret
diff --git a/lib/taurus/core/evaluation/evalauthority.py b/lib/taurus/core/evaluation/evalauthority.py
new file mode 100644
index 0000000..18146aa
--- /dev/null
+++ b/lib/taurus/core/evaluation/evalauthority.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+'''
+evaluation module. See __init__.py for more detailed documentation
+'''
+__all__ = ['EvaluationAuthority']
+
+
+from taurus.core.taurusauthority import TaurusAuthority
+
+
+class EvaluationAuthority(TaurusAuthority):
+    """Dummy authority class for Evaluation
+    (the authority concept is not yet used in the Evaluation scheme)
+
+    .. warning:: In most cases this class should not be instantiated directly.
+                 Instead it should be done via the
+                 :meth:`EvaluationFactory.getAuthority`
+    """
+    _factory = None
+    _scheme = 'eval'
diff --git a/lib/taurus/core/evaluation/evaldevice.py b/lib/taurus/core/evaluation/evaldevice.py
new file mode 100644
index 0000000..74eac3f
--- /dev/null
+++ b/lib/taurus/core/evaluation/evaldevice.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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__ = ['EvaluationDevice']
+
+from taurus import Factory
+from taurus.core.taurusdevice import TaurusDevice
+from taurus.core.util.safeeval import SafeEvaluator
+from taurus.core.taurusbasetypes import TaurusDevState, TaurusAttrValue
+
+
+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
+    mathematical evaluation.
+
+    .. seealso:: :mod:`taurus.core.evaluation`
+
+    .. warning:: In most cases this class should not be instantiated directly.
+                 Instead it should be done via the
+                 :meth:`EvaluationFactory.getDevice`
+    """
+    _symbols = []
+    # helper class property that stores a reference to the corresponding
+    # factory
+    _factory = None
+    _scheme = 'eval'
+
+    def __init__(self, name, **kw):
+        """Object initialization."""
+        self.call__init__(TaurusDevice, name, **kw)
+        safedict = {}
+        for s in self._symbols:
+            if hasattr(self, s):
+                safedict[s] = getattr(self, s)
+        SafeEvaluator.__init__(self, safedict=safedict)
+
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # TaurusDevice necessary overwrite
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    def _createHWObject(self):
+        return 'Evaluation'
+
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    def getAttribute(self, attrname):
+        """Returns the attribute object given its name"""
+        full_attrname = "%s;%s" % (self.getFullName(), attrname)
+        return self.factory().getAttribute(full_attrname)
+
+    def decode(self, event_value):
+        # TODO: Is this method ever called? (or maybe just garbage from 3.x?)
+        if isinstance(event_value, int):  # TaurusSWDevState
+            new_sw_state = event_value
+        else:
+            self.info("Unexpected value to decode: %s" % str(event_value))
+            new_sw_state = TaurusDevState.NotReady
+        value = TaurusAttrValue()
+        value.rvalue = new_sw_state
+        return value
diff --git a/lib/taurus/core/evaluation/evalfactory.py b/lib/taurus/core/evaluation/evalfactory.py
old mode 100644
new mode 100755
index 9e4d2dc..686c15b
--- a/lib/taurus/core/evaluation/evalfactory.py
+++ b/lib/taurus/core/evaluation/evalfactory.py
@@ -1,667 +1,59 @@
 #!/usr/bin/env python
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 '''
 evaluation module. See __init__.py for more detailed documentation
 '''
-__all__ = ['EvaluationFactory', 'EvaluationDatabase', 'EvaluationDevice', 
-           'EvaluationAttribute','EvaluationConfiguration', 
-           'EvaluationConfigurationNameValidator', 'EvaluationDeviceNameValidator', 
-           'EvaluationAttributeNameValidator']
-
+__all__ = ['EvaluationFactory']
 
 
-import time, re, weakref
-import numpy
+import weakref
 
-import taurus
+from taurus.core.taurusbasetypes import TaurusElementType
+from evalattribute import EvaluationAttribute
+from evalauthority import EvaluationAuthority
+from evaldevice import EvaluationDevice
 from taurus.core.taurusexception import TaurusException
 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
-    name_pattern = '' #must be implemented in children classes
-    # The following regexp pattern matches <variable>=<value> pairs    
-    kvsymbols_pattern = r'([a-zA-Z_][a-zA-Z0-9_]*)=([^#;]+)'
-
-    def __init__(self):
-        """ Initialization. Nothing to be done here for now."""
-        pass
-    
-    def init(self, *args, **kwargs):
-        """Singleton instance initialization."""
-        self.name_re = re.compile(self.name_pattern)
-        self.kvsymbols_re = re.compile(self.kvsymbols_pattern)
-        
-    def isValid(self,s, matchLevel = MatchLevel.ANY):
-        return self.name_re.match(s) is not None
-        
-    def getParams(self, s):
-        m = self.attrname_re.match(s)
-        if m is None:
-            return None
-        return m.groupdict()
-
-    def getNames(self, s, factory=None):
-        """Returns the full, normal and simple names for this object, or None if there is no match'''
-        """
-        raise RuntimeError('Not Allowed to call this method from subclasses')
-    
-    def getDeviceName(self, s, full=True):
-        '''
-        returns the device name for the given attribute name. 
-        If full=True, the returned name includes the DB name
-        '''
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        devname = m.group('devname') or EvaluationFactory.DEFAULT_DEVICE
-        if full:
-            return '%s;dev=%s'%(self.getDBName(s),devname)
-        else:
-            return 'eval://dev=%s'%devname
-    
-    def getDBName(self,s):
-        '''returns the full data base name for the given attribute name'''
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        dbname = m.group('dbname') or EvaluationFactory.DEFAULT_DATABASE
-        return "eval://db=%s"%dbname
-    
-
-class EvaluationAttributeNameValidator(AbstractEvaluationNameValidator):
-    # The groups in a match object using the regexp below are:
-    #    1: scheme; named as 'scheme'
-    #    2: 
-    #    3: database name; optional; named as 'dbname'
-    #    4: 
-    #    5: device name; optional; named as 'devname'
-    #    6: attribute name (transformation string); named as 'attrname'
-    #    7:
-    #    8: substitution symbols (semicolon separated key=val pairs) ; optional; named as 'subst'
-    #    9:
-    #    A: fragment; optional; named as 'fragment'
-    #
-    #    Reconstructing the names
-    #    attrname= $4
-    #    devname= $3 or EvaluationFactory.DEFAULT_DEVICE
-    #    fullname= "eval://dev=%s;%s%s%s"%(devname,attrname,$5,$7)
-    #   
-    #                 1                             2   3                     4    5                      6                    7                    8                  9 A                                                        
-    name_pattern = r'^(?P<scheme>eval|evaluation)://(db=(?P<dbname>[^?#;]+);)?(dev=(?P<devname>[^?#;]+);)?(?P<attrname>[^?#;]+)(\?(?!configuration=)(?P<subst>[^#?]*))?(#(?P<fragment>.*))?$'
-        
-    def isValid(self,s, matchLevel = MatchLevel.ANY):
-        m = self.name_re.match(s)
-        if m is None: 
-            return False
-        elif matchLevel == MatchLevel.COMPLETE:
-            return m.group('devname') is not None and m.group('dbname') is not None
-        else:
-            return True
-
-    def getNames(self, s, factory=None):
-        """Returns the complete, normal and short names.
-        
-        For example::
-        
-            >>> EvaluationAttributeNameValidator.getNames("eval://dev=foo;bar*blah?bar=123;blah={a/b/c/d}#[1:-3]")
-            >>> ("eval://db=_DefaultEvalDB;dev=foo;123*{a/b/c/d}", "eval://dev=foo;bar*blah", "bar*blah")
-        
-        """
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        #The following comments are for an example name like: "eval://dev=foo;bar*blah?bar=123;blah={a/b/c/d}#[1:-3]"
-        attr_name = m.group('attrname') # attr_name = "bar*blah"
-        normal_name = "%s;%s"%(self.getDeviceName(s, full=False),attr_name) #normal_name = "eval://dev=foo;bar*blah"
-        expanded_attr_name = self.getExpandedTransformation(s)
-        fullname = "%s;%s"%(self.getDeviceName(s, full=True),expanded_attr_name) #fullname = "eval://db=_DefaultEvalDB;dev=foo;123*{a/b/c/d}"
-        return fullname, normal_name, attr_name
-    
-    def getExpandedTransformation(self, s):
-        'expands the attribute name by substituting all symbols'
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        transf = m.group('attrname')
-        subst = m.group('subst') or ''
-        for k,v in self.kvsymbols_re.findall(subst):
-            transf = re.sub(k,v, transf)
-        return transf
-        
-
-class EvaluationDeviceNameValidator(AbstractEvaluationNameValidator):
-    '''A validator of names for :class:`EvaluationDevice`'''
-    # The groups in a match object using the regexp below are:
-    #    1: scheme; named as 'scheme'
-    #    2: 
-    #    3: database name; optional; named as 'dbname'
-    #    4: 
-    #    5: devicename; named as 'devname'
-    #    6:
-    #    7: substitution symbols (semicolon separated key=val pairs) ; optional; named as 'subst'
-    #
-    #                 1                             2   3                     4    5                    6                    7                                     
-    name_pattern = r'^(?P<scheme>eval|evaluation)://(db=(?P<dbname>[^?#;]+);)?(dev=(?P<devname>[^?#;]+))(\?(?!configuration=)(?P<subst>[^#?]*))?$'
-    
-    def getNames(self, s, factory=None):
-        """Returns the complete, normal and short names. (note: complete=normal)
-        
-        :param s: (str) input string describing the device
-        :param factory: (TaurusFactory) [Unused]
-        
-        :return: (tuple<str,str,str> or None) A tuple of complete, normal and
-                 short names, or None if s is an invalid device name
-        """
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        #The following comments are for a name of the type: eval://dev=foo?bar=123;blah={a/b/c/d} 
-        devname = m.group('devname')  # foo
-        normal_name = self.getDeviceName(s, full=False) #eval://dev=foo
-        full_name = self.getDeviceName(s, full=True) #eval://db=_DefaultEvalDB;dev=foo
-        return full_name, normal_name, devname
-
-
-class EvaluationConfigurationNameValidator(AbstractEvaluationNameValidator):
-    '''A validator of names for :class:`EvaluationConfiguration`'''
-    # The groups in a match object using the regexp below are:
-    #    1: scheme; named as 'scheme'
-    #    2: 
-    #    3: database name; optional; named as 'dbname'
-    #    4: 
-    #    5: device name; optional; named as 'devname'
-    #    6: transformationstring; named as 'attrname'
-    #    7:
-    #    8: substitution symbols (semicolon separated key=val pairs) ; optional; named as 'subst'
-    #    9:
-    #    A: configuration key; named as 'cfgkey'
-    #
-    #    Reconstructing the names
-    #                 1                             2   3                     4    5                      6                    7                    8                  9                 A                    
-    name_pattern = r'^(?P<scheme>eval|evaluation)://(db=(?P<dbname>[^?#;]+);)?(dev=(?P<devname>[^?#;]+);)?(?P<attrname>[^?#;]+)(\?(?!configuration=)(?P<subst>[^#?]*))?(\?configuration=?(?P<cfgkey>[^#?]*))$'
-        
-    def isValid(self,s, matchLevel = MatchLevel.ANY):
-        m = self.name_re.match(s)
-        if m is None: 
-            return False
-        elif matchLevel == MatchLevel.COMPLETE:
-            return m.group('devname') is not None and m.group('dbname') is not None
-        else:
-            return True
-
-    def getNames(self, s, factory=None):
-        """Returns the complete, normal and short names"""
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        #The following comments are for an example name like: "eval://dev=foo;bar*blah?bar=123;blah={a/b/c/d}?configuration=label"
-        cfg_key = m.group('cfgkey') # cfg_key = "label"
-        attr_name = m.group('attrname')
-        normal_name = "%s;%s?configuration"%(self.getDeviceName(s, full=False),attr_name) #normal_name = "eval://dev=foo;bar*blah?configuration"
-        expanded_attr_name = self.getExpandedTransformation(s)
-        fullname = "%s;%s?configuration"%(self.getDeviceName(s, full=True),expanded_attr_name) #fullname = "eval://db=_DefaultEvalDB;dev=foo;123*{a/b/c/d}?configuration"
-        return fullname, normal_name, cfg_key
-    
-    def getAttrName(self, s):
-        names = self.getNames(s)
-        if names is None: return None
-        return names[0][:-len('?configuration')] #remove the "?configuration" substring from the fullname
-        
-    def getExpandedTransformation(self, s):
-        'expands the attribute name by substituting all symbols'
-        m = self.name_re.match(s)
-        if m is None:
-            return None
-        transf = m.group('attrname')
-        subst = m.group('subst') or ''
-        for k,v in self.kvsymbols_re.findall(subst):
-            transf = re.sub(k,v, transf)
-        return transf
-
-class EvaluationDatabase(TaurusDatabase):
-    '''
-    Dummy database class for Evaluation (the Database concept is not used in the Evaluation scheme)
-    
-    .. warning:: In most cases this class should not be instantiated directly.
-                 Instead it should be done via the :meth:`EvaluationFactory.getDataBase`
-    '''
-    def factory(self):
-        return EvaluationFactory()
-        
-    def __getattr__(self, name):
-        return "EvaluationDatabase object calling %s" % name
-
-
-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
-    mathematical evaluation.
-    
-    .. seealso:: :mod:`taurus.core.evaluation`
-    
-    .. warning:: In most cases this class should not be instantiated directly.
-                 Instead it should be done via the :meth:`EvaluationFactory.getDevice`
-    '''
-    _symbols = []
-    
-    def __init__(self, name, **kw):
-        """Object initialization."""
-        self.call__init__(TaurusDevice, name, **kw)
-        safedict = {}
-        for s in self._symbols:
-            if hasattr(self,s):
-                safedict[s] = getattr(self,s)
-        SafeEvaluator.__init__(self, safedict=safedict)        
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusModel necessary overwrite
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # helper class property that stores a reference to the corresponding factory
-    _factory = None
-    
-    @classmethod
-    def factory(cls):
-        if cls._factory is None:
-            cls._factory = taurus.Factory(scheme='eval')
-        return cls._factory
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusDevice necessary overwrite
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    def _createHWObject(self):
-        return 'Evaluation'
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    def getAttribute(self, attrname):
-        """Returns the attribute object given its name"""
-        full_attrname = "%s;%s"%(self.getFullName(), attrname)
-        return self.factory().getAttribute(full_attrname)
-    
-    @classmethod
-    def getNameValidator(cls):
-        return EvaluationDeviceNameValidator()
-    
-    def decode(self, event_value):
-        if isinstance(event_value, int): # TaurusSWDevState
-            new_sw_state = event_value
-        else:
-            self.info("Unexpected value to decode: %s" % str(event_value))
-            new_sw_state = TaurusSWDevState.Crash
-        value = TaurusAttrValue() 
-        value.value = new_sw_state
-        return value
-    
-
-class EvaluationAttribute(TaurusAttribute):
-    '''
-    A :class:`TaurusAttribute` that can be used to perform mathematical
-    operations involving other arbitrary Taurus attributes. The mathematical
-    operation is described in the attribute name itself. An Evaluation Attribute
-    will keep references to any other attributes being referenced and it will
-    update its own value whenever any of the referenced attributes change.
-    
-    .. seealso:: :mod:`taurus.core.evaluation` 
-    
-    .. warning:: In most cases this class should not be instantiated directly.
-                 Instead it should be done via the :meth:`EvaluationFactory.getAttribute`
-    '''
-    pyStr_RegExp = re.compile(r'(?:\"[^\"]+?\")|(?:\'[^\']+?\')') #matches a single or double-quoted string
-    pyVar_RegExp = re.compile("[a-zA-Z_][a-zA-Z0-9_]*") #regexp for a variable/method name (symbol)
-    cref_RegExp = re.compile("\{(.+?)\}") #regexp for references to other taurus models within operation model names
-
-    def __init__(self, name, parent, **kwargs):
-        self.call__init__(TaurusAttribute, name, parent, **kwargs)
-
-        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.configuration.TaurusConfiguration()
-        self.__subscription_state = SubscriptionState.Unsubscribed
-
-        
-        trstring = self._validator.getExpandedTransformation(str(name)) #This should never be None because the init already ran the validator
-        
-        trstring, ok = self.preProcessTransformation(trstring)
-        
-        if ok:
-            self._transformation = trstring
-            self.applyTransformation()
-
-    def __getattr__(self,name):
-        return getattr(self._getRealConfig(), name)
-    
-    def _getRealConfig(self):
-        """ Returns the current configuration of the attribute."""
-        if self.__attr_config is None:
-            cfg_name = "%s?configuration" % self.getFullName()
-            self.__attr_config = EvaluationConfiguration(cfg_name, self)
-        return self.__attr_config
-    
-    @staticmethod
-    def getId(obj, idFormat=r'_V%i_'):
-        '''returns an id string for the given object which has the following two properties:
-        
-            - It is unique for this object during all its life
-            - It is a string that can be used as a variable or method name
-        
-        :param obj: (object) the python object whose id is requested 
-        :param idFormat: (str) a format string containing a "`%i`" which, when expanded
-                         must be a valid variable name (i.e. it must match
-                         `[a-zA-Z_][a-zA-Z0-9_]*`). The default is `_V%i_`
-        '''
-        return idFormat%id(obj)
-        
-    def preProcessTransformation(self, trstring):
-        """
-        parses the transformation string and creates the necessary symbols for
-        the evaluator. It also connects any referenced attributes so that the
-        transformation gets re-evaluated if they change.
-        
-        :param trstring: (str) a string to be pre-processed
-        
-        :return: (tuple<str,bool>) a tuple containing the processed string 
-                 and a boolean indicating if the preprocessing was successful.
-                 if ok==True, the string is ready to be evaluated
-        """
-        #disconnect previously referenced attributes and clean the list
-        for ref in self._references:
-            ref.removeListener(self)
-        self._references = []  
-        
-        #reset symbols
-        evaluator = self.getParentObj()  
-        evaluator.resetSafe()
-        
-        #Find references in the string, create references if needed, 
-        #connect to them and substitute the references by their id
-        trstring = re.sub(self.cref_RegExp, self.__Match2Id, trstring)
-        
-        #validate the expression (look for missing symbols) 
-        safesymbols = evaluator.getSafe().keys()
-        trimmedstring = re.sub(self.pyStr_RegExp, '', trstring) #remove literal text strings from the validation
-        for s in set(re.findall(self.pyVar_RegExp, trimmedstring)):
-            if s not in safesymbols:
-                self.warning('Missing symbol "%s"'%s)
-                return trstring, False
-            
-        #If all went ok, enable/disable polling based on whether there are references or not
-        wantpolling = not self.isUsingEvents()
-        haspolling = self.isPollingEnabled()
-        if wantpolling:
-            self._activatePolling()
-        elif haspolling and not wantpolling:
-            self.disablePolling()
-            
-        
-        return trstring,True
-                    
-    def __Match2Id(self, match):
-        """
-        receives a re.match object for cref_RegExp. Returns the id of an
-        existing taurus attribute corresponding to the match. The attribute is created
-        if it didn't previously exist.
-        """
-        ref = match.groups()[0]
-        refobj = self.__createReference(ref)
-        return self.getId(refobj)
-        
-    def __createReference(self, ref):
-        '''
-        Receives a taurus attribute name and creates/retrieves a reference to
-        the attribute object. If the object was not already referenced, it adds
-        it to the reference list and adds its id and current value to the
-        symbols dictionary of the evaluator.
-        
-        :param ref: (str) 
-        
-        :return: (TaurusAttribute) 
-        
-        '''
-        refobj = taurus.Attribute(ref)
-        if refobj not in self._references:
-            evaluator = self.getParentObj()
-            v = refobj.read().value
-            evaluator.addSafe({self.getId(refobj) : v}) # add its value to the evaluator symbols
-            self._references.append(refobj) #add the object to the reference list            
-        return refobj        
-    
-    def eventReceived(self, evt_src, evt_type, evt_value):
-        try:
-            v = evt_value.value
-        except AttributeError:
-            self.trace('Ignoring event from %s'%repr(evt_src))
-            return
-        #self.trace('received event from %s (%s=%s)'%(evt_src, self.getId(evt_src), v))
-        #update the corresponding value
-        evaluator = self.getParentObj()
-        evaluator.addSafe({self.getId(evt_src) : v})
-        #re-evaluate
-        self.applyTransformation()
-        #notify listeners that the value changed
-
-        if self.isUsingEvents():
-            self.fireEvent(evt_type, self._value)
-        
-    def applyTransformation(self):
-        if self._transformation is None: return
-        try:
-            evaluator = self.getParentObj() 
-            self._value.value = evaluator.eval(self._transformation)
-            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 = AttrQuality.ATTR_INVALID
-            self.warning("the function '%s' could not be evaluated. Reason: %s"%(self._transformation, repr(e)))
-            #self.traceback(taurus.Warning)
-            
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # Necessary to overwrite from TaurusAttribute
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    def isNumeric(self):
-        return True
-        
-    def isBoolean(self):
-        return isinstance(self._value.value, bool)
-    
-    def isState(self):
-        return False
-
-    def getDisplayValue(self,cache=True):
-        return str(self.read(cache=cache).value)
-
-    def encode(self, value):
-        return value
-
-    def decode(self, attr_value):
-        return attr_value
-
-    def write(self, value, with_read=True):
-        raise TaurusException('Evaluation attributes are read-only')
-
-    def read(self, cache=True):
-        '''returns the value of the attribute.
-        
-        :param cache: (bool) If True (default), the last calculated value will
-                      be returned. If False, the referenced values will be re-
-                      read and the transformation string will be re-evaluated
-                      
-        :return: attribute value
-        '''
-        if not cache:
-            symbols = {}
-            for ref in self._references:
-                symbols[self.getId(ref)] = ref.read(cache=False).value
-            evaluator = self.getParentObj()  
-            evaluator.addSafe(symbols)
-            self.applyTransformation()
-        return self._value    
-
-    def poll(self):
-        v = self.read(cache=False)
-        self.fireEvent(TaurusEventType.Periodic, v)
-            
-    def _subscribeEvents(self): 
-        pass
-        
-    def _unsubscribeEvents(self):
-        pass
-
-    def isUsingEvents(self):
-        return bool(len(self._references)) #if this attributes depends from others, then we consider it uses events
-        
-#------------------------------------------------------------------------------ 
-
-    def factory(self):
-        return EvaluationFactory()
-    
-    @classmethod
-    def getNameValidator(cls):
-        return EvaluationAttributeNameValidator()
-
-    def __fireRegisterEvent(self, listener):
-        #fire a first change event
-        try:
-            v = self.read()
-            self.fireEvent(TaurusEventType.Change, v, listener)
-        except:
-            self.fireEvent(TaurusEventType.Error, None, listener)
-    
-    def addListener(self, listener):
-        """ Add a TaurusListener object in the listeners list.
-            If it is the first listener, it triggers the subscription to the referenced attributes.
-            If the listener is already registered nothing happens."""
-        
-        #subscribe to configuration events for this attribute
-        cfg = self.getConfig()
-        cfg.addListener(listener)
-        
-        initial_subscription_state = self.__subscription_state
-        
-        ret = TaurusAttribute.addListener(self, listener)
-
-        if not ret:
-            return ret
-        
-        if self.__subscription_state == SubscriptionState.Unsubscribed:
-            for refobj in self._references:
-                refobj.addListener(self) #subscribe to the referenced attributes
-            self.__subscription_state = SubscriptionState.Subscribed
-
-        assert len(self._listeners) >= 1        
-        #if initial_subscription_state == SubscriptionState.Subscribed:
-        if len(self._listeners) > 1 and (initial_subscription_state == SubscriptionState.Subscribed or self.isPollingActive()):
-            taurus.Manager().addJob(self.__fireRegisterEvent, None, (listener,))
-        return ret
-        
-    def removeListener(self, listener):
-        """ 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 = TaurusAttribute.removeListener(self, listener)
-
-        cfg = self._getRealConfig()
-        cfg.removeListener(listener)
-        
-        if ret and not self.hasListeners():
-            self._deactivatePolling()
-            self.__subscription_state = SubscriptionState.Unsubscribed
-        return ret
-    
-
-class EvaluationConfiguration(TaurusConfiguration):
-    '''
-    A :class:`TaurusConfiguration` 
-    
-    .. seealso:: :mod:`taurus.core.evaluation` 
-    
-    .. warning:: In most cases this class should not be instantiated directly.
-                 Instead it should be done via the :meth:`EvaluationFactory.getConfig`
-    '''
-    def __init__(self, name, parent, storeCallback = None):
-        self.call__init__(TaurusConfiguration, name, parent, storeCallback=storeCallback)
-        
-        #fill the attr info
-        i = parent.read().config
-        a=parent
-        d=self._getDev()
-        # add dev_name, dev_alias, attr_name, attr_full_name
-        i.dev_name = d.getNormalName()
-        i.dev_alias = d.getSimpleName()
-        i.attr_name = a.getSimpleName()
-        i.attr_fullname = a.getNormalName()
-        i.label = a.getSimpleName()
-        self._attr_info = i
-        
-    def __getattr__(self, name): 
-        try:
-            return getattr(self._attr_info,name)
-        except:
-            raise AttributeError("'%s'object has no attribute '%s'"%(self.__class__.__name__, name))
-    @classmethod
-    def getNameValidator(cls):
-        return EvaluationConfigurationNameValidator()
-        
-    def _subscribeEvents(self): 
-        pass
-    
-    def _unSubscribeEvents(self):
-        pass   
-    
-    def factory(self):
-        EvaluationFactory()
-    
-    def getValueObj(self, cache=True):
-        """ Returns the current configuration for the attribute."""
-        return self._attr_info   
-    
 class EvaluationFactory(Singleton, TaurusFactory, Logger):
     """
     A Singleton class that provides Evaluation related objects.
     """
-
-    schemes = ("eval","evaluation")
-    DEFAULT_DEVICE = '_DefaultEvaluator'
+    elementTypesMap = {TaurusElementType.Authority: EvaluationAuthority,
+                       TaurusElementType.Device: EvaluationDevice,
+                       TaurusElementType.Attribute: EvaluationAttribute
+                       }
+    schemes = ("eval", "evaluation")
+    DEFAULT_DEVICE = '@DefaultEvaluator'
+    DEFAULT_AUTHORITY = '//localhost'
     DEFAULT_DATABASE = '_DefaultEvalDB'
+
     def __init__(self):
         """ Initialization. Nothing to be done here for now."""
         pass
@@ -674,13 +66,12 @@ class EvaluationFactory(Singleton, TaurusFactory, Logger):
         self.eval_attrs = weakref.WeakValueDictionary()
         self.eval_devs = weakref.WeakValueDictionary()
         self.eval_configs = weakref.WeakValueDictionary()
-        
+        self.scheme = 'eval'
+
     def findObjectClass(self, absolute_name):
         """Operation models are always OperationAttributes
         """
-        if EvaluationConfiguration.isValid(absolute_name):
-            return EvaluationConfiguration
-        elif EvaluationDevice.isValid(absolute_name):
+        if EvaluationDevice.isValid(absolute_name):
             return EvaluationDevice
         elif EvaluationAttribute.isValid(absolute_name):
             return EvaluationAttribute
@@ -689,156 +80,146 @@ class EvaluationFactory(Singleton, TaurusFactory, Logger):
             self.traceback()
             return None
 
-    def getDatabase(self, db_name=None):
+    def getAuthority(self, name=None):
         """Obtain the EvaluationDatabase object.
-        
+
         :param db_name: (str) this is ignored because only one database is supported
-                           
+
         :return: (EvaluationDatabase)
         """
-        if not hasattr(self, "_db"):
-            self._db = EvaluationDatabase(self.DEFAULT_DATABASE)
-        return self._db
+        if name is None:
+            name = 'eval://localhost'
+
+        v = self.getAuthorityNameValidator()
+        if not v.isValid(name):
+            raise TaurusException(
+                "Invalid Evaluation authority name %s" % name)
+
+        if not hasattr(self, "_auth"):
+            self._auth = EvaluationAuthority(self.DEFAULT_AUTHORITY)
+        return self._auth
 
     def getDevice(self, dev_name):
-        """Obtain the object corresponding to the given device name. If the 
-        corresponding device already exists, the existing instance is returned. 
+        """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 dev_name: (str) the device name string. See
                          :mod:`taurus.core.evaluation` for valid device names
-        
+
         :return: (EvaluationDevice)
-         
+
         @throws TaurusException if the given name is invalid.
         """
+        # try to see if the given name is already a known full_name
         d = self.eval_devs.get(dev_name, None)
         if d is None:
-            validator = EvaluationDevice.getNameValidator()
+            # find the full_name and see if we already know it
+            validator = self.getDeviceNameValidator()
             names = validator.getNames(dev_name)
             if names is None:
-                raise TaurusException("Invalid evaluator device name %s" % dev_name)
+                raise TaurusException("Invalid evaluator device name %s" %
+                                      dev_name)
             fullname, normalname, devname = names
             d = self.eval_devs.get(fullname, None)
+            # if we do not know it, create the dev and store it in cache
             if d is None:
-                tmp = devname.rsplit('.', 1)
-                if len(tmp)==2:
-                    modulename, classname = tmp
+                groups = validator.getUriGroups(dev_name)
+                if groups['_evalclass'] is not None:
+                    modulename, classname = groups['_evalclass'].rsplit('.', 1)
                     try:
-                        m = __import__(modulename, globals(), locals(), [classname], -1)
+                        m = __import__(modulename, globals(), locals(),
+                                       [classname], -1)
                         DevClass = getattr(m, classname)
                     except:
-                        self.warning('Problem importing "%s"'%devname)
+                        self.warning('Problem importing "%s"' % devname)
                         raise
-                elif len(tmp)==1:
-                    DevClass = EvaluationDevice 
-                db = self.getDatabase()
-                d = DevClass(fullname, parent=db, storeCallback=self._storeDev) #use full name
+                else:
+                    DevClass = EvaluationDevice
+                # Get authority (creating if necessary)
+                auth_name = groups.get('authority') or self.DEFAULT_AUTHORITY
+                authority = self.getAuthority(auth_name)
+                # Create Device (and store it in cache via self._storeDev)
+                d = DevClass(fullname, parent=authority,
+                             storeCallback=self._storeDev)
         return d
-        
+
     def getAttribute(self, attr_name, **kwargs):
-        """Obtain the object corresponding to the given attribute name. If the 
+        """Obtain the object corresponding to the given attribute name. If the
         corresponding attribute already exists, the existing instance is
         returned. Otherwise a new instance is stored and returned. The evaluator
         device associated to this attribute will also be created if necessary.
-           
+
         :param attr_name: (str) the attribute name string. See
-                          :mod:`taurus.core.evaluation` for valid attribute names
-        
+                          :mod:`taurus.core.evaluation` for valid attribute
+                          names
+
+        Any aditional keyword arguments will be passed directly to the
+        constructor of `:class:EvaluationAttribute`
+
         :return: (EvaluationAttribute)
-         
+
         @throws TaurusException if the given name is invalid.
         """
-        a = self.eval_attrs.get(attr_name, None) #first try with the given name
-        if a is None: #if not, try with the full name
-            validator = EvaluationAttribute.getNameValidator()
+        a = self.eval_attrs.get(
+            attr_name, None)  # first try with the given name
+        if a is None:  # if not, try with the full name
+            validator = self.getAttributeNameValidator()
             names = validator.getNames(attr_name)
-            if names is None:
-                raise TaurusException("Invalid evaluation attribute name %s" % attr_name)
+            if names is None or names[0] is None:
+                raise TaurusException(
+                    "Invalid evaluation attribute name %s" % attr_name)
             fullname = names[0]
             a = self.eval_attrs.get(fullname, None)
-            if a is None: #if the full name is not there, create one
+            if a is None:  # if the full name is not there, create one
                 dev = self.getDevice(validator.getDeviceName(attr_name))
                 kwargs['storeCallback'] = self._storeAttr
                 if not kwargs.has_key('pollingPeriod'):
                     kwargs['pollingPeriod'] = self.getDefaultPollingPeriod()
-                a = EvaluationAttribute(fullname, parent=dev, **kwargs) #use full name
+                a = EvaluationAttribute(fullname, parent=dev, **kwargs)
         return a
 
-    def getConfiguration(self, param):
-        """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.TaurusAttribute object or full configuration name
-           
-        @return a taurus.core.taurusattribute.TaurusAttribute object
-        @throws TaurusException if the given name is invalid.
-        """
-        if isinstance(param, str):
-            return self._getConfigurationFromName(param)
-        return self._getConfigurationFromAttribute(param)
-
-    def _getConfigurationFromName(self, cfg_name):
-        cfg = self.eval_configs.get(cfg_name, None) #first try with the given name
-        if cfg is None: #if not, try with the full name
-            validator = EvaluationConfiguration.getNameValidator()
-            names = validator.getNames(cfg_name)
-            if names is None:
-                raise TaurusException("Invalid evaluation configuration name %s" % cfg_name)
-            fullname = names[0]
-            cfg = self.eval_configs.get(fullname, None)
-            if cfg is None: #if the full name is not there, create one
-                attr = self.getAttribute(validator.getAttrName(cfg_name))
-                cfg = EvaluationConfiguration(names[0], parent=attr, storeCallback=self._storeConfig) #use full name
-        return cfg
-        
-    def _getConfigurationFromAttribute(self, attr):
-        cfg = attr.getConfig()
-        cfg_name = attr.getFullName() + "?configuration"
-        self.eval_configs[cfg_name] = cfg
-        return cfg
-    
     def _storeDev(self, dev):
         name = dev.getFullName()
         exists = self.eval_devs.get(name)
         if exists is not None:
-            if exists == dev: 
+            if exists == dev:
                 self.debug("%s has already been registered before" % name)
                 raise DoubleRegistration
             else:
-                self.debug("%s has already been registered before with a different object!" % name)
+                self.debug(
+                    "%s has already been registered before with a different object!" % name)
                 raise DoubleRegistration
         self.eval_devs[name] = dev
-    
+
     def _storeAttr(self, attr):
         name = attr.getFullName()
         exists = self.eval_attrs.get(name)
         if exists is not None:
-            if exists == attr: 
+            if exists == attr:
                 self.debug("%s has already been registered before" % name)
                 raise DoubleRegistration
             else:
-                self.debug("%s has already been registered before with a different object!" % name)
+                self.debug(
+                    "%s has already been registered before with a different object!" % name)
                 raise DoubleRegistration
         self.eval_attrs[name] = attr
-        
+
     def _storeConfig(self, fullname, config):
         #name = config.getFullName()
         name = fullname
         exists = self.eval_configs.get(name)
         if exists is not None:
-            if exists == config: 
+            if exists == config:
                 self.debug("%s has already been registered before" % name)
                 raise DoubleRegistration
             else:
-                self.debug("%s has already been registered before with a different object!" % name)
+                self.debug(
+                    "%s has already been registered before with a different object!" % name)
                 raise DoubleRegistration
         self.eval_configs[name] = config
-        
-    def addAttributeToPolling(self, attribute, period, unsubscribe_evts = False):
+
+    def addAttributeToPolling(self, attribute, period, unsubscribe_evts=False):
         """Activates the polling (client side) for the given attribute with the
            given period (seconds).
 
@@ -849,7 +230,7 @@ class EvaluationFactory(Singleton, TaurusFactory, Logger):
         tmr = self.polling_timers.get(period, TaurusPollingTimer(period))
         self.polling_timers[period] = tmr
         tmr.addAttribute(attribute, self.isPollingEnabled())
-        
+
     def removeAttributeFromPolling(self, attribute):
         """Deactivate the polling (client side) for the given attribute. If the
            polling of the attribute was not previously enabled, nothing happens.
@@ -857,7 +238,7 @@ class EvaluationFactory(Singleton, TaurusFactory, Logger):
            :param attribute: (str) attribute name.
         """
         p = None
-        for period,timer in self.polling_timers.iteritems():
+        for period, timer in self.polling_timers.iteritems():
             if timer.containsAttribute(attribute):
                 timer.removeAttribute(attribute)
                 if timer.getAttributeCount() == 0:
@@ -865,78 +246,18 @@ class EvaluationFactory(Singleton, TaurusFactory, Logger):
                 break
         if p:
             del self.polling_timers[period]
-            
-
-    
-
-#===============================================================================
-# Just for testing
-#===============================================================================
-def test1():
-    f = EvaluationFactory()
-    d = f.getDevice('eval://dev=foo')
-    a = f.getAttribute('eval://2*bar?bar={sys/tg_test/1/short_scalar}')
-    c = f.getConfiguration('eval://2*{sys/tg_test/1/short_scalar}?configuration=label')
-    cp = a.getConfig()
-    print "FACTORY:", f
-    print "DEVICE:", d
-    print "ATTRIBUTE", a, a.getSimpleName()
-    print "CONFIGURATION", c, c.getSimpleName()
-    print "CONFIGPROXY", cp, cp.getSimpleName()
-    print
-    print c.getValueObj()
-    print c.getUnit()
-    
-
-def test2():
-    a=taurus.Attribute('eval://[{sys/tg_test/1/short_scalar},{sys/tg_test/1/double_scalar}, {sys/tg_test/1/short_scalar}+{sys/tg_test/1/double_scalar}]')
-    #a=taurus.Attribute('eval://2*{sys/tg_test/1/short_scalar}+rand()')  
-    class Dummy:
-        n=0
-        def eventReceived(self, s,t,v):
-            print self.n, v
-            self.n += 1
-    kk = Dummy()
-    a.addListener(kk)
-    while kk.n <= 2:
-        time.sleep(1)
-    a.removeListener(kk)
-#    while kk.n <= 20:
-#        time.sleep(1)        
-    
-def test3():
-    import sys
-    from taurus.qt.qtgui.application import TaurusApplication
-    from taurus.qt.qtgui.panel import TaurusForm
-    #from taurus.qt.qtgui.plot import TaurusTrend
-    #from taurus.qt.qtgui.display import TaurusLabel
-    app = TaurusApplication()
-    
-    w = TaurusForm()
-#    w=TaurusTrend()
-#    w=TaurusLabel()
-
-    w.setModel(['eval://2*short_scalar?short_scalar={sys/tg_test/1/short_scalar}',
-                'sys/tg_test/1/short_scalar', 'eval://a<100?a={sys/tg_test/1/short_scalar}', 
-                'eval://10*rand()', 'eval://dev=taurus.core.evaluation.dev_example.FreeSpaceDevice;getFreeSpace("/")/1024/1024'])
-#    w.setModel(['eval://2*short_scalar?short_scalar={sys/tg_test/1/short_scalar}'])
-#    w.setModel(['sys/tg_test/1/short_scalar'])
-#    w.setModel('eval://2*{sys/tg_test/1/short_scalar}?configuration=label')
-#    w.setModel('eval://2*{sys/tg_test/1/short_scalar}')
-#    w.setModel('sys/tg_test/1/short_scalar?configuration=label')
-#    w.setModel('sys/tg_test/1/short_scalar')
-
-#    a=w.getModelObj()
-#    print a, a.read().value
-    
-#    a=w.getModelObj()
-#    a.setUnit('asd')
-#    c=a.getConfig()
-
-    w.show()
-    sys.exit(app.exec_())
-
-if __name__ == "__main__":
-    test3()
-    
-        
+
+    def getAuthorityNameValidator(self):
+        """Return EvaluationAuthorityNameValidator"""
+        import evalvalidator
+        return evalvalidator.EvaluationAuthorityNameValidator()
+
+    def getDeviceNameValidator(self):
+        """Return EvaluationDeviceNameValidator"""
+        import evalvalidator
+        return evalvalidator.EvaluationDeviceNameValidator()
+
+    def getAttributeNameValidator(self):
+        """Return EvaluationAttributeNameValidator"""
+        import evalvalidator
+        return evalvalidator.EvaluationAttributeNameValidator()
diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py
new file mode 100644
index 0000000..cc42549
--- /dev/null
+++ b/lib/taurus/core/evaluation/evalvalidator.py
@@ -0,0 +1,516 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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__ = ['EvaluationDeviceNameValidator',
+           'EvaluationAttributeNameValidator']
+
+import re
+import hashlib
+
+import taurus
+from taurus import isValidName, debug
+from taurus.core import TaurusElementType
+
+from taurus.core.taurusvalidator import (TaurusAttributeNameValidator,
+                                         TaurusDeviceNameValidator,
+                                         TaurusAuthorityNameValidator)
+
+# Pattern for python variables
+PY_VAR = r'(?<![\.a-zA-Z0-9_])[a-zA-Z_][a-zA-Z0-9_]*'
+PY_VAR_RE = re.compile(PY_VAR)
+# Pattern for semicolon-separated <variable>=<value> pairs (in URI paths)
+K_EQUALS_V = r'(%s)=([^?#=;]+)' % PY_VAR
+K_EQUALS_V_RE = re.compile(K_EQUALS_V)
+#
+QUOTED_TEXT = '(".*?"|\'.*?\')'
+QUOTED_TEXT_RE = re.compile(QUOTED_TEXT)
+
+
+def _findAllTokensBetweenChars(string, start, end, n=None):
+    '''Finds the text between (possibly nested) delimiters in a string.
+    In case of nested delimiters, only the outermost level is
+    returned. It returns a tuple of (idx,token)
+
+    Example::
+
+      _findAllTokensBetweenChars('{foo}bar{zig{zag}}boom', '{', '}')
+      --> [(1,'foo'), (9, 'zig{zag}')]
+
+
+    :param string: (str) the expression to parse
+    :param start: (str) the char delimiting the start of a token
+    :param end: (str) the char delimiting the end of a token
+    :param n: (int or None) If an int is passed, it sets the maximum number
+              of tokens to be found
+
+    :return: (list(<int>,<str>)) a list of (idx, token) tuples. The idx is the
+    position of the token in `string`
+             (tokens d not include the delimiting chars not including the
+             brackets)
+    '''
+    if start == end:
+        raise ValueError('star_char must be different from end_char')
+    if string.count(start) != string.count(end):
+        raise ValueError('Non-matching delimiters (%i "%s" vs %i "%s")' %
+                         string.count(start), start, string.count(end), end)
+    tokens = []
+    indexes = []
+    idx = 0
+    rest = string
+    while len(tokens) != n:
+        s = rest.find(start)
+        if s < 0:
+            break
+        e = rest.find(end) + 1
+        while rest[s:e].count(start) != rest[s:e].count(end):
+            ne = rest[e:].find(end)
+            e = e + 1 + ne
+        tokens.append((idx + s, rest[s + 1:e - 1]))
+        idx += e
+        rest = rest[e:]
+    return tokens
+
+
+def _isQuoted(string, substring, idx):
+    """returns True if position i of string is in a quoted region"""
+    bfr = string[:idx]
+    aft = string[idx + len(substring):]
+    if (bfr.count('"') % 2 or aft.count('"') % 2 or
+            bfr.count("'") % 2 or aft.count("'") % 2):
+        return True
+    else:
+        return False
+
+
+def _replacepos(string, old, new, idx):
+    """return copy of string where the occurrence of substring `old` at
+    position `pos` is replaced by `new`
+    """
+    if not string[idx:].startswith(old):
+        raise Exception('invalid')
+    return string[:idx] + new + string[idx + len(old):]
+
+
+class EvaluationAuthorityNameValidator(TaurusAuthorityNameValidator):
+    '''Validator for Evaluation authority names. For now, the only supported
+    authority (in strict mode) is "//localhost":
+    '''
+    scheme = 'eval'
+    authority = '//localhost'
+    path = '(?!)'
+    query = '(?!)'
+    fragment = '(?!)'
+
+    @property
+    def nonStrictNamePattern(self):
+        '''implement in derived classes if a "less strict" pattern is allowed
+        (e.g. for backwards-compatibility, "tango://a/b/c" could be an accepted
+        device name, even if it breaks RFC3986).
+        '''
+        return r'^(?P<scheme>eval|evaluation)://(db=(?P<dbname>[^?#;]+))$'
+
+
+class EvaluationDeviceNameValidator(TaurusDeviceNameValidator):
+    '''Validator for Evaluation device names. Apart from the standard named
+    groups (scheme, authority, path, query and fragment), the following named
+    groups are created:
+
+     - devname: device name (either _evalname or _evalclass)
+     - [_evalname]: evaluation instance name (aka non-dotted dev name)
+     - [_evalclass]: evaluator class name (if dotted name given)
+     - [_old_devname]: devname without "@". Only in non-strict mode
+     - [_dbname] and [_subst]: unused. Only if non-strict mode
+
+    Note: brackets on the group name indicate that this group will only contain
+    a string if the URI contains it.
+    '''
+
+    scheme = 'eval'
+    authority = EvaluationAuthorityNameValidator.authority
+    _evaluatorname = r'((?P<_evalname>[^/?#:\.=]+)|(?P<_evalclass>(\w+\.)+\w+))'
+    devname = r'(?P<devname>@%s)' % _evaluatorname
+    path = r'(?!//)/?%s' % devname
+    query = '(?!)'
+    fragment = '(?!)'
+
+    def getUriGroups(self, name, strict=None):
+        '''reimplemented from :class:`TaurusDeviceNameValidator` to provide
+        backwards compatibility with ol syntax'''
+        groups = TaurusDeviceNameValidator.getUriGroups(self, name,
+                                                        strict=strict)
+        if groups is not None and not groups['__STRICT__']:
+            _old_devname = groups['_old_devname']
+            groups['devname'] = '@%s' % _old_devname
+            if '.' in _old_devname:
+                groups['_evalname'] = None
+                groups['_evalclass'] = _old_devname
+            else:
+                groups['_evalname'] = _old_devname
+                groups['_evalclass'] = None
+        return groups
+
+    def getNames(self, fullname, factory=None):
+        '''reimplemented from :class:`TaurusDeviceNameValidator`'''
+        from evalfactory import EvaluationFactory
+        # TODO: add mechanism to select strict mode instead of hardcoding here
+        groups = self.getUriGroups(fullname)
+        if groups is None:
+            return None
+
+        authority = groups.get('authority')
+        if authority is None:
+            f_or_fklass = factory or EvaluationFactory
+            groups['authority'] = authority = f_or_fklass.DEFAULT_AUTHORITY
+
+        complete = 'eval:%(authority)s/%(devname)s' % groups
+        normal = '%(devname)s' % groups
+        short = normal.lstrip('@')
+
+        return complete, normal, short
+
+    @property
+    def nonStrictNamePattern(self):
+        '''In non-strict mode support old-style eval names
+        '''
+        p = r'^(?P<scheme>eval|evaluation)://(db=(?P<_dbname>[^?#;]+);)?' + \
+            r'(dev=(?P<_old_devname>%s))' % self._evaluatorname + \
+            r'(\?(?!configuration=)(?P<_subst>[^#?]*))?$'
+        return p
+
+
+class EvaluationAttributeNameValidator(TaurusAttributeNameValidator):
+    '''Validator for Evaluation attribute names. Apart from the standard named
+    groups (scheme, authority, path, query and fragment), the following named
+    groups are created:
+
+     - attrname: attribute name. same as concatenating _subst with _expr
+     - _expr: a mathematical expression
+     - _evalrefs: a list of eval refs found in the name (see :meth:`getRefs`)
+     - [_subst]: a semicolon-separated repetition of key=value (for replacing
+       them in _expr)
+     - [devname]: as in :class:`EvaluationDeviceNameValidator`
+     - [_evalname]: evaluation instance name (aka non-dotted dev name)
+     - [_evalclass]: evaluator class name (if dotted name given)
+     - [_old_devname]: devname without "@". Only in non-strict mode
+     - [_dbname] and [_subst]: unused. Only if non-strict mode
+     - [cfgkey] same as fragment (for bck-compat use only)
+
+    Note: brackets on the group name indicate that this group will only contain
+    a value if the URI contains it.
+    '''
+    scheme = 'eval'
+    authority = EvaluationAuthorityNameValidator.authority
+    path = ((r'(?!//)/?(%s/)?' +
+             r'(?P<attrname>(?P<_subst>(%s;)+)?(?P<_expr>[^@?#]+))') %
+            (EvaluationDeviceNameValidator.devname, K_EQUALS_V)
+            )
+    query = '(?!)'
+    fragment = '(?P<cfgkey>[^# ]*)'
+
+    @staticmethod
+    def expandExpr(expr, substmap):
+        '''expands expr by substituting all keys in map by their value.
+        Note that eval references in expr (i.e. text within curly brackets)
+        is not substituted.
+
+        :param expr: (str) string that may contain symbols defined in symbolMap
+        :param symbolMap: (dict or str) dictionary whose keys (strings) are
+                          symbols to be substituted in `expr` and whose values
+                          are the corresponding replacements. Alternatively, a
+                          string containing a semi-colon separated list of
+                          symbol=value pairs can also be passed.
+        '''
+        if isinstance(substmap, str):
+            substmap = dict(K_EQUALS_V_RE.findall(substmap))
+        ret = expr
+        protected = {}
+
+        # temporarily replace the text within quotes by hash-based placeholders
+        for s in QUOTED_TEXT_RE.findall(expr):
+            placeholder = hashlib.md5(s).hexdigest()
+            protected[placeholder] = s
+            ret = re.sub(s, placeholder, ret)
+
+        # Substitute each k by its v in the expr (unless they are in
+        # references)
+        for k, v in substmap.iteritems():
+            # create a pattern for matching complete word k
+            # unless it is within between curly brackets
+            keyPattern = r'(?<!\w)%s(?!\w)(?![^\{]*\})' % k
+            # substitute matches of keyPattern by their value
+            ret = re.sub(keyPattern, v, ret)
+
+        # restore the protected strings
+        for placeholder, s in protected.iteritems():
+            ret = re.sub(placeholder, s, ret)
+        return ret
+
+    @staticmethod
+    def getRefs(expr, ign_quoted=True):
+        '''Find the attribute references (strings within brackets) in an eval
+        expression. In case of nested references, only the outermost level is
+        returned.
+
+        Example: val.getRefs('{foo}bar{zig{zag}}boom') --> ['foo', 'zig{zag}']
+
+        :param expr: (str) the expression to parse
+        :param ign_quoted: If True (default) ignore refs within quotes
+
+        :return (list<str>) a list of refs (not including the brackets)
+        '''
+        refs = _findAllTokensBetweenChars(expr, '{', '}')
+
+        # print expr
+        # print '0123456789012345678901234567890123456789'
+        # print refs
+
+        if refs and not ign_quoted:
+            _, refs = zip(*refs)
+            return refs
+
+        ret = []
+        for i, ref in refs:
+            if not _isQuoted(expr, "{" + ref + "}", i):
+                ret.append(ref)
+        return ret
+
+    @staticmethod
+    def replaceUnquotedRef(string, substring, repl):
+        """Return a copy of string where first non-quoted occurrence of
+        `substring`
+         is replaced by `repl`
+
+        :param string: (str) string to be used
+        :param substring: (str) substring to be replaced
+        :param repl: (str) replacement
+
+        :return: (str)
+
+        """
+        idx = string.find(substring)
+        while _isQuoted(string, substring, idx):
+            idx = string.find(substring, idx + 1)
+        return _replacepos(string, substring, repl, idx)
+
+    def isValid(self, name, matchLevel=None, strict=None):
+        '''reimplemented from :class:`TaurusAttributeNameValidator` to do extra
+        check on references validity (recursive)
+        '''
+        # Standard implementation
+        if matchLevel is not None:
+            groups = self._isValidAtLevel(name, matchLevel=matchLevel)
+        else:
+            groups = self.getUriGroups(name, strict=strict)
+        if groups is None:
+            return False
+
+        # now check the references
+        for ref in groups['_evalrefs']:
+            if not isValidName(ref, etypes=(TaurusElementType.Attribute,),
+                               strict=strict):
+                debug('"%s" is invalid because ref "%s" is not a ' +
+                      'valid attribute', name, ref)
+                return False
+        return True
+
+    def getUriGroups(self, name, strict=None):
+        '''reimplemented from :class:`TaurusAttributeNameValidator` to provide
+        backwards compatibility with old syntax'''
+
+        # mangle refs before matching the pattern to sanitize them
+        refs = self.getRefs(name, ign_quoted=False)
+        refs_dict = {}
+        _name = name
+        for i, ref in enumerate(refs):
+            refs_dict['__EVALREF_%d__' % i] = '{%s}' % ref
+            _name = _name.replace('{%s}' % ref, '{__EVALREF_%d__}' % i, 1)
+
+        _groups = TaurusAttributeNameValidator.getUriGroups(self, _name,
+                                                            strict=strict)
+        if _groups is None:
+            return None
+
+        # create the groups dict with unmangled refs in its values
+        groups = {}
+        for n, g in _groups.items():
+            if isinstance(g, str):  # avoid None or boolean values
+                g = g.format(**refs_dict)
+            groups[n] = g
+
+        if not groups['__STRICT__']:
+            # adapt attrname to what would be in strict mode
+            _subst = groups['_subst'] or ''
+            _expr = groups['_expr']
+            if _subst:
+                groups['attrname'] = "%s;%s" % (_subst.rstrip(';'), _expr)
+            else:
+                groups['attrname'] = _expr
+
+            # adapt devname to what would be in strict mode
+            old_devname = groups['_old_devname']
+            if old_devname is None:
+                groups['devname'] = None
+            else:
+                groups['devname'] = '@%s' % old_devname
+
+        # check that there are not ";" in the expr (ign. quoted text and refs)
+        sanitized_expr = QUOTED_TEXT_RE.sub('', groups['_expr'])
+        for ref in self.getRefs(sanitized_expr, ign_quoted=False):
+            sanitized_expr = sanitized_expr.replace(ref, '')
+        if ";" in sanitized_expr:
+            return None
+
+        # add a group containing refs in attrname (ign. those in quoted text)
+        groups['_evalrefs'] = self.getRefs(groups['attrname'], ign_quoted=True)
+
+        return groups
+
+    def _getSimpleNameFromExpression(self, expression):
+        """Get the simple name of an evaluationAttribute from an expression"""
+        name = expression
+        for ref in self.getRefs(expression, ign_quoted=True):
+            manager = taurus.core.TaurusManager()
+            scheme = manager.getScheme(ref)
+            _f = taurus.Factory(scheme)
+            attrNameValidator = _f.getAttributeNameValidator()
+            _, _, simple_name = attrNameValidator.getNames(ref)
+            name = self.replaceUnquotedRef(name, '{%s}' % ref, simple_name)
+        return name
+
+    def _expandRefNames(self, attrname):
+        """Expand the refs in an eval name to their full names"""
+        name = attrname
+        for ref in self.getRefs(attrname, ign_quoted=True):
+            manager = taurus.core.TaurusManager()
+            scheme = manager.getScheme(ref)
+            _f = taurus.Factory(scheme)
+            attrNameValidator = _f.getAttributeNameValidator()
+            full_name, _, _ = attrNameValidator.getNames(ref)
+            if full_name is None:
+                debug('Cannot expand the fullname of %s' % ref)
+                return None
+            name = self.replaceUnquotedRef(name, '{%s}' % ref,
+                                           '{%s}' % full_name)
+        return name
+
+    def getNames(self, fullname, factory=None, fragment=False):
+        '''reimplemented from :class:`TaurusDeviceNameValidator`'''
+        from evalfactory import EvaluationFactory
+        groups = self.getUriGroups(fullname)
+        if groups is None:
+            return None
+
+        f_or_fklass = factory or EvaluationFactory
+
+        authority = groups.get('authority')
+        if authority is None:
+            groups['authority'] = authority = f_or_fklass.DEFAULT_AUTHORITY
+
+        devname = groups.get('devname')
+        if devname is None:
+            groups['devname'] = devname = f_or_fklass.DEFAULT_DEVICE
+
+        complete = 'eval:%s/%s/%s' % (authority, devname, groups['attrname'])
+        complete = self._expandRefNames(complete)
+
+        normal = groups['attrname']
+        if devname != f_or_fklass.DEFAULT_DEVICE:
+            normal = '%s/%s' % (devname, normal)
+        if authority != f_or_fklass.DEFAULT_AUTHORITY:
+            normal = '%s/%s' % (authority, normal)
+        short = self._getSimpleNameFromExpression(groups['_expr'])
+
+        # return fragment if requested
+        if fragment:
+            key = groups.get('fragment', None)
+            return complete, normal, short, key
+        return complete, normal, short
+
+    @property
+    def nonStrictNamePattern(self):
+        '''In non-strict mode support old-style eval config names
+        '''
+        p = r'^(?P<scheme>eval|evaluation)://(db=(?P<_dbname>[^?#;]+);)?' + \
+            r'(dev=(?P<_old_devname>[^?#;]+);)?' + \
+            r'(?P<_expr>[^?#;]+)' + \
+            r'(\?(?P<_substquery>(?!configuration=)(?P<_subst>%s(;%s)*)))?' % \
+            (K_EQUALS_V, K_EQUALS_V) + \
+            r'(\?(?P<query>configuration(=' + \
+            '(?P<fragment>(?P<cfgkey>[^#?]*)))?))?$'
+
+        return p
+
+    def getExpandedExpr(self, name):
+        '''
+        Returns the expanded expression from the attribute name URI
+
+        :param name: (str) eval attribute URI
+
+        :return: (str) the expression (from the name )expanded with any
+                 substitution k,v pairs also defined in the name
+        '''
+        groups = self.getUriGroups(name)
+        if groups is None:
+            return None
+        _expr = groups['_expr']
+        _subst = groups['_subst']
+        return self.expandExpr(_expr, _subst or {})
+
+    def getAttrName(self, s):
+        #@TODO: Maybe this belongs to the factory, not the validator
+        # TODO: this is pre-tep14 API from the
+        # EvaluationConfigurationNameValidator. Check usage and remove.
+        names = self.getNames(s)
+        if names is None:
+            return None
+        return names[0]
+
+    def getDeviceName(self, name):
+        #@TODO: Maybe this belongs to the factory, not the validator
+        '''Obtain the fullname of the device from the attribute name'''
+        from evalfactory import EvaluationFactory
+        groups = self.getUriGroups(name)
+        if groups is None:
+            return None
+        authority = groups.get('authority')
+        if authority is None:
+            authority = EvaluationFactory.DEFAULT_AUTHORITY
+        devname = groups.get('devname')
+        if devname is None:
+            devname = EvaluationFactory.DEFAULT_DEVICE
+        return 'eval:%s/%s' % (authority, devname)
+
+    def getDBName(self, s):
+        #@TODO: Maybe this belongs to the factory, not the validator
+        '''returns the full data base name for the given attribute name'''
+        from evalfactory import EvaluationFactory
+        m = self.name_re.match(s)
+        if m is None:
+            return None
+        dbname = m.group('dbname') or EvaluationFactory.DEFAULT_DATABASE
+        return "eval://db=%s" % dbname
+
+
+if __name__ == '__main__':
+    pass
diff --git a/lib/taurus/core/evaluation/ipap_example.py b/lib/taurus/core/evaluation/ipap_example.py
index 12f29d0..3c8b405 100644
--- a/lib/taurus/core/evaluation/ipap_example.py
+++ b/lib/taurus/core/evaluation/ipap_example.py
@@ -1,24 +1,24 @@
 #!/usr/bin/env python
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,12 +30,12 @@ __all__ = ['IcepapDriverParam']
 
 from taurus.core.evaluation import EvaluationDevice
 import re
-import pyIcePAP
+
 
 class IcepapDriverParam(EvaluationDevice):
-    '''A simple example of usage of the evaluation scheme for 
+    '''A simple example of usage of the evaluation scheme for
     creating an icepap connection device to obtain icepap driver values.
-    
+
     Important: note that only those members listed in `_symbols` will be available
     '''
     _symbols = ['getAxisParam']
@@ -46,52 +46,55 @@ class IcepapDriverParam(EvaluationDevice):
 
         # Get the icepap host and port to connect
         self.ipap = None
+        import pyIcePAP
 
         try:
             db_name = self.getNameValidator().getDBName(self._full_name)
-            db_name = db_name.replace('eval://','')
-            db_name = db_name.replace('db=','')
-            host,port = db_name.split(':')
+            db_name = db_name.replace('eval://', '')
+            db_name = db_name.replace('db=', '')
+            host, port = db_name.split(':')
             self.ipap = pyIcePAP.EthIcePAP(host, port)
             self.ipap.connect()
         except:
             pass
-        
+
     def getAxisParam(self, axis, param):
         ''' return the axis parameter value. '''
         if self.ipap is None or not self.ipap.connected:
             raise Exception('Not a valid icepap connection')
-        
+
         try:
             value = self.ipap.readParameter(axis, param)
             return float(value)
         except:
             return value
-        
 
-#===============================================================================
+
+#=========================================================================
 # Just for testing
-#===============================================================================
+#=========================================================================
 
 ATTR_IPAP_POS = 'eval://db=icepap06:5000;dev=taurus.core.evaluation.ipap_example.IcepapDriverParam;getAxisParam(1,"POS")'
 
-def test1():
+
+def _test1():
     import taurus.core
     a = taurus.Attribute(ATTR_IPAP_POS)
-    print "axis pos:", a.read().value
-    
-def test2():
+    print "axi_s pos:", a.read().value
+
+
+def _test2():
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.qt.qtgui.display import TaurusLabel
     app = TaurusApplication()
-    
+
     tl = TaurusLabel()
     tl.setModel(ATTR_IPAP_POS)
     tl.show()
 
     sys.exit(app.exec_())
-    
+
 if __name__ == "__main__":
-    test1()
-    test2()
+    _test1()
+    _test2()
diff --git a/lib/taurus/core/evaluation/test/__init__.py b/lib/taurus/core/evaluation/test/__init__.py
new file mode 100644
index 0000000..b5a5672
--- /dev/null
+++ b/lib/taurus/core/evaluation/test/__init__.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
diff --git a/lib/taurus/core/evaluation/test/test_evalattribute.py b/lib/taurus/core/evaluation/test/test_evalattribute.py
new file mode 100755
index 0000000..b645043
--- /dev/null
+++ b/lib/taurus/core/evaluation/test/test_evalattribute.py
@@ -0,0 +1,295 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core.tango.test.test_tangovalidator..."""
+
+# __all__ = []
+
+import numpy
+from taurus.external import unittest
+from taurus.external.pint import Quantity
+import taurus
+from taurus.test import insertTest
+from taurus.core.taurusbasetypes import DataType
+from taurus.core.evaluation.evalattribute import EvaluationAttrValue
+
+
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:1',
+            expected=dict(rvalue=Quantity(1, 'dimensionless'),
+                          type=DataType.Integer,
+                          label='1',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=Quantity([], 'dimensionless'),
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:Quantity("1m")+Quantity("2m")',
+            expected=dict(rvalue=Quantity(3, 'm'),
+                          type=DataType.Integer,
+                          label='Quantity("1m")+Quantity("2m")',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=Quantity(3, 'm'),
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:foo=Quantity("1m");bar=Quantity("2m");foo+bar',
+            expected=dict(rvalue=Quantity(3, 'm'),
+                          type=DataType.Integer,
+                          label='foo+bar',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=Quantity(3, 'm'),
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:foo=Q("1m");foo-Q("2m")',
+            expected=dict(rvalue=Quantity(-1, 'm'),
+                          type=DataType.Integer,
+                          label='foo-Q("2m")',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=Quantity(-1, 'm'),
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:[123, 123, 123]',
+            expected=dict(rvalue=Quantity([123, 123, 123], 'dimensionless'),
+                          type=DataType.Integer,
+                          label='[123, 123, 123]',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=Quantity([123, 123, 123],
+                                                'dimensionless'),
+                                wvalue=None
+                                ),
+            expectedshape=(3, )
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:Quantity([1.23, 1.23, 1.23], "m")',
+            expected=dict(rvalue=Quantity([1.23, 1.23, 1.23], 'm'),
+                          type=DataType.Float,
+                          label='Quantity([1.23, 1.23, 1.23], "m")',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=Quantity([1.23, 1.23, 1.23], 'm'),
+                                wvalue=None
+                                ),
+            expectedshape=(3, )
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:foo=Quantity([1.23, 1.23, 1.23], "m");foo*10',
+            expected=dict(rvalue=Quantity([12.3, 12.3, 12.3], 'm'),
+                          type=DataType.Float,
+                          label='foo*10',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=Quantity([12.3, 12.3, 12.3],
+                                                'm'),
+                                wvalue=None
+                                ),
+            expectedshape=(3, )
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:[[1,2,3]]*3',
+            expected=dict(rvalue=Quantity([[1, 2, 3]] * 3, 'dimensionless'),
+                          type=DataType.Integer,
+                          label='[[1,2,3]]*3',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=Quantity([[1, 2, 3]] * 3,
+                                                'dimensionless'),
+                                wvalue=None
+                                ),
+            expectedshape=(3, 3)
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:foo=1;foo+{eval:foo=2;foo}+{eval:foo=3;foo}',
+            expected=dict(rvalue=Quantity(6, 'dimensionless'),
+                          type=DataType.Integer,
+                          label='foo+foo+foo',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=Quantity(6, 'dimensionless'),
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:True',
+            expected=dict(rvalue=True,
+                          type=DataType.Boolean,
+                          label='True',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=True,
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:foo=1;bar=2;foo==bar',
+            expected=dict(rvalue=False,
+                          type=DataType.Boolean,
+                          label='foo==bar',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=False,
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:[[True, False, True]]*3',
+            expected=dict(rvalue=[[True, False, True]] * 3,
+                          type=DataType.Boolean,
+                          label='[[True, False, True]]*3',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=[[True, False, True]] * 3,
+                                wvalue=None
+                                ),
+            expectedshape=(3, 3)
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:"1m"',
+            expected=dict(rvalue="1m",
+                          type=DataType.String,
+                          label='"1m"',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue="1m",
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:"m"*3',
+            expected=dict(rvalue="mmm",
+                          type=DataType.String,
+                          label='"m"*3',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue="mmm",
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:"2+5-10"',
+            expected=dict(rvalue="2+5-10",
+                          type=DataType.String,
+                          label='"2+5-10"',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue="2+5-10",
+                                wvalue=None
+                                ),
+            expectedshape=None
+            )
+ at insertTest(helper_name='read_attr',
+            attr_fullname='eval:[["HelloWorld", "HelloWorld", "HelloWorld"]]*3',
+            expected=dict(rvalue=[["HelloWorld", "HelloWorld", "HelloWorld"]] * 3,
+                          type=DataType.String,
+                          label='[["HelloWorld", "HelloWorld",' +
+                                ' "HelloWorld"]]*3',
+                          writable=False,
+                          ),
+            expected_attrv=dict(rvalue=[["HelloWorld", "HelloWorld",
+                                         "HelloWorld"]] * 3,
+                                wvalue=None
+                                ),
+            expectedshape=(3, 3)
+            )
+class EvalAttributeTestCase(unittest.TestCase):
+
+    def read_attr(self, attr_fullname, expected={}, expected_attrv={},
+                  expectedshape=None):
+        """check creation and correct read of an evaluationAttribute"""
+
+        a = taurus.Attribute(attr_fullname)
+        read_value = a.read()
+
+        msg = ('read() for "{0}" did not return an EvaluationAttrValue ' +
+               '(got a {1})').format(attr_fullname,
+                                     read_value.__class__.__name__)
+        self.assertTrue(isinstance(read_value, EvaluationAttrValue), msg)
+
+        # Test attribute
+        for k, exp in expected.iteritems():
+            try:
+                got = getattr(a, k)
+            except AttributeError:
+                msg = ('The attribute, "%s" does not provide info on %s' %
+                       (attr_fullname, k))
+                self.fail(msg)
+            msg = ('%s for "%s" should be %r (got %r)' %
+                   (attr_fullname, k,  exp, got))
+            self.__assertValidValue(exp, got, msg)
+
+        # Test attribute value
+        for k, exp in expected_attrv.iteritems():
+            try:
+                got = getattr(read_value, k)
+            except AttributeError:
+                msg = ('The read value for "%s" does not provide info on %s' %
+                       (attr_fullname, k))
+                self.fail(msg)
+            msg = ('%s for "%s" should be %r (got %r)' %
+                   (attr_fullname, k,  exp, got))
+            self.__assertValidValue(exp, got, msg)
+
+        if expectedshape is not None:
+            shape = numpy.shape(read_value.rvalue)
+            msg = ('rvalue.shape for %s should be %r (got %r)' %
+                   (attr_fullname, expectedshape, shape))
+            self.assertEqual(shape, expectedshape, msg)
+
+    def __assertValidValue(self, exp, got, msg):
+        # if we are dealing with quantities, use the magnitude for comparing
+        if isinstance(got, Quantity):
+            got = got.to(Quantity(exp).units).magnitude
+        if isinstance(exp, Quantity):
+            exp = exp.magnitude
+        try:
+            # for those values that can be handled by numpy.allclose()
+            chk = numpy.allclose(got, exp)
+        except:
+            # for the rest
+            if isinstance(got, numpy.ndarray):
+                got = got.tolist()
+            chk = bool(got == exp)
+
+        self.assertTrue(chk, msg)
diff --git a/lib/taurus/core/evaluation/test/test_evalfactory.py b/lib/taurus/core/evaluation/test/test_evalfactory.py
new file mode 100644
index 0000000..834450e
--- /dev/null
+++ b/lib/taurus/core/evaluation/test/test_evalfactory.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core.evaluation.test.test_evalfactory..."""
+
+import re
+
+import taurus
+from taurus.external import unittest
+from taurus.test import insertTest
+
+
+ at insertTest(helper_name='checkAttributeName', model='eval://1', oldstyle=True)
+ at insertTest(helper_name='checkAttributeName', model='a=2;a*3')
+ at insertTest(helper_name='checkAttributeName', model='1')
+ at insertTest(helper_name='checkAttributeID', model='eval://1', oldstyle=True)
+ at insertTest(helper_name='checkAttributeID', model='a=2;a*3')
+ at insertTest(helper_name='checkAttributeID', model='1')
+ at insertTest(helper_name='checkAttributeID', model='eval:1')
+class EvaluationFactoryTestCase(unittest.TestCase):
+    fragments = ['#', '#label', '#units']
+
+    def setUp(self):
+        self.f = taurus.Factory('eval')
+
+    def convert2oldstyle(self, fragment):
+        if fragment == '#':
+            return '?configuration'
+        return re.sub("#(?=.+)", "?configuration=", fragment)
+
+    def checkAttributeID(self, model, oldstyle=False):
+        '''Helper for test the attributes (by ID) when some different models
+        of the same attribute are given (adding fragments in the models)
+        '''
+        attr = self.f.getAttribute(model)
+        for fragment in self.fragments:
+            if oldstyle:
+                fragment = self.convert2oldstyle(fragment)
+            attr2 = self.f.getAttribute(model + fragment)
+            msg = '%s and %s has different id' % (attr.getFullName(),
+                                                  attr2.getFullName())
+            self.assertTrue(id(attr) == id(attr2), msg)
+
+    def checkAttributeName(self, model, oldstyle=False):
+        '''Helper for test the attribute names of the same attribute
+        with different models (adding fragments in the models)
+        '''
+        attr = self.f.getAttribute(model)
+        for fragment in self.fragments:
+            if oldstyle:
+                fragment = self.convert2oldstyle(fragment)
+            attr2 = self.f.getAttribute(model + fragment)
+            msg = '%s and %s has different ' % (attr.getFullName(),
+                                                attr2.getFullName())
+            self.assertTrue(attr.getFullName() == attr2.getFullName(),
+                            msg + "fullname")
+            self.assertTrue(attr.getNormalName() == attr2.getNormalName(),
+                            msg + "normalname")
+            self.assertTrue(attr.getSimpleName() == attr2.getSimpleName(),
+                            msg + "simplename")
diff --git a/lib/taurus/core/evaluation/test/test_evalvalidator.py b/lib/taurus/core/evaluation/test/test_evalvalidator.py
new file mode 100644
index 0000000..3cae2df
--- /dev/null
+++ b/lib/taurus/core/evaluation/test/test_evalvalidator.py
@@ -0,0 +1,362 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core.evaluation.test.test_evalvalidator..."""
+
+
+__docformat__ = 'restructuredtext'
+
+import taurus
+from taurus.external import unittest
+from taurus.core.test import (valid, invalid, names,
+                              AbstractNameValidatorTestCase)
+from taurus.core.evaluation.evalvalidator import (EvaluationAuthorityNameValidator,
+                                                  EvaluationDeviceNameValidator,
+                                                  EvaluationAttributeNameValidator)
+
+try:
+    authority = taurus.Factory('tango').getAuthority()
+    default_tango_authority = authority.getSimpleName()
+    reason = None
+except:
+    default_tango_authority = None
+    reason = "Tango scheme is not available"
+#=========================================================================
+# Tests for Eval Authority  name validation
+#=========================================================================
+
+
+ at valid(name='eval://localhost')
+ at invalid(name='eval://foo:10000')
+ at invalid(name='eval://user@foo:10000')
+ at invalid(name='eval://user@localhost')
+ at invalid(name='eval://localhost/')
+ at invalid(name='eval://localhost/?')
+ at invalid(name='eval:foo')
+ at valid(name='eval://db=foo', strict=False)
+ at invalid(name='eval://db=foo', strict=True)
+ at valid(name='//db=foo', strict=False)  # using implicit scheme!
+ at names(name='eval://localhost',
+       out=('eval://localhost', '//localhost', 'localhost'))
+ at names(name='//localhost',  # using implicit scheme!
+       out=('eval://localhost', '//localhost', 'localhost'))
+class EvaluationAuthValidatorTestCase(AbstractNameValidatorTestCase,
+                                      unittest.TestCase):
+    validator = EvaluationAuthorityNameValidator
+
+
+#=========================================================================
+# Tests for Eval Device name validation
+#=========================================================================
+ at invalid(name='eval:foo')
+ at valid(name='eval:@foo')
+ at valid(name='eval:@mymod.Myclass', groups={'devname': '@mymod.Myclass'})
+ at valid(name='eval:@mymod.mysubmod.Myclass')
+ at valid(name='eval:/@foo', groups={'devname': '@foo', 'path': '/@foo'})
+ at valid(name='eval://localhost/@foo')
+ at valid(name='eval:@ foo', groups={'devname': '@ foo'})
+ at invalid(name='eval:@foo?')
+ at valid(name='eval://dev=foo', strict=False)
+ at valid(name='eval://db=localhost;dev=foo', strict=False)
+ at invalid(name='eval://@foo', strict=False)
+ at invalid(name='eval://db=localhost;@foo', strict=False)
+ at invalid(name='eval://localhost;dev=foo', strict=False)
+ at valid(name='eval:@foo')
+ at invalid(name='eval://a/b', strict=True)
+ at invalid(name='eval://d')
+ at names(name='eval://localhost/@foo',
+       out=('eval://localhost/@foo', '@foo', 'foo'))
+ at names(name='eval://dev=foo',
+       out=('eval://localhost/@foo', '@foo', 'foo'))
+class EvaluationDevValidatorTestCase(AbstractNameValidatorTestCase,
+                                     unittest.TestCase):
+    validator = EvaluationDeviceNameValidator
+
+
+#=========================================================================
+# Tests for Eval Attribute name validation
+#=========================================================================
+
+ at valid(name='eval://db=localhost;dev=taurus.core.evaluation.dev_example.FreeSpaceDevice;getFreeSpace("/")/1024/1024',
+       strict=False)
+ at valid(name='eval:1')
+#=========================================================================
+# this is equivalent to "eval:1". The '/' is part of the path, but not of the
+# attrname
+ at valid(name='eval:/1', groups={'path': '/1', 'attrname': '1'})
+#=========================================================================
+ at valid(name='eval:1/')  # "1/" is wrong math, but valid as an attr name!
+ at valid(name='eval:1/3')
+ at valid(name='eval:@foo/1')
+ at valid(name='eval:@mymod.Myclass/1.2',
+       groups={'attrname': '1.2', 'devname': '@mymod.Myclass'})
+ at valid(name='eval://linspace(-1, 1, 256)',
+       groups={'attrname': 'linspace(-1, 1, 256)',
+               '_expr': 'linspace(-1, 1, 256)',
+               '_subst': None,
+               'fragment': None,
+               '__STRICT__': False,
+               'cfgkey': None}, strict=False)
+ at valid(name="eval://rand(256, 128)",
+       groups={'attrname': 'rand(256, 128)',
+               '_expr': 'rand(256, 128)',
+               '_subst': None,
+               'fragment': None,
+               '__STRICT__': False,
+               'cfgkey': None}, strict=False)
+ at valid(name="eval:rand(256, 128)",
+       groups={'attrname': 'rand(256, 128)',
+               '_expr': 'rand(256, 128)',
+               '_subst': None,
+               'fragment': None,
+               '__STRICT__': True,
+               'cfgkey': None}, strict=True)
+ at valid(name="eval:rand(256, 128)#label",
+       groups={'attrname': 'rand(256, 128)',
+               '_expr': 'rand(256, 128)',
+               '_subst': None,
+               'fragment': 'label',
+               '__STRICT__': True,
+               'cfgkey': 'label'}, strict=True)
+ at valid(name="eval:foo=10;rand(256, 128)+foo#label",
+       groups={'attrname': 'foo=10;rand(256, 128)+foo',
+               '_expr': 'rand(256, 128)+foo',
+               '_subst': 'foo=10;',
+               'fragment': 'label',
+               '__STRICT__': True,
+               'cfgkey': 'label'}, strict=True)
+ at valid(name="eval://rand(256, 128)?configuration=label",
+       groups={'attrname': 'rand(256, 128)',
+               '_expr': 'rand(256, 128)',
+               '_subst': None,
+               'query': 'configuration=label',
+               'fragment': 'label',
+               '__STRICT__': False,
+               'cfgkey': 'label'}, strict=False)
+ at valid(name="eval:foo=1;bar=2;tar=3;foo+bar+tar#label",
+       groups={'attrname': 'foo=1;bar=2;tar=3;foo+bar+tar',
+               '_expr': 'foo+bar+tar',
+               '_subst': 'foo=1;bar=2;tar=3;',
+               'query': None,
+               'fragment': 'label',
+               '__STRICT__': True,
+               'cfgkey': 'label'}, strict=True)
+ at valid(name='eval:a={eval:1#f};a+{eval:2#foo}#bar',
+       groups={'attrname': 'a={eval:1#f};a+{eval:2#foo}',
+               '_expr': 'a+{eval:2#foo}',
+               '_subst': 'a={eval:1#f};',
+               'query': None,
+               'fragment': 'bar',
+               '_evalrefs': ['eval:1#f', 'eval:2#foo'],
+               '__STRICT__': True,
+               'cfgkey': 'bar'}, strict=True)
+ at valid(name='eval:@foo/1/3')
+ at valid(name='eval:x=2;y=3;x*y')
+ at valid(name='eval:@foo/x=2;y=3;x*y')
+ at valid(name='eval:{tango:a/b/c/d}')
+ at valid(name='eval:a={tango:a/b/c/d};x=2;a*x',
+       groups={'attrname': 'a={tango:a/b/c/d};x=2;a*x',
+               '_expr': 'a*x',
+               '_subst': 'a={tango:a/b/c/d};x=2;',
+               '_evalrefs': ['tango:a/b/c/d'],
+               'fragment': None})
+ at valid(name='eval://dev=foo;1', strict=False)
+ at valid(name='eval://dev=foo;1/3', strict=False)
+ at valid(name='eval://1/3', strict=False)
+ at valid(name='eval://dev=foo;x*y?x=2;y=3', strict=False)
+ at valid(name='eval://x+y+z?x=1;y=2;z=3', strict=False)
+ at valid(name='eval://a*x?a={tango://a/b/c/d};x=2', strict=False)
+ at invalid(name='eval://dev=foo;1')
+ at invalid(name='eval://dev=foo;1/3')
+ at invalid(name='eval://1/3')
+ at invalid(name='eval://dev=foo;x*y?x=2;y=3')
+ at invalid(name='eval://x+y+z?x=1;y=2;z=3')
+ at invalid(name='eval://a*x?a={tango://a/b/c/d};x=2')
+# TODO #1 maybe we can check if the substitutions can be done
+ at valid(name='eval://configuration?configuration=1', strict=False)
+ at valid(name='eval://config?config=1', strict=False)
+ at valid(name='eval://configurationfoo?configurationfoo=1', strict=False)
+ at valid(name='eval://foo?bar=1', strict=False)  # TODO #1
+ at valid(name='eval:bar=1;foo', strict=False)  # TODO #1
+ at invalid(name='eval://?configurationfoo=1', strict=False)
+ at invalid(name='eval://?configuration=1', strict=False)
+ at valid(name='eval://1?configuration=foo1', strict=False)
+ at valid(name='eval://a?a=1?configuration=label', strict=False)
+ at valid(name='eval://a+b?a=1;b=2?configuration=label', strict=False)
+ at valid(name='eval://1?a=1?configuration=label', strict=False)
+ at valid(name='eval://1?configuration', strict=False)
+ at valid(name='eval://1?configuration=', strict=False)
+ at invalid(name='eval://@foo/1')
+ at valid(name='eval:/@foo/1', groups={'path': '/@foo/1', 'attrname': '1'})
+ at valid(name='eval:@foo/1', groups={'path': '@foo/1', 'attrname': '1'})
+# @invalid(name='eval:1#label')
+#
+# @invalid(name='eval:1?foo')
+# @invalid(name='eval:1?configuration')
+# @invalid(name='eval:1?configuration=foo')
+ at invalid(name='eval:@foo')  # invalid because is a device URI
+ at invalid(name='eval:{tango:a/b/c}')  # invalid because is a device URI
+#=========================================================================
+#
+# this should be invalid because the reference is a dev name instead of an
+# attr name. But for the moment we do not check such details...
+# #TODO: It could be implemented by using
+#        isValidName(ref, etypes=TaurusElementType.Attribute)
+#=========================================================================
+ at names(name='eval:1', out=('eval://localhost/@DefaultEvaluator/1', '1', '1'))
+ at names(name='eval:@Foo/1', out=('eval://localhost/@Foo/1', '@Foo/1', '1'))
+ at names(name='eval:a={tango:a/b/c/d};x=2;a*x',
+       out=('eval://localhost/@DefaultEvaluator/' +
+            'a={tango://%s/a/b/c/d};x=2;a*x' % default_tango_authority,
+            'a={tango:a/b/c/d};x=2;a*x',
+            'a*x'), test_skip=reason)
+ at names(name='eval:@Foo/c=1;cos(0)+c',
+       out=('eval://localhost/@Foo/c=1;cos(0)+c',
+            '@Foo/c=1;cos(0)+c',
+            'cos(0)+c'))
+ at names(name='eval:a={eval:1#f};a+{eval:2#foo}#bar',
+       out=('eval://localhost/@DefaultEvaluator/a=' +
+            '{eval://localhost/@DefaultEvaluator/1};a+' +
+            '{eval://localhost/@DefaultEvaluator/2}',
+            'a={eval:1#f};a+{eval:2#foo}',
+            'a+2'))
+ at names(name='eval:a={eval:"a"};{eval:0}*a*{eval:1+{eval:a=2;a*a}}',
+       out=('eval://localhost/@DefaultEvaluator/' +
+            'a={eval://localhost/@DefaultEvaluator/"a"};' +
+            '{eval://localhost/@DefaultEvaluator/0}*a*' +
+            '{eval://localhost/@DefaultEvaluator/1+' +
+            '{eval://localhost/@DefaultEvaluator/a=2;a*a}}',
+            'a={eval:"a"};{eval:0}*a*{eval:1+{eval:a=2;a*a}}',
+            '0*a*1+a*a'))
+ at names(name='eval:@Foo/{NonExistingAlias/foo}+5',
+       out=(None,
+            '@Foo/{NonExistingAlias/foo}+5',
+            'foo+5'))
+ at names(name='eval:{eval:1}+{eval:2}',
+       out=('eval://localhost/@DefaultEvaluator/' +
+            '{eval://localhost/@DefaultEvaluator/1}+' +
+            '{eval://localhost/@DefaultEvaluator/2}',
+            '{eval:1}+{eval:2}',
+            '1+2'))
+ at names(name='eval:{eval:{eval:foo=1;foo}}',
+       out=('eval://localhost/@DefaultEvaluator/{eval://localhost/' +
+            '@DefaultEvaluator/{eval://localhost/@DefaultEvaluator/foo=1;foo}}',
+            '{eval:{eval:foo=1;foo}}',
+            'foo'))
+ at names(name='eval:x=0;x+x-x*x/x+cos(x)-xxx*xy+yx+yxz+x+{w/x/y/x}*x*{eval:x}',
+       out=('eval://localhost/@DefaultEvaluator/' +
+            'x=0;x+x-x*x/x+cos(x)-xxx*xy+yx+yxz+x+' +
+            '{tango://%s/w/x/y/x}*x*' % default_tango_authority +
+            '{eval://localhost/@DefaultEvaluator/x}',
+            'x=0;x+x-x*x/x+cos(x)-xxx*xy+yx+yxz+x+{w/x/y/x}*x*{eval:x}',
+            'x+x-x*x/x+cos(x)-xxx*xy+yx+yxz+x+x*x*x'), test_skip=reason)
+# old syntax gets transformed into new one!
+ at names(name='eval://dev=foo;x*y?x=2;y=3',
+       out=('eval://localhost/@foo/x=2;y=3;x*y',
+            '@foo/x=2;y=3;x*y',
+            'x*y'))
+# old syntax gets transformed into new one!
+ at names(name='eval://x+x-x*x/x+cos(x)-xxx*xy+yx+yxz+x+{w/x/y/x}*x*{eval:x}?x=0',
+       out=('eval://localhost/@DefaultEvaluator/' +
+            'x=0;x+x-x*x/x+cos(x)-xxx*xy+yx+yxz+x+' +
+            '{tango://%s/w/x/y/x}*x*' % default_tango_authority +
+            '{eval://localhost/@DefaultEvaluator/x}',
+            'x=0;x+x-x*x/x+cos(x)-xxx*xy+yx+yxz+x+{w/x/y/x}*x*{eval:x}',
+            'x+x-x*x/x+cos(x)-xxx*xy+yx+yxz+x+x*x*x'), test_skip=reason)
+ at valid(name='eval:1*{eval:x=3;x}')
+ at valid(name='eval:1*{eval:2*{eval:3}}')
+ at valid(name='eval:{eval:@foo/3}')
+ at valid(name='eval:a={tango:a/b/c/d};{eval:0}+a+{eval:1+{eval:a=2;a*a}}',
+       groups={'_evalrefs': ['tango:a/b/c/d', 'eval:0', 'eval:1+{eval:a=2;a*a}']})
+ at valid(name='eval:a="{eval:0}";b={eval:1};a*b+"{eval:2}"*{eval:3}#{attr.label}',
+       groups={'_evalrefs': ['eval:1', 'eval:3']})
+ at valid(name='eval:a="{eval:1}";b={eval:1};a*b+"{eval:3}"*{eval:3}#{attr.label}',
+       groups={'_evalrefs': ['eval:1', 'eval:3']})
+ at valid(name='eval:"{eval:1}"+"{eval:1}"*{eval:1}*{eval:3}',
+       groups={'_evalrefs': ['eval:1', 'eval:3']})
+ at valid(name='eval:"{eval:1}"*{eval:1}+"{eval:1}"*{eval:3}',
+       groups={'_evalrefs': ['eval:1', 'eval:3']})
+ at valid(name='eval:{eval:1}*"{eval:1}"+"{eval:1}"*{eval:3}',
+       groups={'_evalrefs': ['eval:1', 'eval:3']})
+# invalid because of non-strict ref
+ at invalid(name='eval:1*{eval:2*{eval://3}}')
+ at valid(name='eval:1*{eval:2*{eval://3}}', strict=False)
+ at invalid(name='eval:{tango:a/b/c}')  # invalid:  ref is not an attr!
+# invalid: ref is not an attr!
+ at invalid(name='eval:{tango:a/b/c}', strict=False)
+ at valid(name='eval:{tango:a/b/c/d}')
+ at invalid(name='eval:{tango://a/b/c/d}')  # invalid because of non-strict ref
+# but valid with old syntax
+ at valid(name='eval:{tango://a/b/c/d}', strict=False)
+#=========================================================================
+# Tests for eval attribute  name validation (when passing fragment / cfgkey)
+#=========================================================================
+ at valid(name='eval:1#')
+ at valid(name='eval:1#units', groups={'fragment': 'units'})
+ at valid(name='eval:{tango:a/b/c/d}*2#')
+ at valid(name='eval:{tango:a/b/c/d}*2#label')
+ at valid(name='eval:k=2;a={tango:a/b/c/d};a*k#units')
+ at valid(name='eval://localhost/@Foo/k=2;a={eval:1};a*k#label')
+ at valid(name='eval://localhost/@mymod.MyEvalClass/1#label')
+ at invalid(name='eval:1# ')  # invalid because of the trailing space
+ at names(name='eval:1#units',
+       out=('eval://localhost/@DefaultEvaluator/1',
+            '1',
+            '1', 'units'))
+ at names(name='eval:@Foo/a={tango:a/b/c/d};x=2;a*x#',
+       out=('eval://localhost/@Foo/a={tango://%s/a/b/c/d};x=2;a*x' %
+            default_tango_authority,
+            '@Foo/a={tango:a/b/c/d};x=2;a*x',
+            'a*x', ''), test_skip=reason)
+# old syntax gets transformed into new one!
+ at names(name='eval://1?configuration=units',
+       out=('eval://localhost/@DefaultEvaluator/1',
+            '1',
+            '1', 'units'))
+# old syntax gets transformed into new one!
+ at names(name='eval://dev=Foo;a*x?a={tango:a/b/c/d};x=2?configuration',
+       out=('eval://localhost/@Foo/a={tango://%s/a/b/c/d};x=2;a*x' %
+            default_tango_authority,
+            '@Foo/a={tango:a/b/c/d};x=2;a*x',
+            'a*x', None), test_skip=reason)
+# old syntax gets transformed into new one!
+ at names(name='eval://dev=Foo;a*x?a={tango:a/b/c/d};x=2?configuration=',
+       out=('eval://localhost/@Foo/a={tango://%s/a/b/c/d};x=2;a*x' %
+            default_tango_authority,
+            '@Foo/a={tango:a/b/c/d};x=2;a*x',
+            'a*x', ''), test_skip=reason)
+# old syntax gets transformed into new one!
+ at names(name='eval://dev=Foo;a*x?a={tango:a/b/c/d};x=2?configuration=label',
+       out=('eval://localhost/@Foo/a={tango://%s/a/b/c/d};x=2;a*x' %
+            default_tango_authority,
+            '@Foo/a={tango:a/b/c/d};x=2;a*x',
+            'a*x', 'label'), test_skip=reason)
+class EvaluationAttrValidatorTestCase(AbstractNameValidatorTestCase,
+                                      unittest.TestCase):
+    validator = EvaluationAttributeNameValidator
+
+
+if __name__ == '__main__':
+    pass
diff --git a/lib/taurus/core/init_bkcomp.py b/lib/taurus/core/init_bkcomp.py
index 97003c3..72777df 100644
--- a/lib/taurus/core/init_bkcomp.py
+++ b/lib/taurus/core/init_bkcomp.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -28,7 +28,8 @@
 __docformat__ = "restructuredtext"
 
 import release as Release
-#from .enums import * #note: all the enums from enums.py were moved to taurusbasetypes.py
+# from .enums import * #note: all the enums from enums.py were moved to
+# taurusbasetypes.py
 from .taurusbasetypes import *
 from .taurusexception import *
 from .taurusmodel import *
@@ -36,7 +37,7 @@ from .tauruslistener import *
 from .taurusdevice import *
 from .taurusattribute import *
 from .taurusconfiguration import *
-from .taurusdatabase import *
+from .taurusauthority import *
 from .taurusfactory import *
 from .taurusmanager import *
 from .taurusoperation import *
@@ -48,4 +49,3 @@ try:
     from .tauv1 import *
 except:
     pass
-
diff --git a/lib/taurus/core/init_lightweight.py b/lib/taurus/core/init_lightweight.py
index 5f58b67..d76799c 100644
--- a/lib/taurus/core/init_lightweight.py
+++ b/lib/taurus/core/init_lightweight.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,7 +35,7 @@ from .taurusbasetypes import *
 # from .taurusdevice import *
 # from .taurusattribute import *
 # from .taurusconfiguration import *
-# from .taurusdatabase import *
+# from .taurusauthority import *
 # from .taurusfactory import *
 # from .taurusmanager import *
 # from .taurusoperation import *
diff --git a/lib/taurus/core/release.py b/lib/taurus/core/release.py
index 03639ba..df9a09c 100644
--- a/lib/taurus/core/release.py
+++ b/lib/taurus/core/release.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -42,7 +42,6 @@ Release data for the taurus project. It contains the following members:
 # -*- coding: utf-8 -*-
 
 
-
 # Name of the package for release purposes.  This is the name which labels
 # the tarballs and RPMs made by distutils, so it's best to lowercase it.
 name = 'taurus'
@@ -53,28 +52,29 @@ name = 'taurus'
 # bdist_deb does not accept underscores (a Debian convention).
 
 
-version_info = (3,7,0,'rc',0)
+version_info = (4, 0, 1, '', 0)
 version = '.'.join(map(str, version_info[:3]))
 revision = str(version_info[4])
 
 description = "A framework for scientific/industrial CLIs and GUIs"
 
-long_description = """Taurus is a python framework for control and data 
-acquisition CLIs and GUIs in scientific/industrial environments. 
-It supports multiple control systems or data sources: Tango, EPICS, spec... 
+long_description = """Taurus is a python framework for control and data
+acquisition CLIs and GUIs in scientific/industrial environments.
+It supports multiple control systems or data sources: Tango, EPICS, spec...
 New control system libraries can be integrated through plugins."""
 
 license = 'LGPL'
 
-authors = {'Tiago'          : ('Tiago Coutinho','tiago.coutinho at esrf.fr'),
-           'Pascual-Izarra' : ('Carlos Pascual-Izarra','cpascual at cells.es'),
-           'Reszela'        : ('Zbigniew Reszela','zreszela at cells.es') }
-            
+authors = {'Tiago_et_al': ('Tiago Coutinho et al.', ''),
+           'Community': ('Taurus Community',
+                         'tauruslib-devel at lists.sourceforge.net'),
+           }
+
 
 url = 'http://www.taurus-scada.org'
 
 download_url = 'http://pypi.python.org/packages/source/t/taurus'
 
-platforms = ['Linux','Windows XP/2000/NT','Windows 95/98/ME']
+platforms = ['Linux', 'Windows']
 
-keywords = ['CLI', 'GUI', 'PyTango', 'Tango', 'Shell']
+keywords = ['CLI', 'GUI', 'PyTango', 'Tango', 'Shell', 'Epics']
diff --git a/lib/taurus/core/resource/__init__.py b/lib/taurus/core/resource/__init__.py
index 795eb7e..7dcd15e 100644
--- a/lib/taurus/core/resource/__init__.py
+++ b/lib/taurus/core/resource/__init__.py
@@ -2,94 +2,102 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
 .. currentmodule:: taurus.core.resource
 
-Resource extension for taurus core mode.
-The resource extension is a special extension that acts like a name dictionary
-for actual model names. The official scheme names are 'res' and 'resource'. You
-can used both of them indiferently.
-
-The resources module of taurus will read one or more resources (usualy files) 
-which should contain a dictionary where the keys are resource alias and the values
-are the actual model names.
+Resource scheme extension for taurus core mode.
+The resource extension is a special extension that acts like a name map
+for actual model names.
 
-The main class for the extension module is :class:`ResourcesFactory`.
+This allows to indirect the hardcoded model names of your application and keep
+the actual specific model names grouped in one place for better portability and
+reusability of your application.
 
-By default, the :class:`ResourcesFactory` will use a resource 
-file called 'taurus_resources.py'. It will search for this file in the application
-directory.
+The scheme name is 'res'. The map can be implemented either as python
+modules or as dicts (see below).
 
-You can add additional resources with the method :meth:`ResourcesFactory.loadResource`.
+The main class for the extension module is :class:`ResourcesFactory` and
+you can add resource maps with :meth:`ResourcesFactory.loadResource`.
 
-What is a resource
-------------------
+By default, the :class:`ResourcesFactory` will always try to load a resource
+module named 'taurus_resources' from the application directory (so
+you can create a file called `taurus_resources.py` in your application directory
+and skip the step of calling :meth:`ResourcesFactory.loadResource`.
 
-A resource can be a python file or a simple python dictionary<str,str>. Below there 
-is an example of how register a python dictionary as a resource.
 
-Python resource files
-~~~~~~~~~~~~~~~~~~~~~
+Mapping implemented as python modules
+-------------------------------------
 
-If a resource is a python file, the factory will recognize resource keys as global
-variables. The resource value will be the variable value which must be a string.
-For example, the contents of a python resource file could be something like::
+If a resource is a python module, the factory will use its global variables as
+the resource keys. The variable value, which must be a string will be used as
+the mapped model. For example, if the `taurus_resources.py` file in
+the application directory contains the following definitions::
 
-    my_device = 'my/tango/device'
+    my_device = 'tango:a/b/c'
     my_state = my_device + '/state'
 
-Afterward, in your code, you could access the Device and Attribute objects by doing::
+Then, in your code, you can access the Device and Attribute objects by doing::
 
     >>> import taurus
-    >>> my_device_obj = taurus.Device('res://my_device')
-    >>> my_state_obj = taurus.Attribute('res://my_state')
-
-The advantage of this is that you can design an application that is independent 
-on the real device names.
+    >>> my_device_obj = taurus.Device('res:my_device')
+    >>> my_state_obj = taurus.Attribute('res:my_state')
 
-Note that nothing prevents you from placing any python code in the python resource file.
-This means you can have a script that simplifies the contents of the file. Example::
+Note that you can use python code to automate the contents of the module.
+Example::
 
     base = 'my/motor/'
     g = globals()
-    
+
     for i in xrange(256):
         i_str = str(i)
         g['mym"+i_str] = base + i_str
 
-Dictionary resources
-~~~~~~~~~~~~~~~~~~~~
+Mapping implemented as dictionaries
+-----------------------------------
 
-Instead of having a complete resource file you can also register a dictionary
-as a resource::
+Dictionaries can also be registered (as an alternative to modules) as resource
+maps::
 
-    >>> d = { 'my_device' : 'my/tango/device', 'my_state' = 'my/tango/device/state' }
+    >>> d = {'my_device':'tango:a/b/c', 'my_state':'tango:a/b/c/state'}
     >>> import taurus
     >>> factory = taurus.Factory('res')
     >>> factory.loadResource(d)
-    >>> my_device_obj = taurus.Device('res://my_device')
-    >>> my_state_obj = taurus.Attribute('res://my_state')
+    >>> my_device_obj = taurus.Device('res:my_device')
+    >>> my_state_obj = taurus.Attribute('res:my_state')
+
+Note: for coherence with the file mapping, valid key names are restricted to
+valid variable names (i.e. to the following regexp: `[a-zA-Z_][a-zA-Z0-9_]*`
+
+Important: Models object type is the mapped type
+-------------------------------------------------
+
+The model objects returned by the :class:`ResourcesFactory` will be of the
+mapped model type. In other words: if the model name 'eval:Q(rand())' is
+mapped to the `myattr` resource name, calling `taurus.Attribute('res:myattr')`
+will return a :class:`EvaluationAttribute`, not a `ResAttribute` (`ResAttribute`
+is not even defined).
+
 """
 
-from resfactory import *
\ No newline at end of file
+from resfactory import *
diff --git a/lib/taurus/core/resource/resfactory.py b/lib/taurus/core/resource/resfactory.py
index c280644..48d714f 100644
--- a/lib/taurus/core/resource/resfactory.py
+++ b/lib/taurus/core/resource/resfactory.py
@@ -2,65 +2,56 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-simfactory.py: 
+resfactory.py:
 """
 
-import os, imp, operator, types
+import os
+import imp
+import operator
+import types
 
-from taurus import Factory, Database, Manager
-from taurus.core.taurusexception import TaurusException
-from taurus.core.taurusbasetypes import OperationMode, MatchLevel, \
-    TaurusAttrValue, TaurusEventType
+from taurus.core.taurushelper import Manager
 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):
-        self.__mod = mod
+from taurus.core.taurusexception import TaurusException
 
-    def __getitem__(self, name):
-        return self.__mod.__getattribute__(name)
 
 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' 
+    #: the list of schemes that this factory supports. For this factory: 'res'
     #: and 'resources' are the supported schemes
     schemes = ("res", "resource",)
-    
+
     #: the default resource file name
     DftResourceName = 'taurus_resources.py'
-    
+
     #: priority for the default resource
     DftResourcePriority = 10
-    
+
     def __init__(self):
         """ Initialization. Nothing to be done here for now."""
         pass
@@ -71,38 +62,45 @@ class ResourcesFactory(Singleton, TaurusFactory, Logger):
         name = self.__class__.__name__
         self.call__init__(Logger, name)
         self.call__init__(TaurusFactory)
-        
+        self.clear()
+
+    def clear(self):
         self._resource_map = {}
         self._resource_priority = {}
         self._resource_priority_keys = []
         self._resource_count = 0
-        
+
     def reloadResource(self, obj=None, priority=1, name=None):
         """(Re)Loads the given resource.
-           
-           :param obj: (dict or file or None) the resource object. Default is 
-                       None meaning in will (re)load the default resource: 
+
+           :param obj: (dict or file or None) the resource object. Default is
+                       None meaning in will (re)load the default resource:
                        taurus_resources.py from the application directory
-           :param priority: (int) the resource priority. Default is 1 meaning 
+           :param priority: (int) the resource priority. Default is 1 meaning
                             maximum priority
            :param name: (str) an optional name to give to the resource
-           
+
            :return: (dict) a dictionary version of the given resource object
         """
+        if priority < 1:
+            raise ValueError('priority must be >=1')
         if operator.isMappingType(obj):
             name = name or 'DICT%02d' % priority
         elif type(obj) in types.StringTypes or obj is None:
-            name, obj = self.__reloadResource(obj)
-            obj = ModuleDict(obj)
+            name, mod = self.__reloadResource(obj)
+            obj = {}
+            for k, v in mod.__dict__.items():
+                if not k.startswith('_') and isinstance(v, basestring):
+                    obj[k] = v
         else:
             raise TypeError
-        
+
         if self._resource_map.get(name) is None:
             self._resource_count += 1
         self._resource_map[name] = obj
         if self._resource_count == 1:
             self._first_resource = obj
-    
+
         pl = self._resource_priority.get(priority)
         if pl is None:
             self._resource_priority[priority] = pl = []
@@ -110,17 +108,18 @@ class ResourcesFactory(Singleton, TaurusFactory, Logger):
         self._resource_priority_keys = self._resource_priority.keys()
         self._resource_priority_keys.sort()
         return obj
-        
+
     loadResource = reloadResource
     loadResource.__doc__ = reloadResource.__doc__
-    
+
     def __reloadResource(self, name=None):
         path = os.path.curdir
         if name is None:
             file_name = ResourcesFactory.DftResourceName
         else:
             path, file_name = os.path.split(name)
-            if not path: path = os.path.curdir
+            if not path:
+                path = os.path.curdir
         path = os.path.abspath(path)
 
         full_name = os.path.join(path, file_name)
@@ -129,149 +128,133 @@ class ResourcesFactory(Singleton, TaurusFactory, Logger):
             raise ImportError
 
         module_name, ext = os.path.splitext(file_name)
-        
-        m, file = None, None
+
+        m, file_ = None, None
         try:
-            file, pathname, desc = imp.find_module(module_name, [path])
+            file_, pathname, desc = imp.find_module(module_name, [path])
             self.info("(re)loading resource %s", pathname)
-            m = imp.load_module(module_name, file, pathname, desc)
-            if file: file.close()
+            m = imp.load_module(module_name, file_, pathname, desc)
+            if file_:
+                file_.close()
         except Exception, e:
-            if file: file.close()
+            if file_:
+                file_.close()
             raise e
-        
+
         if m is None:
             self.warning("failed to (re)load resource %s" % module_name)
             raise ImportError
-        
+
         return full_name, m
-    
-    def __get(self, alias):
+
+    def getValue(self, key):
+        """Returns the value for a given key
+
+           :param key: (str) a key
+
+           :return: (str) the value for the given key
+        """
         if self._resource_count == 0:
-            self.reloadResource(priority = ResourcesFactory.DftResourcePriority)
-        
+            try:
+                self.reloadResource(priority=self.DftResourcePriority)
+            except:
+                return None
+
         # optimization: many applications contain only one resource: in that
         # case avoid the loop
         if self._resource_count == 1:
-            return self._first_resource[alias]
-            
+            return self._first_resource.get(key, None)
+
         for p in self._resource_priority_keys:
             for resource_name in self._resource_priority[p]:
                 resource = self._resource_map[resource_name]
-                try: return resource[alias]
-                except: pass
-    
-    def __splitResourceName(self, alias):
-        for i, c in enumerate(alias):
-            if not c.isalnum():
-                return i, c, alias.split(c, 1)
-        return None, '', [alias]
-    
-    def __splitScheme(self, alias):
-        try:
-            i = alias.index('://')
-            return alias[:i], alias[i+3:]
-        except:
-            return '', alias
-    
-    def getValue(self, key):
-        """Returns the value for a given key
-           
-           :param key: (str) a key
-           
-           :return: (str) the value for the given key
-        """
-        alias = self.__splitScheme(key)
-        if alias[0] and not alias[0] in ResourcesFactory.schemes:
-            return None
-        i, c, alias = self.__splitResourceName(alias[1])
-        alias[0] = self.__get(alias[0]) or ''
-        return c.join(alias)
-    
+                try:
+                    return resource[key]
+                except:
+                    pass
+
     def findObjectClass(self, absolute_name):
         """
         Obtain the class object corresponding to the given name.
-           
+
         :param absolute_name: (str) the object absolute name string
 
-        :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.
+        :return: (taurus.core.taurusmodel.TaurusModel or None) the class
+                 for the model object mapped by absolute_name, or None if
+                 absolute_name is invalid.
         """
-        objType = None
+        validators = (self.getAttributeNameValidator(),
+                      self.getDeviceNameValidator(),
+                      self.getAuthorityNameValidator())
 
-        return objType
+        for v in validators:
+            try:
+                value = self.getValue(
+                    v.getUriGroups(absolute_name)['_resname'])
+                return Manager().findObjectClass(value)
+            except:
+                pass
+        return None
 
-    def getDatabase(self, alias=None):
+    def getAuthority(self, name=None):
         """
-        Obtain the object corresponding to the given database name or the 
-        default database if db_name is None.
-        If the corresponding database object already exists, the existing 
-        instance is returned. Otherwise a new instance is stored and returned.
-           
-        :param alias: (str) database name string alias. If None, the 
-                     default database is used
-                           
-        :return: (taurus.core.taurusdatabase.TaurusDatabase) database object
-        :raise: (NameError) if the alias does not exist
-        :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
+        Obtain the authority model object referenced by name.
+
+        :param name: (str) name
+
+        :return: (taurus.core.taurusauthority.TaurusAuthority) authority object
+        :raise: (taurus.core.taurusexception.TaurusException) if name is invalid
         """
-        if alias is None:
-            return Database()
-        
-        alias = self.getValue(alias)
-        if not alias:
-            raise NameError(alias)
-        
-        return Manager().getDatabase(alias)
-
-    def getDevice(self, alias):
+        groups = self.getAuthorityNameValidator().getUriGroups(name)
+        if groups is None:
+            raise TaurusException('Invalid name "%s"' % name)
+        res_name = groups['_resname']
+        value = self.getValue(res_name)
+        return Manager().getAuthority(value)
+
+    def getDevice(self, name):
         """
-        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 alias: device name string alias.
-        
+        Obtain the device model object referenced by name.
+
+        :param name: (str) name
+
         :return: (taurus.core.taurusdevice.TaurusDevice) device object
-        :raise: (NameError) if the alias does not exist
-        :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
+        :raise: (taurus.core.taurusexception.TaurusException) if name is invalid
         """
-        alias = self.getValue(alias)
-        if not alias:
-            raise NameError(alias)
-        return Manager().getDevice(alias)
-        
-    def getAttribute(self, alias):
+        groups = self.getDeviceNameValidator().getUriGroups(name)
+        if groups is None:
+            raise TaurusException('Invalid name "%s"' % name)
+        res_name = groups['_resname']
+        value = self.getValue(res_name)
+        return Manager().getDevice(value)
+
+    def getAttribute(self, name):
         """
-        Obtain the object corresponding to the given attribute name.
-        If the corresponding attribute already exists, the existing instance
-        is returned. Otherwise a new instance is stored and returned.
+        Obtain the attribute model object referenced by name.
+
+        :param name: (str) name
 
-        :param alias: (str) attribute name string alias
-             
         :return: (taurus.core.taurusattribute.TaurusAttribute) attribute object
-        :raise: (NameError) if the alias does not exist
-        :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
+        :raise: (taurus.core.taurusexception.TaurusException) if name is invalid
         """
-        alias = self.getValue(alias)
-        if not alias:
-            raise NameError(alias)
-        return Manager().getAttribute(alias)
+        groups = self.getAttributeNameValidator().getUriGroups(name)
+        if groups is None:
+            raise TaurusException('Invalid name "%s"' % name)
+        res_name = groups['_resname']
+        value = self.getValue(res_name)
+        return Manager().getAttribute(value)
 
-    def getConfiguration(self, alias):
-        """
-        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 alias: (str) configuration name string alias
-             
-        :return: (taurus.core.taurusconfiguration.TaurusConfiguration) configuration object
-        :raise: (NameError) if the alias does not exist
-        :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
-        """
-        alias = self.getValue(alias)
-        if not alias:
-            raise NameError(alias)
-        return Manager().getConfiguration(alias)
+    def getAuthorityNameValidator(self):
+        """Return ResourceAuthorityNameValidator"""
+        import resvalidator
+        return resvalidator.ResourceAuthorityNameValidator()
+
+    def getDeviceNameValidator(self):
+        """Return ResourceDeviceNameValidator"""
+        import resvalidator
+        return resvalidator.ResourceDeviceNameValidator()
 
+    def getAttributeNameValidator(self):
+        """Return ResourceAttributeNameValidator"""
+        import resvalidator
+        return resvalidator.ResourceAttributeNameValidator()
diff --git a/lib/taurus/core/resource/resvalidator.py b/lib/taurus/core/resource/resvalidator.py
new file mode 100644
index 0000000..3eeed3d
--- /dev/null
+++ b/lib/taurus/core/resource/resvalidator.py
@@ -0,0 +1,163 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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__ = ['ResDeviceNameValidator',
+           'ResAttributeNameValidator']
+
+from taurus.core import TaurusElementType
+from taurus.core.taurusvalidator import (TaurusAttributeNameValidator,
+                                         TaurusDeviceNameValidator,
+                                         TaurusAuthorityNameValidator)
+from taurus.core.taurushelper import getSchemeFromName, Factory
+
+
+# Pattern for python variables
+PY_VAR = r'(?<![\.a-zA-Z0-9_])[a-zA-Z_][a-zA-Z0-9_]*'
+
+
+class _ResNameValidator(object):
+    """
+    Abstract class for all Res validators. Res Name validators should inherit
+    first from it and then from the TaurusXXXNameValidator to give its methods
+    highest precedence according to the python MRO
+    """
+    scheme = 'res'
+    authority = '(?!)'
+    path = r'(?P<_resname>%s)' % PY_VAR
+    query = '(?!)'
+    fragment = '(?!)'
+
+    pattern = r'^(?P<scheme>%(scheme)s):' + \
+              r'((?P<authority>%(authority)s)(?=/))?' + \
+              r'(?P<path>%(path)s)' + \
+              r'(\?(?P<query>%(query)s))?' + \
+              r'(#(?P<fragment>%(fragment)s))?$'
+
+    _elementType = None
+
+    def _getValueValidator(self, name):
+        """Return the name validator for the mapped model name scheme
+
+        :param name: (str) resource name
+        :return: A specific TaurusValidator
+        """
+        scheme = getSchemeFromName(name)
+        f = Factory(scheme)
+        if self._elementType == TaurusElementType.Attribute:
+            return f.getAttributeNameValidator()
+        elif self._elementType == TaurusElementType.Device:
+            return f.getDeviceNameValidator()
+        elif self._elementType == TaurusElementType.Authority:
+            return f.getAuthorityNameValidator()
+        else:
+            msg = '_elementType must be one of (Authority, Device, Attribute)'
+            raise Exception(msg)
+
+    def _getKey(self, name):
+
+        if self._elementType == TaurusElementType.Attribute:
+            g = TaurusAttributeNameValidator.getUriGroups(self, name)
+        elif self._elementType == TaurusElementType.Device:
+            g = TaurusDeviceNameValidator.getUriGroups(self, name)
+        elif self._elementType == TaurusElementType.Authority:
+            g = TaurusAuthorityNameValidator.getUriGroups(self, name)
+        else:
+            msg = '_elementType must be one of (Authority, Device, Attribute)'
+            raise Exception(msg)
+        if g is None:
+            return None
+        else:
+            return g['_resname']
+
+    def _getValue(self, key):
+        return Factory('res').getValue(key)
+
+    def isValid(self, name, *args, **kwargs):
+        """Checks validity of the key (resname) and also of the value
+        (model name)"""
+        key = self._getKey(name)
+        if key is None:
+            return False
+        value = self._getValue(key)
+        if value is None:
+            return False
+        v = self._getValueValidator(value)
+        return v.isValid(value, *args, **kwargs)
+
+    def getUriGroups(self, name, *args, **kwargs):
+        """Returns the groups for the value extended with '_resname'"""
+        key = self._getKey(name)
+        if key is None:
+            return None
+        value = self._getValue(key)
+        if value is None:
+            return None
+        v = self._getValueValidator(value)
+        ret = v.getUriGroups(value, *args, **kwargs)
+        if ret is None:
+            return None
+        ret['_resname'] = key
+        return ret
+
+    def getNames(self, name, *args, **kwargs):
+        """Returns the names of the value"""
+        key = self._getKey(name)
+        if key is None:
+            return None
+        value = self._getValue(key)
+        if value is None:
+            return None
+        return self._getValueValidator(value).getNames(value, *args, **kwargs)
+
+
+class ResourceAuthorityNameValidator(_ResNameValidator,
+                                     TaurusAuthorityNameValidator):
+    """Validator for res authority names. Apart from the named related to the
+    mapped model value, the following named groups are created:
+
+     - _resname: resource name (aka key)
+    """
+    # authority = r'(?P<_resname>%s)' % PY_VAR
+    # path = '(?!)'
+    _elementType = TaurusElementType.Authority
+
+
+class ResourceDeviceNameValidator(_ResNameValidator,
+                                  TaurusDeviceNameValidator):
+    """Validator for res device names. Apart from the named related to the
+    mapped model value, the following named groups are created:
+
+     - _resname: resource name (aka key)
+    """
+    _elementType = TaurusElementType.Device
+
+
+class ResourceAttributeNameValidator(_ResNameValidator,
+                                     TaurusAttributeNameValidator):
+    """Validator for res attribute names. Apart from the named related to the
+    mapped model value, the following named groups are created:
+
+     - _resname: resource name (aka key)
+    """
+    _elementType = TaurusElementType.Attribute
diff --git a/lib/taurus/core/resource/test/__init__.py b/lib/taurus/core/resource/test/__init__.py
new file mode 100644
index 0000000..b5a5672
--- /dev/null
+++ b/lib/taurus/core/resource/test/__init__.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
diff --git a/lib/taurus/core/simulation/__taurus_plugin__ b/lib/taurus/core/resource/test/res/__init__.py
old mode 100644
new mode 100755
similarity index 100%
rename from lib/taurus/core/simulation/__taurus_plugin__
rename to lib/taurus/core/resource/test/res/__init__.py
diff --git a/lib/taurus/core/resource/test/res/attr_resources_file.py b/lib/taurus/core/resource/test/res/attr_resources_file.py
new file mode 100755
index 0000000..0db7a6e
--- /dev/null
+++ b/lib/taurus/core/resource/test/res/attr_resources_file.py
@@ -0,0 +1,11 @@
+MyAttr = 'eval:1'
+My_Attr = 'eval:foo=1;bar=2;foo+bar'
+attr_1 = 'tango:a/b/c/d'
+attr_2 = 'a/b/c/d'
+attr1 = 'eval:"Hello_World!!"'
+foo = 'eval:/@Foo/True'
+# 1foo = 'eval:2'
+Foo = 'eval:False'
+res_attr = 'res:attr1'
+dev1 = 'tango:a/b/c'  # invalid for attribute
+dev2 = 'eval:@foo'   # invalid for attribute
diff --git a/lib/taurus/core/resource/test/test_resfactory.py b/lib/taurus/core/resource/test/test_resfactory.py
new file mode 100755
index 0000000..7ab47b7
--- /dev/null
+++ b/lib/taurus/core/resource/test/test_resfactory.py
@@ -0,0 +1,222 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core.resource.test.test_resfactory..."""
+__all__ = ["ResourceFactoryTestCase"]
+
+import os.path as osp
+import taurus
+from taurus.test import insertTest
+from taurus.external import unittest
+from taurus.core.resource.resfactory import ResourcesFactory
+
+
+attr_dict1 = {'attr_1': 'eval:1',
+              'attr_2': 'eval:2',
+              'attr_3': 'eval:3'
+              }
+
+attr_dict2 = {'attr_3': 'eval:4',
+              'attr_4': 'eval:5',
+              'attr_5': 'eval:6'
+              }
+
+attr_dict3 = {'attr_3': 'tango://foo:10000/a/b/c/d',
+              'attr_4': 'tango:motor1/position',
+              'attr_5': 'tango:a/b/c/d'
+              }
+
+attr_dict4 = {'attr_6': 'eval:7',
+              'attr_7': 'res:attr_1',
+              'attr_8': 'tango:a/b/c/d',
+              'attr_9': 'res:attr_10',
+              'attr_10': 'eval:8'
+              }
+
+dev_dict1 = {'dev_1': 'eval:@foo',
+             'dev_2': 'tango://foo:10000/a/b/c',
+             'dev_3': 'tango://a/b/c',
+             'dev_4': 'eval://@mydev'
+             }
+
+auth_dict1 = {'auth_1': 'foo:10000',
+              'auth_2': 'tango://foo:10000',
+              'auth_3': 'eval://localhost'
+              }
+
+file_name1 = osp.join(osp.dirname(osp.abspath(__file__)),
+                      'res', 'attr_resources_file.py')
+print file_name1
+
+# TODO: the same key can be defined in different dictionaries (with different
+# priority) but getValue method can not access to the less priority values in
+# case of redundancies.
+
+
+# ==============================================================================
+# GetValue
+# TODO: Load resources from a file does not seem to work
+ at insertTest(helper_name='getValue',
+            resources=[(file_name1, 1)], key='dev1',
+            expected_value='tango:a/b/c'
+            )
+ at insertTest(helper_name='getValue',
+            resources=[(file_name1, 1)], key='attr_2',
+            expected_value='a/b/c/d'
+            )
+ at insertTest(helper_name='getValue',
+            resources=[(attr_dict1, 1)], key='attr_1',
+            expected_value='eval:1'
+            )
+# Add the same attribute twice but with different priority
+ at insertTest(helper_name='getValue',
+            resources=[(attr_dict1, 1), (attr_dict2, 2)], key='attr_3',
+            expected_value='eval:3'
+            )
+ at insertTest(helper_name='getValue',
+            resources=[(attr_dict1, 3), (attr_dict2, 2)], key='attr_3',
+            expected_value='eval:4'
+            )
+# Add the same attribute twice but with the same priority:
+# The last resources dict set the final values. (Overwriting the existing ones)
+ at insertTest(helper_name='getValue',
+            resources=[(attr_dict1, 5), (attr_dict2, 5)], key='attr_3',
+            expected_value='eval:4'
+            )
+ at insertTest(helper_name='getValue',
+            resources=[(attr_dict1, 3), (dev_dict1, 3)], key='attr_3',
+            expected_value=None
+            )
+ at insertTest(helper_name='getValue',
+            resources=[(attr_dict4, 2), (attr_dict2, 3)], key='attr_3',
+            expected_value='eval:4'
+            )
+ at insertTest(helper_name='getValue',
+            resources=[(attr_dict4, 8), (attr_dict2, 9)], key='attr_8',
+            expected_value='tango:a/b/c/d'
+            )
+ at insertTest(helper_name='getValue',
+            resources=[(dev_dict1, 2), (attr_dict2, 9)], key='dev_2',
+            expected_value='tango://foo:10000/a/b/c'
+            )
+# ==============================================================================
+# GetAttribute
+ at insertTest(helper_name='getAttribute',
+            resources=[(attr_dict1, 3), (attr_dict2, 4)],
+            uri='res:attr_3', expected_attr_uri='eval:3'
+            )
+ at insertTest(helper_name='getAttribute',
+            resources=[(attr_dict4, 3), (attr_dict1, 1)],
+            uri='res:attr_7', expected_attr_uri='eval:1'
+            )
+ at insertTest(helper_name='getAttribute',
+            resources=[(attr_dict4, 3), (dev_dict1, 4)],
+            uri='res:attr_6', expected_attr_uri='eval:7'
+            )
+ at insertTest(helper_name='getAttribute',
+            resources=[(attr_dict1, 1), (attr_dict2, 1)],
+            uri='res:attr_3', expected_attr_uri='eval:4'
+            )
+ at insertTest(helper_name='getAttribute',
+            resources=[(attr_dict4, 1)],
+            uri='res:attr_9', expected_attr_uri='eval:8'
+            )
+# ==============================================================================
+# GetDevice
+ at insertTest(helper_name='getDevice',
+            resources=[(dev_dict1, 1)],
+            uri='res:dev_1', expected_attr_uri='eval:@foo'
+            )
+# ==============================================================================
+# GetAuthority
+ at insertTest(helper_name='getAuthority',
+            resources=[(auth_dict1, 1)],
+            uri='res:auth_3', expected_attr_uri='eval://localhost'
+            )
+class ResourceFactoryTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.resfactory = ResourcesFactory()
+        self.resfactory.clear()
+
+    def _load(self, resources):
+        """ Helper for load the resources
+        :param resources: list of tuples (map, priority)
+        """
+        for obj, priority in resources:
+            self.resfactory.loadResource(obj, priority)
+
+    def getValue(self, resources, key, expected_value):
+        """ Helper for test the resourcefactory getValue method
+        :param resources: list of tuple (map, priority)
+        :param key: name of the key
+        :param expected_value: Is the expected URI
+        """
+        self._load(resources)
+        value = self.resfactory.getValue(key)
+        msg = 'The expected value is %s, got %s' % (expected_value, value)
+        self.assertEqual(value, expected_value, msg)
+
+    def getAttribute(self, resources, uri, expected_attr_uri):
+        """ Helper for test the getAttribute method
+        :param resources: list of tuple (map, priority)
+        :param uri: res scheme uri.
+        :param expected_attr_uri: a scheme uri
+        """
+        self._load(resources)
+        expected_attr = taurus.Attribute(expected_attr_uri)
+        res_attr = self.resfactory.getAttribute(uri)
+        msg = 'Attributes are different, expected %s, got %s' % (expected_attr,
+                                                                 res_attr)
+        self.assertIs(expected_attr, res_attr, msg)
+
+    def getDevice(self, resources, uri, expected_attr_uri):
+        """ Helper for test the getDevice method
+        :param resources: list of tuple (map, priority)
+        :param uri: res scheme uri.
+        :param expected_attr_uri: a scheme uri
+        """
+        self._load(resources)
+        expected_dev = taurus.Device(expected_attr_uri)
+        res_dev = self.resfactory.getDevice(uri)
+        msg = 'Devices are different, expected %s, got %s' % (expected_dev,
+                                                              res_dev)
+        self.assertIs(expected_dev, res_dev, msg)
+
+    def getAuthority(self, resources, uri, expected_attr_uri):
+        """ Helper for test the getAuthority method
+        :param resources: list of tuple (map, priority)
+        :param uri: res scheme uri.
+        :param expected_attr_uri: a scheme uri
+        """
+        self._load(resources)
+        expected_auth = taurus.Authority(expected_attr_uri)
+        res_auth = self.resfactory.getAuthority(uri)
+        msg = 'Authorities are different, expected %s, got %s' % (expected_auth,
+                                                                  res_auth)
+        self.assertIs(expected_auth, res_auth, msg)
+
+    def tearDown(self):
+        self.resfactory.clear()
diff --git a/lib/taurus/core/resource/test/test_resvalidator.py b/lib/taurus/core/resource/test/test_resvalidator.py
new file mode 100755
index 0000000..bf0b124
--- /dev/null
+++ b/lib/taurus/core/resource/test/test_resvalidator.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core.resource.test.test_resvalidator..."""
+
+import os.path as osp
+
+import taurus
+from taurus.core.taurusexception import TaurusException
+from taurus.external import unittest
+from taurus.core.test import (valid, invalid, names,
+                              AbstractNameValidatorTestCase)
+from taurus.core.resource.resvalidator import (ResourceAuthorityNameValidator,
+                                               ResourceDeviceNameValidator,
+                                               ResourceAttributeNameValidator)
+
+
+class _AbstractResNameValidatorTestCase(AbstractNameValidatorTestCase):
+    """Abstract class for creating res validator test cases. Derived classes
+    need to provide the `res_map` dictionary class member"""
+    res_map = {}
+
+    def setUp(self):
+        unittest.TestCase.setUp(self)
+        f = taurus.Factory('res')
+        f.clear()  # make sure we use a clean res factory
+        f.loadResource(self.res_map)
+
+    def tearDown(self):
+        f = taurus.Factory('res')
+        f.clear()
+
+
+ at valid(name='res:foo02')
+ at valid(name='res:localhost')
+ at invalid(name='res:foo:10000')  # Invalid key
+ at invalid(name='res:10000')  # Invalid key
+ at invalid(name='res:127.0.0.1')  # Invalid key
+ at invalid(name='res:badtango_1', exceptionType=TaurusException)  # invalid value
+class ResourceAuthorityValidatorTestCase(_AbstractResNameValidatorTestCase,
+                                         unittest.TestCase):
+    """
+    Test for ResourceAuthorityNameValidator loading the resources
+    from a dictionary.
+    """
+    validator = ResourceAuthorityNameValidator
+    res_map = {'badtango_1': 'foo:10000',  # bad auth. Should start by "//"
+               'foo02': 'tango://foo:10000',
+               'localhost': 'eval://localhost'
+               }
+
+
+ at valid(name='res:MyDev')
+ at valid(name='res:tangoDev1')
+ at valid(name='res:tangoDev_bck')
+ at invalid(name='res:123')  # Invalid key
+ at invalid(name='res:wrong_dev')  # Invalid eval URI
+class ResourceDeviceValidatorTestCase(_AbstractResNameValidatorTestCase,
+                                      unittest.TestCase):
+    """
+    Test for ResourceDeviceNameValidator loading the resources
+    from a dictionary.
+    """
+    validator = ResourceDeviceNameValidator
+    res_map = {'MyDev': 'eval:@foo',
+               'tangoDev1': 'tango://foo:10000/a/b/c',
+               'tangoDev_bck': 'tango:a/b/c',
+               'wrong_dev': 'eval://mydev',
+               }
+
+
+ at names(name='MyAttr', out=('eval://localhost/@DefaultEvaluator/1', '1', '1'))
+ at names(name='foo', out=('eval://localhost/@Foo/True', '@Foo/True', 'True'))
+ at valid(name='res:MyAttr')
+ at valid(name='res:My_Attr')
+ at valid(name='res:attr_1')
+ at valid(name='res:attr_2')
+ at invalid(name='res:attr_tango_bck_1')
+ at valid(name='res:attr_tango_bck_1', strict=False)
+ at valid(name='res:attr_tango_bck_2')
+ at valid(name='res:attr_state')
+ at valid(name='res:attr1')
+ at valid(name='res:foo')
+ at valid(name='res:Foo')
+ at valid(name='res:res_attr')
+ at invalid(name='res:1')
+ at invalid(name='res:1foo')
+ at invalid(name='res: foo')
+ at invalid(name='res:dev1')  # Is a device!
+ at invalid(name='res:dev2')  # Is a device!
+ at invalid(name='res:NotExist')  # Not existing reference!
+class ResourceAttributeValidatorTestCase(_AbstractResNameValidatorTestCase,
+                                         unittest.TestCase):
+    """
+    Test for ResourceAttributeNameValidator loading the resources
+    from a dictionary.
+    """
+    validator = ResourceAttributeNameValidator
+    res_map = {'MyAttr': 'eval:1',
+               'My_Attr': 'eval:foo=1;bar=2;foo+bar',
+               'attr_1': 'tango:a/b/c/d',
+               'attr_2': 'a/b/c/d',
+               'attr_tango_bck_1': 'tango://a/b/c/d',
+               'attr_tango_bck_2': 'tango://foo:10000/a/b/c/d',
+               'attr_state': 'a/b/c/state',
+               'attr1': 'eval:"Hello_World!!"',
+               'foo': 'eval:/@Foo/True',
+               '1foo': 'eval:2',
+               'Foo': 'eval:False',
+               'res_attr': 'res:attr1',
+               'dev1': 'tango:a/b/c',  # invalid
+               'dev2': 'eval:@foo',   # invalid
+               }
diff --git a/lib/taurus/core/simulation/__init__.py b/lib/taurus/core/simulation/__init__.py
deleted file mode 100644
index cc53e92..0000000
--- a/lib/taurus/core/simulation/__init__.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-.. currentmodule:: taurus.core.simulation
-
-Simulation extension for taurus core mode.
-The simulation extension is a special extension that provides simulation
-objects. The official scheme name is 'simulation'.
-
-The main usage for this extension is to provide a useful value when using the
-Qt designer to design the GUI.
-The widgets have in their constructor a 'designMode' parameter that inside
-the designer is set to True by the different plugins that export the different
-taurus widgets to the designer. This way the developer can have a better idea
-of what the GUI will look like in the end without connecting to the actual device
-in design time (which could be dangerous at times) even if the values don't make 
-much sence.
-"""
-from simfactory import *
\ No newline at end of file
diff --git a/lib/taurus/core/simulation/simfactory.py b/lib/taurus/core/simulation/simfactory.py
deleted file mode 100644
index 25ab7f6..0000000
--- a/lib/taurus/core/simulation/simfactory.py
+++ /dev/null
@@ -1,395 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-simfactory.py: 
-
-Simulation Factory uses the Taurus object naming (URI based):
-
-  foo://username:password@example.com:8042/over/there/index.dtb;type=animal?name=ferret#nose
-  \ /   \________________/\_________/ \__/\_________/ \___/ \_/ \_________/ \_________/ \__/
-   |           |               |        |     |         |     |       |            |     |
-scheme     userinfo         hostname  port  path  filename extension parameter(s) query fragment
-        \________________________________/
-                    authority
-"""
-
-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()
-        
-    def getElementAlias(self, full_name):
-        return "abc"
-        
-    def getElementFullName(self, alias):
-        return "a/b/c"
-    
-    def cache(self):
-        return Factory('tango').getDatabase().cache()
-        
-    def __getattr__(self, name):
-        return "SimulationDatabase object calling %s" % name
-    
-   
-class SimulationDevice(TaurusDevice):
-    def _createHWObject(self):
-        return "Simulation"
-
-    def getAttribute(self, attrname):
-        return self._attr
-    
-    def factory(self):
-        return SimulationFactory()
-
-class D:
-    pass
-    
-class SimulationConfiguration(TaurusConfiguration):
-    
-    def __init__(self, name, parent, storeCallback = None):
-        i = D()
-        i.name = "d"
-        i.writable = 3
-        i.data_format = 0
-        i.data_type = 5
-        i.max_dim_x = 1
-        i.max_dim_y = 0
-        i.description = "a bloody attribute, what else?"
-        i.label = "Voltage"
-        i.unit = "mV"
-        i.standard_unit = "No standard unit"
-        i.display_unit = "No display unit"
-        i.format = "%6.2f"
-        i.min_value = -2000
-        i.max_value = 2000
-        i.min_alarm = -1800
-        i.max_alarm = 1800
-        i.writable_attr_name = i.name
-        i.extensions = []
-        i.disp_level = 0
-        i.alarms = D()
-        i.alarms.min_alarm = -1800
-        i.alarms.max_alarm = 1800
-        i.alarms.min_warning = -1500
-        i.alarms.max_warning = 1500
-        i.alarms.delta_t = SimulationConfiguration.not_specified
-        i.alarms.delta_val = SimulationConfiguration.not_specified
-        i.climits = [i.min_value, i.max_value]
-        i.calarms = [i.min_alarm, i.max_alarm]
-        i.cwarnings = [i.alarms.min_warning, i.alarms.max_warning]
-        i.cranges = [i.min_value, i.min_alarm, i.alarms.min_warning,
-                    i.alarms.max_warning, i.max_alarm, i.max_value]
-        # add dev_name, dev_alias, attr_name, attr_full_name
-        attr = parent
-        dev = attr.getParentObj()
-        i.dev_name = dev.getNormalName()
-        i.dev_alias = dev.getSimpleName()
-        i.attr_name = attr.getSimpleName()
-        i.attr_fullname = attr.getNormalName()
-        self.attr_info = i
-        self.call__init__(TaurusConfiguration, name, parent, storeCallback=storeCallback)
-
-    def factory(self):
-        return SimulationFactory()
-
-    def getValueObj(self, cache=True):
-        """ Returns the current configuration for the attribute.
-            if cache is set to True (default) and the the configuration has 
-            events active then it will return the local cached value. Otherwise
-            it will read from the tango layer."""
-        return self.attr_info
-            
-    def _subscribeEvents(self):
-        pass
-        
-    def _unSubscribeEvents(self):
-        pass
-        
-    def isWrite(self, cache=True):
-        return False
-    
-    def isReadOnly(self, cache=True):
-        return False
-
-    def isReadWrite(self, cache=True):
-        return True
-    
-    def isScalar(self, cache=True):
-        return True
-    
-    def isSpectrum(self, cache=True):
-        return False
-    
-    def isImage(self, cache=True):
-        return False
-    
-    def encode(self, value):
-        return value
-    
-    def decode(self, value):
-        return value
-
-    
-class SimulationAttribute(TaurusAttribute):
-
-    def __init__(self, name, parent, storeCallback = None):
-        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__(TaurusAttribute, name, parent, storeCallback=storeCallback)
-        
-    def __getattr__(self,name):
-        return getattr(self.getConfig(), name)
-
-    def factory(self):
-        return SimulationFactory()
-
-    def isNumeric(self):
-        return True
-        
-    def isBoolean(self):
-        return False
-
-    def getDisplayValue(self,cache=True):
-        return str(self._value.value)
-
-    def encode(self, value):
-        return value
-
-    def decode(self, attr_value):
-        return attr_value
-
-    def write(self, value, with_read=True):
-        self._value = value
-        if with_read: return self._value
-
-    def read(self, cache=True):
-        return self._value
-        
-    def _subscribeEvents(self):
-        pass
-        
-    def _unSubscribeEvents(self):
-        pass
-
-    def _getRealConfig(self):
-        if self._config is None:
-            cfg_name = "%s?configuration" % self.getFullName()
-            self._config = SimulationConfiguration(cfg_name, self)
-        return self._config
-
-    def getConfig(self):
-        return self._getRealConfig()
-
-    def addListener(self, listener):
-        """ Add a TaurusListener object in the listeners list.
-            If it is the first element and Polling is enabled starts the 
-            polling mechanism.
-            If the listener is already registered nothing happens."""
-        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(TaurusEventType.Config, cfg_val, listener)
-        #fire a first change event
-        self.fireEvent(TaurusEventType.Change, val, listener)
-        return ret
-
-class SimulationFactory(Singleton, TaurusFactory, Logger):
-    """A Singleton class designed to provide Simulation related objects."""
-
-    schemes = ("simulation",)
-    
-    def __init__(self):
-        """ Initialization. Nothing to be done here for now."""
-        pass
-
-    def init(self, *args, **kwargs):
-        """Singleton instance initialization."""
-        name = self.__class__.__name__
-        self.call__init__(Logger, name)
-        self.call__init__(TaurusFactory)
-        
-    def findObjectClass(self, absolute_name):
-        """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.TaurusModel
-        @throws TaurusException if the given name is invalid.
-        """
-        objType = None
-        try:
-            if SimulationDatabase.isValid(absolute_name, MatchLevel.NORMAL_COMPLETE):
-                objType = SimulationDatabase 
-            elif SimulationDevice.isValid(absolute_name, MatchLevel.NORMAL_COMPLETE):
-                objType = SimulationDevice
-            elif SimulationAttribute.isValid(absolute_name, MatchLevel.NORMAL_COMPLETE):
-                objType = SimulationAttribute
-            elif SimulationConfiguration.isValid(absolute_name, MatchLevel.NORMAL_COMPLETE):
-                objType = SimulationConfiguration
-        except Exception, e:
-            self.debug("Not able to find Object class for %s" % absolute_name)
-            self.traceback()
-        return objType
-
-    def getDatabase(self, db_name=None):
-        """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.
-        If the corresponding database object already exists, the existing 
-        instance is returned. Otherwise a new instance is stored and returned.
-           
-        @param[in] db_name database name string. It should be formed like: 
-                           <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.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 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.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:
-                            <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 scheme.
-        
-        @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 TaurusException("Invalid device name %s." % dev_name)
-
-        if not hasattr(self, "_dev"):
-            db = self.getDatabase("sim:01")
-            self._dev = SimulationDevice("sim:01/a/b/c", parent=db, storeCallback=self._storeDev)
-        return self._dev
-        
-    def getAttribute(self, attr_name):
-        """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
-        is returned. Otherwise a new instance is stored and returned.
-
-        @param[in] attr_name string attribute name
-             
-        @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 TaurusException("Invalid attribute name %s." % attr_name)
-        
-        if not hasattr(self, "_attr"):
-            dev = self.getDevice("sim:01/a/b/c")
-            SimulationAttribute("sim:01/a/b/c/d", parent=dev, storeCallback=self._storeAttr)
-        return self._attr
-
-    def getConfiguration(self, param):
-        """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.TaurusAttribute object or full configuration name
-           
-        @return a taurus.core.taurusattribute.TaurusAttribute object
-        @throws TaurusException if the given name is invalid.
-        """
-        if isinstance(param, str):
-            return self._getConfigurationFromName(param)
-        return self._getConfigurationFromAttribute(param)
-
-    def _getConfigurationFromName(self, name):
-        validator = SimulationConfiguration.getNameValidator()
-        params = validator.getParams(name)
-                
-        if params is None:
-            raise taurus.core.taurusexception.TaurusException("Invalid configuration name %s." % name)
-
-        if not hasattr(self, "_conf"):
-            name = "sim:01/a/b/c/d?configuration"
-            attr = self.getAttribute("sim:01/a/b/c/d")
-            SimulationConfiguration(name, attr, storeCallback=self._storeConfig)
-        return self._config
-    
-    def _getConfigurationFromAttribute(self, attr):
-        if not hasattr(self, "_conf"):
-            name = "sim:01/a/b/c/d?configuration"
-            SimulationConfiguration(name, attr, storeCallback=self._storeConfig)
-        return self._config
-    
-    def _storeDev(self, dev):
-        self._dev = dev
-    
-    def _storeAttr(self, attr):
-        self._attr = attr
-        
-    def _storeConfig(self, name, config):
-        self._config = config
\ No newline at end of file
diff --git a/lib/taurus/core/tango/__init__.py b/lib/taurus/core/tango/__init__.py
index 1b35051..9846430 100644
--- a/lib/taurus/core/tango/__init__.py
+++ b/lib/taurus/core/tango/__init__.py
@@ -2,69 +2,105 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-Tango extension for taurus core mode. 
+Tango extension for taurus core mode.
 The Tango extension implements :mod:`taurus.core` objects that connect to Tango
-objects. The official scheme name is, obviously, 'tango'. As Tango is the default
-taurus scheme, when specifing a tango model name, the scheme prefix ('tango://') can
-be omited.
+objects. The official scheme name is, obviously, 'tango'.
 
-You should never create objects of tango classes directly. Instead you
-should use the :class:`taurus.core.taurusmanager.TaurusManager` and :class:`taurus.core.taurusfactory.TaurusFactory` APIs
-to access all elements.
+This extension maps the (Py)Tango objects into Taurus objects as follows:
 
-For example, to get a reference to the Tango attribute my/tango/device/state you
-should do something like::
+- A Tango database is represented as a subclass of
+  :class:`taurus.core.TaurusAuthority`
+- A Tango device is represented as a subclass of
+  :class:`taurus.core.TaurusDevice`
+- A Tango device attribute is represented as a subclass
+  :class:`taurus.core.TaurusAttribute`
 
-    >>> import taurus
-    >>> my_state = taurus.Attribute('tango://my/tango/device/state')
-    
-In fact, because the taurus default extension is Tango, you could omit the 'tango://'
-prefix from the previous code::
+You should never create objects from the above classes directly. Instead, you
+should use :meth:`taurus.Authority`, :meth:`taurus.Device`,
+and :meth:`taurus.Attribute` helper functions,
+as in the examples below, or if you require more control, use the
+:class:`taurus.core.taurusmanager.TaurusManager` or
+:class:`taurus.core.taurusfactory.TaurusFactory` APIs.
+
+Here are some examples:
+
+The Taurus Authority associated with the Tango database
+running on host "machine01" and port 10000 is named "//machine:10000"
+(note that Taurus authority names are always prefixed by "//", to comply with
+RFC3986). And you can get the corresponding Taurus Authority object as:
 
     >>> import taurus
-    >>> my_state = taurus.Attribute('my/tango/device/state')
+    >>> my_db = taurus.Authority('tango://machine:10000')
 
-The same is applied to a device::
+If "tango" is configured as the default scheme for Taurus, the 'tango:' prefix
+could be avoided and same database could be accessed as::
+
+    >>> my_db = taurus.Authority('//machine:10000')
+
+Now, assume that a TangoTest device is registered  in the above database as
+``sys/tg_test/1``. In this case, the corresponding Taurus device full name
+would be ``tango://machine:10000/sys/tg_test/1`` and it could be accessed as::
 
     >>> import taurus
-    >>> my_device = taurus.Device('my/tango/device')
+    >>> my_device = taurus.Device('tango://machine:10000/sys/tg_test/1')
 
-...to a database::
+If "tango" is configured as the default scheme for Taurus, the previous name
+could be shortened to ``//machine:10000/sys/tg_test/1`` or even to
+``sys/tg_test/1`` if the TANGO_HOST environment variable
+(or tango.rc file) point to `machine:10000` as the default tango database.
+Furthermore, if, on top of that,  this device is aliased as ``tgtest1`` in the
+database, it could be accessed as::
 
     >>> import taurus
-    >>> db = taurus.Database('homer:10000')
+    >>> my_device = taurus.Device('tgtest1')
 
-...and an attribute configuration::
+Similarly, accessing the ``ampli`` attribute from the above Tango device can be
+done using its full name::
 
     >>> import taurus
-    >>> me_state_config = taurus.Attribute('my/tango/device/state?configuration')
+    >>> my_attr = taurus.Attribute('tango://machine:10000/sys/tg_test/1/ampli')
+
+And of course shorter names can also be used for attributes. Following the
+examples for the device above, the following names could also have been passed
+to :meth:`taurus.Attribute`:
 
-The way to get access to the Tango factory is::
+- ``//machine:10000/sys/tg_test/1/ampli``
+- ``sys/tg_test/1/ampli``
+- ``tgtest1/ampli``
+
+Finally, the TangoFactory object can be accessed as::
 
     >>> import taurus
-    >>> factory = taurus.Factory()
+    >>> tg_factory = taurus.Factory('tango')
+
+
+.. note:: Previous to TEP3, a RFC3986 non-compliant syntax was used for the
+          Tango scheme (e.g., allowing names such as ``tango://a/b/c/d`` -note
+          the double slash which should not be there).
+          This syntax is now deprecated and should not be used. Taurus will
+          issue warnings if detected.
 """
 
 __docformat__ = "restructuredtext"
diff --git a/lib/taurus/core/tango/enums.py b/lib/taurus/core/tango/enums.py
index 08fc9c8..609889c 100644
--- a/lib/taurus/core/tango/enums.py
+++ b/lib/taurus/core/tango/enums.py
@@ -2,54 +2,55 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 tango enumerations"""
 
 __all__ = ["TangoObjectType", "EVENT_TO_POLLING_EXCEPTIONS",
-           "FROM_TANGO_TO_NUMPY_TYPE", "FROM_TANGO_TO_STR_TYPE"]
+           "FROM_TANGO_TO_NUMPY_TYPE", "FROM_TANGO_TO_STR_TYPE", "DevState"]
 
 __docformat__ = "restructuredtext"
 
-from taurus.core.taurusbasetypes import SubscriptionState
 from taurus.core.util.enumeration import Enumeration
+from taurus.external.enum import IntEnum
 
-TangoObjectType = Enumeration("TangoObjectType", 
-                              ["Database", "Server", "Class", "Device", 
-                               "Attribute","Property","Configuration",
+TangoObjectType = Enumeration("TangoObjectType",
+                              ["Authority", "Server", "Class", "Device",
+                               "Attribute", "Property", "Configuration",
                                "Object"])
+TangoObjectType.Database = TangoObjectType.Authority  # backwards compatibility
 
 import numpy
 import PyTango
 
 # The exception reasons that will force switching from events to polling
-# API_AttributePollingNotStarted - the attribute does not support events. 
+# API_AttributePollingNotStarted - the attribute does not support events.
 #                                  Don't try to resubscribe.
 # API_DSFailedRegisteringEvent - same exception then the one above but higher
 #                                in the stack
 # API_NotificationServiceFailed - Problems in notifd, it was not able to
 #                                 register the event.
 # API_EventChannelNotExported - the notifd is not running
-# API_EventTimeout - after a successfull register the the device server 
+# API_EventTimeout - after a successfull register the the device server
 #                    and/or notifd shuts down/crashes
 # API_CommandNotFound - Added on request from ESRF (Matias Guijarro). They have
 #                       a DS in java (doesn't have events) and the only way they
@@ -64,33 +65,65 @@ EVENT_TO_POLLING_EXCEPTIONS = ('API_AttributePollingNotStarted',
                                'API_EventTimeout',
                                'API_EventPropertiesNotSet',
                                'API_CommandNotFound',
-)
-#                                   'API_BadConfigurationProperty')    
+                               )
+#                                   'API_BadConfigurationProperty')
 
 FROM_TANGO_TO_NUMPY_TYPE = {
-   PyTango.DevBoolean : numpy.bool8,
-     PyTango.DevUChar : numpy.ubyte,
-     PyTango.DevShort : numpy.short,
-    PyTango.DevUShort : numpy.ushort,
-      PyTango.DevLong : numpy.int32,
-     PyTango.DevULong : numpy.uint32,
-    PyTango.DevLong64 : numpy.int64,
-   PyTango.DevULong64 : numpy.uint64,
-    PyTango.DevString : numpy.str,
-    PyTango.DevDouble : numpy.float64,
-     PyTango.DevFloat : numpy.float32,
+    PyTango.DevBoolean: numpy.bool8,
+    PyTango.DevUChar: numpy.uint8,
+    PyTango.DevShort: numpy.short,
+    PyTango.DevUShort: numpy.ushort,
+    PyTango.DevLong: numpy.int32,
+    PyTango.DevULong: numpy.uint32,
+    PyTango.DevLong64: numpy.int64,
+    PyTango.DevULong64: numpy.uint64,
+    PyTango.DevString: numpy.str,
+    PyTango.DevDouble: numpy.float64,
+    PyTango.DevFloat: numpy.float32,
 }
 
 FROM_TANGO_TO_STR_TYPE = {
-   PyTango.DevBoolean : 'bool8',
-   PyTango.DevUChar : 'ubyte',
-   PyTango.DevShort : 'short',
-   PyTango.DevUShort : 'ushort',
-   PyTango.DevLong : 'int32',
-   PyTango.DevULong : 'uint32',
-   PyTango.DevLong64 : 'int64',
-   PyTango.DevULong64 : 'uint64',
-   PyTango.DevString : 'str',
-   PyTango.DevDouble : 'float64',
-   PyTango.DevFloat : 'float32',
+    PyTango.DevBoolean: 'bool8',
+    PyTango.DevUChar: 'uint8',
+    PyTango.DevShort: 'short',
+    PyTango.DevUShort: 'ushort',
+    PyTango.DevLong: 'int32',
+    PyTango.DevULong: 'uint32',
+    PyTango.DevLong64: 'int64',
+    PyTango.DevULong64: 'uint64',
+    PyTango.DevString: 'str',
+    PyTango.DevDouble: 'float64',
+    PyTango.DevFloat: 'float32',
 }
+
+
+class DevState(IntEnum):
+    """ This is the taurus.core.tango equivalent to PyTango.DevState.
+    It defines the same members and uses the same numerical values internally,
+    allowing equality comparisons with :class:`PyTango.DevState` (but not
+    identity checks!)::
+
+        from taurus.core.tango import DevState as D1
+        from PyTango import DevState as D2
+
+        D1.OPEN == D2.OPEN          # --> True
+        D1.OPEN in (D2.ON, D2.OPEN) # --> True
+        D1.OPEN == 3                # --> True
+        D1.OPEN is 3                # --> False
+        D1.OPEN is D2.OPEN          # --> False
+
+     """
+    ON = 0
+    OFF = 1
+    CLOSE = 2
+    OPEN = 3
+    INSERT = 4
+    EXTRACT = 5
+    MOVING = 6
+    STANDBY = 7
+    FAULT = 8
+    INIT = 9
+    RUNNING = 10
+    ALARM = 11
+    DISABLE = 12
+    UNKNOWN = 13
diff --git a/lib/taurus/core/tango/img/__init__.py b/lib/taurus/core/tango/img/__init__.py
index a6be985..49d2850 100644
--- a/lib/taurus/core/tango/img/__init__.py
+++ b/lib/taurus/core/tango/img/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,6 +30,7 @@ __docformat__ = 'restructuredtext'
 
 from img import *
 
+
 def registerExtensions():
     """Registers the image extensions in the :class:`taurus.core.tango.TangoFactory`"""
     import taurus
diff --git a/lib/taurus/core/tango/img/img.py b/lib/taurus/core/tango/img/img.py
index 455b720..03915fa 100644
--- a/lib/taurus/core/tango/img/img.py
+++ b/lib/taurus/core/tango/img/img.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -37,9 +37,10 @@ from taurus.core.tango import TangoDevice
 from taurus.core.util.containers import CaselessDict, CaselessList
 from threading import RLock
 
+
 class ImageDevice(TangoDevice):
     """A class encapsulating a generic image device"""
-    
+
     def __init__(self, name, image_name='image', **kw):
         self.call__init__(TangoDevice, name, **kw)
         self.setImageAttrName(image_name)
@@ -48,14 +49,14 @@ class ImageDevice(TangoDevice):
         if attr_name in self._image_attr_names:
             return
         self._image_attr_names.append(attr_name)
-            
+
     def setImageAttrName(self, attr_name):
         self._image_attr_names = CaselessList()
         self.addImageAttrName(attr_name)
-        
+
     def getImageAttrName(self, idx=0):
         return self._image_attr_names[0]
-    
+
     def getImageAttrNames(self):
         return self._image_attr_names
 
@@ -63,11 +64,13 @@ class ImageDevice(TangoDevice):
 class ImageCounterDevice(ImageDevice):
     """A class encapsulating a generic image device that has an image counter
     attribute"""
-    
-    def __init__(self, name, image_name='image', **kw):
+
+    def __init__(self, name, image_name='image', image_ct='imagecounter', **kw):
         self._image_data = CaselessDict()
-        self.call__init__(ImageDevice, name, **kw)
-        self._image_id_attr = self.getAttribute(self.getImageIDAttrName())
+        self._image_id_attr_name = image_ct
+        self.call__init__(ImageDevice, name, image_name, **kw)
+        self._busy = False
+        self._image_id_attr = self.getAttribute(self._image_id_attr_name)
         self._image_id_attr.addListener(self)
 
     def _setDirty(self, names=None):
@@ -86,24 +89,49 @@ class ImageCounterDevice(ImageDevice):
         return names
 
     def getImageIDAttrName(self):
-        return 'imagecounter'
-    
+        return self._image_id_attr_name
+
     def eventReceived(self, evt_src, evt_type, evt_value):
         if evt_src == self._image_id_attr:
             if evt_type == TaurusEventType.Change:
-                self._setDirty()
-                self.fireEvent(evt_type, evt_value)
+                # discard events if there is one being processed
+                if not self._busy:
+                    self._busy = True
+                    self.debug("Processing image %d" % evt_value.rvalue)
+                    # read the related Image attributes
+                    # (asap and in one action)
+                    images = self.getImageData()
+                    self._setDirty()
+                    self.fireEvent(evt_type, evt_value)
+                    # maintain this fireEvent for backwards compatibility
+                    # with Qub widget
+                    self._emitImageEvents(evt_type, images)
+                    self._busy = False
+                else:
+                    self.debug("Discard image %d" % evt_value.value)
         else:
             ImageDevice.eventReceived(self, evt_src, evt_type, evt_value)
-    
+
+    def _emitImageEvents(self, evt_type, images):
+        for attr_image_name in images:
+            image_value = images[attr_image_name][1]
+            if hasattr(image_value, 'is_empty') and not image_value.is_empty:
+                self.debug("fireEvent for %s attribute" % attr_image_name)
+                if not hasattr(image_value, 'rvalue'):
+                    image_value.rvalue = image_value.value
+                # Only emit to upper layers the events where
+                # something has been read.
+                attr_image = self.getAttribute(image_value.name)
+                attr_image.fireEvent(evt_type, image_value)
+
     def getImageData(self, names=None):
         if names is None:
             names = self.getImageAttrNames()
         elif isinstance(names, str):
             names = (names,)
-        
+
         fetch = self._getDirty(names)
-        
+
         try:
             data = self.read_attributes(fetch)
             for d in data:
@@ -116,14 +144,16 @@ PyImageViewer = ImageCounterDevice
 ImgGrabber = ImageCounterDevice
 CCDPVCAM = ImageCounterDevice
 
+
 class Falcon(ImageCounterDevice):
 
     def __init__(self, name, image_name='image', **kw):
         self._color = False
-        self.call__init__(ImageCounterDevice, name, image_name=image_name, **kw)
+        self.call__init__(ImageCounterDevice, name,
+                          image_name=image_name, **kw)
         self.imgFormat_Attr = self.getAttribute("imageformat")
         self.imgFormat_Attr.addListener(self)
-    
+
     def eventReceived(self, evt_src, evt_type, evt_value):
         if evt_src == self.getAttribute("imageformat"):
             if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
@@ -136,34 +166,21 @@ class Falcon(ImageCounterDevice):
         if self._color:
             for k, v in data.items():
                 s = v[1].value.shape
-                v[1].value = v[1].value.reshape((s[0], s[1]/3, 3))
+                v[1].value = v[1].value.reshape((s[0], s[1] / 3, 3))
         return data
 
 
 class ImgBeamAnalyzer(ImageCounterDevice):
-    
+
     def __init__(self, name, image_name='roiimage', **kw):
         self.call__init__(ImageCounterDevice, name, image_name, **kw)
 
-class LimaCCDs(ImageCounterDevice):
 
-    def __init__(self, name, image_name='video_last_image', **kw):
-        self.call__init__(ImageCounterDevice, name, image_name, **kw)
-        self.rlock = RLock()
-        self.processing = False
-
-    def getImageIDAttrName(self):
-        return 'video_last_image_counter'
+class LimaCCDs(ImageCounterDevice):
 
-    def eventReceived(self, evt_src, evt_type, evt_value):
-        if evt_src == self._image_id_attr and self.processing == False:
-            if evt_type == TaurusEventType.Change:
-                with self.rlock:
-                    self.processing = True
-                    attr_image = self.getAttribute('video_last_image')
-                    evt_value = attr_image.read(False)
-                    attr_image.fireEvent(evt_type, evt_value)
-                    self.processing = False
+    def __init__(self, name, image_name='video_last_image',
+                 image_ct='video_last_image_counter', **kw):
+        self.call__init__(ImageCounterDevice, name, image_name, image_ct, **kw)
+        self.debug("Prepared to listen image counter (%s) for the %s images"
+                   % (self.getImageIDAttrName(), self.getImageAttrNames()))
 
-        else:
-            ImageCounterDevice.eventReceived(self, evt_src, evt_type, evt_value)
diff --git a/lib/taurus/core/tango/search.py b/lib/taurus/core/tango/search.py
index 0cc8428..68522b8 100644
--- a/lib/taurus/core/tango/search.py
+++ b/lib/taurus/core/tango/search.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,89 +35,112 @@ import taurus
 ###############################################################################
 # Utils
 
-def searchCl(regexp,target): 
-    return re.search(extend_regexp(regexp).lower(),target.lower())
 
-def matchCl(regexp,target): 
-    return re.match(extend_regexp(regexp).lower(),target.lower())
+def searchCl(regexp, target):
+    return re.search(extend_regexp(regexp).lower(), target.lower())
+
+
+def matchCl(regexp, target):
+    return re.match(extend_regexp(regexp).lower(), target.lower())
+
 
 def is_regexp(s):
     return any(c in s for c in '.*[]()+?')
 
+
 def extend_regexp(s):
     s = str(s).strip()
-    if '.*' not in s: 
-        s = s.replace('*','.*')
     if '.*' not in s:
-        if ' ' in s: s = s.replace(' ','.*')
-        if '/' not in s: s = '.*'+s+'.*'
+        s = s.replace('*', '.*')
+    if '.*' not in s:
+        if ' ' in s:
+            s = s.replace(' ', '.*')
+        if '/' not in s:
+            s = '.*' + s + '.*'
     else:
-        if not s.startswith('^'): s = '^'+s
-        if not s.endswith('$'): s = s+'$'
+        if not s.startswith('^'):
+            s = '^' + s
+        if not s.endswith('$'):
+            s = s + '$'
     return s
 
+
 def isString(s):
     typ = s.__class__.__name__.lower()
-    return not hasattr(s,'__iter__') and 'str' in typ and 'list' not in typ
+    return not hasattr(s, '__iter__') and 'str' in typ and 'list' not in typ
+
 
 def isCallable(obj):
-    return hasattr(obj,'__call__')
+    return hasattr(obj, '__call__')
+
 
 def isMap(obj):
-    return hasattr(obj,'has_key') or hasattr(obj,'items')
+    return hasattr(obj, 'has_key') or hasattr(obj, 'items')
+
 
 def isDictionary(obj):
     return isMap(obj)
 
+
 def isSequence(obj):
     typ = obj.__class__.__name__.lower()
-    return (hasattr(obj,'__iter__') or 'list' in typ) and not isString(obj) and not isMap(obj)
-        
+    return (hasattr(obj, '__iter__') or 'list' in typ) and not isString(obj) and not isMap(obj)
+
+
 def split_model_list(modelNames):
     '''convert str to list if needed (commas and whitespace are considered as separators)'''
-    if isString(modelNames): #isinstance(modelNames,(basestring,Qt.QString)): 
-        modelNames = str(modelNames).replace(',',' ')
+    if isString(modelNames):  # isinstance(modelNames,(basestring,Qt.QString)):
+        modelNames = str(modelNames).replace(',', ' ')
         modelNames = modelNames.split()
-    if isSequence(modelNames): #isinstance(modelNames,(list.Qt.QStringList)): 
+    if isSequence(modelNames):  # isinstance(modelNames,(list.Qt.QStringList)):
         modelNames = [str(s) for s in modelNames]
-    return modelNames 
-    
-def get_matching_devices(expressions,limit=0,exported=False):
-    """ 
-    Searches for devices matching expressions, if exported is True only running devices are returned 
+    return modelNames
+
+
+def get_matching_devices(expressions, limit=0, exported=False):
+    """
+    Searches for devices matching expressions, if exported is True only running devices are returned
     """
-    db = taurus.Database()
-    all_devs = [s.lower() for s in db.get_device_name('*','*')]
-    #This code is used to get data from multiples hosts
+    db = taurus.Authority()
+    all_devs = [s.lower() for s in db.get_device_name('*', '*')]
+    # This code is used to get data from multiples hosts
     #if any(not fun.matchCl(rehost,expr) for expr in expressions): all_devs.extend(get_all_devices(exported))
-    #for expr in expressions:
-        #m = fun.matchCl(rehost,expr) 
-        #if m:
-            #host = m.groups()[0]
-            #print 'get_matching_devices(%s): getting %s devices ...'%(expr,host)
-            #odb = PyTango.Database(*host.split(':'))
-            #all_devs.extend('%s/%s'%(host,d) for d in odb.get_device_name('*','*'))
+    # for expr in expressions:
+    #m = fun.matchCl(rehost,expr)
+    # if m:
+    #host = m.groups()[0]
+    # print 'get_matching_devices(%s): getting %s devices ...'%(expr,host)
+    #odb = PyTango.Database(*host.split(':'))
+    #all_devs.extend('%s/%s'%(host,d) for d in odb.get_device_name('*','*'))
     result = [e for e in expressions if e.lower() in all_devs]
     expressions = [extend_regexp(e) for e in expressions if e not in result]
-    result.extend(filter(lambda d: any(matchCl(extend_regexp(e),d) for e in expressions),all_devs))
+    result.extend(filter(lambda d: any(matchCl(extend_regexp(e), d)
+                                       for e in expressions), all_devs))
     return result
 
+
 def get_device_for_alias(alias):
-    db = taurus.Database()
-    try: return db.get_device_alias(alias)
-    except Exception,e:
-        if 'no device found' in str(e).lower(): return None
-        return None #raise e
+    db = taurus.Authority()
+    try:
+        return db.get_device_alias(alias)
+    except Exception, e:
+        if 'no device found' in str(e).lower():
+            return None
+        return None  # raise e
+
 
 def get_alias_for_device(dev):
-    db = taurus.Database()
-    try: 
-        result = db.get_alias(dev) #.get_database_device().DbGetDeviceAlias(dev)
+    db = taurus.Authority()
+    try:
+        # .get_database_device().DbGetDeviceAlias(dev)
+        result = db.get_alias(dev)
         return result
-    except Exception,e:
-        if 'no alias found' in str(e).lower(): return None
-        return None #raise e
+    except Exception, e:
+        if 'no alias found' in str(e).lower():
+            return None
+        return None  # raise e
+
 
 def get_alias_dict(exp='*'):
-    tango = taurus.Database()
-    return dict((k,tango.get_device_alias(k)) for k in tango.get_device_alias_list(exp))
\ No newline at end of file
+    tango = taurus.Authority()
+    return dict((k, tango.get_device_alias(k)) for k in tango.get_device_alias_list(exp))
diff --git a/lib/taurus/core/tango/starter.py b/lib/taurus/core/tango/starter.py
index 79888f7..bb5b6b0 100644
--- a/lib/taurus/core/tango/starter.py
+++ b/lib/taurus/core/tango/starter.py
@@ -2,31 +2,31 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides a very simple API for starting and killing device 
+"""This module provides a very simple API for starting and killing device
 servers
 
-It is not a replacement of the Tango Starter Device Server since this is much 
+It is not a replacement of the Tango Starter Device Server since this is much
 more limited in scope.
 """
 
@@ -42,24 +42,25 @@ from taurus.core.util.log import Logger
 
 _log = Logger('Starter')
 
+
 class Starter(object):
-    '''Abstract class for managing (starting, stopping, registering and 
+    '''Abstract class for managing (starting, stopping, registering and
     removing) a Tango Device Server.
-    
-    Derived classes should provide the methods for starting and stopping a 
+
+    Derived classes should provide the methods for starting and stopping a
     device.
     '''
-   
+
     def __init__(self, ds_name):
         '''
         :param ds_name: (str) Device Server name in the form "server/instance"
         '''
         self.ds_name = ds_name
-        self.dserver_name = 'dserver/%s' % ds_name       
+        self.dserver_name = 'dserver/%s' % ds_name
         try:
             self.dserver = PyTango.DeviceProxy(self.dserver_name)
             self.serverExisted = True
-        except PyTango.DevFailed: #not registered?
+        except PyTango.DevFailed:  # not registered?
             self.dserver = None
             self.serverExisted = False
         self._addedDevices = []
@@ -69,10 +70,10 @@ class Starter(object):
 
     def terminate(self):
         raise NotImplementedError('terminate method is mandatory')
-        
+
     def start(self):
         raise NotImplementedError('start method is mandatory')
-    
+
     def stopDs(self, synch=True, hard_kill=False, wait_seconds=10):
         if hard_kill:
             _log.info('Hard killing server %s...' % self.ds_name)
@@ -83,20 +84,20 @@ class Starter(object):
         if not synch:
             return
         for i in range(wait_seconds):
-            _log.debug('Waiting for server %s to get stopped. Iteration: %d'% \
+            _log.debug('Waiting for server %s to get stopped. Iteration: %d' %
                        (self.ds_name, i))
             if self.isRunning():
                 time.sleep(1)
             else:
                 ##############################################################
                 # TODO: this workaround doesn't seem necessary (see isRunning)
-                #time.sleep(3)
+                # time.sleep(3)
                 ##############################################################
                 _log.info('Server %s has been stopped' % self.ds_name)
                 return
-        _log.warning('Server %s did not stop within %d seconds'%
+        _log.warning('Server %s did not stop within %d seconds' %
                      (self.ds_name, wait_seconds))
-    
+
     def startDs(self, synch=True, wait_seconds=10):
         if self.isRunning():
             _log.warning('Server already running')
@@ -106,33 +107,33 @@ class Starter(object):
         if not synch:
             return
         for i in range(wait_seconds):
-            _log.debug('Waiting for server %s to get started... %d'% \
-                      (self.ds_name, i))
+            _log.debug('Waiting for server %s to get started... %d' %
+                       (self.ds_name, i))
             if self.isRunning():
                 _log.info('Server %s has been started' % self.ds_name)
                 ##############################################################
                 # TODO: this workaround doesn't seem necessary (see isRunning)
-                #time.sleep(3)
+                # time.sleep(3)
                 ##############################################################
                 return
             else:
                 time.sleep(1)
-        _log.warning('Server %s did not start within %d seconds'% \
+        _log.warning('Server %s did not start within %d seconds' %
                      (self.ds_name, wait_seconds))
-        
+
     def addNewDevice(self, device, klass=None):
         """
-        Register a device of this server in the DB (register the server if 
+        Register a device of this server in the DB (register the server if
         not present)
         e.g. to create Starter in an init script::
-            
+
             addNewDevice('sys/tg_test/foobar', klass='TangoTest')
-        
-        :param klass: class name. If None passed, it defaults to the server 
+
+        :param klass: class name. If None passed, it defaults to the server
                       name (without instance name)
         """
         if device in self._addedDevices:
-            _log.warning('%s already added. Skipping'%device)
+            _log.warning('%s already added. Skipping' % device)
             return
         if klass is None:
             klass = self.ds_name.split('/')[0]
@@ -144,39 +145,38 @@ class Starter(object):
             return
         except:
             pass
-        # register the device, 
+        # register the device,
         # in case the server did not exist before this will define it
         dev_info = PyTango.DbDevInfo()
         dev_info.name = device
         dev_info.klass = klass
         dev_info.server = self.ds_name
         db.add_device(dev_info)
-        #create proxy to dserver
+        # create proxy to dserver
         self.dserver = PyTango.DeviceProxy(self.dserver_name)
-        #keep track of added devices
-        self._addedDevices.append(device) 
-        
+        # keep track of added devices
+        self._addedDevices.append(device)
+
     def cleanDb(self, force=False):
         '''removes devices which have been added by :meth:`addNewDevice`
-        and then removes the server if it was registered by this starter 
+        and then removes the server if it was registered by this starter
         (or, if force is True, it removes the server in any case)
-        
-        :param force: (bool) force removing of the Server even if it was 
-                      not registered within this starter 
+
+        :param force: (bool) force removing of the Server even if it was
+                      not registered within this starter
         '''
         for device in self._addedDevices:
             PyTango.Database().delete_device(device)
-            _log.info('Deleted device %s'%device)
-        if (self.serverExisted or len(self._addedDevices)==0) and not force:
-            msg = ('%s was not registered by this starter. Not removing. '+
-                   'Use %s.cleanDb(force=True) to force cleanup')% \
-                                 (self.ds_name, self.__class__.__name__)
+            _log.info('Deleted device %s' % device)
+        if (self.serverExisted or len(self._addedDevices) == 0) and not force:
+            msg = ('%s was not registered by this starter. Not removing. ' +
+                   'Use %s.cleanDb(force=True) to force cleanup') % \
+                (self.ds_name, self.__class__.__name__)
             _log.warning(msg)
         else:
             self.stopDs(hard_kill=True)
             PyTango.Database().delete_server(self.ds_name)
-            _log.info('Deleted Server %s'%self.ds_name)
-
+            _log.info('Deleted Server %s' % self.ds_name)
 
     def isRunning(self):
         # TODO: In case the sleeps in startDS and stopDS need to be re-added,
@@ -191,7 +191,7 @@ class Starter(object):
 
 
 class ProcessStarter(Starter):
-    '''A :class:`Starter` which uses subprocess to start and stop a device 
+    '''A :class:`Starter` which uses subprocess to start and stop a device
     server.
     '''
 
@@ -209,7 +209,7 @@ class ProcessStarter(Starter):
         dev_null = open(os.devnull, 'wb')
         args = [self.exec_name, self.ds_instance]
         self.process = subprocess.Popen(args, stdout=dev_null, stderr=dev_null)
-            
+
     def terminate(self):
         if self.process:
             self.process.terminate()
@@ -224,19 +224,17 @@ class ProcessStarter(Starter):
 
 
 if __name__ == '__main__':
-    
+
     from taurus.test.resource import getResourcePath
     timeoutExec = getResourcePath('taurus.qt.qtgui.button.test.res', 'Timeout')
     s = ProcessStarter(timeoutExec, 'Timeout/test_removeme')
     devname = 'testing/timeout/temp-1'
     s.addNewDevice(devname, klass='Timeout')
     s.startDs()
-    try: 
+    try:
         print 'Is running:', s.isRunning()
         print "ping:", PyTango.DeviceProxy(devname).ping()
     except Exception, e:
         print e
     s.stopDs()
     s.cleanDb(force=False)
-    
-    
diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py
index 1639578..2339581 100755
--- a/lib/taurus/core/tango/tangoattribute.py
+++ b/lib/taurus/core/tango/tangoattribute.py
@@ -2,53 +2,249 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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 taurus tango attribute"""
 
-__all__ = ["TangoAttribute", "TangoStateAttribute", "TangoAttributeEventListener"]
+__all__ = ["TangoAttribute", "TangoAttributeEventListener", "TangoAttrValue"]
 
 __docformat__ = "restructuredtext"
 
 # -*- coding: utf-8 -*-
 import time
 import threading
+import weakref
 import PyTango
 import numpy
+from functools import partial
 
-from taurus import Factory, Manager
-from taurus.core.taurusattribute import TaurusAttribute, TaurusStateAttribute
-from taurus.core.taurusbasetypes import TaurusEventType, TaurusSerializationMode, \
-    SubscriptionState
+from taurus import Manager
+from taurus.external.pint import Quantity
+
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusbasetypes import (TaurusEventType,
+                                         TaurusSerializationMode,
+                                         SubscriptionState, TaurusAttrValue,
+                                         DataFormat, DataType)
 from taurus.core.taurusoperation import WriteAttrOperation
 from taurus.core.util.event import EventListener
-from .enums import EVENT_TO_POLLING_EXCEPTIONS
+from taurus.core.util.log import debug, taurus4_deprecation
+
+from taurus.core.tango.enums import (EVENT_TO_POLLING_EXCEPTIONS,
+                                     FROM_TANGO_TO_NUMPY_TYPE,
+                                     DevState)
+
+from .util.tango_taurus import (description_from_tango,
+                                display_level_from_tango,
+                                quality_from_tango,
+                                standard_display_format_from_tango,
+                                unit_from_tango, quantity_from_tango_str,
+                                str_2_obj, data_format_from_tango,
+                                data_type_from_tango)
+
+
+class TangoAttrValue(TaurusAttrValue):
+    """A TaurusAttrValue specialization to decode PyTango.DeviceAttribute
+    objects
+    """
+
+    def __init__(self, attr=None, pytango_dev_attr=None, config=None):
+        # config parameter is kept for backwards compatibility only
+        TaurusAttrValue.__init__(self)
+        if config is not None:
+            from taurus.core.util.log import deprecated
+            deprecated(dep='"config" kwarg', alt='"attr"', rel='4.0')
+            attr = config
+        if attr is None:
+            self._attrRef = None
+        else:
+            self._attrRef = weakref.proxy(attr)
+        self.config = self._attrRef  # bck-compat
+
+        self._pytango_dev_attr = p = pytango_dev_attr
+        if p is None:
+            self._pytango_dev_attr = p = PyTango.DeviceAttribute()
+            return
+
+        if self._attrRef is None:
+            return
+
+        numerical = PyTango.is_numerical_type(self._attrRef._tango_data_type,
+                                              inc_array=True)
+        if p.has_failed:
+            self.error = PyTango.DevFailed(*p.get_err_stack())
+        else:
+            if p.is_empty:  # spectra and images can be empty without failing
+                dtype = FROM_TANGO_TO_NUMPY_TYPE.get(
+                    self._attrRef._tango_data_type)
+                if self._attrRef.data_format == DataFormat._1D:
+                    shape = (0,)
+                elif self._attrRef.data_format == DataFormat._2D:
+                    shape = (0, 0)
+                p.value = numpy.empty(shape, dtype=dtype)
+                if not (numerical or self._attrRef.type == DataType.Boolean):
+                    # generate a nested empty list of given shape
+                    p.value = []
+                    for _ in xrange(len(shape) - 1):
+                        p.value = [p.value]
+
+        rvalue = p.value
+        wvalue = p.w_value
+        if numerical:
+            units = self._attrRef._units
+            if rvalue is not None:
+                rvalue = Quantity(rvalue, units=units)
+            if wvalue is not None:
+                wvalue = Quantity(wvalue, units=units)
+        elif isinstance(rvalue, PyTango._PyTango.DevState):
+            rvalue = DevState[str(rvalue)]
+        elif p.type == PyTango.CmdArgType.DevUChar:
+            if self._attrRef.data_format == DataFormat._0D:
+                rvalue = chr(rvalue)
+                wvalue = chr(wvalue)
+            else:
+                rvalue = rvalue.view('S1')
+                wvalue = wvalue.view('S1')
+
+        self.rvalue = rvalue
+        self.wvalue = wvalue
+        self.time = p.time  # TODO: decode this into a TaurusTimeVal
+        self.quality = quality_from_tango(p.quality)
+
+    def __getattr__(self, name):
+        try:
+            ret = getattr(self._attrRef, name)
+        except AttributeError:
+            try:
+                ret = getattr(self._pytango_dev_attr, name)
+            except AttributeError:
+                raise AttributeError('%s has no attribute %s'
+                                     % (self.__class__.__name__, name))
+        # return the attr but only after warning
+        from taurus.core.util.log import deprecated
+        deprecated(dep='TangoAttrValue.%s' % name,
+                   alt='TangoAttribute.%s' % name, rel='4.0')
+        return ret
+
+    # --------------------------------------------------------
+    # This is for backwards compat with the API of taurus < 4
+    #
+    @taurus4_deprecation(alt='.rvalue')
+    def _get_value(self):
+        """for backwards compat with taurus < 4"""
+        debug(repr(self))
+        try:
+            return self.__fix_int(self.rvalue.magnitude)
+        except AttributeError:
+            return self.rvalue
+
+    @taurus4_deprecation(alt='.rvalue')
+    def _set_value(self, value):
+        """for backwards compat with taurus < 4"""
+        debug('Setting %r to %s' % (value, self.name))
+
+        if self.rvalue is None:  # we do not have a previous rvalue
+            import numpy
+            dtype = numpy.array(value).dtype
+            if numpy.issubdtype(dtype, int) or numpy.issubdtype(dtype, float):
+                msg = 'Refusing to set ambiguous value (deprecated .value API)'
+                raise ValueError(msg)
+            else:
+                self.rvalue = value
+        elif hasattr(self.rvalue, 'units'):  # we do have it and is a Quantity
+            self.rvalue = Quantity(value, units=self.rvalue.units)
+        else:  # we do have a previous value and is not a quantity
+            self.rvalue = value
+
+    value = property(_get_value, _set_value)
+
+    @taurus4_deprecation(alt='.wvalue')
+    def _get_w_value(self):
+        """for backwards compat with taurus < 4"""
+        debug(repr(self))
+        try:
+            return self.__fix_int(self.wvalue.magnitude)
+        except AttributeError:
+            return self.wvalue
+
+    @taurus4_deprecation(alt='.wvalue')
+    def _set_w_value(self, value):
+        """for backwards compat with taurus < 4"""
+        debug('Setting %r to %s' % (value, self.name))
+
+        if self.wvalue is None:  # we do not have a previous wvalue
+            import numpy
+            dtype = numpy.array(value).dtype
+            if numpy.issubdtype(dtype, int) or numpy.issubdtype(dtype, float):
+                msg = 'Refusing to set ambiguous value (deprecated .value API)'
+                raise ValueError(msg)
+            else:
+                self.wvalue = value
+        elif hasattr(self.wvalue, 'units'):  # we do have it and is a Quantity
+            self.wvalue = Quantity(value, units=self.wvalue.units)
+        else:  # we do have a previous value and is not a quantity
+            self.wvalue = value
+
+    w_value = property(_get_w_value, _set_w_value)
+
+    @property
+    @taurus4_deprecation(alt='.error')
+    def has_failed(self):
+        return self.error
+
+    def __fix_int(self, value):
+        """cast value to int if  it is an integer.
+        Works on scalar and non-scalar values
+        """
+        if self._attrRef.type is None or self._attrRef.type != DataType.Integer:
+            return value
+        try:
+            return int(value)
+        except TypeError:
+            import numpy
+            return numpy.array(value, dtype='int')
 
-DataType = PyTango.CmdArgType
 
 class TangoAttribute(TaurusAttribute):
 
-    # helper class property that stores a reference to the corresponding factory
+    no_cfg_value = '-----'
+    no_unit = 'No unit'
+    no_standard_unit = 'No standard unit'
+    no_display_unit = 'No display unit'
+    no_description = 'No description'
+    not_specified = 'Not specified'
+    no_min_value = no_max_value = not_specified
+    no_min_alarm = no_max_alarm = not_specified
+    no_min_warning = no_max_warning = not_specified
+    no_delta_t = no_delta_val = not_specified
+    no_rel_change = no_abs_change = not_specified
+    no_archive_rel_change = no_archive_abs_change = not_specified
+    no_archive_period = not_specified
+
+    # helper class property that stores a reference to the corresponding
+    # factory
     _factory = None
+    _scheme = 'tango'
+    _description = 'A Tango Attribute'
 
     def __init__(self, name, parent, **kwargs):
 
@@ -58,41 +254,56 @@ class TangoAttribute(TaurusAttribute):
         # the last attribute error
         self.__attr_err = None
 
-        # the last time the attribute was read
-        self.__attr_timestamp = 0
-
         # the change event identifier
         self.__chg_evt_id = None
 
-        # reference to the configuration object
-        self.__attr_config = None
-
         # current event subscription state
         self.__subscription_state = SubscriptionState.Unsubscribed
         self.__subscription_event = threading.Event()
 
-        self.call__init__(TaurusAttribute, name, parent, **kwargs)
+        # the parent's HW object (the PyTango Device obj)
+        self.__dev_hw_obj = None
 
-    def __getattr__(self, name):
-        return getattr(self._getRealConfig(), name)
+        self.call__init__(TaurusAttribute, name, parent, **kwargs)
 
-    def _getRealConfig(self):
-        """ Returns the current configuration of the attribute."""
+        self._events_working = False
 
-        if self.__attr_config is None:
-            cfg_name = "%s?configuration" % self.getFullName()
-            from taurus.core.tango import TangoConfiguration  # @todo...
-            self.__attr_config = TangoConfiguration(cfg_name, self)
-        return self.__attr_config
+        attr_info = None
+        if parent:
+            attr_name = self.getSimpleName()
+            try:
+                attr_info = parent.attribute_query(attr_name)
+            except (AttributeError, PyTango.DevFailed):
+                # if PyTango could not connect to the dev
+                attr_info = None
+
+        # Set default values in case the attrinfoex is None
+        self.writable = False
+        dis_level = PyTango.DispLevel.OPERATOR
+        self.display_level = display_level_from_tango(dis_level)
+        self.tango_writable = PyTango.AttrWriteType.READ
+        self._units = unit_from_tango(PyTango.constants.UnitNotSpec)
+        # decode the Tango configuration attribute (adds extra members)
+        self._pytango_attrinfoex = None
+        self._decodeAttrInfoEx(attr_info)
+
+        # subscribe to configuration events (unsubscription done at cleanup)
+        self.__cfg_evt_id = None
+        self._subscribeConfEvents()
+
+    def cleanUp(self):
+        self.trace("[TangoAttribute] cleanUp")
+        self._unsubscribeConfEvents()
+        TaurusAttribute.cleanUp(self)
+        self.__dev_hw_obj = None
+        self._pytango_attrinfoex = None
 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusModel necessary overwrite
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    @classmethod
-    def factory(cls):
-        if cls._factory is None:
-            cls._factory = Factory(scheme='tango')
-        return cls._factory
+    def __getattr__(self, name):
+        try:
+            return getattr(self._pytango_attrinfoex, name)
+        except AttributeError:
+            raise Exception('TangoAttribute does not have the attribute %s'
+                            % name)
 
     def getNewOperation(self, value):
         attr_value = PyTango.AttributeValue()
@@ -106,110 +317,97 @@ class TangoAttribute(TaurusAttribute):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def isNumeric(self, inc_array=False):
-        cfg = self._getRealConfig()
-        if not cfg:
-            self.warning("attribute does not contain information")
-            return False
-        if inc_array and not self.isScalar():
-            return False
-
-        type = cfg.getType()
-        return PyTango.is_numerical_type(type, inc_array=inc_array)
+        tgtype = self._tango_data_type
+        return PyTango.is_numerical_type(tgtype, inc_array=inc_array)
 
     def isInteger(self, inc_array=False):
-        cfg = self._getRealConfig()
-        if not cfg:
-            self.warning("attribute does not contain information")
-            return False
-        if inc_array and not self.isScalar():
-            return False
-
-        type = cfg.getType()
-        return PyTango.is_int_type(type, inc_array=inc_array)
+        tgtype = self._tango_data_type
+        return PyTango.is_int_type(tgtype, inc_array=inc_array)
 
     def isFloat(self, inc_array=False):
-        cfg = self._getRealConfig()
-        if not cfg:
-            self.warning("attribute does not contain information")
-            return False
-        if inc_array and not self.isScalar():
-            return False
-
-        type = cfg.getType()
-        return PyTango.is_float_type(type, inc_array=inc_array)
+        tgtype = self._tango_data_type
+        return PyTango.is_float_type(tgtype, inc_array=inc_array)
 
     def isBoolean(self, inc_array=False):
-        cfg = self._getRealConfig()
-        if not cfg:
-            self.warning("attribute does not contain information")
-            return False
-        if inc_array and not self.isScalar():
-            return False
-
-        type = cfg.getType()
-        if inc_array:
-            return type in (DataType.DevBoolean, DataType.DevVarBooleanArray)
-        else:
-            return type == DataType.DevBoolean
+        tgtype = self._tango_data_type
+        # PyTango.is_bool_type is not implemented in Tango7 and neither in
+        # some Tango8, at least 8.1.1. Avoid to use is_bool_type method
+        # while taurus is still compatible with these versions.
+        # PyTango.is_bool_type(tgtype, inc_array=inc_array)
+        if tgtype == PyTango.CmdArgType.DevBoolean:
+            return True
+        if inc_array and tgtype == PyTango.CmdArgType.DevVarBooleanArray:
+            return True
+        return False
 
     def isState(self):
-        cfg = self._getRealConfig()
-        if not cfg:
-            self.warning("attribute does not contain information")
-            return False
-        return cfg.getType() == DataType.DevState
+        tgtype = self._tango_data_type
+        return tgtype == PyTango.CmdArgType.DevState
 
-    def getDisplayValue(self, cache=True):
-        attrvalue = self.getValueObj(cache=cache)
-        if not attrvalue:
-            return None
-        v = attrvalue.value
-
-        return self.displayValue(v)
+    def getFormat(self, cache=True):
+        return self.format
 
     def encode(self, value):
         """Translates the given value into a tango compatible value according to
-        the attribute data type"""
-
-        attrvalue = None
-
-        if self._getRealConfig() is None:
-            self.warning("attribute does not contain information")
-            return value
+        the attribute data type.
+
+        Raises `pint.DimensionalityError` if value is a Quantity and it
+        cannot be expressed in the units of the attribute set in the DB
+        """
+        if isinstance(value, Quantity):
+            # convert to units of the attr in the DB (or raise an exception)
+            magnitude = value.to(self._units).magnitude
+        else:
+            magnitude = value
 
         fmt = self.getDataFormat()
-        type = self.getType()
-        if fmt == PyTango.SCALAR:
-            if type == DataType.DevDouble:
-                attrvalue = float(value)
-            elif type == DataType.DevFloat:
+        tgtype = self._tango_data_type
+        if fmt == DataFormat._0D:
+            if tgtype == PyTango.CmdArgType.DevDouble:
+                attrvalue = float(magnitude)
+            elif tgtype == PyTango.CmdArgType.DevFloat:
                 # We encode to float, but rounding to Tango::DevFloat precision
-                # see: http://sf.net/p/tauruslib/tickets/61
-                attrvalue = float(numpy.float32(value))
-            elif PyTango.is_int_type(type):
-                #attrvalue = int(value)
-                attrvalue = long(value)  #changed as a partial workaround to a problem in PyTango writing to DevULong64 attributes (see ALBA RT#29793)
-            elif type == DataType.DevBoolean:
+                # see: http://sf.net/p/sardana/tickets/162
+                attrvalue = float(numpy.float32(magnitude))
+            elif PyTango.is_int_type(tgtype):
+                # changed as a partial workaround to a problem in PyTango
+                # writing to DevULong64 attributes (see ALBA RT#29793)
+                attrvalue = long(magnitude)
+            elif tgtype == PyTango.CmdArgType.DevBoolean:
                 try:
-                    attrvalue = bool(int(value))
+                    attrvalue = bool(int(magnitude))
                 except:
-                    attrvalue = str(value).lower() == 'true'
-            elif type == DataType.DevUChar:
-                attrvalue = chr(value)
-            elif type == DataType.DevState or type == DataType.DevEncoded:
-                attrvalue = value
+                    attrvalue = str(magnitude).lower() == 'true'
+            elif tgtype == PyTango.CmdArgType.DevUChar:
+                try:
+                    # assume value to be a 1-character string repr of a byte
+                    attrvalue = ord(magnitude)
+                except TypeError:
+                    # but also support uint8 values (use ord-chr to make sure)
+                    attrvalue = ord(chr(magnitude))
+            elif tgtype in (PyTango.CmdArgType.DevState,
+                            PyTango.CmdArgType.DevEncoded):
+                attrvalue = magnitude
+            else:
+                attrvalue = str(magnitude)
+        elif fmt in (DataFormat._1D, DataFormat._2D):
+            if PyTango.is_int_type(tgtype):
+                # cast to integer because the magnitude conversion gives floats
+                attrvalue = magnitude.astype('int64')
+            elif tgtype == PyTango.CmdArgType.DevUChar:
+                attrvalue = magnitude.view('uint8')
             else:
-                attrvalue = str(value)
-        elif fmt in (PyTango.SPECTRUM, PyTango.IMAGE):
-            attrvalue = value
+                attrvalue = magnitude
         else:
-            attrvalue = str(value)
+            attrvalue = str(magnitude)
         return attrvalue
 
     def decode(self, attr_value):
-        """Decodes a value that was received from PyTango into the expected 
+        """Decodes a value that was received from PyTango into the expected
         representation"""
-        return attr_value
+        # TODO decode of the configuration
+        value = TangoAttrValue(pytango_dev_attr=attr_value, attr=self)
+        return value
 
     def write(self, value, with_read=True):
         """ Write the value in the Tango Device Attribute """
@@ -231,17 +429,18 @@ class TangoAttribute(TaurusAttribute):
                         if err.reason == 'API_UnsupportedFeature':
                             dev.write_attribute(name, value)
                             result = dev.read_attribute(name)
-                            break;
+                            break
                     else:
                         raise df
-                result = self.decode(result)
                 self.poll(single=False, value=result, time=time.time())
-                return result
+                return self.decode(result)
             else:
                 dev.write_attribute(name, value)
+                return None
         except PyTango.DevFailed, df:
             err = df[0]
-            self.error("[Tango] write failed (%s): %s" % (err.reason, err.desc))
+            self.error("[Tango] write failed (%s): %s" %
+                       (err.reason, err.desc))
             raise df
         except Exception, e:
             self.error("[Tango] write failed: %s" % str(e))
@@ -256,7 +455,6 @@ class TangoAttribute(TaurusAttribute):
             else:
                 self.__attr_value = self.decode(kwargs.get('value'))
                 self.__attr_err = kwargs.get('error')
-                self.__attr_timestamp = kwargs.get('time', time.time())
                 if self.__attr_err:
                     raise self.__attr_err
         except PyTango.DevFailed, df:
@@ -274,13 +472,17 @@ class TangoAttribute(TaurusAttribute):
 
     def read(self, cache=True):
         """ Returns the current value of the attribute.
-            if cache is set to True (default) or the attribute has events 
+            if cache is set to True (default) or the attribute has events
             active then it will return the local cached value. Otherwise it will
             read the attribute value from the tango device."""
         curr_time = time.time()
 
         if cache:
-            dt = (curr_time - self.__attr_timestamp) * 1000
+            try:
+                attr_timestamp = self.__attr_value.time.totime()
+            except AttributeError:
+                attr_timestamp = 0
+            dt = (curr_time - attr_timestamp) * 1000
             if dt < self.getPollingPeriod():
                 if self.__attr_value is not None:
                     return self.__attr_value
@@ -291,12 +493,13 @@ class TangoAttribute(TaurusAttribute):
             try:
                 dev = self.getParentObj()
                 v = dev.read_attribute(self.getSimpleName())
-                self.__attr_value, self.__attr_err, self.__attr_timestamp = self.decode(v), None, curr_time
+                self.__attr_value, self.__attr_err = self.decode(v), None
                 return self.__attr_value
             except PyTango.DevFailed, df:
-                self.__attr_value, self.__attr_err, self.__attr_timestamp = None, df, curr_time
+                self.__attr_value, self.__attr_err = None, df
                 err = df[0]
-                self.debug("[Tango] read failed (%s): %s", err.reason, err.desc)
+                self.debug("[Tango] read failed (%s): %s",
+                           err.reason, err.desc)
                 raise df
             except Exception, e:
                 self.__attr_value, self.__attr_err = None, e
@@ -305,7 +508,6 @@ class TangoAttribute(TaurusAttribute):
         elif self.__subscription_state in (SubscriptionState.Subscribing, SubscriptionState.PendingSubscribe):
             self.__subscription_event.wait()
 
-
         if self.__attr_err is not None:
             raise self.__attr_err
         return self.__attr_value
@@ -315,26 +517,23 @@ class TangoAttribute(TaurusAttribute):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def __fireRegisterEvent(self, listener):
-        #fire a first configuration event
-        #cfg = self._getRealConfig().getValueObj()
-        #if cfg:
-        #    self.fireEvent(TaurusEventType.Config, cfg, listener)
-        #else:
-
-        #fire a first change event
+        '''fire the first config and change (or error) events'''
         try:
             v = self.read()
+            # note: it may seem redundant, but some widgets may only react to
+            # one or another type, so we should send both for bck-compat
+            # Taurus4 widgets should never use config events since the same info
+            # is always emitted in a change event
+            self.fireEvent(TaurusEventType.Config, v, listener)
             self.fireEvent(TaurusEventType.Change, v, listener)
         except:
             self.fireEvent(TaurusEventType.Error, self.__attr_err, listener)
 
     def addListener(self, listener):
         """ Add a TaurusListener object in the listeners list.
-            If it is the first element and Polling is enabled starts the 
+            If it is the first element and Polling is enabled starts the
             polling mechanism.
             If the listener is already registered nothing happens."""
-        cfg = self._getRealConfig()
-        cfg.addListener(listener)
 
         listeners = self._listeners
         initial_subscription_state = self.__subscription_state
@@ -348,7 +547,7 @@ class TangoAttribute(TaurusAttribute):
         if self.__subscription_state == SubscriptionState.Unsubscribed and len(listeners) == 1:
             self._subscribeEvents()
 
-        #if initial_subscription_state == SubscriptionState.Subscribed:
+        # if initial_subscription_state == SubscriptionState.Subscribed:
         if len(listeners) > 1 and (initial_subscription_state == SubscriptionState.Subscribed or self.isPollingActive()):
             sm = self.getSerializationMode()
             if sm == TaurusSerializationMode.Concurrent:
@@ -358,14 +557,11 @@ class TangoAttribute(TaurusAttribute):
         return ret
 
     def removeListener(self, listener):
-        """ Remove a TaurusListener from the listeners list. If polling enabled 
+        """ 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 = TaurusAttribute.removeListener(self, listener)
 
-        cfg = self._getRealConfig()
-        cfg.removeListener(listener)
-
         if not ret:
             return ret
 
@@ -395,62 +591,104 @@ class TangoAttribute(TaurusAttribute):
         pass
 
     def _subscribeEvents(self):
-        """ Enable subscription to the attribute events. If change events are 
+        """ Enable subscription to the attribute events. If change events are
             not supported polling is activated """
 
-        # We have to register for configuration events before registering for
-        # change events because when a change event occurs we need to have
-        # configuration info in order to know how to decode the value
-        self._getRealConfig().addListener(self)
-
-
-        self.trace("Subscribing to change events...")
-
-        dev = self.getParentObj()
-        if dev is None:
-            self.debug("failed to subscribe change events: device is None")
-            return
-        dev = dev.getHWObj()
-        if dev is None:
-            self.debug("failed to subscribe change events: HW is None")
-            return
+        if self.__dev_hw_obj is None:
+            dev = self.getParentObj()
+            if dev is None:
+                self.debug("failed to subscribe to chg events: device is None")
+                return
+            self.__dev_hw_obj = dev.getDeviceProxy()
+            if self.__dev_hw_obj is None:
+                self.debug("failed to subscribe to chg events: HW is None")
+                return
 
         self.__subscription_event = threading.Event()
+        attr_name = self.getSimpleName()
 
         try:
             self.__subscription_state = SubscriptionState.Subscribing
-            self.__chg_evt_id = dev.subscribe_event(self.getSimpleName(),
-                                                  PyTango.EventType.CHANGE_EVENT,
-                                                  self, [])
+            self.__chg_evt_id = self.__dev_hw_obj.subscribe_event(
+                attr_name, PyTango.EventType.CHANGE_EVENT,
+                self, [])
 
         except:
             self.__subscription_state = SubscriptionState.PendingSubscribe
             self._activatePolling()
-            self.__chg_evt_id = dev.subscribe_event(self.getSimpleName(),
-                                                  PyTango.EventType.CHANGE_EVENT,
-                                                  self, [], True)
+            self.__chg_evt_id = self.__dev_hw_obj.subscribe_event(
+                attr_name, PyTango.EventType.CHANGE_EVENT,
+                self, [], True)
 
     def _unsubscribeEvents(self):
         # Careful in this method: This is intended to be executed in the cleanUp
         # so we should not access external objects from the factory, like the
         # parent object
-        self._getRealConfig().removeListener(self)
-        if not self.__chg_evt_id is None and not self._dev_hw_obj is None:
-            self.trace("Unsubscribing to change events (ID=%d)" % self.__chg_evt_id)
+        if self.__dev_hw_obj is not None and self.__chg_evt_id is not None:
+            self.trace("Unsubscribing to change events (ID=%d)",
+                       self.__chg_evt_id)
             try:
-                self._dev_hw_obj.unsubscribe_event(self.__chg_evt_id)
+                self.__dev_hw_obj.unsubscribe_event(self.__chg_evt_id)
                 self.__chg_evt_id = None
             except PyTango.DevFailed, df:
                 if len(df.args) and df[0].reason == 'API_EventNotFound':
-                    # probably tango shutdown as been initiated before and it
-                    # unsubscribed from events itself
+                    # probably tango shutdown has been initiated before and
+                    # it unsubscribed from events itself
                     pass
                 else:
-                    self.debug("Failed: %s" % df[0].desc)
+                    self.debug("Failed: %s", df[0].desc)
                     self.trace(str(df))
         self._deactivatePolling()
         self.__subscription_state = SubscriptionState.Unsubscribed
 
+    def _subscribeConfEvents(self):
+        """ Enable subscription to the attribute configuration events."""
+        self.trace("Subscribing to configuration events...")
+        if self.__dev_hw_obj is None:
+            dev = self.getParentObj()
+            if dev is None:
+                self.debug("failed to subscribe to cfg events: device is None")
+                return
+            self.__dev_hw_obj = dev.getDeviceProxy()
+            if self.__dev_hw_obj is None:
+                self.debug("failed to subscribe to cfg events: HW is None")
+                return
+
+        attr_name = self.getSimpleName()
+        try:
+            self.__cfg_evt_id = self.__dev_hw_obj.subscribe_event(
+                attr_name,
+                PyTango.EventType.ATTR_CONF_EVENT,
+                self, [], True)
+        except PyTango.DevFailed, e:
+            self.debug("Error trying to subscribe to CONFIGURATION events.")
+            self.traceback()
+            # Subscription failed either because event mechanism is not available
+            # or because the device server is not running.
+            # The first possibility is assumed so an attempt to get the configuration
+            # manually is done
+            # TODO decide what should be done here
+            try:
+                attrinfoex = self.__dev_hw_obj.attribute_query(attr_name)
+                self._decodeAttrInfoEx(attrinfoex)
+            except:
+                self.debug("Error getting attribute configuration")
+                self.traceback()
+
+    def _unsubscribeConfEvents(self):
+        # Careful in this method: This is intended to be executed in the cleanUp
+        # so we should not access external objects from the factory, like the
+        # parent object
+        if self.__cfg_evt_id and not self.__dev_hw_obj is None:
+            self.trace("Unsubscribing to configuration events (ID=%s)",
+                       str(self.__cfg_evt_id))
+            try:
+                self.__dev_hw_obj.unsubscribe_event(self.__cfg_evt_id)
+                self.__cfg_evt_id = None
+            except PyTango.DevFailed, e:
+                self.debug("Error trying to unsubscribe configuration events")
+                self.trace(str(e))
+
     def push_event(self, event):
         """Method invoked by the PyTango layer when a change event occurs.
            Default implementation propagates the event to all listeners."""
@@ -459,17 +697,30 @@ class TangoAttribute(TaurusAttribute):
         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
-            self.__subscription_state = SubscriptionState.Subscribed
-            self.__subscription_event.set()
-            if not self.isPollingForced():
-                self._deactivatePolling()
+            # if it is a configuration event
+            if isinstance(event, PyTango.AttrConfEventData):
+                event_type = TaurusEventType.Config
+                self._decodeAttrInfoEx(event.attr_conf)
+                # make sure that there is a self.__attr_value
+                if self.__attr_value is None:
+                    # TODO: maybe we can avoid this read?
+                    self.__attr_value = self.getValueObj(cache=False)
+            # if it is an attribute event
+            else:
+                event_type = TaurusEventType.Change
+                self.__attr_value, self.__attr_err = self.decode(
+                    event.attr_value), None
+                self.__subscription_state = SubscriptionState.Subscribed
+                self.__subscription_event.set()
+                if not self.isPollingForced():
+                    self._deactivatePolling()
+            # notify the listeners
             listeners = tuple(self._listeners)
             if sm == TaurusSerializationMode.Concurrent:
-                manager.addJob(self.fireEvent, None, TaurusEventType.Change,
+                manager.addJob(self.fireEvent, None, event_type,
                                self.__attr_value, listeners=listeners)
             else:
-                self.fireEvent(TaurusEventType.Change, self.__attr_value,
+                self.fireEvent(event_type, self.__attr_value,
                                listeners=listeners)
         elif event.errors[0].reason in EVENT_TO_POLLING_EXCEPTIONS:
             if self.isPollingActive():
@@ -478,7 +729,8 @@ class TangoAttribute(TaurusAttribute):
             self.__subscription_state = SubscriptionState.PendingSubscribe
             self._activatePolling()
         else:
-            self.__attr_value, self.__attr_err = None, PyTango.DevFailed(*event.errors)
+            self.__attr_value, self.__attr_err = None, PyTango.DevFailed(
+                *event.errors)
             self.__subscription_state = SubscriptionState.Subscribed
             self.__subscription_event.set()
             self._deactivatePolling()
@@ -490,19 +742,430 @@ class TangoAttribute(TaurusAttribute):
                 self.fireEvent(TaurusEventType.Error, self.__attr_err,
                                listeners=listeners)
 
+    def isWrite(self, cache=True):
+        return self.getTangoWritable(cache) == PyTango.AttrWriteType.WRITE
+
+    def isReadOnly(self, cache=True):
+        return not self.getTangoWritable(cache) == PyTango.AttrWriteType.READ
+
+    def isReadWrite(self, cache=True):
+        return self.getTangoWritable(cache) == PyTango.AttrWriteType.READ_WRITE
+
+    def getTangoWritable(self, cache=True):
+        """like TaurusAttribute.isWritable(), but it returns a
+        PyTango.AttrWriteType instead of a bool"""
+        return self.tango_writable
+
+    def getLabel(self, cache=True):
+        return self._label
+
+    def getRange(self, cache=True):
+        return self._range
+
+    def getLimits(self, cache=True):
+        return self.getRange(cache)
+
+    def getRanges(self, cache=True):
+        return self.getRange()
+
+    def getAlarms(self, cache=True):
+        return self._alarm
+
+    def getWarnings(self, cache=True):
+        return self._warning
+
+    def getMaxDim(self, cache=True):
+        return self.max_dim_x, self.max_dim_y
+
+    def setLimits(self, low, high):
+        self.setRange([low, high])
+
+    def setLabel(self, lbl):
+        TaurusAttribute.setLabel(self, lbl)
+        infoex = self._pytango_attrinfoex
+        infoex.label = lbl
+        self._applyConfig()
+
+    def setRange(self, *limits):
+        if isinstance(limits[0], list):
+            limits = limits[0]
+        low, high = limits
+        low = Quantity(low)
+        high = Quantity(high)
+        TaurusAttribute.setRange(self, [low, high])
+        infoex = self._pytango_attrinfoex
+        if low.magnitude != float('-inf'):
+            infoex.min_value = str(low.to(self._units).magnitude)
+        else:
+            infoex.min_value = 'Not specified'
+        if high.magnitude != float('inf'):
+            infoex.max_value = str(high.to(self._units).magnitude)
+        else:
+            infoex.max_value = 'Not specified'
+        self._applyConfig()
+
+    def setWarnings(self, *limits):
+        if isinstance(limits[0], list):
+            limits = limits[0]
+        low, high = limits
+        low = Quantity(low)
+        high = Quantity(high)
+        TaurusAttribute.setWarnings(self, [low, high])
+        infoex = self._pytango_attrinfoex
+        if low.magnitude != float('-inf'):
+            infoex.alarms.min_warning = str(low.to(self._units).magnitude)
+        else:
+            infoex.alarms.min_warning = 'Not specified'
+        if high.magnitude != float('inf'):
+            infoex.alarms.max_warning = str(high.to(self._units).magnitude)
+        else:
+            infoex.alarms.max_warning = 'Not specified'
+        self._applyConfig()
+
+    def setAlarms(self, *limits):
+        if isinstance(limits[0], list):
+            limits = limits[0]
+        low, high = limits
+        low = Quantity(low)
+        high = Quantity(high)
+        TaurusAttribute.setAlarms(self, [low, high])
+        infoex = self._pytango_attrinfoex
+        if low.magnitude != float('-inf'):
+            infoex.alarms.min_alarm = str(low.to(self._units).magnitude)
+        else:
+            infoex.alarms.min_alarm = 'Not specified'
+        if high.magnitude != float('inf'):
+            infoex.alarms.max_alarm = str(high.to(self._units).magnitude)
+        else:
+            infoex.alarms.max_alarm = 'Not specified'
+        self._applyConfig()
+
+    def _applyConfig(self):
+        config = self._pytango_attrinfoex
+        self.setConfigEx(config)
+
+    def _decodeAttrInfoEx(self, pytango_attrinfoex=None):
+        if pytango_attrinfoex is None:
+            self._pytango_attrinfoex = PyTango.AttributeInfoEx()
+        else:
+            self._pytango_attrinfoex = i = pytango_attrinfoex
+
+            self.writable = i.writable != PyTango.AttrWriteType.READ
+            self._label = i.label
+            self.data_format = data_format_from_tango(i.data_format)
+            desc = description_from_tango(i.description)
+            if desc != "":
+                self._description = desc
+            self.type = data_type_from_tango(i.data_type)
+            ###############################################################
+            # changed in taurus4: range, alarm and warning now return
+            # quantities if appropriate
+            units = unit_from_tango(i.unit)
+            if PyTango.is_numerical_type(i.data_type, inc_array=True):
+                Q_ = partial(quantity_from_tango_str, units=units,
+                             dtype=i.data_type)
+                ninf, inf = float('-inf'), float('inf')
+                min_value = Q_(i.min_value) or Quantity(ninf, units)
+                max_value = Q_(i.max_value) or Quantity(inf, units)
+                min_alarm = Q_(i.alarms.min_alarm) or Quantity(ninf, units)
+                max_alarm = Q_(i.alarms.max_alarm) or Quantity(inf, units)
+                min_warning = Q_(i.alarms.min_warning) or Quantity(ninf, units)
+                max_warning = Q_(i.alarms.max_warning) or Quantity(inf, units)
+                self._range = [min_value, max_value]
+                self._warning = [min_warning, max_warning]
+                self._alarm = [min_alarm, max_alarm]
+
+            ###############################################################
+            # The following members will be accessed via __getattr__
+            # self.standard_unit
+            # self.display_unit
+            # self.disp_level
+            ###############################################################
+            # Tango-specific extension of TaurusConfigValue
+            self.display_level = display_level_from_tango(i.disp_level)
+            self.tango_writable = i.writable
+            self.max_dim = i.max_dim_x, i.max_dim_y
+            ###############################################################
+            self.format = standard_display_format_from_tango(i.data_type,
+                                                             i.format)
+            # self._units and self._display_format is to be used by
+            # TangoAttrValue for performance reasons. Do not rely on it in other
+            # code
+            self._units = units
+
+    @property
+    def _tango_data_type(self):
+        '''returns the *tango* (not Taurus) data type'''
+        return self._pytango_attrinfoex.data_type
+
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # Deprecated methods
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
+    @taurus4_deprecation(alt=".description")
+    def getDescription(self, cache=True):
+        return self.description
+
+    @taurus4_deprecation(alt=".description")
+    def setDescription(self, descr):
+        self.description = descr
+
+    @taurus4_deprecation()
     def isInformDeviceOfErrors(self):
         return False
 
+    @taurus4_deprecation(dbg_msg='Deprecated method')
+    def displayValue(self, value):
+        return str(value)
 
-class TangoStateAttribute(TangoAttribute, TaurusStateAttribute):
-    def __init__(self, name, parent, **kwargs):
-        self.call__init__(TangoAttribute, name, parent, **kwargs)
-        self.call__init__(TaurusStateAttribute, name, parent, **kwargs)
+    @taurus4_deprecation(alt='getLabel')
+    def getDisplayValue(self, cache=True):
+        attrvalue = self.getValueObj(cache=cache)
+        if not attrvalue:
+            return None
+        v = attrvalue.rvalue
+
+        return self.displayValue(v)
+
+    @taurus4_deprecation(alt='.rvalue.units')
+    def getStandardUnit(self, cache=True):
+        try:
+            return str(self.getValueObj(cache).rvalue.units)
+        except:
+            return None
+
+    @taurus4_deprecation(alt='.rvalue.units')
+    def getDisplayUnit(self, cache=True):
+        try:
+            return str(self.getValueObj(cache).rvalue.units)
+        except:
+            return None
+
+    @taurus4_deprecation(dbg_msg='Do not use')
+    def getDisplayWriteValue(self, cache=True):
+        raise NotImplementedError("Not available since Taurus4")
+
+    @taurus4_deprecation(alt='isWritable')
+    def getWritable(self, cache=True):
+        return self.isWritable(cache)
+
+    @taurus4_deprecation(alt='self.data_format')
+    def isScalar(self):
+        return self.data_format == DataFormat._0D
+
+    @taurus4_deprecation(alt='self.data_format')
+    def isSpectrum(self):
+        return self.data_format == DataFormat._1D
+
+    @taurus4_deprecation(alt='self.data_format')
+    def isImage(self):
+        return self.data_format == DataFormat._2D
+
+    @taurus4_deprecation(alt='getMaxDim')
+    def getMaxDimX(self, cache=True):
+        dim = self.getMaxDim(cache)
+        if dim:
+            return dim[0]
+        else:
+            return None
+
+    @taurus4_deprecation(alt='getMaxDim')
+    def getMaxDimY(self, cache=True):
+        dim = self.getMaxDim(cache)
+        if dim:
+            return dim[1]
+        else:
+            return None
+
+    @taurus4_deprecation(dbg_msg='Deprecated method')
+    def getShape(self, cache=True):
+        if self.isScalar(cache):
+            return ()
+        elif self.isSpectrum():
+            return (self.getMaxDimX(),)
+        else:
+            return self.getMaxDim()
+
+    @taurus4_deprecation(alt='getAttributeInfoEx')
+    def getParam(self, param_name):
+        """ Get attributes of AttributeInfoEx (PyTango)
+        """
+        try:
+            return getattr(self._pytango_attrinfoex, param_name)
+        except:
+            return None
+
+    @taurus4_deprecation(alt='PyTango')
+    def setParam(self, param_name, value):
+        """ Set attributes of AttributeInfoEx (PyTango)
+        """
+        if hasattr(self._pytango_attrinfoex, param_name):
+            setattr(self._pytango_attrinfoex, param_name, str(value))
+        self._applyConfig()
+
+    @taurus4_deprecation(alt='self')
+    def getConfig(self):
+        """Returns the current configuration of the attribute."""
+        return weakref.proxy(self)
+
+    def getAttributeInfoEx(self):
+        return self._pytango_attrinfoex
+
+    @taurus4_deprecation(alt='.rvalue.units')
+    def getUnit(self, cache=True):
+        try:
+            return str(self.getValueObj(cache).rvalue.units)
+        except:
+            return None
+
+    @taurus4_deprecation(alt='.rvalue.units')
+    def _set_unit(self, value):
+        '''for backwards compat with taurus < 4'''
+        extra_msg = 'Ignoring setting of units of %s to %r' % (self.name,
+                                                               value)
+        self.debug(extra_msg)
+
+    @taurus4_deprecation(alt='getMinRange')
+    def getMinValue(self, cache=True):
+        return self.getMinRange()
+
+    @taurus4_deprecation(alt='getMaxRange')
+    def getMaxValue(self, cache=True):
+        return self.getMaxRange()
+
+    @taurus4_deprecation(alt='getRange')
+    def getCLimits(self):
+        if self._pytango_attrinfoex is not None:
+            value = [self._pytango_attrinfoex.min_value,
+                     self._pytango_attrinfoex.max_value]
+        else:
+            value = [self.not_specified, self.not_specified]
+        return value
+
+    @taurus4_deprecation(alt='getAlarms')
+    def getCAlarms(self):
+        if self._pytango_attrinfoex is not None:
+            value = [self._pytango_attrinfoex.min_alarm,
+                     self._pytango_attrinfoex.max_alarm]
+        else:
+            value = [self.not_specified, self.not_specified]
+        return value
+
+    @taurus4_deprecation(alt='getWarnings')
+    def getCWarnings(self):
+        if self._pytango_attrinfoex is not None:
+            value = [self._pytango_attrinfoex.alarms.min_warning,
+                     self._pytango_attrinfoex.alarms.max_warning]
+        else:
+            value = [self.not_specified, self.not_specified]
+        return value
+
+    @taurus4_deprecation(alt='getRange + getAlarms + getWarnings')
+    def getCRanges(self):
+        if self._pytango_attrinfoex is not None:
+            value = [self._pytango_attrinfoex.min_value,
+                     self._pytango_attrinfoex.min_alarm,
+                     self._pytango_attrinfoex.alarms.min_warning,
+                     self._pytango_attrinfoex.alarms.max_warning,
+                     self._pytango_attrinfoex.max_alarm,
+                     self._pytango_attrinfoex.max_value]
+        else:
+            value = [self.not_specified, self.not_specified,
+                     self.not_specified, self.not_specified,
+                     self.not_specified, self.not_specified]
+        return value
+
+    @taurus4_deprecation(alt='.alarms[0]')
+    def getMinAlarm(self):
+        if self._pytango_attrinfoex is None:
+            return None
+        return self._pytango_attrinfoex.alarms.min_alarm
+
+    @taurus4_deprecation(alt='.alarms[1]')
+    def getMaxAlarm(self):
+        if self._pytango_attrinfoex is None:
+            return None
+        return self._pytango_attrinfoex.alarms.max_alarm
+
+    @taurus4_deprecation(alt='.warnings[0]')
+    def getMinWarning(self):
+        if self._pytango_attrinfoex is None:
+            return None
+        return self._pytango_attrinfoex.alarms.min_warning
+
+    @taurus4_deprecation(alt='.warnings[1]')
+    def getMaxWarning(self):
+        if self._pytango_attrinfoex is None:
+            return None
+        return self._pytango_attrinfoex.alarms.max_warning
+
+    @taurus4_deprecation(alt='.alarms')
+    def setMinAlarm(self, value):
+        if self._pytango_attrinfoex is None:
+            self._pytango_attrinfoex.alarms.min_alarm = str(value)
+            self._applyConfig()
+
+    @taurus4_deprecation(alt='.alarms')
+    def setMaxAlarm(self, value):
+        if self._pytango_attrinfoex is None:
+            self._pytango_attrinfoex.alarms.max_alarm = str(value)
+            self._applyConfig()
+
+    @taurus4_deprecation(alt='.warnings')
+    def setMinWarning(self, value):
+        if self._pytango_attrinfoex is None:
+            self._pytango_attrinfoex.alarms.min_warning = str(value)
+            self._applyConfig()
+
+    @taurus4_deprecation(alt='.warnings')
+    def setMaxWarning(self, value):
+        if self._pytango_attrinfoex is None:
+            self._pytango_attrinfoex.alarms.max_warning = str(value)
+            self._applyConfig()
+
+    # deprecated property!
+    unit = property(getUnit, _set_unit)
+    climits = property(getCLimits)
+    calarms = property(getCAlarms)
+    cwarnings = property(getCAlarms)
+    cranges = property(getCRanges)
+
+    min_alarm = property(getMinAlarm, setMinAlarm)
+    max_alarm = property(getMaxAlarm, setMaxAlarm)
+    min_warning = property(getMinWarning, setMinWarning)
+    max_warning = property(getMaxWarning, setMaxWarning)
+
+    # properties
+    label = property(getLabel, setLabel)
+    range = property(getRange, setRange)
+    warnings = property(getWarnings, setWarnings)
+    alarms = property(getAlarms, setAlarms)
+
+    @property
+    def description(self):
+        return self._description
+
+    @property
+    def dev_alias(self):
+        self.deprecated(dep='dev_alias', alt='getParentObj().name', rel='tep14')
+        parent = self.getParentObj()
+        if parent is None:
+            return None
+        else:
+            return parent.name
+
+    @description.setter
+    def description(self, descr):
+        if descr != self._description:
+            if descr == '':
+                descr = 'A Tango Attribute'
+            self._description = descr
+            self._applyConfig()
 
 
 class TangoAttributeEventListener(EventListener):
     """A class that listens for an event with a specific value
-    
+
     Note: Since this class stores for each event value the last timestamp when
     it occured, it should only be used for events for which the event value
     domain (possible values) is limited and well known (ex: an enum)"""
@@ -518,7 +1181,6 @@ class TangoAttributeEventListener(EventListener):
         self.fireEvent(v.value)
 
 
-
 def test1():
     import numpy
     from taurus import Attribute
@@ -528,4 +1190,3 @@ def test1():
 
 if __name__ == "__main__":
     test1()
-
diff --git a/lib/taurus/core/tango/tangoconfiguration.py b/lib/taurus/core/tango/tangoconfiguration.py
index 2380892..f9cc90f 100644
--- a/lib/taurus/core/tango/tangoconfiguration.py
+++ b/lib/taurus/core/tango/tangoconfiguration.py
@@ -2,435 +2,43 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 taurus tango attribute configuration"""
+"""[DEPRECATED SINCE v 4.0]
+This module contains all taurus tango attribute configuration"""
 
 __all__ = ["TangoConfiguration"]
 
 __docformat__ = "restructuredtext"
 
-# -*- coding: utf-8 -*-
-import threading
-import weakref
-import time
-
-import PyTango
-
-from taurus import Factory, Manager
-from taurus.core.taurusbasetypes import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusConfigValue
 from taurus.core.taurusconfiguration import TaurusConfiguration
-from .enums import EVENT_TO_POLLING_EXCEPTIONS
-
-class TangoConfiguration(TaurusConfiguration):
-    
-    def __init__(self, name, parent, storeCallback = None):
-        self._events_working = False
-        self.call__init__(TaurusConfiguration, name, parent, storeCallback)
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusModel necessary overwrite
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    # helper class property that stores a reference to the corresponding factory
-    _factory = None
-    
-    @classmethod
-    def factory(cls):
-        if cls._factory is None:
-            cls._factory = Factory("tango")
-        return cls._factory
-
-    def __getattr__(self, name):
-        if self._attr_info is None:
-            return
-        try:
-            return getattr(self._attr_info,name)
-        except:
-            try:
-                return getattr(self._attr_info.alarms,name)
-            except:
-                try:
-                    return getattr(self._attr_info.events,name)
-                except AttributeError:
-                    raise AttributeError
-                    
-    def isWrite(self, cache=True):
-        return self.getWritable(cache) == PyTango.AttrWriteType.WRITE
-    
-    def isReadOnly(self, cache=True):
-        return self.getWritable(cache) == PyTango.AttrWriteType.READ
-
-    def isReadWrite(self, cache=True):
-        return self.getWritable(cache) == PyTango.AttrWriteType.READ_WRITE
-    
-    def isScalar(self, cache=True):
-        return self.getDataFormat(cache) == PyTango.AttrDataFormat.SCALAR
-    
-    def isSpectrum(self, cache=True):
-        return self.getDataFormat(cache) == PyTango.AttrDataFormat.SPECTRUM
-    
-    def isImage(self, cache=True):
-        return self.getDataFormat(cache) == PyTango.AttrDataFormat.IMAGE
-    
-    def encode(self, value):
-        """Translates the given value into a tango compatible value according to
-        the attribute data type
-        value must be a valid """
-        return value
 
-    def getValueObj(self, cache=True):
-        """ Returns the current configuration for the attribute.
-            if cache is set to True (default) and the the configuration has 
-            events active then it will return the local cached value. Otherwise
-            it will read from the tango layer."""
-        if cache and self._attr_info is not None:
-            return self._attr_info
-        
-        curr_time = time.time()
-        
-        dt = (curr_time - self._attr_timestamp)*1000
-        if dt < TangoConfiguration.DftTimeToLive:
-            return self._attr_info
-            
-        self._attr_timestamp = curr_time
-        try:
-            dev = self._getDev()
-            v = dev.attribute_query(self._getAttrName())
-            self._attr_info = self.decode(v)
-        except PyTango.DevFailed, df:
-            err = df[0]
-            self.debug("[Tango] read configuration failed (%s): %s" % (err.reason, err.desc))
-        except Exception, e:
-            self.debug("[Tango] read configuration failed: %s" % str(e))
-        return self._attr_info
 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # API for listeners
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
+class TangoConfigValue(TaurusConfigValue):
+    '''A TaurusConfigValue specialization to decode PyTango.AttrInfoEx
+    objects'''
+    pass
 
-    def __fireRegisterEvent(self, listener):
-        value = self.getValueObj()
-        if value is not None:
-            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 = TaurusConfiguration.addListener(self, listener)
-        if not ret:
-            return ret
-        
-        #fire a first configuration event
-        #if len(self._listeners) > 1 or not self._events_working:
-        Manager().addJob(self.__fireRegisterEvent, None, (listener,))
-        return ret
-    
-    def removeListener(self, listener):
-        """ Remove a TaurusListener from the listeners list.
-        If it is the last listener, unsubscribe from events."""
-        ret = TaurusConfiguration.removeListener(self, listener)
-        if not ret:
-            return ret
-        if not self.hasListeners():
-            self._unsubscribeEvents()
-        return ret
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # PyTango event handling (private) 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
-
-    def _subscribeEvents(self):
-        """ Enable subscription to the attribute configuration events."""
-        self.trace("Subscribing to configuration events...")
-        dev = self._getDev()
-        if dev is None:
-            self.debug("failed to subscribe config events: device is None")
-            return
-        dev = dev.getHWObj()
-        if dev is None:
-            self.debug("failed to subscribe config events: HW is None")
-            return
-        
-        attrname = self._getAttrName()
-        try:
-            self._cfg_evt_id = dev.subscribe_event(attrname,
-                                                  PyTango.EventType.ATTR_CONF_EVENT,
-                                                  self, [], True)
-        except PyTango.DevFailed, e:
-            self.debug("Unexpected exception trying to subscribe to CONFIGURATION events.")
-            self.traceback()
-            # Subscription failed either because event mechanism is not available
-            # or because the device server is not running.
-            # The first possibility is assumed so an attempt to get the configuration
-            # manually is done 
-            try:
-                self.getValueObj(cache=False)
-            except: 
-                self.debug("Error getting attribute configuration")
-                self.traceback()
-        
-    def _unsubscribeEvents(self):
-        # Careful in this method: This is intended to be executed in the cleanUp
-        # so we should not access external objects from the factory, like the 
-        # parent object
-        if self._cfg_evt_id and not self._dev_hw_obj is None:
-            self.trace("Unsubscribing to configuration events (ID=%s)" % str(self._cfg_evt_id))
-            try:
-                self._dev_hw_obj.unsubscribe_event(self._cfg_evt_id)
-                self._cfg_evt_id = None
-            except PyTango.DevFailed, e:
-                self.debug("Exception trying to unsubscribe configuration events")
-                self.trace(str(e))
-                
-    def decode(self, i):
-        if i is None:
-            return i
-        
-        i.climits = [i.min_value, i.max_value]
-        i.calarms = [i.min_alarm, i.max_alarm]
-        i.cwarnings = [i.alarms.min_warning, i.alarms.max_warning]
-        i.cranges = [i.min_value, i.min_alarm, i.alarms.min_warning,
-                    i.alarms.max_warning, i.max_alarm, i.max_value]
-        i.range = [i.min_value, i.max_value]
-        i.alarm = [i.min_alarm, i.max_alarm]
-        i.warning = [i.alarms.min_warning, i.alarms.max_warning]
-        # add dev_name, dev_alias, attr_name, attr_full_name
-        i.dev_name = self._getDev().getNormalName()
-        i.dev_alias = self._getDev().getSimpleName()
-        try:
-            attr = self._getAttr()
-            if attr is not None:
-                i.attr_fullname = self._getAttr().getNormalName()
-                i.attr_name = self._getAttr().getSimpleName()
-            else: 
-                self.debug(('TangoConfiguration.decode(%s/%s): ' +
-                              'self._getAttr() returned None (failed detach?)'), 
-                           i.dev_name, i.name)
-        except:
-            import traceback
-            self.warning('at TangoConfiguration.decode(%s/%s)', i.dev_name, i.name)
-            self.warning(traceback.format_exc())
-            i.attr_name = i.attr_fullname = ''
-        
-        # %6.2f is the default value that Tango sets when the format is
-        # unassigned. This is only good for float types! So for other
-        # types I am changing this value.
-        # There's a bug about this in the core TangoC++ project, so
-        # this code may become useless someday.
-        if i.format == '%6.2f':
-            if PyTango.is_float_type(i.data_type, inc_array=True):
-                pass
-            elif PyTango.is_int_type(i.data_type, inc_array=True):
-                i.format = '%d'
-            elif i.data_type in (PyTango.CmdArgType.DevString, PyTango.CmdArgType.DevVarStringArray):
-                i.format = '%s'
-        return i
-
-    def push_event(self, event):
-        if event.err:
-            if event.errors[0].reason not in EVENT_TO_POLLING_EXCEPTIONS:
-                self._attr_timestamp = time.time()
-                self._events_working = True
-            else:
-                self._events_working = False
-            return
-        if self._getAttr() is None and not self._listeners:
-            #===================================================================
-            # This is a safety net to catch "zombie" TangoConfiguration objects
-            # when they get called.
-            # If you get here, there is some bug elsewhere which should be
-            # investigated.
-            # Without this safety net, you would get exceptions.
-            # We assume that a TangoConfiguration object which has no listeners
-            # and which is not associated to a TangoAttribute, is a "zombie".
-            self.warning('"Zombie" object (%s) received an event. Unsubscribing it.', repr(self))
-            self._unsubscribeEvents()
-            return
-            #===================================================================
-        self._events_working = True
-        self._attr_timestamp = time.time()
-        self._attr_info = self.decode(event.attr_conf)
-        listeners = tuple(self._listeners)
-        #Manager().addJob(self._push_event, None, event)
-        Manager().addJob(self.fireEvent, None, TaurusEventType.Config, self._attr_info, listeners=listeners)
-        
-    
-    #===========================================================================
-    # Some methods reimplemented from TaurusConfiguration
-    #===========================================================================
-    
-    def getMaxDimX(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.max_dim_x
-        return None
-
-    def getMaxDimY(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.max_dim_y
-        return None
-    
-    def getType(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.data_type
-        return None
-    
-    def getRange(self, cache=True):
-        return self.getLimits(cache=cache)
-    
-    def getLimits(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.climits
-        return None
-    
-    def getRanges(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return list(c.cranges)
-        return None
-    
-    def getMinAlarm(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.min_alarm
-        return None
-
-    def getMaxAlarm(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.max_alarm
-        return None
-        
-    def getAlarms(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return list(c.calarms)
-        return None
-    
-    def getMinWarning(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.alarms.min_warning
-        return None
-
-    def getMaxWarning(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.alarms.max_warning
-        return None
-        
-    def getWarnings(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return list(c.cwarnings)
-        return None
-    
-    def getParam(self, param_name):
-        config = self.getValueObj()
-        if config:
-            if param_name.endswith('warning') or param_name.endswith('alarm'):
-                config = config.alarms
-            try:
-                return getattr(config, param_name)
-            except:
-                return None
-            
-    def setParam(self, param_name, value):
-        config = self.getValueObj()
-        if config is None:
-            return
-        if param_name.endswith('warning') or param_name.endswith('alarm'):
-            config = config.alarms
-        setattr(config, param_name, value)
-        self._applyConfig()
-    
-    def setDescription(self,descr):
-        config = self.getValueObj()
-        if config:
-            config.description = descr
-            self._applyConfig()
-
-    def setLabel(self,lbl):
-        config = self.getValueObj()
-        if config:
-            config.label = lbl
-            self._applyConfig()
-
-    def setUnit(self,unit):
-        config = self.getValueObj()
-        if config:
-            config.unit = unit
-            self._applyConfig()
-
-    def setStandardUnit(self,standard_unit):
-        config = self.getValueObj()
-        if config:
-            config.standard_unit = standard_unit
-            self._applyConfig()
-        
-    def setDisplayUnit(self,display_unit):
-        config = self.getValueObj()
-        if config:
-            config.display_unit = display_unit
-            self._applyConfig()
-    
-    def setFormat(self,fmt):
-        config = self.getValueObj()
-        if config:
-            config.format = fmt
-            self._applyConfig()
-        
-    def setLimits(self,low, high):
-        config = self.getValueObj()
-        if config:
-            l_str, h_str = str(low), str(high)
-            config.cranges[0] = config.min_value = l_str
-            config.cranges[5] = config.max_value = h_str
-            config.climits = [l_str, h_str]
-            self._applyConfig()
-
-    def setWarnings(self,low, high):
-        config = self.getValueObj()
-        if config:
-            l_str, h_str = str(low), str(high)
-            config.cranges[2] = config.alarms.min_warning = l_str
-            config.cranges[3] = config.alarms.max_warning = h_str
-            config.cwarnings = [l_str, h_str]
-            self._applyConfig()
-
-    def setAlarms(self,low, high):
-        config = self.getValueObj()
-        if config:
-            l_str, h_str = str(low), str(high)
-            config.cranges[1] = config.min_alarm = config.alarms.min_alarm = l_str
-            config.cranges[4] = config.max_alarm = config.alarms.max_alarm = h_str
-            config.calarms = [l_str, h_str]
-            self._applyConfig()
-    
-    def _applyConfig(self):
-        config = self.getValueObj()
-        if config:
-            self.getParentObj().setConfigEx(config)
+class TangoConfiguration(TaurusConfiguration):
+    pass
diff --git a/lib/taurus/core/tango/tangodatabase.py b/lib/taurus/core/tango/tangodatabase.py
index 4245603..fb35ff6 100644
--- a/lib/taurus/core/tango/tangodatabase.py
+++ b/lib/taurus/core/tango/tangodatabase.py
@@ -2,125 +2,280 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 taurus tango database"""
+"""This module contains all taurus tango authority"""
 
-__all__ = ["TangoDevInfo", "TangoServInfo", "TangoDatabaseCache",
-           "TangoDatabase" ]
+__all__ = ["TangoInfo", "TangoAttrInfo", "TangoDevInfo", "TangoServInfo",
+           "TangoDevClassInfo", "TangoDatabaseCache", "TangoDatabase",
+           "TangoAuthority"]
 
 __docformat__ = "restructuredtext"
 
 import os
+import operator
+import weakref
 
-import PyTango
-import PyTango.utils
-
-from taurus import Factory, Device
-from taurus.core.taurusbasetypes import TaurusSWDevHealth
-from taurus.core.taurusdatabase import TaurusDatabaseCache, TaurusDevInfo, \
-    TaurusAttrInfo, TaurusServInfo, TaurusDevClassInfo, TaurusDevTree, \
-    TaurusServerTree
+from PyTango import (Database, DeviceProxy, DevFailed, ApiUtil)
+from taurus import Device
+from taurus.core.taurusbasetypes import TaurusDevState, TaurusEventType
+from taurus.core.taurusauthority import TaurusAuthority
 from taurus.core.util.containers import CaselessDict
-from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.util.log import taurus4_deprecation
+
 
 InvalidAlias = "nada"
 
 
-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)
+class TangoInfo(object):
+
+    def __init__(self, container, name=None, full_name=None):
+        self._container = weakref.ref(container)
+        self._name = name
+        self._full_name = full_name
+
+    def container(self):
+        return self._container()
+
+    def name(self):
+        return self._name
+
+    def fullName(self):
+        return self._full_name
+
+    def __str__(self):
+        return "%s(%s)" % (self.__class__.__name__, self.name())
+    __repr__ = __str__
+
+
+class TangoAttrInfo(TangoInfo):
+
+    def __init__(self, container, name=None, full_name=None, device=None,
+                 info=None):
+        super(TangoAttrInfo, self).__init__(container, name=name,
+                                            full_name=full_name)
+        self._info = info
+        self._device = weakref.ref(device)
+
+    def device(self):
+        return self._device()
+
+    def info(self):
+        return self._info
+
+    def __getattr__(self, name):
+        return getattr(self._info, name)
+
+
+class TangoDevClassInfo(TangoInfo):
+
+    def __init__(self, container, name=None, full_name=None):
+        super(TangoDevClassInfo, self).__init__(container, name=name,
+                                                full_name=full_name)
+
+        self._devices = CaselessDict()
+
+    def devices(self):
+        return self._devices
+
+    def addDevice(self, dev):
+        self._devices[dev.name()] = dev
+
+    def getDeviceNames(self):
+        if not hasattr(self, "_device_name_list"):
+            self._device_name_list = sorted(map(TangoDevInfo.name,
+                                                self._devices.values()))
+        return self._device_name_list
+
+
+class TangoDevInfo(TangoInfo):
+
+    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)
+        self._alias = alias
+        self._server = weakref.ref(server)
+        self._klass = weakref.ref(klass)
+        self._exported = bool(int(exported))
+        self._alive = None
+        self._state = None
+        self._host = host
+        self._domain, self._family, self._member = map(str.upper,
+                                                       name.split("/", 2))
+        self._attributes = None
         self._alivePending = False
-    
-    def attributes(self):
-        if self._attributes is None or len(self._attributes) == 0:
-            self.refreshAttributes()
-        return self._attributes
 
-    def getHWObj(self):
-        db = self.container().db
-        name = self.name()
-        full_name = db.getFullName() + "/" + name
-        dev = None
-        try:
-            dev = db.factory().getDevice(full_name).getHWObj()
-        except:
-            pass
-        return dev
-    
+    def domain(self):
+        return self._domain
+
+    def family(self):
+        return self._family
+
+    def member(self):
+        return self._member
+
+    def alias(self):
+        return self._alias
+
+    def server(self):
+        return self._server()
+
+    def klass(self):
+        return self._klass()
+
+    def exported(self):
+        return self._exported
+
     def alive(self):
         if self._alive is None:
             if self._alivePending:
                 return False
             self._alivePending = True
             try:
-                dev = self.getHWObj()
-                state = dev.state()
+                dev = self.getDeviceProxy()
+                _ = dev.state()
                 self._alive = True
             except:
                 self._alive = False
             self._alivePending = False
         return self._alive
-    
-    def health(self):
-        """Overwrite health so it doesn't call 'alive()' since it can take
+
+    def state(self):
+        """Overwrite state so it doesn't call 'alive()' since it can take
         a long time for devices that are declared as exported but are in fact
-        not running (crached, network error, power cut, etc)"""
-        if not self._health is None:
-            return self._health
+        not running (crashed, network error, power cut, etc)"""
+        if not self._state is None:
+            return self._state
         exported = self.exported()
         if exported:
-            self._health = TaurusSWDevHealth.Exported
+            self._state = TaurusDevState.Ready
         else:
-            self._health = TaurusSWDevHealth.NotExported
-        return self._health
-    
+            self._state = TaurusDevState.NotReady
+        return self._state
+
+    def host(self):
+        return self._host
+
+    def attributes(self):
+        if self._attributes is None or len(self._attributes) == 0:
+            self.refreshAttributes()
+        return self._attributes
+
+    def getAttribute(self, attrname):
+        attrname = attrname.lower()
+        for a in self.attributes():
+            if a.name() == attrname:
+                return a
+        return None
+
+    def setAttributes(self, attributes):
+        self._attributes = attributes
+
+    @taurus4_deprecation(alt="getDeviceProxy()")
+    def getHWObj(self):
+        return self.getDeviceProxy()
+
+    def getDeviceProxy(self):
+        db = self.container().db
+        name = self.name()
+        full_name = db.getFullName() + "/" + name
+        dev = None
+        try:
+            dev = db.factory().getDevice(full_name).getDeviceProxy()
+        except:
+            pass
+        return dev
+
     def refreshAttributes(self):
         attrs = []
         try:
-            dev = self.getHWObj()
+            dev = self.getDeviceProxy()
             if dev is None:
-                raise PyTango.DevFailed() # @todo: check if this is the right exception to throw
+                raise DevFailed()  # @todo: check if this is the right exception to throw
             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 = TaurusAttrInfo(self.container(), 
-                    name=attr_info.name.lower(), full_name=full_name.lower(),
-                    device=self, info=attr_info)
+                attr_obj = TangoAttrInfo(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 as df:
-            if self.health() == TaurusSWDevHealth.Exported:
-                self._health = TaurusSWDevHealth.ExportedNotAlive
+            attrs = sorted(attrs, key=lambda attr: attr.name())
+        except DevFailed as df:
+            self._state = TaurusDevState.NotReady
         self.setAttributes(attrs)
 
 
-class TangoServInfo(TaurusServInfo):
-    
+class TangoServInfo(TangoInfo):
+
     def __init__(self, container, name=None, full_name=None):
-        super(TangoServInfo, self).__init__(container, name=name, full_name=full_name)
+        super(TangoServInfo, self).__init__(container, name=name,
+                                            full_name=full_name)
+        self._devices = {}
+        self._exported = False
+        self._alive = None
+        self._host = ""
+        self._server_name, self._server_instance = name.split("/", 1)
         self._alivePending = False
-        
+
+    def devices(self):
+        return self._devices
+
+    def getDeviceNames(self):
+        if not hasattr(self, "_device_name_list"):
+            self._device_name_list = sorted(map(TangoDevInfo.name,
+                                                self._devices.values()))
+        return self._device_name_list
+
+    def getClassNames(self):
+        if not hasattr(self, "_klass_name_list"):
+            klasses = set(map(TangoDevInfo.klass, self._devices.values()))
+            self._klass_name_list = sorted(map(TangoDevClassInfo.name,
+                                               klasses))
+        return self._klass_name_list
+
+    def exported(self):
+        return self._exported
+
+    def state(self):
+        exported = self.exported()
+        if exported:
+            return TaurusDevState.Ready
+        return TaurusDevState.NotReady
+
+    def host(self):
+        return self._host
+
+    def serverName(self):
+        return self._server_name
+
+    def serverInstance(self):
+        return self._server_instance
+
+    def addDevice(self, dev):
+        self._exported |= dev.exported()
+        self._host = dev.host()
+        self._devices[dev.name()] = dev
+
     def alive(self):
         if self._alive is None:
             if self._alivePending:
@@ -133,14 +288,32 @@ class TangoServInfo(TaurusServInfo):
                     if not alive:
                         break
                 self._alive = alive
-            except Exception,e:
-                print "except",e
+            except Exception, e:
+                print "except", e
                 self._alive = False
             self._alivePending = False
         return self._alive
 
 
-class TangoDatabaseCache(TaurusDatabaseCache):
+class TangoDatabaseCache(object):
+
+    def __init__(self, db):
+        self._db = weakref.ref(db)
+        self._device_tree = None
+        self._server_tree = None
+        self._servers = None
+        self._server_name_list = None
+        self._devices = None
+        self._device_name_list = None
+        self._klasses = None
+        self._klass_name_list = None
+        self._aliases = None
+        self._alias_name_list = None
+        self.refresh()
+
+    @property
+    def db(self):
+        return self._db()
 
     def refresh(self):
         db = self.db
@@ -162,7 +335,7 @@ class TangoDatabaseCache(TaurusDatabaseCache):
             all_exported = db.get_device_exported('*')
             for k in db.get_device_alias_list('*'):  # Time intensive!!
                 all_alias[db.get_device_alias(k)] = k
-            for d in all_devs: # Very time intensive!!
+            for d in all_devs:  # Very time intensive!!
                 _info = db.command_inout("DbGetDeviceInfo", d)[1]
                 name, ior, level, server, host, started, stopped = _info
                 klass = db.get_class_for_device(d)
@@ -175,73 +348,249 @@ class TangoDatabaseCache(TaurusDatabaseCache):
         dev_dict, serv_dict, klass_dict, alias_dict = CD(), {}, {}, CD()
 
         for i in xrange(0, len(data), column_nb):
-            name, alias, exported, host, server, klass = data[i:i+column_nb]
-            if name.count("/") != 2: continue # invalid/corrupted entry: just ignore it
-            if server.count("/") != 1: continue # invalid/corrupted entry: just ignore it
-            if not len(alias): alias = None
-
-            serv_dict[server] = si = serv_dict.get(server, 
+            name, alias, exported, host, server, klass = data[i:i + column_nb]
+            if name.count("/") != 2:
+                continue  # invalid/corrupted entry: just ignore it
+            if server.count("/") != 1:
+                continue  # invalid/corrupted entry: just ignore it
+            if not len(alias):
+                alias = None
+
+            serv_dict[server] = si = serv_dict.get(server,
                                                    TangoServInfo(self, name=server,
                                                                  full_name=server))
-            
+
             klass_dict[klass] = dc = klass_dict.get(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, 
+                                                    TangoDevClassInfo(self,
+                                                                      name=klass,
+                                                                      full_name=klass))
+
+            full_name = "%s/%s" % (db.getFullName(), name)
+            dev_dict[name] = di = TangoDevInfo(self, name=name, full_name=full_name,
                                                alias=alias, server=si, klass=dc,
                                                exported=exported, host=host)
-            
+
             si.addDevice(di)
             dc.addDevice(di)
             if alias is not None:
                 alias_dict[alias] = di
-        
+
         self._devices = dev_dict
-        self._device_tree = TaurusDevTree(dev_dict)
-        self._server_tree = TaurusServerTree(serv_dict)
+        self._device_tree = TangoDevTree(dev_dict)
+        self._server_tree = TangoServerTree(serv_dict)
         self._servers = serv_dict
         self._klasses = klass_dict
         self._aliases = alias_dict
-        
+
     def refreshAttributes(self, device):
         attrs = []
         try:
             db = self.db
             name = device.name()
             full_name = db.getFullName() + "/" + name
-            taurus_dev = db.factory().getExistingDevice(full_name)
+            taurus_dev = db.factory().getDevice(full_name,
+                                                create_if_needed=False)
             if taurus_dev is None:
-                dev = PyTango.DeviceProxy(full_name)
+                dev = DeviceProxy(full_name)
             else:
-                dev = taurus_dev.getHWObj()
+                dev = taurus_dev.getDeviceProxy()
             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 = TaurusAttrInfo(self, name=attr_info.name,
-                                          full_name=full_attr_name,
-                                          device=device, info=attr_info) 
+                attr_obj = TangoAttrInfo(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 as df:
+            attrs = sorted(attrs, key=lambda attr: attr.name().lower())
+        except DevFailed as df:
             pass
         device.setAttributes(attrs)
 
+    def getDevice(self, name):
+        """Returns a :class:`TangoDevInfo` object with information
+        about the given device name
+
+        :param name: (str) the device name
+
+        :return: (TangoDevInfo) information about the device"""
+        return self._devices.get(name)
+
+    def getDeviceNames(self):
+        """Returns a list of registered device names
+
+        :return: (sequence<str>) a sequence with all registered device names"""
+        if self._device_name_list is None:
+            self._device_name_list = sorted(
+                map(TangoDevInfo.name, self.devices().values()))
+        return self._device_name_list
+
+    def getAliasNames(self):
+        if self._alias_name_list is None:
+            self._alias_name_list = sorted(
+                map(TangoDevInfo.alias, self.aliases().values()))
+        return self._alias_name_list
+
+    def getServerNames(self):
+        """Returns a list of registered server names
+
+        :return: (sequence<str>) a sequence with all registered server names"""
+        if self._server_name_list is None:
+            self._server_name_list = sorted(
+                map(TangoServInfo.name, self.servers().values()))
+        return self._server_name_list
+
+    def getClassNames(self):
+        """Returns a list of registered device classes
+
+        :return: (sequence<str>) a sequence with all registered device classes"""
+        if self._klass_name_list is None:
+            self._klass_name_list = sorted(
+                map(TangoDevClassInfo.name, self.klasses().values()))
+        return self._klass_name_list
+
+    def deviceTree(self):
+        """Returns a tree container with all devices in three levels: domain,
+           family and member
+
+           :return: (TangoDevTree) a tree containning all devices"""
+        return self._device_tree
+
+    def serverTree(self):
+        """Returns a tree container with all servers in two levels: server name
+        and server instance
+
+           :return: (TangoServerTree) a tree containning all servers"""
+        return self._server_tree
+
+    def servers(self):
+        return self._servers
+
+    def devices(self):
+        return self._devices
+
+    def klasses(self):
+        return self._klasses
+
+    def getDeviceDomainNames(self):
+        return self._device_tree.keys()
+
+    def getDeviceFamilyNames(self, domain):
+        families = self._device_tree.get(domain)
+        if families is None:
+            return []
+        return families.keys()
+
+    def getDeviceMemberNames(self, domain, family):
+        families = self._device_tree.get(domain)
+        if families is None:
+            return []
+        members = families.get(family)
+        if members is None:
+            return []
+        return members.keys()
+
+    def getDomainDevices(self, domain):
+        return self.deviceTree().getDomainDevices(domain)
+
+    def getFamilyDevices(self, domain, family):
+        return self.deviceTree().getFamilyDevices(domain, family)
+
+    def getServerNameInstances(self, serverName):
+        return self.serverTree().getServerNameInstances(serverName)
+
+
+class TangoDevTree(CaselessDict):
+
+    def __init__(self, other=None):
+        super(TangoDevTree, self).__init__()
+        self._devices = CaselessDict()
+        if other is not None:
+            self._update(other)
+
+    def _update(self, other):
+        try:
+            if operator.isMappingType(other):
+                other = other.values()
+            for dev in other:
+                try:
+                    self.addDevice(dev)
+                except Exception, e:
+                    print e
+        except Exception, e:
+            raise Exception(
+                "Must give dict<obj, TangoDevInfo> or sequence<TangoDevInfo>")
+
+    def addDevice(self, dev_info):
+        domain, family, member = dev_info.domain(), dev_info.family(), dev_info.member()
+
+        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, CaselessDict())
+
+        members[member] = dev_info
+
+    def getDomainDevices(self, domain):
+        """Returns all devices under the given domain. Returns empty list if
+        the domain doesn't exist or doesn't contain any devices"""
+        return self._devices.get(domain, {}).values()
+
+    def getFamilyDevices(self, domain, family):
+        """Returns all devices under the given domain/family. Returns empty list if
+        the domain/family doesn't exist or doesn't contain any devices"""
+        families = self.get(domain)
+        if families is None:
+            return
+        return families.get(family, {}).values()
+
+
+class TangoServerTree(dict):
+
+    def __init__(self, other=None):
+        super(TangoServerTree, self).__init__()
+        if other is not None:
+            self._update(other)
+
+    def _update(self, other):
+        try:
+            if operator.isMappingType(other):
+                other = other.values()
+            for serv in other:
+                try:
+                    self.addServer(serv)
+                except Exception, e:
+                    print e
+        except Exception, e:
+            raise Exception(
+                "Must give dict<obj, TangoServInfo> or sequence<TangoServInfo>")
+
+    def addServer(self, serv_info):
+        serverName, serverInstance = serv_info.serverName(), serv_info.serverInstance()
+
+        serverInstances = self[serverName] = self.get(serverName, {})
+
+        serverInstances[serverInstance] = serv_info
+
+    def getServerNameInstances(self, serverName):
+        """Returns all servers under the given serverName. Returns empty list if
+        the server name doesn't exist or doesn't contain any instances"""
+        return self.get(serverName, {}).values()
+
 
 def get_home():
     """
     Find user's home directory if possible. Otherwise raise error.
-    
+
     :return: user's home directory
     :rtype: str
-    
+
     New in PyTango 7.2.0
     """
-    path=''
+    path = ''
     try:
-        path=os.path.expanduser("~")
+        path = os.path.expanduser("~")
     except:
         pass
     if not os.path.isdir(path):
@@ -250,33 +599,35 @@ def get_home():
                 path = os.environ[evar]
                 if os.path.isdir(path):
                     break
-            except: pass
+            except:
+                pass
     if path:
         return path
     else:
         raise RuntimeError('please define environment variable $HOME')
 
+
 def get_env_var(env_var_name):
     """
     Returns the value for the given environment name
     A backup method for old Tango/PyTango versions which don't implement
     :meth:`PyTango.ApiUtil.get_env_var`
-    
+
     Search order:
 
         * a real environ var
         * HOME/.tangorc
         * /etc/tangorc
-        
+
     :param env_var_name: the environment variable name
     :type env_var_name: str
     :return: the value for the given environment name
     :rtype: str
     """
-    
+
     if env_var_name in os.environ:
         return os.environ[env_var_name]
-    
+
     fname = os.path.join(get_home(), '.tangorc')
     if not os.path.exists(fname):
         if os.name == 'posix':
@@ -285,40 +636,46 @@ def get_env_var(env_var_name):
         return None
 
     for line in file(fname):
-        strippedline = line.split('#',1)[0].strip()
-        
+        strippedline = line.split('#', 1)[0].strip()
+
         if not strippedline:
-            #empty line
+            # empty line
             continue
-        
-        tup = strippedline.split('=',1)
-        if len(tup) !=2:
+
+        tup = strippedline.split('=', 1)
+        if len(tup) != 2:
             # illegal line!
             continue
-        
+
         key, val = map(str.strip, tup)
         if key == env_var_name:
             return val
 
 
-class TangoDatabase(TaurusDatabase):
+class TangoAuthority(TaurusAuthority):
+
+    # helper class property that stores a reference to the corresponding
+    # factory
+    _factory = None
+    _scheme = 'tango'
+    _description = 'A Tango Authority'
 
-    def __init__(self,host=None,port=None,parent=None):
+    def __init__(self, host=None, port=None, parent=None):
         pars = ()
         if host is None or port is None:
             try:
-                host, port = TangoDatabase.get_default_tango_host().rsplit(':', 1)
+                host, port = TangoAuthority.get_default_tango_host().rsplit(':', 1)
                 pars = host, port
             except Exception, e:
-                print "Error getting env TANGO_HOST:", str(e)
+                self.warning("Error getting default Tango host:", str(e))
         else:
             pars = host, port
-        self.dbObj = PyTango.Database(*pars)
+        self.dbObj = Database(*pars)
         self._dbProxy = None
         self._dbCache = None
-        
-        complete_name = "%s:%s" % (host, port)
-        self.call__init__(TaurusDatabase, complete_name, parent)
+
+        complete_name = "tango://%s:%s" % (host, port)
+        self.call__init__(TaurusAuthority, complete_name, parent)
 
         try:
             self.get_class_for_device(self.dev_name())
@@ -328,8 +685,8 @@ class TangoDatabase(TaurusDatabase):
 
     @staticmethod
     def get_default_tango_host():
-        if hasattr(PyTango.ApiUtil, "get_env_var"):
-            f = PyTango.ApiUtil.get_env_var
+        if hasattr(ApiUtil, "get_env_var"):
+            f = ApiUtil.get_env_var
         else:
             f = get_env_var
         return f("TANGO_HOST")
@@ -337,43 +694,46 @@ class TangoDatabase(TaurusDatabase):
     def __get_class_for_device(self, dev_name):
         """Backup method when connecting to tango 5 database device server"""
         # Ok, old tango database.
-        serv_name = self.command_inout("DbGetDeviceInfo",dev_name)[1][3]
+        serv_name = self.command_inout("DbGetDeviceInfo", dev_name)[1][3]
         devs = self.get_device_class_list(serv_name)
         dev_name_lower = dev_name.lower()
-        for i in xrange(len(devs)/2):
-            idx = i*2
+        for i in xrange(len(devs) / 2):
+            idx = i * 2
             if devs[idx].lower() == dev_name_lower:
-                return devs[idx+1]
+                return devs[idx + 1]
         return None
 
     def get_device_attribute_list(self, dev_name, wildcard):
         return self.command_inout("DbGetDeviceAttributeList", (dev_name, wildcard))
-        
+
     # Export the PyTango.Database interface into this object.
-    # This way we can call for example get_attribute_property on an object of this class
+    # This way we can call for example get_attribute_property on an object of
+    # this class
     def __getattr__(self, name):
-        if not self.dbObj is None: 
-            return getattr(self.dbObj,name)
+        if not self.dbObj is None:
+            return getattr(self.dbObj, name)
         return None
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusModel implementation
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
 
-    # helper class property that stores a reference to the corresponding factory
-    _factory = None
-    
-    @classmethod
-    def factory(cls):
-        if cls._factory is None:
-            cls._factory = Factory(scheme='tango')
-        return cls._factory
-        
-    def getValueObj(self,cache=True):
+    @taurus4_deprecation(alt='getTangoDB')
+    def getValueObj(self, cache=True):
+        return self.getTangoDB()
+
+    def getTangoDB(self):
         return self.dbObj
-    
+
+    @taurus4_deprecation(alt='getFullName')
+    def getDisplayValue(self, cache=True):
+        return self.getDisplayDescription(cache)
+
+    def addListener(self, listener):
+        ret = TaurusAuthority.addListener(self, listener)
+        if not ret:
+            return ret
+        self.fireEvent(TaurusEventType.Change, self.getFullName(), listener)
+        return ret
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # Mandatory methods to overwrite from TaurusDatabase
+    # Query capabilities built on top of a cache
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def cache(self):
@@ -381,18 +741,95 @@ class TangoDatabase(TaurusDatabase):
             self._dbCache = TangoDatabaseCache(self)
         return self._dbCache
 
+    def refreshCache(self):
+        self.cache().refresh()
+
+    def getDevice(self, name):
+        """
+        Reimplemented from :class:`TaurusDevice` to use cache and return
+        :class:`taurus.core.tango.TangoDevInfo` objects with information
+        about the given device name
+
+        :param name: (str) the device name
+
+        :return: (TangoDevInfo) information about the tango device"""
+        return self.cache().getDevice(name)
+
+    def getDeviceNames(self):
+        """Returns a list of registered tango device names
+
+        :return: (sequence<str>) a sequence with all registered tango device names"""
+        return self.cache().getDeviceNames()
+
+    def getAliasNames(self):
+        """Returns a list of registered tango device alias
+
+        :return: (sequence<str>) a sequence with all registered tango device alias"""
+        return self.cache().getAliasNames()
+
+    def getServerNames(self):
+        """Returns a list of registered tango device servers in format<name>/<instance>
+
+        :return: (sequence<str>) a sequence with all registered tango device servers"""
+        return self.cache().getServerNames()
+
+    def getClassNames(self):
+        """Returns a list of registered tango device classes
+
+        :return: (sequence<str>) a sequence with all registered tango device classes"""
+        return self.cache().getClassNames()
+
+    def getDeviceDomainNames(self):
+        return self.cache().getDeviceDomainNames()
+
+    def getDeviceFamilyNames(self, domain):
+        return self.cache().getDeviceFamilyNames(domain)
+
+    def getDeviceMemberNames(self, domain, family):
+        return self.cache().getDeviceMemberNames(domain, family)
+
+    def getDomainDevices(self, domain):
+        return self.cache().getDomainDevices(domain)
+
+    def getFamilyDevices(self, domain, family):
+        return self.cache().getFamilyDevices(domain, family)
+
+    def getServerNameInstances(self, serverName):
+        return self.cache().getServerNameInstances(serverName)
+
+    def deviceTree(self):
+        """Returns a tree container with all devices in three levels : domain,
+           family and member
+
+           :return: (TangoDevTree) a tree containning all devices"""
+        return self.cache().deviceTree()
+
     def getElementAlias(self, full_name):
+        '''return the alias of an element from its full name'''
         try:
-            alias = self.getValueObj().get_alias(full_name)
+            alias = self.getTangoDB().get_alias(full_name)
             if alias and alias.lower() == InvalidAlias:
-                alias = None 
+                alias = None
         except:
             alias = None
         return alias
-        
+
     def getElementFullName(self, alias):
-        try:
-            return self.getValueObj().get_device_alias(alias)
+        '''return the full name of an element from its alias'''
+        try:  # PyTango v>=8.1.0
+            return self.getTangoDB().get_device_from_alias(alias)
+        except AttributeError:
+            try:  # PyTango v<8.1.0
+                return self.getTangoDB().get_device_alias(alias)
+            except:
+                return None
         except:
-            pass
-        return None
+            return None
+
+    @taurus4_deprecation(alt=".description")
+    def getDescription(self, cache=True):
+        return self.description
+
+
+# Declare this alias for backwards compatibility
+TangoDatabase = TangoAuthority
diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py
old mode 100644
new mode 100755
index 2a7114c..7f58995
--- a/lib/taurus/core/tango/tangodevice.py
+++ b/lib/taurus/core/tango/tangodevice.py
@@ -2,41 +2,41 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 taurus tango database"""
+"""This module defines the TangoDevice object"""
 
 __all__ = ["TangoDevice"]
 
 __docformat__ = "restructuredtext"
 
 import time
-import PyTango
+from PyTango import (DeviceProxy, DevFailed, LockerInfo, DevState)
 
-from taurus import Factory
 from taurus.core.taurusdevice import TaurusDevice
-from taurus.core.taurusbasetypes import TaurusSWDevState, TaurusLockInfo, LockStatus
+from taurus.core.taurusbasetypes import (TaurusDevState, TaurusLockInfo,
+                                         LockStatus, TaurusEventType)
+from taurus.core.util.log import taurus4_deprecation
 
-DFT_TANGO_DEVICE_DESCRIPTION = "A TANGO device"
 
 class _TangoInfo(object):
 
@@ -46,36 +46,177 @@ class _TangoInfo(object):
         self.server_host = 'Unknown'
         self.server_id = 'Unknown'
         self.server_version = 1
-                
+
+
 class TangoDevice(TaurusDevice):
+    """A Device object representing an abstraction of the PyTango.DeviceProxy
+       object in the taurus.core.tango scheme"""
+
+    # helper class property that stores a reference to the corresponding
+    # factory
+    _factory = None
+    _scheme = 'tango'
+    _description = "A Tango Device"
+
     def __init__(self, name, **kw):
         """Object initialization."""
         self.call__init__(TaurusDevice, name, **kw)
+        self._deviceObj = self._createHWObject()
+        self._lock_info = TaurusLockInfo()
+        self._deviceStateObj = None
+        # TODO reimplement using the new codification
+        self._deviceState = TaurusDevState.Undefined
 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusModel necessary overwrite
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # helper class property that stores a reference to the corresponding factory
-    _factory = None
-    
-    @classmethod
-    def factory(cls):
-        if cls._factory is None:
-            cls._factory = Factory(scheme='tango')
-        return cls._factory
+    # Export the DeviceProxy interface into this object.
+    # This way we can call for example read_attribute on an object of this
+    # class
+    def __getattr__(self, name):
+        if self._deviceObj is not None:
+            return getattr(self._deviceObj, name)
+        cls_name = self.__class__.__name__
+        raise AttributeError("'%s' has no attribute '%s'" % (cls_name, name))
+
+    # def __setattr__(self, name, value):
+    #     if '_deviceObj' in self.__dict__ and self._deviceObj is not None:
+    #         return setattr(self._deviceObj, name, value)
+    #     super(TaurusDevice, self).__setattr__(name, value)
+
+    def __contains__(self, key):
+        """delegate the contains interface to the device proxy"""
+        hw = self.getDeviceProxy()
+        if hw is None:
+            return False
+        return hw.__contains__(key)
+
+    def __getitem__(self, key):
+        """read attribute value using key-indexing syntax (e.g. as in a dict)
+        on the device"""
+        attr = self.getAttribute(key)
+        return attr.read()
+
+    def __setitem__(self, key, value):
+        """set attribute value using key-indexing syntax (e.g. as in a dict)
+        on the device"""
+        attr = self.getAttribute(key)
+        return attr.write(value)
+
+    def getAttribute(self, attrname):
+        """Returns the attribute object given its name"""
+        slashnb = attrname.count('/')
+        if slashnb == 0:
+            attrname = "%s/%s" % (self.getFullName(), attrname)
+        elif attrname[0] == '/':
+            attrname = "%s%s" % (self.getFullName(), attrname)
+        return self.factory().getAttribute(attrname)
+
+    @taurus4_deprecation(alt='.stateObj.read().rvalue [Tango] or ' +
+                           '.state [agnostic]')
+    def getState(self, cache=True):
+        stateAttrValue = self.stateObj.read(cache=cache)
+        if not stateAttrValue is None:
+            state_rvalue = stateAttrValue.rvalue
+            return DevState.values[state_rvalue.value]
+        return None
+
+    @taurus4_deprecation(alt='.stateObj [Tango] or ' +
+                           '.factory.getAttribute(state_full_name) [agnostic]')
+    def getStateObj(self):
+        return self.stateObj
+
+    @taurus4_deprecation(alt="state")
+    def getSWState(self, cache=True):
+        raise Exception('getSWState has been removed. Use state instead')
+        # return self.getValueObj().rvalue
+
+    @property
+    def state(self, cache=True):
+        """Reimplemented from :class:`TaurusDevice` to use Tango's state
+        attribute for diagnosis of the current state. It supports a "cache"
+        kwarg
+
+        :param cache: (bool) If True (default), cache will be used when reading
+                      the state attribute of this device
+
+        :return: (TaurusDevState)
+        """
+        self._deviceState = TaurusDevState.NotReady
+        try:
+            taurus_tango_state = self.stateObj.read(cache).rvalue
+        except:
+            try:
+                if self.getDeviceProxy().import_info().exported:
+                    self._deviceState = TaurusDevState.Undefined
+                    return self._deviceState  # Undefined
+                else:
+                    return self._deviceState  # NotReady
+            except:
+                return self._deviceState  # NotReady
+        from taurus.core.tango.enums import DevState as TaurusTangoDevState
+        if taurus_tango_state == TaurusTangoDevState.UNKNOWN:
+            self._deviceState = TaurusDevState.Undefined
+        elif taurus_tango_state not in (TaurusTangoDevState.FAULT,
+                                      TaurusTangoDevState.DISABLE,
+                                      TaurusTangoDevState.INIT):
+            self._deviceState = TaurusDevState.Ready
+        return self._deviceState
+
+    @taurus4_deprecation(alt="state [agnostic] or stateObj.read [Tango]")
+    def getValueObj(self, cache=True):
+        """ Deprecated by TEP14.
+        ..warning::
+            this bck-compat implementation is not perfect because the
+            rvalue of the returned TangoAttributeValue is now a member of
+            TaurusDevState instead of TaurusSWDevState
+        """
+        from taurus.core.tango.tangoattribute import TangoAttrValue
+        ret = TangoAttrValue()
+        ret.rvalue = self.state(cache)
+        return ret
+
+    def getDisplayDescrObj(self, cache=True):
+        desc_obj = super(TangoDevice, self).getDisplayDescrObj(cache)
+        # extend the info on dev state
+        ret = []
+        for name, value in desc_obj:
+            if name.lower() == 'device state' and self.stateObj is not None:
+                tg_state = self.stateObj.read(cache).rvalue.name
+                value = "%s (%s)" % (value, tg_state)
+            ret.append((name, value))
+        return ret
+
+    def cleanUp(self):
+        self.trace("[TangoDevice] cleanUp")
+        self._descr = None
+
+        if not self._deviceStateObj is None:
+            self._deviceStateObj.removeListener(self)
+        self._deviceStateObj = None
+        self._deviceObj = None
+        TaurusDevice.cleanUp(self)
+
+    @taurus4_deprecation(alt='.state().name')
+    def getDisplayValue(self, cache=True):
+        return self.state(cache).name
 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusDevice necessary overwrite
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     def _createHWObject(self):
         try:
-            return PyTango.DeviceProxy(self.getFullName())
-        except PyTango.DevFailed, e:
+            return DeviceProxy(self.getFullName())
+        except DevFailed, e:
             self.warning('Could not create HW object: %s' % (e[0].desc))
             self.traceback()
-            
+
+    @taurus4_deprecation(alt="getDeviceProxy()")
+    def getHWObj(self):
+        return self.getDeviceProxy()
+
+    def getDeviceProxy(self):
+        if self._deviceObj is None:
+            self._deviceObj = self._createHWObject()
+        return self._deviceObj
+
+    @taurus4_deprecation(alt='getDeviceProxy() is not None')
     def isValidDev(self):
-        '''see: :meth:`TaurusDevice.isValid`'''
+        """see: :meth:`TaurusDevice.isValid`"""
         return self._deviceObj is not None
 
     def lock(self, force=False):
@@ -83,18 +224,18 @@ class TangoDevice(TaurusDevice):
         if force:
             if self.getLockInfo().status == TaurusLockInfo.Locked:
                 self.unlock(force=True)
-        return self.getHWObj().lock()
+        return self.getDeviceProxy().lock()
 
     def unlock(self, force=False):
-        return self.getHWObj().unlock(force)
-    
+        return self.getDeviceProxy().unlock(force)
+
     def getLockInfo(self, cache=False):
         lock_info = self._lock_info
         if cache and lock_info.status != LockStatus.Unknown:
             return lock_info
         try:
-            dev = self.getHWObj()
-            li = PyTango.LockerInfo()
+            dev = self.getDeviceProxy()
+            li = LockerInfo()
             locked = dev.get_locker(li)
             msg = "%s " % self.getSimpleName()
             if locked:
@@ -120,79 +261,62 @@ class TangoDevice(TaurusDevice):
         except:
             self._lock_info = lock_info = TaurusLockInfo()
         return lock_info
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Protected implementation
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    def _server_state(self):
-        state = None
-        try:
-            self.dev.ping()
-            state = TaurusSWDevState.Running
-        except:
-            try:
-                if self.dev.import_info().exported:
-                    state = TaurusSWDevState.Crash
-                else:
-                    state = TaurusSWDevState.Shutdown
-            except:
-                state = TaurusSWDevState.Shutdown
-        return state
-        
-    def decode(self, event_value):
-        if isinstance(event_value, PyTango.DeviceAttribute):
-            new_sw_state = TaurusSWDevState.Running
-        elif isinstance(event_value, PyTango.DevFailed):
-            new_sw_state = self._handleExceptionEvent(event_value)
-        elif isinstance(event_value, int): # TaurusSWDevState
-            new_sw_state = event_value
+    def removeListener(self, listener):
+        ret = TaurusDevice.removeListener(self, listener)
+        if not ret or self.hasListeners():
+            return ret  # False, None or True
+        return self.stateObj.removeListener(self)
+
+    def addListener(self, listener):
+        weWereListening = self.hasListeners()
+        ret = TaurusDevice.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
+            # subscribed listener with the current value
+            evt_value = self.__decode(self.stateObj.read())
+            listeners = hasattr(listener, '__iter__') and listener or [
+                listener]
+            self.fireEvent(TaurusEventType.Change, evt_value, listeners)
         else:
-            self.info("Unexpected value to decode: %s" % str(event_value))
-            new_sw_state = TaurusSWDevState.Crash
-            
-        value = PyTango.DeviceAttribute()
-        value.value = new_sw_state
-        
+            # We were not listening to events, but now we have to
+            self.stateObj.addListener(self)
+        return ret
+
+    def eventReceived(self, event_src, event_type, event_value):
+        if event_type == TaurusEventType.Config:
+            return
+        value = self.__decode(event_value)
+        new_state = value.rvalue
+        if new_state != self._deviceState:
+            msg = "Device State changed %s -> %s" % (self._deviceState.name,
+                                                     new_state.name)
+            self.debug(msg)
+            self._deviceState = new_state
+            self.fireEvent(TaurusEventType.Change, value)
+
+    def __decode(self, event_value):
+        """Decode events from the state attribute into TangoAttrValues whose
+        rvalue is the Device state"""
+        from taurus.core.tango.tangoattribute import TangoAttrValue
+        if isinstance(event_value, TangoAttrValue):  # for change events (&co)
+            new_state = TaurusDevState.Ready
+        elif isinstance(event_value, DevFailed):  # for error events
+            new_state = TaurusDevState.NotReady
+        else:
+            self.info("Unexpected event value: %r", event_value)
+            new_state = TaurusDevState.Undefined
+        from taurus.core.taurusbasetypes import TaurusModelValue
+        value = TaurusModelValue()
+        value.rvalue = new_state
         return value
-        
-    def _handleExceptionEvent(self, event_value):
-        """Handles the tango error event and returns the proper SW state."""
-        
-        new_sw_state = TaurusSWDevState.Uninitialized
-        reason = event_value[0].reason
-        # API_EventTimeout happens when: 
-        # 1 - the server where the device is running shuts down/crashes
-        # 2 - the notifd shuts down/crashes
-        if reason == 'API_EventTimeout':
-            if not self._deviceSwState in self.SHUTDOWNS:
-                serv_state = self._server_state()
-                # if the device is running it means that it must have been 
-                # the event system that failed
-                if serv_state == TaurusSWDevState.Running:
-                    new_sw_state = TaurusSWDevState.EventSystemShutdown
-                else:
-                    new_sw_state = serv_state
-            else:
-                # Keep the old state
-                new_sw_state = self._deviceSwState
-                
-        # API_BadConfigurationProperty happens when: 
-        # 1 - at client startup the server where the device is is not 
-        #     running.
-        elif reason == 'API_BadConfigurationProperty':
-            assert(self._deviceSwState != TaurusSWDevState.Running)
-            new_sw_state = TaurusSWDevState.Shutdown
-        
-        # API_EventChannelNotExported happens when:
-        # 1 - at client startup the server is running but the notifd
-        #     is not
-        elif reason == 'API_EventChannelNotExported':
-            new_sw_state = TaurusSWDevState.EventSystemShutdown
-        return new_sw_state
-    
-    def _getDefaultDescription(self):
-        return DFT_TANGO_DEVICE_DESCRIPTION
 
     def __pollResult(self, attrs, ts, result, error=False):
         if error:
@@ -202,7 +326,7 @@ class TangoDevice(TaurusDevice):
 
         for da in result:
             if da.has_failed:
-                v, err = None, PyTango.DevFailed(*da.get_err_stack())
+                v, err = None, DevFailed(*da.get_err_stack())
             else:
                 v, err = da, None
             attr = attrs[da.name]
@@ -212,7 +336,7 @@ class TangoDevice(TaurusDevice):
         ts = time.time()
         try:
             req_id = self.read_attributes_asynch(attrs.keys())
-        except PyTango.DevFailed as e:
+        except DevFailed as e:
             return False, e, ts
         return True, req_id, ts
 
@@ -224,7 +348,7 @@ class TangoDevice(TaurusDevice):
 
         if timeout is None:
             timeout = 0
-        timeout = int(timeout*1000)
+        timeout = int(timeout * 1000)
         result = self.read_attributes_reply(req_id, timeout)
         self.__pollResult(attrs, ts, result)
 
@@ -240,14 +364,14 @@ class TangoDevice(TaurusDevice):
         ts = time.time()
         try:
             result = self.read_attributes(attrs.keys())
-        except PyTango.DevFailed as e:
+        except DevFailed as e:
             error = True
             result = e
         self.__pollResult(attrs, ts, result, error=error)
-    
+
     def _repr_html_(self):
         try:
-            info = self.getHWObj().info()
+            info = self.getDeviceProxy().info()
         except:
             info = _TangoInfo()
         txt = """\
@@ -263,3 +387,21 @@ class TangoDevice(TaurusDevice):
            full_name=self.getFullName(), dev_class=info.dev_class,
            server_id=info.server_id, doc_url=info.doc_url)
         return txt
+
+    @taurus4_deprecation(alt=".description")
+    def getDescription(self, cache=True):
+        return self.description
+
+    @property
+    def description(self):
+        try:
+            self._description = self.getDeviceProxy().description()
+        except:
+            pass
+        return self._description
+
+    @property
+    def stateObj(self):
+        if self._deviceStateObj is None:
+            self._deviceStateObj = self.getAttribute("state")
+        return self._deviceStateObj
diff --git a/lib/taurus/core/tango/tangofactory.py b/lib/taurus/core/tango/tangofactory.py
index a9ada49..6e71b25 100644
--- a/lib/taurus/core/tango/tangofactory.py
+++ b/lib/taurus/core/tango/tangofactory.py
@@ -2,94 +2,97 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 taurus tango attribute configuration"""
+"""This module provides the `TangoFactory` object"""
 
 __all__ = ["TangoFactory"]
 
 __docformat__ = "restructuredtext"
 
-import sys
-import os
-import threading
-import PyTango
-
+try:
+    import PyTango
+except ImportError:
+    # note that if PyTango is not installed the factory will not be available
+    from taurus.core.util.log import debug
+    msg = 'cannot import PyTango module. ' + \
+          'Taurus will not support the "tango" scheme'
+    debug(msg)
+    raise
+
+from taurus.core.taurusbasetypes import TaurusElementType
 from taurus.core.taurusfactory import TaurusFactory
-from taurus.core.taurusbasetypes import OperationMode, MatchLevel
+from taurus.core.taurusbasetypes import OperationMode
 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.log import Logger, taurus4_deprecation
 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 .tangodatabase import TangoAuthority
+from .tangoattribute import TangoAttribute
 from .tangodevice import TangoDevice
-from .tangoconfiguration import TangoConfiguration
 
-_Database = TangoDatabase
+_Authority = TangoAuthority
 _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
-      
-      Tango Factory uses the Taurus object naming (URI based)::
-
-          foo://username:password@example.com:8042/over/there/index.dtb;type=animal?name=ferret#nose
-          \_/   \________________/\_________/ \__/\_________/ \___/ \_/ \_________/ \_________/ \__/
-           |            |              |       |       |        |    |       |            |      |
-          scheme     userinfo      hostname   port   path filename extension parameter(s) query fragment
-                    \____________________________/
-                                |
-                             authority
-
-    For Tango:
-    
+    """A :class:`TaurusFactory` singleton class to provide Tango-specific
+    Taurus Element objects (TangoAuthority, TangoDevice, TangoAttribute)
+
+    Tango model names are URI based See https://tools.ietf.org/html/rfc3986.
+    For example, a TangoAttribute would be::
+
+        tango://foo.org:1234/a/b/c/d#label
+        \___/   \_____/ \__/ \_____/ \___/
+          |        |     |      |      |
+          |    hostname port  attr     |
+          |   \____________/\______/   |
+          |         |           |      |
+        scheme   authority     path  fragment
+
+    For Tango Elements:
+
         - The 'scheme' must be the string "tango" (lowercase mandatory)
-        - The 'authority' is the Tango database (<hostname> and <port> mandatory)
-        - The 'path' is the Tango object, which can be a Device or Attribute.
-          For device it must have the format _/_/_ or alias 
-          For attribute it must have the format _/_/_/_ or devalias/_
-        - The 'filename' and 'extension' are always empty
-        - The 'parameter' is always empty
-        - The 'the query' is valid when the 'path' corresponds to an Attribute. Valid
-          queries must have the format configuration=<config param>. Valid 
-          configuration parameters are: label, format, description, unit, display_unit, 
-          standard_unit, max_value, min_value, max_alarm, min_alarm, 
-          max_warning, min_warning. in this case the Tango object is a Configuration
+        - The 'authority' identifies the Tango database (<hostname> and <port>
+          are mandatory if authority is given)
+        - The 'path' identifies Tango Device and Attributes.
+          For devices it must have the format _/_/_ or alias
+          For attributes it must have the format _/_/_/_ or devalias/_
+        - The 'fragment' is optional and it refers to a member of the model
+          object, thus not being part of the model name itself
     """
-    
-    #: the list of schemes that this factory supports. For this factory: 'tango' 
+
+    #: the list of schemes that this factory supports. For this factory: 'tango'
     #: is the only scheme
     schemes = ("tango",)
-    
+    caseSensitive = False
+    elementTypesMap = {TaurusElementType.Authority: TangoAuthority,
+                       TaurusElementType.Device: TangoDevice,
+                       TaurusElementType.Attribute: TangoAttribute
+                       }
+
     def __init__(self):
         """ Initialization. Nothing to be done here for now."""
         pass
@@ -102,71 +105,66 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
         self.call__init__(TaurusFactory)
         self._polling_enabled = True
         self.reInit()
+        self.scheme = 'tango'
 
     def reInit(self):
         """Reinitialize the singleton"""
         self._default_tango_host = None
-        self.operation_mode = OperationMode.ONLINE
         self.dft_db = None
         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 = CaselessDict()
-        self.tango_attr_klasses["state"] = _StateAttribute
 
     def cleanUp(self):
         """Cleanup the singleton instance"""
         self.trace("[TangoFactory] cleanUp")
-        for k,v in self.tango_attrs.items():       v.cleanUp()
-        for k,v in self.tango_configs.items():     v.cleanUp()
-        for k,v in self.tango_dev_queries.items(): v.cleanUp()
-        for k,v in self.tango_devs.items():        v.cleanUp()
+        for k, v in self.tango_attrs.items():
+            v.cleanUp()
+        for k, v in self.tango_dev_queries.items():
+            v.cleanUp()
+        for k, v in self.tango_devs.items():
+            v.cleanUp()
         self.dft_db = None
-        for k,v in self.tango_db_queries.items():  v.cleanUp()
-        for k,v in self.tango_db.items():          v.cleanUp()
+        for k, v in self.tango_db_queries.items():
+            v.cleanUp()
+        for k, v in self.tango_db.items():
+            v.cleanUp()
         self.reInit()
 
     def getExistingAttributes(self):
         """Returns a new dictionary will all registered attributes on this factory
-           
+
            :return:  dictionary will all registered attributes on this factory
            :rtype: dict"""
         return dict(self.tango_attrs)
 
     def getExistingDevices(self):
         """Returns a new dictionary will all registered devices on this factory
-           
+
            :return:  dictionary will all registered devices on this factory
            :rtype: dict"""
         return dict(self.tango_devs)
 
     def getExistingDatabases(self):
         """Returns a new dictionary will all registered databases on this factory
-           
+
            :return:  dictionary will all registered databases on this factory
            :rtype: dict"""
         return dict(self.tango_db)
 
-    def getExistingConfigurations(self):
-        """Returns a new dictionary will all registered configurations on this factory
-           
-           :return:  dictionary will all registered configurations on this factory
-           :rtype: dict"""
-        return dict(self.tango_configs)
-
     def set_default_tango_host(self, tango_host):
         """Sets the new default tango host.
-        
+
         :param tango_host: (str) the new tango host
         """
         self._default_tango_host = tango_host
@@ -174,188 +172,140 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
 
     def registerAttributeClass(self, attr_name, attr_klass):
         """Registers a new attribute class for the attribute name.
-           
+
            :param attr_name: (str) attribute name
-           :param attr_klass: (taurus.core.tango.TangoAttribute) the new class that 
+           :param attr_klass: (taurus.core.tango.TangoAttribute) the new class that
                               will handle the attribute
         """
         self.tango_attr_klasses[attr_name] = attr_klass
-    
+
     def unregisterAttributeClass(self, attr_name):
         """Unregisters the attribute class for the given attribute
            If no class was registered before for the given attribute, this call
            as no effect
-           
+
            :param attr_name: (str) attribute name
         """
         if self.tango_attr_klasses.has_key(attr_name):
             del self.tango_attr_klasses[attr_name]
-            
+
     def registerDeviceClass(self, dev_klass_name, dev_klass):
         """Registers a new python class to handle tango devices of the given tango class name
-        
+
            :param dev_klass_name: (str) tango device class name
            :param dev_klass: (taurus.core.tango.TangoDevice) the new class that will
                              handle devices of the given tango class name
         """
         self.tango_dev_klasses[dev_klass_name] = dev_klass
-    
+
     def unregisterDeviceClass(self, dev_klass_name):
         """Unregisters the class for the given tango class name
            If no class was registered before for the given attribute, this call
            as no effect
-           
+
            :param dev_klass_name: (str) tango device class name
         """
         if self.tango_dev_klasses.has_key(dev_klass_name):
             del self.tango_dev_klasses[dev_klass_name]
 
-    def findObjectClass(self,absolute_name):
-        """
-        Obtain the class object corresponding to the given name.
-           
-        :param absolute_name: (str) the object absolute name string
+    def getDatabase(self, name=None):
+        '''Deprecated. Use getAuthority instead'''
+        return self.getAuthority(name=name)
 
-        :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.
+    def getAuthority(self, name=None):
         """
-        objType = None
-        try:
-            if _Database.isValid(absolute_name, MatchLevel.NORMAL_COMPLETE):
-                objType = _Database 
-            elif _Device.isValid(absolute_name, MatchLevel.NORMAL_COMPLETE):
-                objType = _Device
-            elif _Attribute.isValid(absolute_name, MatchLevel.NORMAL_COMPLETE):
-                objType = _Attribute
-            elif _Configuration.isValid(absolute_name, MatchLevel.NORMAL_COMPLETE):
-                objType = _Configuration
-            elif _Database.isValid(absolute_name, MatchLevel.SHORT):
-                objType = _Database 
-            elif _Device.isValid(absolute_name, MatchLevel.SHORT):
-                objType = _Device
-            elif _Attribute.isValid(absolute_name, MatchLevel.SHORT):
-                objType = _Attribute
-            elif _Configuration.isValid(absolute_name, MatchLevel.SHORT):
-                objType = _Configuration
-        except:
-            self.debug("Not able to find Object class for %s" % absolute_name, exc_info=1)
-        return objType
-
-    def getDatabase(self, db_name = None):
-        """
-        Obtain the object corresponding to the given database name or the 
-        default database if db_name is None.
-        If the corresponding database object already exists, the existing 
+        Obtain the object corresponding to the given database name or the
+        default database if name is None.
+        If the corresponding authority object already exists, the existing
         instance is returned. Otherwise a new instance is stored and returned.
-           
-        :param db_name: (str) database name string alias. If None, the 
+
+        :param name: (str) database name string alias. If None, the
                         default database is used
-                           
-        :return: (taurus.core.tangodatabase.TangoDatabase) database object
+
+        :return: (taurus.core.tangodatabase.TangoAuthority) database object
         :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
         """
         ret = None
-        if db_name is None:
+        if name is None:
             if self.dft_db is None:
                 try:
                     if self._default_tango_host is None:
-                        self.dft_db = _Database()
+                        self.dft_db = _Authority()
                     else:
-                        db_name = self._default_tango_host
-                        validator = _Database.getNameValidator()
-                        params = validator.getParams(db_name)
-                        if params is None:
-                            raise TaurusException("Invalid default Tango database name %s" % db_name)
-                        host, port = params.get('host'),params.get('port')
-                        self.dft_db = _Database(host,port)
+                        name = self._default_tango_host
+                        validator = _Authority.getNameValidator()
+                        groups = validator.getUriGroups(name)
+                        if groups is None:
+                            raise TaurusException(
+                                "Invalid default Tango authority name %s" % name)
+                        self.dft_db = _Authority(host=groups['host'],
+                                                 port=groups['port'])
                 except:
-                    self.debug("Could not create Database", exc_info=1)
+                    self.debug("Could not create Authority", exc_info=1)
                     raise
-                db_name = self.dft_db.getFullName()
-                self.tango_db[db_name] = self.dft_db
+                name = self.dft_db.getFullName()
+                self.tango_db[name] = self.dft_db
             ret = self.dft_db
         else:
-            ret = self.tango_db.get(db_name)
+            ret = self.tango_db.get(name)
             if not ret is None:
                 return ret
-            validator = _Database.getNameValidator()
-            params = validator.getParams(db_name)
-            if params is None:
-                raise TaurusException("Invalid Tango database name %s" % db_name)
-            host, port = params.get('host'),params.get('port')
+            validator = _Authority.getNameValidator()
+            groups = validator.getUriGroups(name)
+            if not validator.isValid(name):
+                raise TaurusException("Invalid Tango authority name %s" % name)
             try:
-                ret = _Database(host,port)
+                ret = _Authority(host=groups['host'], port=groups['port'])
             except:
-                self.debug("Could not create Database %s:%s", host, port, exc_info=1)
-            
-            self.tango_db[db_name] = ret
-        return ret 
+                self.debug("Could not create Authority %s", groups['authority'],
+                           exc_info=1)
 
-    def getDevice(self,dev_name,**kw):
+            self.tango_db[name] = ret
+        return ret
+
+    def getDevice(self, dev_name, create_if_needed=True, **kw):
         """Obtain the object corresponding to the given tango device name.
            If the corresponding device already exists, the existing instance
            is returned. Otherwise a new instance is stored and returned.
-           
-           :param dev_name: (str) tango device name or tango alias for the device.
-                            It should be formed like: <host>:<port>/<tango device name>
-                            - If <host>:<port> is ommited then it will use the 
-                            default database.
-                            - <tango device name> can be full tango device name 
-                            (_/_/_) or a device alias.
-             
-           :return: (taurus.core.tango.TangoDevice) a device object 
-           :raise: (taurus.core.taurusexception.TaurusException) if the given dev_name is invalid.
+
+           :param dev_name: (str) tango device name or tango alias for the
+                            device. It must be a valid Tango device URI.
+                            If authority is not explicit, the default Tango
+                            Database will be used
+           :param create_if_needed: (bool) If True, the Device is created if it
+                                    did not exist previously. If False, it
+                                    returns None if it did not exist
+
+           :return: (taurus.core.tango.TangoDevice) a device object
+           :raise: (taurus.core.taurusexception.TaurusException) if the given
+                   dev_name is invalid.
         """
         d = self.tango_devs.get(dev_name)
         if d is None:
             d = self.tango_alias_devs.get(dev_name)
         if d is not None:
             return d
-        
-        # Simple approach did not work. Lets build a proper device name
-        if dev_name.lower().startswith("tango://"):
-            dev_name = dev_name[8:]
-        
+
         validator = _Device.getNameValidator()
-        params = validator.getParams(dev_name)
-        
-        if params is None:
+        groups = validator.getUriGroups(dev_name)
+        if groups is None:
             raise TaurusException("Invalid Tango device name '%s'" % dev_name)
-        
-        host,port = params.get('host'),params.get('port')
-        db = None
-        if host is None or port is None:
-            db = self.getDatabase()
-            host, port = db.get_db_host(), db.get_db_port()
-        else:
-            db_name = "%s:%s" % (host,port)
-            db = self.getDatabase(db_name)
-            
-        dev_name = params.get('devicename')
-        alias = params.get('devalias')
-        
-        if dev_name:
-            try:
-                alias = db.get_alias(dev_name)
-                if alias and alias.lower() == InvalidAlias:
-                    alias = None 
-            except:
-                alias = None
-        else:
-            try:
-                dev_name = db.get_device_alias(alias)
-            except:
-                raise TaurusException("Device %s is not defined in %s." % (alias,db.getFullName()))
 
-        full_dev_name = db.getFullName() + "/" + dev_name
-        if not alias is None:
-            alias = db.getFullName() + "/" + alias
-        
+        full_dev_name, _, _ = validator.getNames(dev_name)
+
+        if full_dev_name is None:
+            raise TaurusException("Cannot find full name of '%s'" % dev_name)
+
         d = self.tango_devs.get(full_dev_name)
-        
+
+        if not create_if_needed:
+            return d
+
         if d is None:
             try:
-                dev_klass = self._getDeviceClass(db=db, dev_name=dev_name)
+                db = self.getAuthority(groups.get('authority'))
+                dev_klass = self._getDeviceClass(
+                    db=db, devname=groups['devname'])
                 kw['storeCallback'] = self._storeDevice
                 kw['parent'] = db
                 d = dev_klass(full_dev_name, **kw)
@@ -368,54 +318,39 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
                 raise
         return d
 
-    def getAttribute(self,attr_name, **kwargs):
+    def getAttribute(self, attr_name, create_if_needed=True, **kwargs):
         """Obtain the object corresponding to the given attribute name.
            If the corresponding attribute already exists, the existing instance
            is returned. Otherwise a new instance is stored and returned.
 
-           :param attr_name: (str) attribute name
-                 
+           :param attr_name: (str) a valid attribute name URI
+           :param create_if_needed: (bool) If True, the Attribute is created if
+                                    it did not already exist. If False,
+                                    None is returned if it did not exist
            :return: (taurus.core.tangoattribute.TangoAttribute) attribute object
-           :raise: (taurus.core.taurusexception.TaurusException) if the given alias is invalid.
+           :raise: (taurus.core.taurusexception.TaurusException) if the given
+                   alias is invalid.
         """
         attr = self.tango_attrs.get(attr_name)
-
-        if not attr is None:
+        if attr is not None:
             return attr
-        
+
         # Simple approach did not work. Lets build a proper device name
-        if attr_name.lower().startswith("tango://"):
-            attr_name = attr_name[8:]
         validator = _Attribute.getNameValidator()
-        params = validator.getParams(attr_name)
-        
-        if params is None:
-            raise TaurusException("Invalid Tango attribute name '%s'" % attr_name)
-        
-        host,port = params.get('host'),params.get('port')
-        
-        db = None
-        if host is None or port is None:
-            db = self.getDatabase()
-            host, port = db.get_db_host(), db.get_db_port()
-        else:
-            db_name = "%s:%s" % (host,port)
-            db = self.getDatabase(db_name)
-        
-        dev_name = params.get('devicename')
-        
-        if dev_name is None:
-            dev = self.getDevice(params.get('devalias'))
-            dev_name = dev.getFullName()
-        else:
-            dev_name = db.getFullName() + "/" + dev_name
+        groups = validator.getUriGroups(attr_name)
+        if groups is None:
+            raise TaurusException(("Invalid Tango attribute name '%s'") %
+                                  attr_name)
+
+        full_attr_name, _, _ = validator.getNames(attr_name)
+
+        if full_attr_name is None:
+            raise TaurusException("Cannot find full name of '%s'" % attr_name)
 
-        attr_name = params.get('attributename')
-        full_attr_name = dev_name + "/" + attr_name
-         
         attr = self.tango_attrs.get(full_attr_name)
-        
+
         if attr is None:
+            dev_name = full_attr_name.rsplit('/', 1)[0]
             try:
                 dev = self.getDevice(dev_name)
                 if dev is not None:
@@ -425,21 +360,24 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
                     if attr is not None:
                         return attr
                     try:
-                        attr_klass = self._getAttributeClass(attr_name=attr_name)
+                        attr_klass = self._getAttributeClass(
+                            attr_name=attr_name)
                         kwargs['storeCallback'] = self._storeAttribute
                         if not kwargs.has_key('pollingPeriod'):
-                            kwargs['pollingPeriod'] = self.getDefaultPollingPeriod()
+                            kwargs[
+                                'pollingPeriod'] = self.getDefaultPollingPeriod()
                         attr = attr_klass(full_attr_name, dev, **kwargs)
                         # attribute objects will register themselves in this factory
                         # so there is no need to do it here
                     except DoubleRegistration:
                         attr = self.tango_attrs.get(full_attr_name)
             except:
-                self.debug("Error creating attribute %s", attr_name, exc_info=1)
+                self.debug("Error creating attribute %s",
+                           attr_name, exc_info=1)
                 raise
         return attr
 
-    def getAttributeInfo(self,full_attr_name):
+    def getAttributeInfo(self, full_attr_name):
         """Deprecated: Use :meth:`taurus.core.tango.TangoFactory.getConfiguration` instead.
 
            Obtain attribute information corresponding to the given attribute name.
@@ -447,83 +385,43 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
            is returned. Otherwise a new information instance is stored and returned.
 
            :param full_attr_name: (str) attribute name in format: <tango device name>'/'<attribute name>
-           
+
            :return: (taurus.core.tango.TangoConfiguration) configuration object
         """
         self.deprecated("Use getConfiguration(full_attr_name) instead")
         attr = self.getAttribute(full_attr_name)
-        return attr.getConfig()
+        return attr
 
-    def getConfiguration(self,param):
+    @taurus4_deprecation(alt='getAttribute')
+    def getConfiguration(self, param):
         """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 param: (taurus.core.taurusattribute.TaurusAttribute or str) attrubute object or full configuration name
-           
-           :return: (taurus.core.tango.TangoConfiguration) configuration object
+           :param param: (taurus.core.taurusattribute.TaurusAttribute or str)
+                         attribute object or full configuration name
+
+           :return: (taurus.core.tango.TangoAttribute) configuration object
         """
         if isinstance(param, str):
-            return self._getConfigurationFromName(param)
-        return self._getConfigurationFromAttribute(param)
+            return self.getAttribute(param)
+        return param
 
     def _getAttributeClass(self, **params):
         attr_name = params.get("attr_name")
         attr_klass = self.tango_attr_klasses.get(attr_name, _Attribute)
         return attr_klass
 
-    def _getDeviceClass(self, **params):
-        db, dev_name = params.get("db"), params.get("dev_name")
+    def _getDeviceClass(self, **kwargs):
+        db, dev_name = kwargs.get("db"), kwargs.get("devname")
         if db is None or dev_name is None or len(self.tango_dev_klasses) == 0:
             return _Device
         else:
+            if '/' not in dev_name:  # we got an alias... find the devslashname
+                dev_name = db.getElementFullName(dev_name)
             tango_dev_klass = db.get_class_for_device(dev_name)
             return self.tango_dev_klasses.get(tango_dev_klass, _Device)
-        
-    def _getConfigurationFromName(self,cfg_name):
-        cfg = self.tango_configs.get(cfg_name)
-        
-        if cfg is not None:
-            return cfg
-        
-        # Simple approach did not work. Lets build a proper configuration name
-        if cfg_name.lower().startswith("tango://"):
-            cfg_name = cfg_name[8:]
-        
-        validator = _Configuration.getNameValidator()
-        params = validator.getParams(cfg_name)
-                
-        if params is None:
-            raise TaurusException("Invalid Tango configuration name %s" % cfg_name)
-        
-        host,port = params.get('host'),params.get('port')
-        db = None
-        if host is None or port is None:
-            db = self.getDatabase()
-            host, port = db.get_db_host(), db.get_db_port()
-        else:
-            db_name = "%s:%s" % (host,port)
-            db = self.getDatabase(db_name)
-        
-        dev_name = params.get('devicename') or db.get_device_alias(params.get('devalias'))
-        dev_name = db.getFullName() + "/" + dev_name
-        attr_name = params.get('attributename')
-        attr_name = dev_name + "/" + attr_name
-        cfg_name = attr_name + "?configuration"
-        
-        cfg = self.tango_configs.get(cfg_name)
-
-        if cfg is None:
-            attrObj = self.getAttribute(attr_name)
-            cfg = self._getConfigurationFromAttribute(attrObj)
-        return cfg
-        
-    def _getConfigurationFromAttribute(self,attrObj):
-        cfg = attrObj.getConfig()
-        cfg_name = attrObj.getFullName() + "?configuration"
-        self.tango_configs[cfg_name] = cfg
-        return cfg
-    
+
     def _storeDevice(self, dev):
         name, alias = dev.getFullName(), dev.getSimpleName()
         exists = self.tango_devs.get(name)
@@ -535,139 +433,44 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
             self.debug(msg)
             raise DoubleRegistration(msg)
         self.tango_devs[name] = dev
-        if not alias is None and len(alias): 
+        if not alias is None and len(alias):
             self.tango_alias_devs[alias] = dev
-    
+
     def _storeAttribute(self, attr):
         name = attr.getFullName()
         exists = self.tango_attrs.get(name)
         if not exists is None:
-            if exists == attr: 
+            if exists == attr:
                 msg = "%s has already been registered before" % name
             else:
                 msg = "%s has already been registered before with a different object!" % name
             self.debug(msg)
             raise DoubleRegistration(msg)
         self.tango_attrs[name] = attr
-        
-    def getExistingAttribute(self, attr_name):
-        """Returns a registered attribute or None if the corresponding attribute
-           as not been registered. This is used mainly to avoid recursion between 
-           two objects supplied by this factory which can ask for the other object 
-           in the constructor.
-        
-           :param attr_name: (str) attribute name
-           :return: (taurus.core.tango.TangoAttribute or None) attribute object or None
-           """
-        attr = self.tango_attrs.get(attr_name)
 
-        if attr is not None:
-            return attr
-        
-        # Simple approach did not work. Lets build a proper device name
-        if attr_name.lower().startswith("tango://"):
-            attr_name = attr_name[8:]
-        validator = _Attribute.getNameValidator()
-        params = validator.getParams(attr_name)
-        
-        if params is None:
-            raise TaurusException("Invalid Tango attribute name %s" % attr_name)
-        
-        host,port = params.get('host'),params.get('port')
-        
-        db = None
-        if host is None or port is None:
-            db = self.getDatabase()
-            host, port = db.get_db_host(), db.get_db_port()
-        else:
-            db_name = "%s:%s" % (host,port)
-            db = self.getDatabase(db_name)
-        
-        dev_name = params.get('devicename')
-        
-        if dev_name is None:
-            dev = self.getDevice(params.get('devalias'))
-            dev_name = dev.getFullName()
-        else:
-            dev_name = db.getFullName() + "/" + dev_name
+    def getExistingAttribute(self, attr_name):
+        """Deprecated: use getAtribute with create_if_needed=False
+        """
+        self.warning(('getExistingAttribute is deprecated. ' +
+                      'Use getDevice with create_if_needed=False'))
+        return self.getAttribute(attr_name, create_if_needed=False)
 
-        attr_name = params.get('attributename')
-        full_attr_name = dev_name + "/" + attr_name
-         
-        attr = self.tango_attrs.get(full_attr_name)
-        return attr
-    
     def getExistingDevice(self, dev_name):
-        """Returns a registered device or None if the corresponding device
-           as not been registered. This is used mainly to avoid recursion between 
-           two objects supplied by this factory which can ask for the other object 
-           in the constructor.
-        
-           :param dev_name: (str) tango device name or tango alias for the device.
-                            It should be formed like: <host>:<port>/<tango device name>
-                            - If <host>:<port> is ommited then it will use the 
-                            default database.
-                            - <tango device name> can be full tango device name 
-                            (_/_/_) or a device alias.
-           :return: (taurus.core.tango.TangoDevice or None) device object or None
+        """Deprecated: use getDevice with create_if_needed=False
         """
+        self.warning(('getExistingDevice is deprecated. ' +
+                      'Use getDevice with create_if_needed=False'))
+        return self.getDevice(dev_name, create_if_needed=False)
 
-        d = self.tango_devs.get(dev_name)
-        if d is None:
-            d = self.tango_alias_devs.get(dev_name)
-        if d is not None:
-            return d
-        
-        # Simple approach did not work. Lets build a proper device name
-        if dev_name.lower().startswith("tango://"):
-            dev_name = dev_name[8:]
-        
-        validator = _Device.getNameValidator()
-        params = validator.getParams(dev_name)
-        
-        if params is None:
-            raise TaurusException("Invalid Tango device name %s" % dev_name)
-        
-        host,port = params.get('host'),params.get('port')
-        db = None
-        if host is None or port is None:
-            db = self.getDatabase()
-            host, port = db.get_db_host(), db.get_db_port()
-        else:
-            db_name = "%s:%s" % (host,port)
-            db = self.getDatabase(db_name)
-            
-        dev_name = params.get('devicename')
-        alias = params.get('devalias')
-        
-        if dev_name:
-            try:
-                alias = db.get_alias(dev_name)
-                if alias and alias.lower() == InvalidAlias:
-                    alias = None 
-            except:
-                alias = None
-        else:
-            try:
-                dev_name = db.get_device_alias(alias)
-            except:
-                raise TaurusException("Device %s is not defined in %s." % (alias,db.getFullName()))
-
-        full_dev_name = db.getFullName() + "/" + dev_name
-        if not alias is None:
-            alias = db.getFullName() + "/" + alias
-        
-        return self.tango_devs.get(full_dev_name)
-        
     def removeExistingDevice(self, dev_or_dev_name):
         """Removes a previously registered device.
-           
+
            :param dev_or_dev_name: (str or TangoDevice) device name or device object
         """
         if isinstance(dev_or_dev_name, _Device):
             dev = dev_or_dev_name
         else:
-            dev = self.getExistingDevice(dev_or_dev_name)
+            dev = self.getDevice(dev_or_dev_name, create_if_needed=False)
         if dev is None:
             raise KeyError("Device %s not found" % dev_or_dev_name)
         dev.cleanUp()
@@ -677,10 +480,10 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
         simp_name = dev.getSimpleName()
         if self.tango_alias_devs.has_key(simp_name):
             del self.tango_alias_devs[simp_name]
-    
+
     def removeExistingAttribute(self, attr_or_attr_name):
         """Removes a previously registered attribute.
-           
+
            :param attr_or_attr_name: (str or TangoAttribute) attribute name or attribute object
         """
         if isinstance(attr_or_attr_name, _Attribute):
@@ -693,8 +496,8 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
         full_name = attr.getFullName()
         if self.tango_attrs.has_key(full_name):
             del self.tango_attrs[full_name]
-    
-    def addAttributeToPolling(self, attribute, period, unsubscribe_evts = False):
+
+    def addAttributeToPolling(self, attribute, period, unsubscribe_evts=False):
         """Activates the polling (client side) for the given attribute with the
            given period (seconds).
 
@@ -713,7 +516,7 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
            :param attribute: (str) attribute name.
         """
         p = None
-        for period,timer in self.polling_timers.iteritems():
+        for period, timer in self.polling_timers.iteritems():
             if timer.containsAttribute(attribute):
                 timer.removeAttribute(attribute)
                 if timer.getAttributeCount() == 0:
@@ -721,27 +524,65 @@ class TangoFactory(Singleton, TaurusFactory, Logger):
                 break
         if p:
             del self.polling_timers[period]
-    
+
     def isPollingEnabled(self):
         """Tells if the local tango polling is enabled
-        
+
            :return: (bool) wheter or not the polling is enabled
         """
         return self._polling_enabled
-            
+
     def disablePolling(self):
         """Disable the application tango polling"""
         if not self.isPollingEnabled():
             return
         self._polling_enabled = False
-        for period,timer in self.polling_timers.iteritems():
+        for period, timer in self.polling_timers.iteritems():
             timer.stop()
-            
+
     def enablePolling(self):
         """Enable the application tango polling"""
         if self.isPollingEnabled():
             return
-        for period,timer in self.polling_timers.iteritems():
+        for period, timer in self.polling_timers.iteritems():
             timer.start()
         self._polling_enabled = True
-    
+
+    def getDatabaseNameValidator(self):
+        """Deprecated"""
+        self.warning(('getDatabaseNameValidator is deprecated.' +
+                      'Use "Authority" instead of "Database"'))
+        return self.getAuthorityNameValidator()
+
+    def getAuthorityNameValidator(self):
+        """Return TangoAuthorityNameValidator"""
+        import tangovalidator
+        return tangovalidator.TangoAuthorityNameValidator()
+
+    def getDeviceNameValidator(self):
+        """Return TangoDeviceNameValidator"""
+        import tangovalidator
+        return tangovalidator.TangoDeviceNameValidator()
+
+    def getAttributeNameValidator(self):
+        """Return TangoAttributeNameValidator"""
+        import tangovalidator
+        return tangovalidator.TangoAttributeNameValidator()
+
+    def setOperationMode(self, mode):
+        """ Deprecated. setOperationMode(OperationMode mode) -> None
+            Sets the operation mode for the Tango system."""
+        dep = 'setOperationMode'
+        rel = 'Taurus4'
+        dbg_msg = "Don't use this method"
+        msg = '%s is deprecated (from %s). %s' % (dep, rel, dbg_msg)
+        self.deprecated(msg)
+
+    def getOperationMode(self):
+        """Deprecated. Gives the current operation mode."""
+        dep = 'getOperationMode'
+        rel = 'Taurus4'
+        dbg_msg = "Don't use this method"
+        msg = '%s is deprecated (from %s). %s' % (dep, rel, dbg_msg)
+        self.deprecated(msg)
+        return OperationMode.ONLINE
diff --git a/lib/taurus/core/tango/tangovalidator.py b/lib/taurus/core/tango/tangovalidator.py
new file mode 100644
index 0000000..e1afcc6
--- /dev/null
+++ b/lib/taurus/core/tango/tangovalidator.py
@@ -0,0 +1,224 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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 the base taurus name validator classes"""
+
+__all__ = ["TangoAuthorityNameValidator", "TangoDeviceNameValidator",
+           "TangoAttributeNameValidator"]
+
+__docformat__ = "restructuredtext"
+
+
+from taurus.core.taurusvalidator import (TaurusAttributeNameValidator,
+                                         TaurusDeviceNameValidator,
+                                         TaurusAuthorityNameValidator)
+
+
+# todo: I do not understand the behaviour of getNames for Auth, Dev and Attr in
+#      the case when the fullname does not match the regexp. For Auth it returns
+#      a 3-tuple, for devs a 2-tuple and for attrs and conf a single None.
+#      This is not coherent to what the method returns when it matches the
+#      regexp (always a 3-tuple)
+
+class TangoAuthorityNameValidator(TaurusAuthorityNameValidator):
+    '''Validator for Tango authority names. Apart from the standard named
+    groups (scheme, authority, path, query and fragment), the following named
+    groups are created:
+
+     - host: tango host name, without port.
+     - port: port number
+    '''
+
+    scheme = 'tango'
+    authority = '//(?P<host>([\w\-_]+\.)*[\w\-_]+):(?P<port>\d{1,5})'
+    path = '(?!)'
+    query = '(?!)'
+    fragment = '(?!)'
+
+
+class TangoDeviceNameValidator(TaurusDeviceNameValidator):
+    '''Validator for Tango device names. Apart from the standard named
+    groups (scheme, authority, path, query and fragment), the following named
+    groups are created:
+
+     - devname: device name (either alias or slashed name)
+     - [_devalias]: device alias
+     - [_devslashname]: device name in slashed (a/b/c) form
+     - [host] as in :class:`TangoAuthorityNameValidator`
+     - [port] as in :class:`TangoAuthorityNameValidator`
+
+    Note: brackets on the group name indicate that this group will only contain
+    a string if the URI contains it.
+    '''
+
+    scheme = 'tango'
+    authority = TangoAuthorityNameValidator.authority
+    path = r'/?(?P<devname>((?P<_devalias>[^/?#:]+)|' + \
+           r'(?P<_devslashname>[^/?#:]+/[^/?#:]+/[^/?#:]+)))'
+    query = '(?!)'
+    fragment = '(?!)'
+
+    def getNames(self, fullname, factory=None, queryAuth=True):
+        '''reimplemented from :class:`TaurusDeviceNameValidator`. It accepts an
+        extra keyword arg `queryAuth` which, if set to False, will prevent the
+        validator from trying to query a TaurusAuthority to obtain missing info
+        such as the devslashname <--> devalias correspondence.
+        '''
+        groups = self.getUriGroups(fullname)
+        if groups is None:
+            return None
+
+        import PyTango
+        default_authority = '//' + PyTango.ApiUtil.get_env_var('TANGO_HOST')
+
+        authority = groups.get('authority')
+        if authority is None:
+            groups['authority'] = authority = default_authority
+
+        db = None
+        if queryAuth:
+            # attempt to get an Authority object
+            if factory is None:
+                from taurus import Factory
+                factory = Factory(scheme=self.scheme)
+            try:
+                db = factory.getAuthority('tango:%s' % authority)
+            except:
+                pass
+
+        # note, since we validated, we either have alias or slashname (not
+        # both)
+        _devalias = groups.get('_devalias')
+        _devslashname = groups.get('_devslashname')
+
+        if _devslashname is None and db is not None:
+            # get _devslashname from the alias using the DB
+            _devslashname = db.getElementFullName(_devalias)
+            groups['_devslashname'] = _devslashname
+
+        if _devslashname is None:
+            # if we still do not have a slashname, we can only give the short
+            return None, None, _devalias
+
+        # we can now construct everything. First the complete:
+        complete = 'tango:%(authority)s/%(_devslashname)s' % groups
+
+        # then the normal
+        if authority.lower() == default_authority.lower():
+            normal = '%(_devslashname)s' % groups
+        else:
+            normal = '%(authority)s/%(_devslashname)s' % groups
+
+        # and finally the short
+        if _devalias is not None:
+            short = _devalias
+        else:
+            if db is not None:
+                # get the alias from the DB (if it is defined)
+                short = db.getElementAlias(_devslashname) or _devslashname
+            else:
+                short = _devslashname
+
+        return complete, normal, short
+
+    @property
+    def nonStrictNamePattern(self):
+        '''In non-strict mode, allow double-slash even if there is no Authority.
+        (e.g., "tango://a/b/c" passes this non-strict form)
+        '''
+        return self.namePattern.replace('tango):(', 'tango)://(')
+
+
+class TangoAttributeNameValidator(TaurusAttributeNameValidator):
+    '''Validator for Tango attribute names. Apart from the standard named
+    groups (scheme, authority, path, query and fragment), the following named
+    groups are created:
+
+     - attrname: attribute name including device name
+     - _shortattrname: attribute name excluding device name
+     - devname: as in :class:`TangoDeviceNameValidator`
+     - [_devalias]: as in :class:`TangoDeviceNameValidator`
+     - [_devslashname]: as in :class:`TangoDeviceNameValidator`
+     - [host] as in :class:`TangoAuthorityNameValidator`
+     - [port] as in :class:`TangoAuthorityNameValidator`
+     - [cfgkey] same as fragment (for bck-compat use only)
+
+    Note: brackets on the group name indicate that this group will only contain
+    a string if the URI contains it.
+    '''
+    scheme = 'tango'
+    authority = TangoAuthorityNameValidator.authority
+    path = ('(?P<attrname>%s/(?P<_shortattrname>[^/?:#]+))' %
+            TangoDeviceNameValidator.path)
+    query = '(?!)'
+    fragment = '(?P<cfgkey>[^# ]*)'
+
+    def getNames(self, fullname, factory=None, queryAuth=True, fragment=False):
+        """Returns the complete and short names"""
+
+        groups = self.getUriGroups(fullname)
+        if groups is None:
+            return None
+
+        complete, normal, short = None, None, groups.get('_shortattrname')
+
+        # reuse the getNames from the Device validator...
+        devname = fullname.rsplit('/', 1)[0]
+        v = TangoDeviceNameValidator()
+        devcomplete, devnormal, _ = v.getNames(devname, factory=factory,
+                                               queryAuth=queryAuth)
+        if devcomplete is not None:
+            complete = '%s/%s' % (devcomplete, short)
+        if devnormal is not None:
+            normal = '%s/%s' % (devnormal, short)
+
+        # return fragment if requested
+        if fragment:
+            key = groups.get('fragment', None)
+            return complete, normal, short, key
+
+        return complete, normal, short
+
+    @property
+    def nonStrictNamePattern(self):
+        """In non-strict mode, allow double-slash even if there is no Authority.
+        Also allow old-style "?configuration[=cfgkey]" instead of fragment.
+        If cfgkey is present, it is also stored in the "fragment" named group.
+        For example, "tango://a/b/c/d?configuration=label" passes this
+        non-strict form, and the named group "fragment" will contain "label"
+        """
+
+        # allow for *optional* double-slashes and *optional* ?configuration...
+        pattern = r'^(?P<scheme>%(scheme)s):(//)?' + \
+                  r'((?P<authority>%(authority)s)(?=/))?' + \
+                  r'(?P<path>%(path)s)' + \
+                  r'(\?(?P<query>%(query)s))?' + \
+                  r'(#%(fragment)s)?$'
+
+        return pattern % dict(scheme=self.scheme,
+                              authority='(?P<host>([\w\-_]+\.)*[\w\-_]+):(?P<port>\d{1,5})',
+                              path=self.path,
+                              query='configuration(=(?P<fragment>(?P<cfgkey>[^# ]+)))?',
+                              fragment='(?!)')
diff --git a/lib/taurus/core/tango/test/__init__.py b/lib/taurus/core/tango/test/__init__.py
new file mode 100644
index 0000000..7ba300b
--- /dev/null
+++ b/lib/taurus/core/tango/test/__init__.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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 tgtestds import TangoSchemeTestLauncher
diff --git a/lib/taurus/core/tango/test/res/TangoSchemeTest b/lib/taurus/core/tango/test/res/TangoSchemeTest
new file mode 100755
index 0000000..1e267ef
--- /dev/null
+++ b/lib/taurus/core/tango/test/res/TangoSchemeTest
@@ -0,0 +1,499 @@
+#!/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 2014 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 numpy
+
+from PyTango import DeviceProxy, AttrWriteType, DevState
+from PyTango.server import Device, DeviceMeta, attribute, run, command
+
+
+class TangoSchemeTest(Device):
+    """
+    This device server emulates the TangoTest device server for taurus test
+    purposes (Tango schema). Only works with PyTango8.
+
+    It defines attributes of type boolean, short, float, double and string
+    for the different structures: scalar, spectrum and image,
+
+    The device has attributes read only, which names finish by _ro,
+    read/write, and some subset of both attributes,
+    which names finish by _nu (not unit), that means attribute without unit.
+
+    All the default attribute configurations are defined by class member
+    attributes.
+     e.g
+     - The dim of images and spectrums are defined by DIMX and DIMY.
+     - The default rvalue, units, ranges, alarms and warnings are defined by
+     dictionaries with this name pattern: "default_ATTRNAME"
+     (e.g. default_rvalue, default_unit, ...).
+
+    The keys of the default dictionaries are python types (bool, int, float
+    and string) and its values are hardcoded default values.
+    The equivalence between python and tango types are:
+    - bool is used for boolean tango attributes
+    - int is used for short tango attributes
+    - float is used for float and double tango attributes
+    - string is used for string tango attributes
+
+    An example of a short_scalar attribute of this Device has:
+        rvalue = default_rvalue["int"]
+        unit = default_unit["int"]
+        range = default_ranges["int"]
+        alarm = default_ranges["int"]
+        warning = default_warnings["int"]
+    """
+    __metaclass__ = DeviceMeta
+
+    doc = __doc__
+
+    MAXDIMX = 32
+    MAXDIMY = 32
+    DIMX = 3
+    DIMY = 3
+
+    default_rvalue = {'bool': True,
+                      'int': 123,
+                      'float': 1.23,
+                      'string': 'hello world',
+                      'uchar': ord('A'),
+                      }
+
+    default_unit = {'int': "mm",
+                    'float': "mm"}
+    # x10 default_rvalue
+    default_ranges = {'int': [-default_rvalue["int"] * 10,
+                              default_rvalue["int"] * 10],
+                      'float': [-default_rvalue["float"] * 10,
+                                default_rvalue["float"] * 10]
+                      }
+    # x5 default_rvalue
+    default_alarms = {'int': [-default_rvalue["int"] * 5,
+                              default_rvalue["int"] * 5],
+                      'float': [-default_rvalue["float"] * 5,
+                                default_rvalue["float"] * 5]
+                      }
+    # x3 default_rvalue
+    default_warnings = {'int': [-default_rvalue["int"] * 3,
+                                default_rvalue["int"] * 3],
+                        'float': [-default_rvalue["float"] * 3,
+                                  default_rvalue["float"] * 3]
+                        }
+
+    attrs = {'bool_scalar': dict(dtype=bool),
+             'short_scalar': dict(unit=default_unit["int"],
+                                  dtype=numpy.int16),
+             'short_scalar_nu': dict(dtype=numpy.int16),
+             'float_scalar': dict(unit=default_unit["float"],
+                                  dtype=numpy.float32),
+             'double_scalar': dict(unit=default_unit["float"],
+                                   dtype=numpy.float64),
+             'string_scalar': dict(dtype=str),
+             'uchar_scalar': dict(dtype=numpy.uint8),
+             'bool_spectrum': dict(dtype=(bool,), max_dim_x=MAXDIMX),
+             'short_spectrum': dict(unit=default_unit["int"],
+                                    dtype=(numpy.int16,),
+                                    max_dim_x=MAXDIMX),
+             'float_spectrum': dict(unit=default_unit["float"],
+                                    dtype=(numpy.float32,),
+                                    max_dim_x=MAXDIMX),
+             'double_spectrum': dict(unit=default_unit["float"],
+                                     dtype=(numpy.float64,),
+                                     max_dim_x=MAXDIMX),
+             'string_spectrum': dict(dtype=(str,), max_dim_x=MAXDIMX),
+             'uchar_spectrum': dict(dtype=(numpy.uint8,), max_dim_x=MAXDIMX),
+             'bool_image': dict(dtype=[(bool,)], max_dim_x=MAXDIMX,
+                                max_dim_y=MAXDIMY),
+             'short_image': dict(unit=default_unit["int"],
+                                 dtype=[(numpy.int16,)],
+                                 max_dim_x=MAXDIMX, max_dim_y=MAXDIMY),
+             'float_image': dict(unit=default_unit["float"],
+                                 dtype=[(numpy.float32,)],
+                                 max_dim_x=MAXDIMX, max_dim_y=MAXDIMY),
+             'double_image': dict(unit=default_unit["float"],
+                                  dtype=[(numpy.float64,)],
+                                  max_dim_x=MAXDIMX, max_dim_y=MAXDIMY),
+             'string_image': dict(dtype=[(str,)], max_dim_x=MAXDIMX,
+                                  max_dim_y=MAXDIMY),
+             'uchar_image': dict(dtype=[(numpy.uint8,)], max_dim_x=MAXDIMX,
+                                 max_dim_y=MAXDIMY),
+             }
+
+    extra_cfg = {'short_scalar': dict(min_value=default_ranges['int'][0],
+                                      max_value=default_ranges['int'][1],
+                                      min_alarm=default_alarms['int'][0],
+                                      max_alarm=default_alarms['int'][1],
+                                      min_warning=default_warnings['int'][0],
+                                      max_warning=default_warnings['int'][1]),
+                 'float_scalar': dict(min_value=default_ranges['float'][0],
+                                      max_value=default_ranges['float'][1],
+                                      min_alarm=default_alarms['float'][0],
+                                      max_alarm=default_alarms['float'][1],
+                                      min_warning=default_warnings['float'][0],
+                                      max_warning=default_warnings['float'][1]),
+                 'double_scalar': dict(min_value=default_ranges['float'][0],
+                                       max_value=default_ranges['float'][1],
+                                       min_alarm=default_alarms['float'][0],
+                                       max_alarm=default_alarms['float'][1],
+                                       min_warning=default_warnings[
+                                           'float'][0],
+                                       max_warning=default_warnings['float'][1])
+                 }
+
+    # READ ONLY ATTRIBUTES
+    # SCALARS
+    boolean_scalar_ro = attribute(access=AttrWriteType.READ,
+                                  **attrs['bool_scalar'])
+    short_scalar_ro = attribute(access=AttrWriteType.READ,
+                                **attrs['short_scalar'])
+    short_scalar_ro_nu = attribute(access=AttrWriteType.READ,
+                                   **attrs['short_scalar_nu'])
+    float_scalar_ro = attribute(access=AttrWriteType.READ,
+                                **attrs['float_scalar'])
+    string_scalar_ro = attribute(access=AttrWriteType.READ,
+                                 **attrs['string_scalar'])
+    # SPECTRUMS
+    boolean_spectrum_ro = attribute(access=AttrWriteType.READ,
+                                    **attrs['bool_spectrum'])
+    short_spectrum_ro = attribute(access=AttrWriteType.READ,
+                                  **attrs['short_spectrum'])
+    float_spectrum_ro = attribute(access=AttrWriteType.READ,
+                                  **attrs['float_spectrum'])
+    string_spectrum_ro = attribute(access=AttrWriteType.READ,
+                                   **attrs['string_spectrum'])
+    # IMAGES
+    boolean_image_ro = attribute(access=AttrWriteType.READ,
+                                 **attrs['bool_image'])
+    short_image_ro = attribute(access=AttrWriteType.READ,
+                               **attrs['short_image'])
+    float_image_ro = attribute(access=AttrWriteType.READ,
+                               **attrs['float_image'])
+    string_image_ro = attribute(access=AttrWriteType.READ,
+                                **attrs['string_image'])
+
+    # READ/WRITE ATTRIBUTES
+    # SCALARS
+    boolean_scalar = attribute(access=AttrWriteType.READ_WRITE,
+                               **attrs['bool_scalar'])
+    attr = dict()
+    attr.update(attrs['short_scalar'])
+    attr.update(extra_cfg['short_scalar'])
+    short_scalar = attribute(access=AttrWriteType.READ_WRITE, **attr)
+    short_scalar_nu = attribute(access=AttrWriteType.READ_WRITE,
+                                **attrs['short_scalar_nu'])
+    attr = {}
+    attr.update(attrs['float_scalar'])
+    attr.update(extra_cfg['float_scalar'])
+    float_scalar = attribute(access=AttrWriteType.READ_WRITE, **attr)
+    attr = {}
+    attr.update(attrs['double_scalar'])
+    attr.update(extra_cfg['double_scalar'])
+    double_scalar = attribute(access=AttrWriteType.READ_WRITE, **attr)
+    string_scalar = attribute(access=AttrWriteType.READ_WRITE,
+                              **attrs['string_scalar'])
+    uchar_scalar = attribute(access=AttrWriteType.READ_WRITE,
+                             **attrs['uchar_scalar'])
+    # SPECTRUM
+    boolean_spectrum = attribute(access=AttrWriteType.READ_WRITE,
+                                 **attrs['bool_spectrum'])
+    short_spectrum = attribute(access=AttrWriteType.READ_WRITE,
+                               **attrs['short_spectrum'])
+    float_spectrum = attribute(access=AttrWriteType.READ_WRITE,
+                               **attrs['float_spectrum'])
+    double_spectrum = attribute(access=AttrWriteType.READ_WRITE,
+                                **attrs['double_spectrum'])
+    string_spectrum = attribute(access=AttrWriteType.READ_WRITE,
+                                **attrs['string_spectrum'])
+    uchar_spectrum = attribute(access=AttrWriteType.READ_WRITE,
+                               **attrs['uchar_spectrum'])
+    # IMAGES
+    boolean_image = attribute(access=AttrWriteType.READ_WRITE,
+                              **attrs['bool_image'])
+    short_image = attribute(access=AttrWriteType.READ_WRITE,
+                            **attrs['short_image'])
+    float_image = attribute(access=AttrWriteType.READ_WRITE,
+                            **attrs['float_image'])
+    double_image = attribute(access=AttrWriteType.READ_WRITE,
+                             **attrs['double_image'])
+    string_image = attribute(access=AttrWriteType.READ_WRITE,
+                             **attrs['string_image'])
+    uchar_image = attribute(access=AttrWriteType.READ_WRITE,
+                            **attrs['uchar_image'])
+
+    # READ ONLY METHODS
+    # SCALARS
+    def read_boolean_scalar_ro(self):
+        return self.default_rvalue['bool']
+
+    def read_short_scalar_ro(self):
+        return self.default_rvalue['int']
+
+    def read_short_scalar_ro_nu(self):
+        return self.default_rvalue['int']
+
+    def read_float_scalar_ro(self):
+        return self.default_rvalue['float']
+
+    def read_double_scalar_ro(self):
+        return self.default_rvalue['float']
+
+    def read_string_scalar_ro(self):
+        return self.default_rvalue['string']
+
+    # SPECTRUMS
+    def read_boolean_spectrum_ro(self):
+        return [self.default_rvalue['bool']] * self.DIMX
+
+    def read_short_spectrum_ro(self):
+        return [self.default_rvalue['int']] * self.DIMX
+
+    def read_float_spectrum_ro(self):
+        return [self.default_rvalue['float']] * self.DIMX
+
+    def read_double_spectrum_ro(self):
+        return [self.default_rvalue['float']] * self.DIMX
+
+    def read_string_spectrum_ro(self):
+        return [self.default_rvalue['string']] * self.DIMX
+
+    # IMAGES
+    def read_boolean_image_ro(self):
+        return [[self.default_rvalue['bool']] * self.DIMX] * self.DIMY
+
+    def read_short_image_ro(self):
+        return [[self.default_rvalue['int']] * self.DIMX] * self.DIMY
+
+    def read_float_image_ro(self):
+        return [[self.default_rvalue['float']] * self.DIMX] * self.DIMY
+
+    def read_double_image_ro(self):
+        return [[self.default_rvalue['float']] * self.DIMX] * self.DIMY
+
+    def read_string_image_ro(self):
+        return [[self.default_rvalue['string']] * self.DIMX] * self.DIMY
+
+    # READ/WRITE METHODS
+    # SCALARS
+    def read_boolean_scalar(self):
+        return getattr(self, '_boolean_scalar', self.default_rvalue['bool'])
+
+    def write_boolean_scalar(self, v):
+        self._boolean_scalar = v
+
+    def read_short_scalar(self):
+        return getattr(self, '_short_scalar', self.default_rvalue['int'])
+
+    def write_short_scalar(self, v):
+        self._short_scalar = v
+
+    def read_short_scalar_nu(self):
+        return getattr(self, '_short_scalar_nu', self.default_rvalue['int'])
+
+    def write_short_scalar_nu(self, v):
+        self._short_scalar_nu = v
+
+    def read_float_scalar(self):
+        return getattr(self, '_float_scalar', self.default_rvalue['float'])
+
+    def write_float_scalar(self, v):
+        self._float_scalar = v
+
+    def read_double_scalar(self):
+        return getattr(self, '_double_scalar', self.default_rvalue['float'])
+
+    def write_double_scalar(self, v):
+        self._double_scalar = v
+
+    def read_string_scalar(self):
+        return getattr(self, '_string_scalar', self.default_rvalue['string'])
+
+    def write_string_scalar(self, v):
+        self._string_scalar = v
+
+    def read_uchar_scalar(self):
+        return getattr(self, '_uchar_scalar', self.default_rvalue['uchar'])
+
+    def write_uchar_scalar(self, v):
+        self._uchar_scalar = v
+
+    # SPECTRUMS
+    def read_boolean_spectrum(self):
+        return getattr(self, '_boolean_spectrum',
+                       [self.default_rvalue['bool']] * self.DIMX)
+
+    def write_boolean_spectrum(self, v):
+        self._boolean_spectrum = v
+
+    def read_short_spectrum(self):
+        return getattr(self, '_short_spectrum',
+                       [self.default_rvalue['int']] * self.DIMX)
+
+    def write_short_spectrum(self, v):
+        self._short_spectrum = v
+
+    def read_float_spectrum(self):
+        return getattr(self, '_float_spectrum',
+                       [self.default_rvalue['float']] * self.DIMX)
+
+    def write_float_spectrum(self, v):
+        self._float_spectrum = v
+
+    def read_double_spectrum(self):
+        return getattr(self, '_double_spectrum',
+                       [self.default_rvalue['float']] * self.DIMX)
+
+    def write_double_spectrum(self, v):
+        self._double_spectrum = v
+
+    def read_string_spectrum(self):
+        return getattr(self, '_string_spectrum',
+                       [self.default_rvalue['string']] * self.DIMX)
+
+    def write_string_spectrum(self, v):
+        self._string_spectrum = v
+
+    def read_uchar_spectrum(self):
+        return getattr(self, '_uchar_spectrum',
+                       [self.default_rvalue['uchar']] * self.DIMX)
+
+    def write_uchar_spectrum(self, v):
+        self._uchar_spectrum = v
+
+    # IMAGES
+    def read_boolean_image(self):
+        return getattr(self, '_boolean_image',
+                       [[self.default_rvalue['bool']] * self.DIMX] * self.DIMY)
+
+    def write_boolean_image(self, v):
+        self._boolean_image = v
+
+    def read_short_image(self):
+        return getattr(self, '_short_image',
+                       [[self.default_rvalue['int']] * self.DIMX] * self.DIMY)
+
+    def write_short_image(self, v):
+        self._short_image = v
+
+    def read_float_image(self):
+        return getattr(self, '_float_image',
+                       [[self.default_rvalue['float']] * self.DIMX] * self.DIMY)
+
+    def write_float_image(self, v):
+        self._float_image = v
+
+    def read_double_image(self):
+        return getattr(self, '_double_image',
+                       [[self.default_rvalue['float']] * self.DIMX] * self.DIMY)
+
+    def write_double_image(self, v):
+        self._double_image = v
+
+    def read_string_image(self):
+        return getattr(self, '_string_image',
+                       [[self.default_rvalue['string']] * self.DIMX] *
+                       self.DIMY)
+
+    def write_string_image(self, v):
+        self._string_image = v
+
+    def read_uchar_image(self):
+        return getattr(self, '_uchar_image',
+                       [[self.default_rvalue['uchar']] * self.DIMX] *
+                       self.DIMY)
+
+    def write_uchar_image(self, v):
+        self._uchar_image = v
+
+    def init_device(self):
+        # To setUp the state
+        Device.init_device(self)
+        self.set_state(DevState.ON)
+
+    @command
+    def Reset(self):
+        """ Reset the attributes value and configuration parameters
+        """
+        # Reset the attributes configuration
+        # TODO there is a bug in self.set_attribute_config_3(),
+        # so is not possible to use the PyTango.Device API
+        dev = DeviceProxy(self.get_name())
+        attr_list = list(dev.get_attribute_list())
+        for attr in attr_list:
+            attrInfoex = dev.get_attribute_config(attr)
+            if attr.startswith('string') or attr.startswith('boolean') or \
+                    attr.startswith('State') or attr.startswith('Status') or \
+                    attr.endswith('_nu'):
+                attrInfoex.unit = ''
+            else:
+                attrInfoex.unit = 'mm'
+                if attr == "short_scalar":
+                    range = self.default_ranges['int']
+                    attrInfoex.min_value = str(range[0])
+                    attrInfoex.max_value = str(range[1])
+                    alarm = self.default_alarms['int']
+                    attrInfoex.min_alarm = str(alarm[0])
+                    attrInfoex.max_alarm = str(alarm[1])
+                    warning = self.default_warnings['int']
+                    attrInfoex.min_warning = str(warning[0])
+                    attrInfoex.max_warning = str(warning[1])
+                elif attr in ["float_scalar", "double_scalar"]:
+                    range = self.default_ranges['float']
+                    attrInfoex.min_value = str(range[0])
+                    attrInfoex.max_value = str(range[1])
+                    alarm = self.default_alarms['float']
+                    attrInfoex.min_alarm = str(alarm[0])
+                    attrInfoex.max_alarm = str(alarm[1])
+                    warning = self.default_warnings['float']
+                    attrInfoex.min_warning = str(warning[0])
+                    attrInfoex.max_warning = str(warning[1])
+            dev.set_attribute_config(attrInfoex)
+        # Reset the attributes value
+        self._boolean_scalar = self.default_rvalue['bool']
+        self._short_scalar = self.default_rvalue['int']
+        self._short_scalar_nu = self.default_rvalue['int']
+        self._float_scalar = self.default_rvalue['float']
+        self._double_scalar = self.default_rvalue['float']
+        self._string_scalar = self.default_rvalue['string']
+        self._uchar_scalar = self.default_rvalue['uchar']
+        self._boolean_spectrum = [self.default_rvalue['bool']] * self.DIMX
+        self._short_spectrum = [self.default_rvalue['int']] * self.DIMX
+        self._float_spectrum = [self.default_rvalue['float']] * self.DIMX
+        self._double_spectrum = [self.default_rvalue['float']] * self.DIMX
+        self._string_spectrum = [self.default_rvalue['string']] * self.DIMX
+        self._uchar_spectrum = [self.default_rvalue['uchar']] * self.DIMX
+        v = [[self.default_rvalue['bool']] * self.DIMX] * self.DIMY
+        self._boolean_image = v
+        v = [[self.default_rvalue['int']] * self.DIMX] * self.DIMY
+        self._short_image = v
+        v = [[self.default_rvalue['float']] * self.DIMX] * self.DIMY
+        self._float_image = v
+        v = [[self.default_rvalue['float']] * self.DIMX] * self.DIMY
+        self._double_image = v
+        v = [[self.default_rvalue['string']] * self.DIMX] * self.DIMY
+        self._string_image = v
+        v = [[self.default_rvalue['uchar']] * self.DIMX] * self.DIMY
+        self._uchar_image = v
+
+
+if __name__ == "__main__":
+    run([TangoSchemeTest])
diff --git a/lib/taurus/core/tango/test/res/__init__.py b/lib/taurus/core/tango/test/res/__init__.py
new file mode 100644
index 0000000..b5a5672
--- /dev/null
+++ b/lib/taurus/core/tango/test/res/__init__.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
diff --git a/lib/taurus/core/tango/test/test_modelequality.py b/lib/taurus/core/tango/test/test_modelequality.py
new file mode 100644
index 0000000..7a80f56
--- /dev/null
+++ b/lib/taurus/core/tango/test/test_modelequality.py
@@ -0,0 +1,50 @@
+import unittest
+from taurus.core.test.modelequality import TaurusModelEqualityTestCase, \
+    testDeviceModelEquality, \
+    testAttributeModelEquality
+
+# the same device models, just different cases
+dev_models1 = ['tango:sys/tg_test/1',
+               'tango:SYS/TG_TEST/1']
+# different device models
+dev_models2 = ['tango:sys/tg_test/1',
+               'tango:sys/database/2']
+# the same attribute models, just different cases
+attr_models1 = ['tango:sys/tg_test/1/float_scalar',
+                'tango:SYS/TG_TEST/1/FLOAT_SCALAR']
+# different attribute models (same attr from different device)
+attr_models2 = ['tango:sys/tg_test/1/state',
+                'tango:sys/database/2/state']
+# the same attribute models, just different cases
+attr_models3 = [
+    'tango:sys/tg_test/1/float_scalar#label',
+    'tango:SYS/TG_TEST/1/FLOAT_SCALAR#LABEL'
+]
+# different attribute models (same attr and fragment but different device)
+attr_models4 = [
+    'tango:sys/tg_test/1/state#label',
+    'tango:sys/database/2/state#label'
+]
+# the same attribute models, just different fragment
+attr_models5 = [
+    'tango:sys/tg_test/1/float_scalar#label',
+    'tango:SYS/TG_TEST/1/FLOAT_SCALAR#range'
+]
+
+# # test cases for the model case insensitiveness
+
+
+ at testAttributeModelEquality(models=attr_models1, equal=True)
+ at testDeviceModelEquality(models=dev_models1, equal=True)
+ at testAttributeModelEquality(models=attr_models3, equal=True)
+# test cases for the different models inequality
+ at testAttributeModelEquality(models=attr_models2, equal=False)
+ at testDeviceModelEquality(models=dev_models2, equal=False)
+ at testAttributeModelEquality(models=attr_models4, equal=False)
+# test cases for the different models equality
+# TODO: add device/alias equality tests
+ at testAttributeModelEquality(models=attr_models5, equal=True)
+class TangoModelEqualityTestCase(TaurusModelEqualityTestCase,
+                                 unittest.TestCase):
+    """TestCase class for tango model equality testing."""
+    pass
diff --git a/lib/taurus/core/tango/test/test_tangoattribute.py b/lib/taurus/core/tango/test/test_tangoattribute.py
new file mode 100644
index 0000000..33a53fe
--- /dev/null
+++ b/lib/taurus/core/tango/test/test_tangoattribute.py
@@ -0,0 +1,823 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core.tango.test.test_tangovalidator..."""
+
+# __all__ = []
+
+__docformat__ = 'restructuredtext'
+
+import numpy
+import PyTango
+from taurus.external import unittest
+from taurus.external.pint import Quantity
+import taurus
+from taurus.core import DataType, DataFormat
+from taurus.core.tango.tangoattribute import TangoAttrValue
+from taurus.core.tango.test import TangoSchemeTestLauncher
+from taurus.test import insertTest
+from taurus.core.taurusbasetypes import AttrQuality
+from taurus.core.tango.util.tango_taurus import unit_from_tango
+
+_INT_IMG = numpy.arange(2 * 3, dtype='int16').reshape((2, 3))
+_INT_SPE = _INT_IMG[1, :]
+_FLOAT_IMG = _INT_IMG * .1
+_FLOAT_SPE = _INT_SPE * .1
+_BOOL_IMG = numpy.array([[True, False], [False, True]])
+_BOOL_SPE = [True, False]
+_STR = 'foo BAR |-+#@!?_[]{}'
+_UCHAR_IMG = numpy.array([['a', 'b'], ['c', 'd']], dtype='S1')
+_UCHAR_SPE = _UCHAR_IMG[1, :]
+_UINT8_IMG = _UCHAR_IMG.view('uint8')
+_UINT8_SPE = _UINT8_IMG[1, :]
+
+# ==============================================================================
+# Test writing fragment values
+##
+# DISABLED: these tests break test isolation (looks like Reset is not working
+#           for configurations). Until we solve it, we disable all these tests
+#
+# @insertTest(helper_name='write_read_conf', attr_name='short_scalar_nu',
+#             cfg='range', value=[float('-inf'), float('inf')],
+#             expected=[Quantity(float('-inf')), Quantity(float('inf'))]
+#             )
+# @insertTest(helper_name='write_read_conf', attr_name='short_scalar_nu',
+#             cfg='range', value=[Quantity(float('-inf')),
+#                                 Quantity(float('inf'))],
+#             expected=[Quantity(float('-inf')), Quantity(float('inf'))])
+# @insertTest(helper_name='write_read_conf', attr_name='short_scalar_nu',
+#             cfg='range', value=[100, 300],
+#             expected=[Quantity(100), Quantity(300)])
+# @insertTest(helper_name='write_read_conf', attr_name='short_scalar_nu',
+#             cfg='range', value=[Quantity(100), Quantity(300)],
+#             expected=[Quantity(100), Quantity(300)])
+# @insertTest(helper_name='write_read_conf', attr_name='float_scalar',
+#             cfg='range', value=[Quantity(-5, 'mm'), Quantity(5, 'mm')],
+#             expected=[Quantity(-0.005, 'm'), Quantity(5, 'mm')])
+# @insertTest(helper_name='write_read_conf', attr_name='short_spectrum',
+#             cfg='label', value='Just a Test',
+#             expected='Just a Test')
+# @insertTest(helper_name='write_read_conf', attr_name='boolean_spectrum',
+#             cfg='label', value='Just_a_Test',
+#             expected='Just_a_Test')
+# @insertTest(helper_name='write_read_conf', attr_name='short_scalar',
+#             cfg='warnings', value=[Quantity(-2, 'mm'), Quantity(2, 'mm')],
+#             expected=[Quantity(-2, 'mm'), Quantity(0.002, 'm')])
+# @insertTest(helper_name='write_read_conf', attr_name='short_image',
+#             cfg='warnings', value=[Quantity(-2, 'mm'), Quantity(2, 'mm')],
+#             expected=[Quantity(-0.002, 'm'), Quantity(2, 'mm')])
+# @insertTest(helper_name='write_read_conf', attr_name='float_image',
+#             cfg='warnings', value=[Quantity(-0.75, 'mm'),
+#                                         Quantity(0.75, 'mm')],
+#             expected=[Quantity(-0.00075, 'm'), Quantity(0.75, 'mm')])
+# @insertTest(helper_name='write_read_conf', attr_name='short_scalar_nu',
+#             cfg='warnings', value=[100, 300],
+#             expected=[Quantity(100), Quantity(300)])
+# @insertTest(helper_name='write_read_conf', attr_name='short_scalar',
+#             cfg='alarms', value=[Quantity(-50, 'mm'), Quantity(50, 'mm')],
+#             expected=[Quantity(-50, 'mm'), Quantity(50, 'mm')])
+# @insertTest(helper_name='write_read_conf', attr_name='short_image',
+#             cfg='alarms', value=[Quantity(-2, 'mm'), Quantity(2, 'mm')],
+#             expected=[Quantity(-0.002, 'm'), Quantity(2, 'mm')])
+# @insertTest(helper_name='write_read_conf', attr_name='float_image',
+#             cfg='alarms', value=[Quantity(-0.75, 'mm'), Quantity(0.75, 'mm')],
+#             expected=[Quantity(-0.00075, 'm'), Quantity(0.75, 'mm')])
+# @insertTest(helper_name='write_read_conf', attr_name='short_scalar_nu',
+#             cfg='alarms', value=[100, 300],
+#             expected=[Quantity(100), Quantity(300)])
+
+# ==============================================================================
+# Test encode-decode of empty arrays
+
+
+ at insertTest(helper_name='write_read_attr',
+            attrname='short_spectrum',
+            setvalue=Quantity(numpy.empty(0, dtype='int16'), 'km'),
+            expected=dict(rvalue=Quantity([], 'mm'),
+                          type=DataType.Integer,
+                          unit="mm"
+                          ),
+            expected_attrv=dict(rvalue=Quantity([], 'mm'),
+                                type=DataType.Integer,
+                                unit="mm"
+                                ),
+            expectedshape=(0,)
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='short_image',
+            setvalue=Quantity(numpy.empty((0, 0), dtype='int16'), 'mm'),
+            expected=dict(rvalue=Quantity([], 'mm'),
+                          type=DataType.Integer
+                          ),
+            expectedshape=(0, 0)
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='boolean_spectrum',
+            setvalue=numpy.empty(0, dtype='bool8'),
+            expected=dict(type=DataType.Boolean),
+            expectedshape=(0,)
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='boolean_image',
+            setvalue=numpy.empty((0, 0), dtype='bool8'),
+            expected=dict(type=DataType.Boolean),
+            expectedshape=(0, 0)
+            )
+# # Cannot test: Tango ignores writes of empty list for string attributes.
+# @insertTest(helper_name='write_read_attr',
+#             attrname='string_spectrum',
+#             setvalue=[],
+#             expected=dict(value=(), type=DataType.String,
+#                           rvalue=(), wvalue=()))
+#
+# # Cannot test: Tango ignores writes of empty list for string attributes.
+# @insertTest(helper_name='write_read_attr',
+#             attrname='string_image',
+#             setvalue=[[]],
+#             expected=dict(value=[[]], type=DataType.String))
+# ==============================================================================
+# Test encode-decode of strings, booleans and uchars
+ at insertTest(helper_name='write_read_attr',
+            attrname='uchar_image',
+            setvalue=_UCHAR_IMG,
+            expected=dict(rvalue=_UCHAR_IMG,
+                          wvalue=_UCHAR_IMG,
+                          type=DataType.Bytes,
+                          label='uchar_image',
+                          writable=True,
+                          ),
+            expected_attrv=dict(rvalue=_UCHAR_IMG,
+                                value=_UCHAR_IMG,
+                                wvalue=_UCHAR_IMG,
+                                w_value=_UCHAR_IMG,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='uchar_spectrum',
+            setvalue=_UCHAR_SPE,
+            expected=dict(rvalue=_UCHAR_SPE,
+                          wvalue=_UCHAR_SPE,
+                          type=DataType.Bytes,
+                          writable=True,
+                          ),
+            expected_attrv=dict(rvalue=_UCHAR_SPE,
+                                value=_UCHAR_SPE,
+                                wvalue=_UCHAR_SPE,
+                                w_value=_UCHAR_SPE,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='uchar_scalar',
+            setvalue='a',
+            expected=dict(rvalue='a',
+                          wvalue='a',
+                          type=DataType.Bytes,
+                          writable=True,
+                          range=[None, None],
+                          alarms=[None, None],
+                          warnings=[None, None]
+                          ),
+            expected_attrv=dict(rvalue='a',
+                                value='a',
+                                wvalue='a',
+                                w_value='a',
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='uchar_image',
+            setvalue=_UINT8_IMG,
+            expected=dict(rvalue=_UCHAR_IMG,
+                          wvalue=_UCHAR_IMG,
+                          type=DataType.Bytes,
+                          label='uchar_image',
+                          writable=True,
+                          ),
+            expected_attrv=dict(rvalue=_UCHAR_IMG,
+                                value=_UCHAR_IMG,
+                                wvalue=_UCHAR_IMG,
+                                w_value=_UCHAR_IMG,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='uchar_spectrum',
+            setvalue=_UINT8_SPE,
+            expected=dict(rvalue=_UCHAR_SPE,
+                          wvalue=_UCHAR_SPE,
+                          type=DataType.Bytes,
+                          writable=True,
+                          ),
+            expected_attrv=dict(rvalue=_UCHAR_SPE,
+                                value=_UCHAR_SPE,
+                                wvalue=_UCHAR_SPE,
+                                w_value=_UCHAR_SPE,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='uchar_scalar',
+            setvalue=97,  # ord('a')-->97
+            expected=dict(rvalue='a',
+                          wvalue='a',
+                          type=DataType.Bytes,
+                          writable=True,
+                          range=[None, None],
+                          alarms=[None, None],
+                          warnings=[None, None]
+                          ),
+            expected_attrv=dict(rvalue='a',
+                                value='a',
+                                wvalue='a',
+                                w_value='a',
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='string_image',
+            setvalue=((_STR,) * 3,) * 2,
+            expected=dict(rvalue=((_STR,) * 3,) * 2,
+                          wvalue=((_STR,) * 3,) * 2,
+                          type=DataType.String,
+                          label='string_image',
+                          writable=True,
+                          ),
+            expected_attrv=dict(value=((_STR,) * 3,) * 2,
+                                w_value=((_STR,) * 3,) * 2,
+                                rvalue=((_STR,) * 3,) * 2,
+                                wvalue=((_STR,) * 3,) * 2,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='string_spectrum',
+            setvalue=(_STR,) * 3,
+            expected=dict(rvalue=(_STR,) * 3,
+                          wvalue=(_STR,) * 3,
+                          type=DataType.String,
+                          label='string_spectrum',
+                          writable=True,
+                          ),
+            expected_attrv=dict(value=(_STR,) * 3,
+                                w_value=(_STR,) * 3,
+                                rvalue=(_STR,) * 3,
+                                wvalue=(_STR,) * 3,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='string_scalar',
+            setvalue=_STR,
+            expected=dict(rvalue=_STR,
+                          wvalue=_STR,
+                          type=DataType.String,
+                          label='string_scalar',
+                          writable=True,
+                          ),
+            expected_attrv=dict(value=_STR,
+                                w_value=_STR,
+                                rvalue=_STR,
+                                wvalue=_STR,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='boolean_image',
+            setvalue=_BOOL_IMG,
+            expected=dict(rvalue=_BOOL_IMG,
+                          wvalue=_BOOL_IMG,
+                          type=DataType.Boolean,
+                          label='boolean_image',
+                          writable=True,
+                          ),
+            expected_attrv=dict(rvalue=_BOOL_IMG,
+                                value=_BOOL_IMG,
+                                wvalue=_BOOL_IMG,
+                                w_value=_BOOL_IMG,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='boolean_spectrum',
+            setvalue=_BOOL_SPE,
+            expected=dict(rvalue=_BOOL_SPE,
+                          wvalue=_BOOL_SPE,
+                          type=DataType.Boolean,
+                          writable=True,
+                          ),
+            expected_attrv=dict(rvalue=_BOOL_SPE,
+                                value=_BOOL_SPE,
+                                wvalue=_BOOL_SPE,
+                                w_value=_BOOL_SPE,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='boolean_scalar',
+            setvalue=False,
+            expected=dict(rvalue=False,
+                          wvalue=False,
+                          type=DataType.Boolean,
+                          writable=True,
+                          range=[None, None],
+                          alarms=[None, None],
+                          warnings=[None, None]
+                          ),
+            expected_attrv=dict(rvalue=False,
+                                value=False,
+                                wvalue=False,
+                                w_value=False,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+# ==============================================================================
+# Test encode-decode with quantitiy conversions
+ at insertTest(helper_name='write_read_attr',
+            attrname='float_image',
+            setvalue=Quantity(_FLOAT_IMG, 'm'),
+            expected=dict(rvalue=Quantity(_FLOAT_IMG, 'm'),
+                          wvalue=Quantity(_FLOAT_IMG, 'm'),
+                          type=DataType.Float,
+                          writable=True,
+                          quality=AttrQuality.ATTR_VALID,
+                          label='float_image',
+                          range=[Quantity(float('-inf'), 'mm'),
+                                 Quantity(float('inf'), 'mm')],
+                          alarms=[Quantity(float('-inf'), 'mm'),
+                                  Quantity(float('inf'), 'mm')],
+                          warnings=[Quantity(float('-inf'), 'mm'),
+                                    Quantity(float('inf'), 'mm')]
+                          ),
+            expected_attrv=dict(rvalue=Quantity(_FLOAT_IMG, 'm'),
+                                value=1000 * _FLOAT_IMG,
+                                wvalue=Quantity(_FLOAT_IMG, 'm'),
+                                w_value=1000 * _FLOAT_IMG,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            expectedshape=numpy.shape(_FLOAT_IMG)
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='float_spectrum',
+            setvalue=Quantity(_FLOAT_SPE, 'm'),
+            expected=dict(rvalue=Quantity(_FLOAT_SPE, 'm'),
+                          wvalue=Quantity(_FLOAT_SPE, 'm'),
+                          type=DataType.Float,
+                          quality=AttrQuality.ATTR_VALID
+                          ),
+            expected_attrv=dict(rvalue=Quantity(_FLOAT_SPE, 'm'),
+                                value=1000 * _FLOAT_SPE,
+                                wvalue=Quantity(_FLOAT_SPE, 'm'),
+                                w_value=1000 * _FLOAT_SPE,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            expectedshape=numpy.shape(_FLOAT_SPE)
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='float_scalar',
+            setvalue=Quantity(0.01, 'm'),
+            expected=dict(rvalue=Quantity(0.01, 'm'),
+                          wvalue=Quantity(10, 'mm'),
+                          type=DataType.Float,
+                          name='float_scalar',
+                          range=[Quantity(-12.30, 'mm'),
+                                 Quantity(12.30, 'mm')],
+                          alarms=[Quantity(-6.15, 'mm'),
+                                  Quantity(6.15, 'mm')],
+                          warnings=[Quantity(-3.69, 'mm'),
+                                    Quantity(3.69, 'mm')]
+                          ),
+            expected_attrv=dict(value=10,
+                                rvalue=Quantity(0.01, 'm'),
+                                w_value=10,
+                                wvalue=Quantity(10, 'mm'),
+                                quality=AttrQuality.ATTR_ALARM
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='float_scalar',
+            setvalue=Quantity(0.004, 'm'),
+            expected=dict(rvalue=Quantity(4, 'mm'),
+                          wvalue=Quantity(4, 'mm')
+                          ),
+            expected_attrv=dict(rvalue=Quantity(4, 'mm'),
+                                wvalue=Quantity(0.004, 'm'),
+                                quality=AttrQuality.ATTR_WARNING
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='float_scalar',
+            setvalue=Quantity(3, 'mm'),
+            expected=dict(rvalue=Quantity(3, 'mm'),
+                          wvalue=Quantity(3, 'mm'),
+                          type=DataType.Float,
+                          ),
+            expected_attrv=dict(value=3,
+                                w_value=3,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='double_scalar',
+            setvalue=Quantity(0.01, 'm'),
+            expected=dict(rvalue=Quantity(0.01, 'm'),
+                          wvalue=Quantity(10, 'mm'),
+                          type=DataType.Float,
+                          name="double_scalar",
+                          range=[Quantity(-12.30, 'mm'),
+                                 Quantity(12.30, 'mm')],
+                          alarms=[Quantity(-6.15, 'mm'),
+                                  Quantity(6.15, 'mm')],
+                          warnings=[Quantity(-3.69, 'mm'),
+                                    Quantity(3.69, 'mm')]
+                          ),
+            expected_attrv=dict(value=10,
+                                rvalue=Quantity(0.01, 'm'),
+                                w_value=10,
+                                wvalue=Quantity(10, 'mm'),
+                                quality=AttrQuality.ATTR_ALARM
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='double_scalar',
+            setvalue=Quantity(0.004, 'm'),
+            expected=dict(rvalue=Quantity(4, 'mm'),
+                          wvalue=Quantity(4, 'mm')
+                          ),
+            expected_attrv=dict(rvalue=Quantity(4, 'mm'),
+                                wvalue=Quantity(0.004, 'm'),
+                                quality=AttrQuality.ATTR_WARNING
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='double_scalar',
+            setvalue=Quantity(3, 'mm'),
+            expected=dict(rvalue=Quantity(3, 'mm'),
+                          wvalue=Quantity(3, 'mm'),
+                          type=DataType.Float,
+                          ),
+            expected_attrv=dict(value=3,
+                                w_value=3,
+                                quality=AttrQuality.ATTR_VALID
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='short_image',
+            setvalue=Quantity(_INT_IMG, 'm'),
+            expected=dict(rvalue=Quantity(_INT_IMG, 'm'),
+                          wvalue=Quantity(_INT_IMG, 'm'),
+                          type=DataType.Integer
+                          ),
+            expected_attrv=dict(value=1000 * _INT_IMG,
+                                rvalue=Quantity(_INT_IMG, 'm'),
+                                wvalue=Quantity(_INT_IMG, 'm'),
+                                w_value=1000 * _INT_IMG,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            expectedshape=numpy.shape(_INT_IMG)
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='short_spectrum',
+            setvalue=Quantity(_INT_SPE, 'm'),
+            expected=dict(rvalue=Quantity(_INT_SPE, 'm'),
+                          wvalue=Quantity(_INT_SPE, 'm'),
+                          type=DataType.Integer),
+            expectedshape=numpy.shape(_INT_SPE),
+            expected_attrv=dict(value=1000 * _INT_SPE,
+                                w_value=1000 * _INT_SPE
+                                )
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='short_scalar',
+            setvalue=Quantity(1, 'm'),
+            expected=dict(rvalue=Quantity(1000, 'mm'),
+                          wvalue=Quantity(1000, 'mm'),
+                          type=DataType.Integer,
+                          label='short_scalar',
+                          data_format=DataFormat._0D,
+                          writable=True,
+                          range=[Quantity(-1230, 'mm'),
+                                 Quantity(1230, 'mm')],
+                          alarms=[Quantity(-615, 'mm'),
+                                  Quantity(615, 'mm')],
+                          warnings=[Quantity(-369, 'mm'),
+                                    Quantity(369, 'mm')]
+                          ),
+            expected_attrv=dict(value=1000,
+                                w_value=1000,
+                                quality=AttrQuality.ATTR_ALARM
+                                )
+            )
+# ==============================================================================
+# Test read of tango attributes
+ at insertTest(helper_name='write_read_attr',
+            attrname='string_image_ro',
+            expected=dict(rvalue=(('hello world',) * 3,) * 3,
+                          wvalue=None,
+                          type=DataType.String
+                          ),
+            expected_attrv=dict(value=(('hello world',) * 3,) * 3,
+                                w_value=None,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            expectedshape=(3, 3),
+            test_skip='Known (Py)Tango bug for empty string arrays',
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='string_spectrum_ro',
+            expected=dict(rvalue=('hello world',) * 3,
+                          wvalue=None,
+                          type=DataType.String),
+            expected_attrv=dict(value=('hello world',) * 3,
+                                w_value=None,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            expectedshape=(3,),
+            test_skip='Known (Py)Tango bug for empty string arrays',
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='string_scalar_ro',
+            expected=dict(rvalue='hello world',
+                          wvalue=None,
+                          type=DataType.String
+                          ),
+            expected_attrv=dict(value='hello world',
+                                w_value=None,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='boolean_image_ro',
+            expected=dict(rvalue=numpy.ones((3, 3), dtype='b'),
+                          wvalue=None,
+                          type=DataType.Boolean
+                          ),
+            expected_attrv=dict(value=numpy.ones((3, 3), dtype='b'),
+                                w_value=None,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            expectedshape=(3, 3))
+ at insertTest(helper_name='write_read_attr',
+            attrname='boolean_spectrum_ro',
+            expected=dict(rvalue=numpy.array([True] * 3),
+                          wvalue=None,
+                          type=DataType.Boolean,
+                          label='boolean_spectrum_ro'
+                          ),
+            expected_attrv=dict(value=numpy.array([True] * 3),
+                                w_value=None,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            expectedshape=(3,))
+ at insertTest(helper_name='write_read_attr',
+            attrname='boolean_scalar_ro',
+            expected=dict(rvalue=True,
+                          wvalue=None,
+                          type=DataType.Boolean,
+                          range=[None, None],
+                          alarms=[None, None],
+                          warnings=[None, None],
+                          data_format=DataFormat._0D,
+                          writable=False
+                          ),
+            expected_attrv=dict(value=True,
+                                w_value=None,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='float_image_ro',
+            expected=dict(rvalue=Quantity([[1.23] * 3] * 3, 'mm'),
+                          wvalue=None,
+                          type=DataType.Float
+                          ),
+            expected_attrv=dict(value=[[1.23] * 3] * 3,
+                                w_value=None,
+                                quality=AttrQuality.ATTR_VALID,
+                                wvalue=None),
+            expectedshape=(3, 3))
+ at insertTest(helper_name='write_read_attr',
+            attrname='float_spectrum_ro',
+            expected=dict(rvalue=Quantity([1.23] * 3, 'mm'),
+                          wvalue=None,
+                          type=DataType.Float
+                          ),
+            expected_attrv=dict(value=[1.23] * 3,
+                                w_value=None,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            expectedshape=(3,)
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='float_scalar_ro',
+            expected=dict(rvalue=Quantity(1.23, 'mm'),
+                          wvalue=None,
+                          type=DataType.Float,
+                          writable=False,
+                          range=[Quantity(float('-inf'), 'mm'),
+                                 Quantity(float('inf'), 'mm')],
+                          alarms=[Quantity(float('-inf'), 'mm'),
+                                  Quantity(float('inf'), 'mm')],
+                          warnings=[Quantity(float('-inf'), 'mm'),
+                                    Quantity(float('inf'), 'mm')]
+                          ),
+            expected_attrv=dict(value=1.23,
+                                w_value=None,
+                                quality=AttrQuality.ATTR_VALID
+                                ),
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='short_image_ro',
+            expected=dict(rvalue=Quantity([[123] * 3] * 3, 'mm'),
+                          wvalue=None,
+                          type=DataType.Integer
+                          ),
+            expected_attrv=dict(rvalue=Quantity([[123] * 3] * 3, 'mm'),
+                                value=[[123] * 3] * 3,
+                                quality=AttrQuality.ATTR_VALID,
+                                wvalue=None,
+                                w_value=None),
+            expectedshape=(3, 3)
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='short_spectrum_ro',
+            expected=dict(rvalue=Quantity([123] * 3, 'mm'),
+                          wvalue=None,
+                          type=DataType.Integer,
+                          data_format=DataFormat._1D,
+                          writable=False
+                          ),
+            expected_attrv=dict(rvalue=Quantity([123] * 3, 'mm'),
+                                value=[123] * 3,
+                                quality=AttrQuality.ATTR_VALID,
+                                wvalue=None,
+                                w_value=None),
+            expectedshape=(3,)
+            )
+ at insertTest(helper_name='write_read_attr',
+            attrname='short_scalar_ro',
+            expected=dict(rvalue=Quantity(123, 'mm'),
+                          wvalue=None,
+                          type=DataType.Integer,
+                          data_format=DataFormat._0D,
+                          writable=False,
+                          range=[Quantity(float('-inf'), 'mm'),
+                                 Quantity(float('inf'), 'mm')],
+                          alarms=[Quantity(float('-inf'), 'mm'),
+                                  Quantity(float('inf'), 'mm')],
+                          warnings=[Quantity(float('-inf'), 'mm'),
+                                    Quantity(float('inf'), 'mm')]
+                          ),
+            expected_attrv=dict(rvalue=Quantity(123, 'mm'),
+                                value=123,
+                                quality=AttrQuality.ATTR_VALID,
+                                wvalue=None,
+                                w_value=None)
+            )
+class AttributeTestCase(TangoSchemeTestLauncher, unittest.TestCase):
+    """TestCase for the taurus.Attribute helper"""
+
+    def tearDown(self):
+        TangoSchemeTestLauncher.tearDown(self)
+
+    def _getDecodePyTangoAttr(self, attr_name, cfg):
+        """Helper for decode the PyTango attribute infoex
+        """
+        dev = PyTango.DeviceProxy(self.DEV_NAME)
+        infoex = dev.get_attribute_config_ex(attr_name)[0]
+        unit = unit_from_tango(infoex.unit)
+        if cfg in ['range', 'alarms', 'warnings']:
+            if cfg == 'range':
+                low = infoex.min_value
+                high = infoex.max_value
+            elif cfg == 'alarms':
+                low = infoex.alarms.min_alarm
+                high = infoex.alarms.max_alarm
+            elif cfg == 'warnings':
+                low = infoex.alarms.min_warning
+                high = infoex.alarms.max_warning
+            if low == 'Not specified':
+                low = '-inf'
+            if high == 'Not specified':
+                high = 'inf'
+            return [Quantity(float(low), unit),
+                    Quantity(float(high), unit)]
+        elif cfg == 'label':
+            return infoex.label
+        else:
+            return None
+
+    def write_read_conf(self, attr_name, cfg, value, expected):
+        """ Helper for checking the write-and-read of the Tango
+        attribute configuration (existing in Taurus).
+        """
+        attr_fullname = '%s/%s' % (self.DEV_NAME, attr_name)
+        attr = taurus.Attribute(attr_fullname)
+        # write the property
+        setattr(attr, cfg, value)
+        # read the property
+        got = getattr(attr, cfg)
+        msg = '%s.%s from Taurus do not mach, expected %s read %s' %\
+              (attr_name, cfg, expected, got)
+        map(self.__assertValidValue, got, expected, msg)
+
+        msg = '%s.%s from Tango do not mach, expected %s read %s' %\
+              (attr_name, cfg, expected, got)
+        tangovalue = self._getDecodePyTangoAttr(attr_name, cfg)
+        map(self.__assertValidValue, got, tangovalue, msg)
+
+    def write_read_attr(self, attrname=None, setvalue=None, expected=None,
+                        expected_attrv=None, expectedshape=None):
+        """check creation and correct write-and-read of an attribute"""
+
+        if expected is None:
+            expected = {}
+        if expected_attrv is None:
+            expected_attrv = {}
+
+        name = '%s/%s' % (self.DEV_NAME, attrname)
+        a = taurus.Attribute(name)
+
+        if setvalue is None:
+            read_value = a.read()
+        else:
+            read_value = a.write(setvalue,  with_read=True)
+
+        msg = ('read() for "%s" did not return a TangoAttrValue (got a %s)' %
+               (attrname, read_value.__class__.__name__))
+        self.assertTrue(isinstance(read_value, TangoAttrValue), msg)
+
+        # Test attribute
+        for k, exp in expected.iteritems():
+            try:
+                got = getattr(a, k)
+            except AttributeError:
+                msg = ('The attribute, "%s" does not provide info on %s' %
+                       (attrname, k))
+                self.fail(msg)
+            msg = ('%s for "%s" should be %r (got %r)' %
+                   (k, attrname,  exp, got))
+            self.__assertValidValue(exp, got, msg)
+
+        # Test attribute value
+        for k, exp in expected_attrv.iteritems():
+            try:
+                got = getattr(read_value, k)
+            except AttributeError:
+                msg = ('The read value for "%s" does not provide info on %s' %
+                       (attrname, k))
+                self.fail(msg)
+            msg = ('%s for the value of %s should be %r (got %r)' %
+                   (k, attrname,  exp, got))
+            self.__assertValidValue(exp, got, msg)
+
+        if expectedshape is not None:
+            msg = ('rvalue.shape for %s should be %r (got %r)' %
+                   (attrname, expectedshape, read_value.rvalue.shape))
+            self.assertEqual(read_value.rvalue.shape, expectedshape, msg)
+
+    def __assertValidValue(self, exp, got, msg):
+        # if we are dealing with quantities, use the magnitude for comparing
+        if isinstance(got, Quantity):
+            got = got.to(Quantity(exp).units).magnitude
+        if isinstance(exp, Quantity):
+            exp = exp.magnitude
+        try:
+            # for those values that can be handled by numpy.allclose()
+            chk = numpy.allclose(got, exp)
+        except:
+            if isinstance(got, numpy.ndarray):
+                # uchars were not handled with allclose
+                # UGLY!! but numpy.all does not work
+                chk = got.tolist() == exp.tolist()
+            else:
+                # for the rest
+                chk = bool(got == exp)
+
+        self.assertTrue(chk, msg)
+
+if __name__ == '__main__':
+    pass
diff --git a/lib/taurus/core/tango/test/test_tangovalidator.py b/lib/taurus/core/tango/test/test_tangovalidator.py
new file mode 100644
index 0000000..3115859
--- /dev/null
+++ b/lib/taurus/core/tango/test/test_tangovalidator.py
@@ -0,0 +1,162 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core.tango.test.test_tangovalidator..."""
+
+#__all__ = []
+
+__docformat__ = 'restructuredtext'
+
+
+from taurus.external import unittest
+from taurus.core.test import (valid, invalid, names,
+                              AbstractNameValidatorTestCase)
+from taurus.core.tango.tangovalidator import (TangoAuthorityNameValidator,
+                                              TangoDeviceNameValidator,
+                                              TangoAttributeNameValidator)
+
+import PyTango
+__GETENV = PyTango.ApiUtil.get_env_var
+
+
+#=========================================================================
+# Tests for Tango Authority  name validation
+#=========================================================================
+ at valid(name='tango://foo:10000')
+ at invalid(name='tango:foo')
+ at invalid(name='tango:foo:10000')
+ at invalid(name='tango://foo:10000/')
+ at invalid(name='tango://foo:10000/?')
+ at invalid(name='tango://foo:bar')
+ at invalid(name='tango://foo:10000/foo')
+ at names(name='tango://foo:123',
+       out=('tango://foo:123', '//foo:123', 'foo:123'))
+ at names(name='//foo:123',  # using implicit scheme!
+       out=('tango://foo:123', '//foo:123', 'foo:123'))
+class TangoAuthValidatorTestCase(AbstractNameValidatorTestCase,
+                                 unittest.TestCase):
+    validator = TangoAuthorityNameValidator
+
+
+#=========================================================================
+# Tests for Tango Device name validation
+#=========================================================================
+ at valid(name='tango:foo', groups={'devname': 'foo',
+                                 '_devalias': 'foo',
+                                 '_devslashname': None})
+ at valid(name='tango:a/b/c', groups={'devname': 'a/b/c',
+                                   '_devalias': None,
+                                   '_devslashname': 'a/b/c'})
+ at valid(name='tango://foo:123/a/b/c', groups={'devname': 'a/b/c',
+                                             '_devalias': None,
+                                             '_devslashname': 'a/b/c'})
+ at valid(name='tango:a/b/ c', groups={'devname': 'a/b/ c'})
+ at invalid(name='tango:/a/b/c?')
+ at valid(name='tango://a/b/c', strict=False)
+ at invalid(name='tango://a/b/c', strict=True)
+ at invalid(name='tango://devalias')
+ at names(name='tango://foo:123/a/b/c',
+       out=('tango://foo:123/a/b/c', '//foo:123/a/b/c', 'a/b/c'))
+ at names(name='tango:sys/tg_test/1',
+       out=('tango://%s/sys/tg_test/1' % __GETENV("TANGO_HOST"),
+            'sys/tg_test/1', 'sys/tg_test/1'))
+ at names(name='tango:alias', out=(None, None, 'alias'))
+# @names(name = 'tango:mot49', # commented out because it assumes mot49 exists
+#        out=('tango://%s/motor/motctrl13/1'% __GETENV("TANGO_HOST"),
+#             'motor/motctrl13/1', 'mot49'))
+class TangoDevValidatorTestCase(AbstractNameValidatorTestCase,
+                                unittest.TestCase):
+    validator = TangoDeviceNameValidator
+
+
+#=========================================================================
+# Tests for Tango Attribute name validation (without fragment)
+#=========================================================================
+ at valid(name='tango:a/b/c/d', groups={'devname': 'a/b/c',
+                                     'attrname': 'a/b/c/d',
+                                     '_shortattrname': 'd'})
+ at valid(name='tango:alias/attr', groups={'devname': 'alias',
+                                        '_devalias': 'alias',
+                                        'attrname': 'alias/attr',
+                                        '_shortattrname': 'attr'})
+ at valid(name='tango://a/b/c/d', strict=False)
+ at valid(name='tango://alias/attr', strict=False)
+ at invalid(name='tango://a/b/c/d')
+ at invalid(name='tango://a/b/c/')
+ at invalid(name='tango://alias/attr')
+ at invalid(name='tango://a/b/c/d?')
+ at invalid(name='tango:a/b/c')
+ at invalid(name='tango:sys/tg_test/1')
+ at names(name='tango://foo:123/a/b/c/d',
+       out=('tango://foo:123/a/b/c/d', '//foo:123/a/b/c/d', 'd'))
+ at names(name='tango:sys/tg_test/1/float_scalar',
+       out=('tango://%s/sys/tg_test/1/float_scalar' % __GETENV("TANGO_HOST"),
+            'sys/tg_test/1/float_scalar', 'float_scalar'))
+# @names(name = 'tango:mot49/position', # commented out because it assumes mot49
+#        out=('tango://%s/motor/motctrl13/1/position'% __GETENV("TANGO_HOST"),
+#             'motor/motctrl13/1/position', 'position'))
+#=========================================================================
+# Tests for validation of Attribute name with fragment
+#=========================================================================
+ at valid(name='tango:a/b/c/d#',
+       groups={'devname': 'a/b/c', 'attrname': 'a/b/c/d', '_shortattrname': 'd',
+               'cfgkey': ''})
+ at valid(name='tango:a/b/c/d#label',
+       groups={'devname': 'a/b/c', 'attrname': 'a/b/c/d', '_shortattrname': 'd',
+               'cfgkey': 'label'})
+ at valid(name='tango:alias/attr#')
+ at valid(name='tango:alias/attr#label')
+ at valid(name='tango://a/b/c/d?configuration', strict=False)
+ at valid(name='tango://a/b/c/d?configuration=label', strict=False,
+       groups={'devname': 'a/b/c',
+               'attrname': 'a/b/c/d',
+               '_shortattrname': 'd',
+               'cfgkey': 'label',
+               'fragment': 'label'})  # fragment=cfgkey (in non-strict mode)
+ at invalid(name='tango://a/b/c/d#')
+ at invalid(name='tango://a/b/c/d?foo', strict=False)
+ at invalid(name='tango://a/b/c/d?foo=label', strict=False)
+ at valid(name='tango:a/b/c/d#?foo=label')  # "?" is allowed in cfgkeys!
+ at valid(name='tango:a/b/c/d#label?foo=bar')
+ at names(name='tango://foo:123/a/b/c/d#',
+       out=('tango://foo:123/a/b/c/d',
+            '//foo:123/a/b/c/d', 'd', ''))
+ at names(name='tango://foo:123/a/b/c/d#label',
+       out=('tango://foo:123/a/b/c/d',
+            '//foo:123/a/b/c/d', 'd', 'label'))
+ at names(name='tango:sys/tg_test/1/float_scalar#',
+       out=('tango://%s/sys/tg_test/1/float_scalar' %
+            __GETENV("TANGO_HOST"),
+            'sys/tg_test/1/float_scalar', 'float_scalar', ''))
+ at names(name='tango://foo:123/a/b/c/d?configuration=label',
+       out=('tango://foo:123/a/b/c/d',
+            '//foo:123/a/b/c/d', 'd', 'label'))
+class TangoAttrValidatorTestCase(AbstractNameValidatorTestCase,
+                                 unittest.TestCase):
+    validator = TangoAttributeNameValidator
+
+
+if __name__ == '__main__':
+    pass
diff --git a/lib/taurus/core/tango/test/tgtestds.py b/lib/taurus/core/tango/test/tgtestds.py
new file mode 100644
index 0000000..42fa703
--- /dev/null
+++ b/lib/taurus/core/tango/test/tgtestds.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Module containing base classes for using the TangoSchemeTest DS in tests"""
+
+__all__ = ['TangoSchemeTestLauncher']
+
+__docformat__ = 'restructuredtext'
+
+import PyTango
+
+from taurus.core.tango.starter import ProcessStarter
+from taurus.test import getResourcePath
+
+
+class TangoSchemeTestLauncher(object):
+    """A base class for TestCase classes wishing to start a TangoSchemeTest.
+    Use it as a mixin class"""
+
+    DEV_NAME = 'TangoSchemeTest/unittest/temp-1'  # the dev name
+
+    @classmethod
+    def setUpClass(cls):
+        """ Create and run a TangoSchemeTest device server
+        """
+        # get path to DS and executable
+        device = getResourcePath('taurus.core.tango.test.res',
+                                 'TangoSchemeTest')
+        # create starter for the device server
+        cls._starter = ProcessStarter(device, 'TangoSchemeTest/unittest')
+        # register
+        cls._starter.addNewDevice(cls.DEV_NAME, klass='TangoSchemeTest')
+        # start device server
+        cls._starter.startDs()
+
+    @classmethod
+    def tearDownClass(cls):
+        """ Stop the device server and undo changes to the database
+        """
+        d = PyTango.DeviceProxy(cls.DEV_NAME)
+        d.Reset()
+        cls._starter.stopDs(hard_kill=True)
+        # remove server
+        cls._starter.cleanDb(force=True)
+
+    def tearDown(self):
+        d = PyTango.DeviceProxy(self.DEV_NAME)
+        d.Reset()
+
+if __name__ == '__main__':
+    pass
diff --git a/lib/taurus/core/tango/util/__init__.py b/lib/taurus/core/tango/util/__init__.py
new file mode 100644
index 0000000..1f55bd1
--- /dev/null
+++ b/lib/taurus/core/tango/util/__init__.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""The sardana package. It contains specific part of sardana"""
+
+__docformat__ = 'restructuredtext'
diff --git a/lib/taurus/core/tango/util/tango_taurus.py b/lib/taurus/core/tango/util/tango_taurus.py
new file mode 100644
index 0000000..0577c42
--- /dev/null
+++ b/lib/taurus/core/tango/util/tango_taurus.py
@@ -0,0 +1,180 @@
+# -*- 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/>.
+##
+##############################################################################
+
+'''Utility functions to convert between tango and Taurus types'''
+
+import PyTango
+
+from taurus.external.pint import Quantity, UndefinedUnitError, UR
+from taurus.core.taurusbasetypes import (AttrQuality, DisplayLevel,
+                                         TaurusAttrValue, DataType, DataFormat)
+
+
+__NO_STR_VALUE = PyTango.constants.AlrmValueNotSpec, PyTango.constants.StatusNotSet
+
+FROM_TANGO_TO_TAURUS_DFORMAT = {PyTango.AttrDataFormat.SCALAR: DataFormat._0D,
+                                PyTango.AttrDataFormat.SPECTRUM: DataFormat._1D,
+                                PyTango.AttrDataFormat.IMAGE: DataFormat._2D}
+
+FROM_TANGO_TO_TAURUS_TYPE = {PyTango.CmdArgType.DevVoid: None,
+                             PyTango.CmdArgType.DevBoolean: DataType.Boolean,
+                             PyTango.CmdArgType.DevShort: DataType.Integer,
+                             PyTango.CmdArgType.DevLong: DataType.Integer,
+                             PyTango.CmdArgType.DevFloat: DataType.Float,
+                             PyTango.CmdArgType.DevDouble: DataType.Float,
+                             PyTango.CmdArgType.DevUShort: DataType.Integer,
+                             PyTango.CmdArgType.DevULong: DataType.Integer,
+                             PyTango.CmdArgType.DevString: DataType.String,
+                             PyTango.CmdArgType.DevVarCharArray: DataType.Integer,  # maybe should be Bytes?
+                             PyTango.CmdArgType.DevVarShortArray: DataType.Integer,
+                             PyTango.CmdArgType.DevVarLongArray: DataType.Integer,
+                             PyTango.CmdArgType.DevVarFloatArray: DataType.Float,
+                             PyTango.CmdArgType.DevVarDoubleArray: DataType.Float,
+                             PyTango.CmdArgType.DevVarUShortArray: DataType.Integer,
+                             PyTango.CmdArgType.DevVarULongArray: DataType.Integer,
+                             PyTango.CmdArgType.DevVarStringArray: DataType.String,
+                             PyTango.CmdArgType.DevVarLongStringArray: DataType.Object,
+                             PyTango.CmdArgType.DevVarDoubleStringArray: DataType.Object,
+                             PyTango.CmdArgType.DevState: DataType.DevState,
+                             PyTango.CmdArgType.ConstDevString: DataType.String,
+                             PyTango.CmdArgType.DevVarBooleanArray: DataType.Boolean,
+                             PyTango.CmdArgType.DevUChar: DataType.Bytes,
+                             PyTango.CmdArgType.DevLong64: DataType.Integer,
+                             PyTango.CmdArgType.DevULong64: DataType.Integer,
+                             PyTango.CmdArgType.DevVarLong64Array: DataType.Integer,
+                             PyTango.CmdArgType.DevVarULong64Array: DataType.Integer,
+                             PyTango.CmdArgType.DevInt: DataType.Integer,
+                             PyTango.CmdArgType.DevEncoded: DataType.DevEncoded,
+                             }
+
+if hasattr(PyTango, "str_2_obj"):
+    str_2_obj = PyTango.str_2_obj
+else:
+
+    # Old PyTango
+    import PyTango.utils
+
+    bool_ = lambda value_str: value_str.lower() == "true"
+
+    def str_2_obj(obj_str, tg_type=None):
+        f = str
+        if PyTango.utils.is_scalar_type(tg_type):
+            if PyTango.utils.is_numerical_type(tg_type):
+                if obj_str in __NO_STR_VALUE:
+                    return None
+
+            if PyTango.utils.is_int_type(tg_type):
+                f = int
+            elif PyTango.utils.is_float_type(tg_type):
+                f = float
+            elif PyTango.utils.is_bool_type(tg_type):
+                f = bool_
+        return f(obj_str)
+
+
+def get_quantity(value, units=None, fmt=None):
+    if value is None:
+        return None
+    res = Quantity(value, units=units)
+    if fmt is not None:
+        res.default_format = fmt + res.default_format
+    return res
+
+
+def quantity_from_tango_str(value_str, dtype=None, units=None, fmt=None,
+                            ignore_exception=True):
+    try:
+        return get_quantity(str_2_obj(value_str, dtype), units=units, fmt=fmt)
+    except ValueError:
+        if not ignore_exception:
+            raise
+        return None
+
+
+def unit_from_tango(unit):
+    if unit == PyTango.constants.UnitNotSpec:
+        unit = None
+    try:
+        return UR.parse_units(unit)
+    except UndefinedUnitError:
+        # TODO: Maybe we could dynamically register the unit in the UR
+        from taurus import warning
+        warning('Unknown unit "%s (will be treated as dimensionless)"', unit)
+        return UR.parse_units(None)
+
+
+def ndim_from_tango(data_format):
+    return int(data_format)
+
+
+def data_format_from_tango(data_format):
+    return FROM_TANGO_TO_TAURUS_DFORMAT[data_format]
+
+
+def data_type_from_tango(data_type):
+    return FROM_TANGO_TO_TAURUS_TYPE[data_type]
+
+
+def display_level_from_tango(disp_level):
+    return DisplayLevel(disp_level)
+
+
+def quality_from_tango(quality):
+    return AttrQuality(int(quality))
+
+
+__NULL_DESC = PyTango.constants.DescNotSet, PyTango.constants.DescNotSpec
+
+
+def description_from_tango(desc):
+    if desc in __NULL_DESC:
+        desc = ''
+    return desc
+
+__S_TYPES = (PyTango.CmdArgType.DevString,
+             PyTango.CmdArgType.DevVarStringArray,
+             PyTango.CmdArgType.DevEncoded,)
+
+
+def standard_display_format_from_tango(dtype, fmt):
+    if fmt == 'Not specified':
+        return '!s'
+
+    # %6.2f is the default value that Tango sets when the format is
+    # unassigned in tango < 8. This is only good for float types! So for other
+    # types I am changing this value.
+    if fmt == '%6.2f':
+        if PyTango.is_float_type(dtype, inc_array=True):
+            pass
+        elif PyTango.is_int_type(dtype, inc_array=True):
+            fmt = '%d'
+        elif dtype in __S_TYPES:
+            fmt = '%s'
+    return fmt
+
+
+def display_format_from_tango(dtype, fmt):
+    fmt = standard_display_format_from_tango(dtype, fmt)
+    return fmt.replace('%s', '!s').replace('%r', '!r').replace('%', '')
diff --git a/lib/taurus/core/taurusattribute.py b/lib/taurus/core/taurusattribute.py
index 9560fc8..08a69ae 100644
--- a/lib/taurus/core/taurusattribute.py
+++ b/lib/taurus/core/taurusattribute.py
@@ -2,75 +2,91 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 the base class for a taurus attribute"""
 
-__all__ = ["TaurusAttribute", "TaurusStateAttribute"]
+__all__ = ["TaurusAttribute"]
 
 __docformat__ = "restructuredtext"
 
 import weakref
 
-from taurus.core.taurusbasetypes import TaurusElementType
+from .taurushelper import Factory
 from .taurusmodel import TaurusModel
-from .taurusconfiguration import TaurusConfigurationProxy
+from taurus.core.taurusbasetypes import TaurusElementType, DataType
+from taurus.external.pint import Quantity, UR
+
 
 class TaurusAttribute(TaurusModel):
-    
+
+    DftTimeToLive = 10000  # 10s
+    _description = "A Taurus Attribute"
+    defaultFragmentName = "rvalue"  # fragment to be used if none is specified
+
     def __init__(self, name, parent, **kwargs):
         self.call__init__(TaurusModel, name, parent)
 
-        self.__parentDevice = parent # just to keep it alive
-        
         # User enabled/disabled polling
-        self.__enable_polling = kwargs.get('enablePolling', True) 
-        
-        # attribute should be polled. The attribute is in fact polled only if the polling is also enabled 
+        self.__enable_polling = kwargs.get('enablePolling', True)
+
+        # attribute should be polled.
+        # The attribute is polled only if the polling is also enabled
         self.__activate_polling = False
-        
-        # efectively tells if the attribute is being polled periodically
-        # in summary: polled = enable_polling and activate_polling
+
+        # Indicates if the attribute is being polled periodically
+        # In summary: polled = enable_polling and activate_polling
         self.__polled = False
-        
+
         # current polling period
         self.__polling_period = kwargs.get("pollingPeriod", 3000)
-        
+
         # stores if polling has been forced by user API
         self.__forced_polling = False
-        
-        # Everything went ok so now we are sure we can store the object
+
+        # If everything went well, the object is stored
         storeCallback = kwargs.get("storeCallback", None)
         if not storeCallback is None:
             storeCallback(self)
 
-        self._dev_hw_obj = parent.getHWObj()
-    
+        self.writable = None
+        self.data_format = None
+        self._label = None
+        self.type = None
+        self._range = [None, None]
+        self._alarm = [None, None]
+        self._warning = [None, None]
+
     def cleanUp(self):
         self.trace("[TaurusAttribute] cleanUp")
         self._unsubscribeEvents()
-        self._dev_hw_obj = None
         TaurusModel.cleanUp(self)
-        
+
+    @classmethod
+    def factory(cls):
+        if cls._factory is None:
+            cls._factory = Factory(scheme=cls._scheme)
+        return cls._factory
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusModel implementation
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
@@ -78,15 +94,18 @@ class TaurusAttribute(TaurusModel):
     @classmethod
     def getTaurusElementType(cls):
         return TaurusElementType.Attribute
-            
+
     @classmethod
     def buildModelName(cls, parent_model, relative_name):
-        """build an 'absolute' model name from the parent model and the 'relative'
-        name. 
+        """build an 'absolute' model name from the parent model and the
+        'relative' name.
         - If parent_model is a TaurusDevice, the return is a composition of
-        the database model name and is device name
+        the database model name and its device name
         - If parent_model is a TaurusAttribute, the relative name is ignored and
         the parent name is returned
+
+        Note: This is a basic implementation. You may need to reimplement this
+              for a specific scheme if it supports "useParentModel".
         """
         if parent_model is None:
             return relative_name
@@ -95,60 +114,55 @@ class TaurusAttribute(TaurusModel):
             return relative_name
         if isinstance(parent_model, cls):
             return parent_name
-        return '%s%s' % (parent_name,relative_name)  
-            
+        return '%s%s' % (parent_name, relative_name)
+
     @classmethod
     def getNameValidator(cls):
-        import taurusvalidator
-        return taurusvalidator.AttributeNameValidator()
-        
-    # received configuration events
-    def eventReceived(self, src, src_type, evt_value):
-        """Method invoked by the configuration object when a configuration event
-           is received. Default implementation propagates the event to all 
-           listeners."""
-        #self.fireEvent(src_type, evt_value)
-        pass
+        return cls.factory().getAttributeNameValidator()
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Necessary to overwrite in subclass
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     def isNumeric(self):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.isNumeric")
-        
-    def isBoolean(self):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.isBoolean")
-    
-    def isState(self):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.isState")
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute.isNumeric")
 
-    def getDisplayValue(self,cache=True):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.getDisplayValue")
+    def isState(self):
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute.isState")
 
     def encode(self, value):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.encode")
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute.encode")
 
     def decode(self, attr_value):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.decode")
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute.decode")
 
     def write(self, value, with_read=True):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.write")
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute.write")
 
     def read(self, cache=True):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.read")
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute.read")
 
     def poll(self):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.poll")
-            
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute.poll")
+
     def _subscribeEvents(self):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute._subscribeEvents")
-        
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute._subscribeEvents")
+
     def _unsubscribeEvents(self):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute._unsubscribeEvents")
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute._unsubscribeEvents")
 
     def isUsingEvents(self):
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute.isUsingEvents")
-        
+        raise NotImplementedError("Not allowed to call AbstractClass" +
+                                  " TaurusAttribute.isUsingEvents")
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusModel necessary overwrite
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
@@ -159,88 +173,18 @@ class TaurusAttribute(TaurusModel):
         except Exception:
             return None
 
-    def getDisplayDescrObj(self,cache=True):
-        name = self.getLabel(cache=cache)
-        if name:
-            name += " (" + self.getNormalName().upper() + ")"
-        else:
-            name = self.getDisplayName(cache=cache)
-        obj = [('name', name)]
-
-        descr = self.getDescription(cache=cache)
-        if descr and descr != self.no_description:
-            obj.append(('description',descr.replace("<","<").replace(">",">")))
-        
-        unit = self.getUnit(cache=cache)
-        if unit and unit != self.no_unit:
-            obj.append(('unit', unit))
-            
-        limits = self.getRange(cache=cache)
-        if limits and (limits[0] != self.no_min_value or \
-                       limits[1] != self.no_max_value):
-            if limits[0] == self.no_min_value: limits[0] = self.no_cfg_value
-            if limits[1] == self.no_max_value: limits[1] = self.no_cfg_value
-            obj.append(('limits', "[%s, %s]" % (limits[0],limits[1])))
-
-        alarms = self.getAlarms(cache=cache)
-        if alarms and (alarms[0] != self.no_min_alarm or \
-                       alarms[1] != self.no_max_alarm):
-            if alarms[0] == self.no_min_alarm: alarms[0] = self.no_cfg_value
-            if alarms[1] == self.no_max_alarm: alarms[1] = self.no_cfg_value
-            obj.append(('alarms', "[%s, %s]" % (alarms[0],alarms[1])))
-
-        warnings = self.getWarnings(cache=cache)
-        if warnings and (warnings[0] != self.no_min_warning or \
-                         warnings[1] != self.no_max_warning):
-            if warnings[0] == self.no_min_warning: warnings[0] = self.no_cfg_value
-            if warnings[1] == self.no_max_warning: warnings[1] = self.no_cfg_value
-            obj.append(('warnings', "[%s, %s]" % (warnings[0],warnings[1])))
-        
-        return obj
-        
-    def areStrValuesEqual(self,v1,v2):
+    def areStrValuesEqual(self, v1, v2):
         try:
-            if "nan" == str(v1).lower() == str(v2).lower(): return True
+            if "nan" == str(v1).lower() == str(v2).lower():
+                return True
             return self.encode(v1) == self.encode(v2)
         except:
             return False
 
-    def getDisplayWriteValue(self,cache=True):
-        if not self.isWritable():
-            self.warning("requesting write value of a read-only attribute")
-            return None
-
-        attrvalue = self.getValueObj(cache=cache)
-        if not attrvalue:
-            return None
-        
-        v = attrvalue.w_value
-        return self.displayValue(v)
-        
-    def displayValue(self,value):
-        if value is None:
-            return None
-        ret = None
-        try:
-            if self.isScalar():
-                fmt = self.getFormat()
-                if self.isNumeric() and fmt is not None:
-                    ret = fmt % value
-                else:
-                    ret = str(value)
-            elif self.isSpectrum():
-                ret = str(value)
-            else:
-                ret = str(value)
-        except:
-            # if cannot calculate value based on the format just return the value
-            ret = str(value)
-        return ret
-    
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # API for listeners
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
-    
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
     def hasEvents(self):
         self.deprecated("Don't use this anymore. Use isUsingEvents instead")
         return self.isUsingEvents()
@@ -248,22 +192,22 @@ class TaurusAttribute(TaurusModel):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Polling (client side)
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def enablePolling(self, force=False):
         '''Enable polling. See :meth:`isPollingEnabled` for clarification of
         what enabled polling means.
 
-        :param force: (bool) True also activates polling 
+        :param force: (bool) True also activates polling
                       (see: :meth:`activatePolling`)
         '''
         self.__enable_polling = True
         self.__forced_polling = force
         if force:
             self.__activate_polling = True
-        
+
         if self.__activate_polling:
             self._activatePolling()
-    
+
     def disablePolling(self):
         '''Disable polling and if polling is active also deactivate it.
         See :meth:`isPollingEnabled` for clarification of
@@ -273,7 +217,7 @@ class TaurusAttribute(TaurusModel):
         self.__forced_polling = False
         if self.__activate_polling:
             self._deactivatePolling()
-            
+
     def isPollingEnabled(self):
         '''Indicate whether polling was activated/deactivated by user.
         Enabled polling does not mean that it is active - periodically poll
@@ -284,19 +228,19 @@ class TaurusAttribute(TaurusModel):
         :see: :meth:`enablePolling`, :meth:`disablePolling`
         '''
         return self.__enable_polling
-        
+
     def _activatePolling(self):
         self.__activate_polling = True
         if not self.isPollingEnabled():
             return
         self.factory().addAttributeToPolling(self, self.getPollingPeriod())
         self.__polled = True
-    
+
     def _deactivatePolling(self):
         self.__activate_polling = False
         self.factory().removeAttributeFromPolling(self)
         self.__polled = False
-    
+
     def isPollingActive(self):
         '''Indicate whether polling is active. Active polling means that
         a periodic timer poll the attribute. By default the attribute creation
@@ -307,15 +251,15 @@ class TaurusAttribute(TaurusModel):
         :see: :meth:`activatePolling`, :meth:`disablePolling`
         '''
         return self.__polled
-    
+
     def isPollingForced(self):
         return self.__forced_polling
-    
+
     def changePollingPeriod(self, period):
         """change polling period to period miliseconds """
         if self.__polling_period == period and self.__activate_polling:
             return
-            
+
         self.__polling_period = period
         if self.__activate_polling:
             self._deactivatePolling()
@@ -324,21 +268,17 @@ class TaurusAttribute(TaurusModel):
     def isPolled(self):
         self.deprecated("use isPollingActive()")
         return self.isPollingActive()
-    
+
     def getPollingPeriod(self):
         """returns the polling period """
         return self.__polling_period
 
-    # The following are deprecated and maintained only for compatibility
-
     def activatePolling(self, period, unsubscribe_evts=False, force=False):
         """activate polling for attribute.
-        
+
            :param period: polling period (in miliseconds)
            :type period: int
         """
-        ## 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)
 
@@ -346,55 +286,172 @@ class TaurusAttribute(TaurusModel):
         """unregister attribute from polling"""
         self.deprecated("use disablePolling()")
         self.disablePolling()
-            
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # API for attribute configuration
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
 
-    def _getRealConfig(self):
-        """ Returns the current configuration of the attribute."""
-        raise RuntimeError("Not allowed to call AbstractClass TaurusAttribute::_getRealConfig")
+    def __str__(self):
+        return self.getFullName()
 
-    def getConfig(self):
-        """ Returns the current configuration of the attribute."""
-        try:
-            ob = None
-            ob = self.__weakFakeConfigObj()
-        except Exception:
-            pass
+    def getDisplayDescription(self, cache=True):
+        return self.description
 
-        if ob is not None:
-            return ob
+    def getDisplayDescrObj(self, cache=True):
+        name = self.getLabel(cache=cache)
+        obj = [('name', name)]
+        descr = self.description
+        if descr:
+            _descr = descr.replace("<", "<").replace(">", ">")
+            obj.append(('description', _descr))
+
+        if isinstance(self.rvalue, Quantity):
+            idDimensionless = self.rvalue.dimensionless
+            range = self._range
+            alarm = self._alarm
+            warning = self._warning
+            if range != [None, None]:
+                if not idDimensionless:
+                    low = range[0]
+                    high = range[1]
+                else:
+                    low = range[0].magnitude
+                    high = range[1].magnitude
+                obj.append(('range', "[%s, %s]" % (low, high)))
+            if alarm != [None, None]:
+                if not idDimensionless:
+                    low = alarm[0]
+                    high = alarm[1]
+                else:
+                    low = alarm[0].magnitude
+                    high = alarm[1].magnitude
+                obj.append(('alarm', "[%s, %s]" % (low, high)))
+            if warning != [None, None]:
+                if not idDimensionless:
+                    low = warning[0]
+                    high = warning[1]
+                else:
+                    low = warning[0].magnitude
+                    high = warning[1].magnitude
+                obj.append(('warning', "[%s, %s]" % (low, high)))
+        return obj
 
-        ob = TaurusConfigurationProxy(self)
-        self.__weakFakeConfigObj = weakref.ref(ob)
-        return ob
-    
     def isWritable(self, cache=True):
-        return not self._getRealConfig().isReadOnly(cache=cache)
-    
-    def isWrite(self, cache=True):
-        return self._getRealConfig().isWrite(cache=cache)
-    
-    def isReadOnly(self, cache=True):
-        return self._getRealConfig().isReadOnly(cache=cache)
+        return self.writable
 
-    def isReadWrite(self, cache=True):
-        return self._getRealConfig().isReadWrite(cache=cache)
+    def getType(self, cache=True):
+        return self.type
 
-    def getWritable(self, cache=True):
-        return self._getRealConfig().getWritable(cache=cache)
+    def getDataFormat(self, cache=True):
+        return self.data_format
 
+    def getLabel(self, cache=True):
+        return self._label
 
-class TaurusStateAttribute(TaurusAttribute):
-    """ """
-    
-    def __init__(self, name, parent, **kwargs):
-        self.call__init__(TaurusAttribute, name, parent, **kwargs)
-        
-    def isInformDeviceOfErrors(self):
-        return True
-
-#del weakef
-#del TaurusModel
-#del TaurusConfigurationProxy
+    def getMinRange(self, cache=True):
+        return self._range[0]
+
+    def getMaxRange(self, cache=True):
+        return self._range[1]
+
+    def getRange(self, cache=True):
+        return self._range
+
+    def getMinAlarm(self, cache=True):
+        return self._alarm[0]
+
+    def getMaxAlarm(self, cache=True):
+        return self._alarm[1]
+
+    def getAlarms(self, cache=True):
+        return self._alarm
+
+    def getMinWarning(self, cache=True):
+        return self._warning[0]
+
+    def getMaxWarning(self, cache=True):
+        return self._warning[1]
+
+    def getWarnings(self, cache=True):
+        return self._warning
+
+    def setLabel(self, lbl):
+        self._label = lbl
+
+    def __assertsValidLimits(self, limits):
+        assert len(limits) == 2, "The limits must be two values, low and high"
+        low, high = limits
+        assert isinstance(self.rvalue, Quantity), "rvalue is not a Quantity"
+        assert isinstance(low, Quantity), "low is not a Quantity"
+        assert isinstance(high, Quantity), "high is not a Quantity"
+        assert self.rvalue.dimensionality == low.dimensionality, \
+            "low and rvalue have different dimensionality"
+        assert self.rvalue.dimensionality == high.dimensionality, \
+            "high and rvalue have different dimensionality"
+
+    def setRange(self, *limits):
+        if isinstance(limits[0], list):
+            limits = limits[0]
+        self.__assertsValidLimits(limits)
+        self._range = limits
+
+    def setWarnings(self, *limits):
+        if isinstance(limits[0], list):
+            limits = limits[0]
+        self.__assertsValidLimits(limits)
+        self._warning = limits
+
+    def setAlarms(self, *limits):
+        if isinstance(limits[0], list):
+            limits = limits[0]
+        self.__assertsValidLimits(limits)
+        self._alarm = limits
+
+    def isBoolean(self, cache=True):
+        v = self.read(cache)
+        return isinstance(v.rvalue, bool)
+
+    @property
+    def description(self):
+        return self._description
+
+    @description.setter
+    def description(self, descr):
+        self._description = descr
+
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # API to provide access to the TaurusAttributeValue-related fragments
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
+    @property
+    def rvalue(self, cache=True):
+        valueObj = self.getValueObj()
+        if valueObj is None:
+            return None
+        else:
+            return valueObj.rvalue
+
+    @property
+    def wvalue(self, cache=True):
+        valueObj = self.getValueObj()
+        if valueObj is None:
+            return None
+        else:
+            return valueObj.wvalue
+
+    @property
+    def time(self, cache=True):
+        valueObj = self.getValueObj()
+        if valueObj is None:
+            return None
+        else:
+            return valueObj.time
+
+    @property
+    def quality(self, cache=True):
+        valueObj = self.getValueObj()
+        if valueObj is None:
+            return None
+        else:
+            return valueObj.quality
+
+    label = property(getLabel, setLabel)
+    range = property(getRange, setRange)
+    warnings = property(getWarnings, setWarnings)
+    alarms = property(getAlarms, setAlarms)
diff --git a/lib/taurus/core/taurusauthority.py b/lib/taurus/core/taurusauthority.py
new file mode 100644
index 0000000..9054ed1
--- /dev/null
+++ b/lib/taurus/core/taurusauthority.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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 the base class for a taurus database"""
+
+__all__ = ["TaurusAuthority"]
+
+__docformat__ = "restructuredtext"
+
+
+from .taurusbasetypes import TaurusElementType
+from .taurusmodel import TaurusModel
+from .taurushelper import Factory
+
+
+class TaurusAuthority(TaurusModel):
+
+    _description = "A Taurus Authority"
+
+    def __init__(self, complete_name, parent=None):
+        self.call__init__(TaurusModel, complete_name, parent)
+
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # TaurusModel implementation
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    def cleanUp(self):
+        self.trace("[TaurusAuthority] cleanUp")
+        TaurusModel.cleanUp(self)
+
+    @classmethod
+    def factory(cls):
+        if cls._factory is None:
+            cls._factory = Factory(scheme=cls._scheme)
+        return cls._factory
+
+    @classmethod
+    def getTaurusElementType(cls):
+        return TaurusElementType.Authority
+
+    @classmethod
+    def buildModelName(cls, parent_model, relative_name):
+        """build an 'absolute' model name from the parent name and the
+        'relative' name. parent_model is ignored since there is nothing above
+        the Authority object
+
+        Note: This is a basic implementation. You may need to reimplement this
+              for a specific scheme if it supports "useParentModel".
+        """
+        return relative_name
+
+    @classmethod
+    def getNameValidator(cls):
+        return cls.factory().getAuthorityNameValidator()
+
+    def getDisplayDescription(self, cache=True):
+        return self.getFullName()
+
+    def getDisplayDescrObj(self, cache=True):
+        obj = []
+        obj.append(('name', self.getDisplayName(cache=cache)))
+        obj.append(('description', self.description))
+        return obj
+
+    def getChildObj(self, child_name):
+        if not child_name:
+            return None
+        return self.getDevice(child_name)
+
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # Device access method
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
+    def getDevice(self, devname):
+        """Returns the device object given its name"""
+        import taurusdevice
+        return self.factory().getObject(taurusdevice.TaurusDevice, devname)
+
+    @property
+    def description(self):
+        return self._description
+
+# For backwards compatibility, we make an alias for TaurusAuthority.
+# Note that no warning is issued!
+TaurusDatabase = TaurusAuthority
diff --git a/lib/taurus/core/taurusbasetypes.py b/lib/taurus/core/taurusbasetypes.py
index f336ee3..1e7a228 100644
--- a/lib/taurus/core/taurusbasetypes.py
+++ b/lib/taurus/core/taurusbasetypes.py
@@ -1,24 +1,24 @@
 #!/usr/bin/env python
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,260 +30,283 @@ __all__ = ["TaurusSWDevState", "TaurusSWDevHealth", "OperationMode",
            "TaurusSerializationMode", "SubscriptionState", "TaurusEventType",
            "MatchLevel", "TaurusElementType", "LockStatus", "DataFormat",
            "AttrQuality", "AttrAccess", "DisplayLevel", "ManagerState",
-           "TaurusTimeVal", "TaurusAttrValue", "TaurusConfigValue",
-           "TaurusLockInfo"]
+           "TaurusTimeVal", "TaurusAttrValue", "TaurusConfigValue", "DataType",
+           "TaurusLockInfo", "TaurusDevState", "TaurusModelValue"]
 
 __docformat__ = "restructuredtext"
 
-import time
 import datetime
 
 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
-))
-
+from .util.log import taurus4_deprecation
+from taurus.external.enum import IntEnum
+
+
+class TaurusDevState(IntEnum):
+    """Enumeration of possible states of :class:`taurus.core.TaurusDevice`
+    objects. This is returned, e.g. by :meth:`TaurusDevice.state`.
+
+    The description of the values of this enumeration is:
+
+    - Ready: the device can be operated by the user and could even be
+      involved in some operation.
+    - NotReady: the device can not be operated by the user (e.g. due to
+      still being initialized, or due to a device failure,...)
+    - Undefined: it is not possible to retrieve a coherent state from the
+      device (e.g. due to communication, or to contradictory internal
+      states, ...)
+    """
+    # TODO: it could be extended for more detailed description using bit masks
+    Ready = 1
+    NotReady = 2
+    Undefined = 4
+
+# Deprecated enumeration.
+# According with TEP3, the logic of the OperationMode should be in the widgets
 OperationMode = Enumeration(
-'OperationMode', (
-    'OFFLINE',
-    'ONLINE'
-))
+    'OperationMode', (
+        'OFFLINE',
+        'ONLINE'
+    ))
 
 TaurusSerializationMode = Enumeration(
-'TaurusSerializationMode', (
-    'Serial',
-    'Concurrent'
-))
+    'TaurusSerializationMode', (
+        'Serial',
+        'Concurrent'
+    ))
 
 TaurusEventType = Enumeration(
-'TaurusEventType', (
-    'Change',
-    'Config',
-    'Periodic',
-    'Error'
-))
+    'TaurusEventType', (
+        'Change',
+        'Config',  # Deprecated in Taurus >=4
+        'Periodic',
+        'Error'
+    ))
 
 MatchLevel = Enumeration(
-'MatchLevel', (
-    'ANY', 
-    'SHORT', 
-    'NORMAL', 
-    'COMPLETE', 
-    'SHORT_NORMAL', 
-    'NORMAL_COMPLETE'
-))
+    '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',
-))
+    'TaurusElementType', (
+        'Unknown',
+        'Name',
+        'DeviceClass',
+        'Device',
+        'DeviceAlias',
+        'Domain',
+        'Family',
+        'Member',
+        'Server',
+        'ServerName',
+        'ServerInstance',
+        'Exported',
+        'Host',
+        'Attribute',
+        'AttributeAlias',
+        'Command',
+        'Property',
+        'Configuration',
+        'Authority'
+    ))
 
 LockStatus = Enumeration(
-'LockStatus', (
-    'Unlocked',
-    'Locked',
-    'LockedMaster',
-    'Unknown',
-))
+    'LockStatus', (
+        'Unlocked',
+        'Locked',
+        'LockedMaster',
+        'Unknown'
+    ))
 
 DataFormat = Enumeration(
-'DataFormat', (
-    '_0D',
-    '_1D',
-    '_2D'
-))
+    'DataFormat', (
+        '_0D',
+        '_1D',
+        '_2D'
+    ))
+
+# TODO: Consider adding  Enum and Quantity to DataType enumeration ...
+# TODO: ... and also to __PYTHON_TYPE_TO_TAURUS_DATATYPE
 
 DataType = Enumeration(
-'DataType', (
-    'Integer',
-    'Float',
-    'String',
-    'Boolean',
-))
+    'DataType', (
+        'Integer',  # Can be used in scheme-agnostic code
+        'Float',  # Can be used in scheme-agnostic code
+        'String',  # Can be used in scheme-agnostic code
+        'Boolean',  # Can be used in scheme-agnostic code
+        'Bytes',
+        'DevState',  # This type is for Tango backwards-compat. Avoid using it
+        'DevEncoded',  # This type is for Tango backwards-compat. Avoid using it
+        'Object'  # use this for opaque py objects not described by any of the above
+    ))
+# monkey-patch DataType to provide from_python_type()
+__PYTHON_TYPE_TO_TAURUS_DATATYPE = {
+    str: DataType.String,
+    int: DataType.Integer,
+    long: DataType.Integer,
+    float: DataType.Float,
+    bool: DataType.Boolean,
+    # bytes : DataType.Bytes, # see below...
+}
+if str is not bytes:  # Python >=3
+    __PYTHON_TYPE_TO_TAURUS_DATATYPE[bytes] = DataType.Bytes
+# Note: in Python2, DataType.from_python_type(bytes) --> DataType.String
+DataType.from_python_type = __PYTHON_TYPE_TO_TAURUS_DATATYPE.get
 
 SubscriptionState = Enumeration(
-"SubscriptionState", (
-    "Unsubscribed",
-    "Subscribing",
-    "Subscribed", 
-    "PendingSubscribe"
-))
-
-#################
-# Not in use yet:
-
-AttrQuality = Enumeration(
-'AttrQuality', (
-    'ATTR_VALID', 
-    'ATTR_INVALID', 
-    'ATTR_ALARM'
-))
+    "SubscriptionState", (
+        "Unsubscribed",
+        "Subscribing",
+        "Subscribed",
+        "PendingSubscribe"
+    ))
+
+
+class AttrQuality(IntEnum):
+    """Enumeration of quality states for Taurus attributes. based on
+    This is the Taurus equivalent to PyTango.AttrQuality.
+    The members present in PyTango are also defined here with the same values,
+    allowing equality comparisons with :class:`PyTango.AttrQuality` (but not
+    identity checks!)::
+
+        from taurus.core import AttrQuality as Q1
+        from PyTango import AttrQuality as Q2
+
+        Q1.ATTR_ALARM == Q2.ATTR_ALARM                  # --> True
+        Q1.ATTR_ALARM in (Q2.ATTR_ALARM, Q2.ATTR_ALARM) # --> True
+        Q1.ATTR_ALARM == 2                              # --> True
+        Q1.ATTR_ALARM is 2                              # --> False
+        Q1.ATTR_ALARM is Q2.ATTR_ALARM                  # --> False
+    """
+    ATTR_VALID = 0
+    ATTR_INVALID = 1
+    ATTR_ALARM = 2
+    ATTR_CHANGING = 3
+    ATTR_WARNING = 4
+
+    def __str__(self):
+        # Todo: BEWARE!! This alters the usual behaviour of IntEnum!
+        return self.name
 
 AttrAccess = Enumeration(
-'AttrAccess', (
-    'READ', 
-    'READ_WITH_WRITE', 
-    'WRITE', 
-    'READ_WRITE' 
-))
+    'AttrAccess', (
+        'READ',
+        'READ_WITH_WRITE',
+        'WRITE',
+        'READ_WRITE'
+    ))
 
 DisplayLevel = Enumeration(
-'DisplayLevel', (
-    'OPERATOR', 
-    'EXPERT', 
-    'DEVELOPER'
-))
+    'DisplayLevel', (
+        'OPERATOR',
+        'EXPERT',
+        'DEVELOPER'
+    ))
+
+ManagerState = Enumeration(
+    'ManagerState', (
+        'UNINITIALIZED',
+        'INITED',
+        'CLEANED'
+    ))
+
 
-ManagerState =  Enumeration(
-'ManagerState', (
-    'UNINITIALIZED', 
-    'INITED', 
-    'CLEANED'
-)) 
+class DeprecatedEnum(object):
 
+    def __init__(self, name, alt):
+        self.__name = name
+        self.__alt = alt
+
+    def __getattr__(self, name):
+        raise RuntimeError('%s enumeration was removed. Use %s instead' %
+                           (self.__name, self.__alt))
+
+
+TaurusSWDevState = DeprecatedEnum('TaurusSWDevState', 'TaurusDevState')
+TaurusSWDevHealth = DeprecatedEnum('TaurusSWDevHealth', 'TaurusDevState')
 
 
 class TaurusTimeVal(object):
+
     def __init__(self):
         self.tv_sec = 0
         self.tv_usec = 0
         self.tv_nsec = 0
-    
+
     def __repr__(self):
-        return "%s(tv_sec=%i, tv_usec=%i, tv_nsec=%i)"%(self.__class__.__name__, self.tv_sec, self.tv_usec, self.tv_nsec)
-    
+        return "%s(tv_sec=%i, tv_usec=%i, tv_nsec=%i)" % (self.__class__.__name__, self.tv_sec, self.tv_usec, self.tv_nsec)
+
     def __float__(self):
         return self.totime()
-    
+
     def totime(self):
-        return self.tv_usec*1e-9 + self.tv_usec*1e-6 + self.tv_sec
-    
+        return self.tv_usec * 1e-9 + self.tv_usec * 1e-6 + self.tv_sec
+
     def todatetime(self):
         return datetime.datetime.fromtimestamp(self.totime())
-    
+
     def isoformat(self):
         return self.todatetime().isoformat()
-    
+
     @staticmethod
     def fromtimestamp(v):
         tv = TaurusTimeVal()
         tv.tv_sec = int(v)
-        usec = (v - tv.tv_sec)*1000000
+        usec = (v - tv.tv_sec) * 1000000
         tv.tv_usec = int(usec)
-        tv.tv_nsec = int((usec - tv.tv_usec)*1000)
+        tv.tv_nsec = int((usec - tv.tv_usec) * 1000)
         return tv
-    
+
     @staticmethod
     def fromdatetime(v):
         import time
         tv = TaurusTimeVal()
         tv.tv_sec = int(time.mktime(v.timetuple()))
         tv.tv_usec = v.microsecond
-        tv.tv_nsec = 0 #datetime does not provide ns info
+        tv.tv_nsec = 0  # datetime does not provide ns info
         return tv
-    
+
     @staticmethod
     def now():
-        return TaurusTimeVal.fromdatetime(datetime.datetime.now())    
-         
+        return TaurusTimeVal.fromdatetime(datetime.datetime.now())
+
+
+class TaurusModelValue(object):
+
+    def __init__(self):
+        self.rvalue = None
+
+    def __repr__(self):
+        return "%s%s" % (self.__class__.__name__, repr(self.__dict__))
+
+
+class TaurusAttrValue(TaurusModelValue):
 
-class TaurusAttrValue(object):
     def __init__(self):
-        self.value = None
-        self.w_value = None
+        TaurusModelValue.__init__(self)
+        self.wvalue = None
         self.time = None
         self.quality = AttrQuality.ATTR_VALID
-        self.format = 0
-        self.has_failed = False
-        self.err_stack = None
-        self.config = TaurusConfigValue()
-        
-    def __getattr__(self,name):
-        return getattr(self.config, name)
-    
-    def __repr__(self):
-        return "%s%s"%(self.__class__.__name__, repr(self.__dict__))
-        #values = ", ".join(["%s=%s"%(m,repr(getattr(self,m))) for m in self.__dict__])
-        #return "%s(%s)"%(self.__class__.__name__, values)
+        self.error = None
+
 
 class TaurusConfigValue(object):
+
+    @taurus4_deprecation(alt='TaurusAttrValue')
     def __init__(self):
-        self.name = None
-        self.writable = None
-        self.data_format = None
-        self.type = None
-        self.max_dim = 1, 1
-        self.label = None
-        self.unit = None
-        self.standard_unit = None
-        self.display_unit= None
-        self.format = None
-        self.range = float('-inf'), float('inf')
-        self.alarm = float('-inf'), float('inf')
-        self.warning = float('-inf'), float('inf')
-        self.disp_level = None
-        self.description = None
-    
-    def __repr__(self):
-        return "%s%s"%(self.__class__.__name__, repr(self.__dict__))
-
-    def isWrite(self):
-        return self.writable == AttrAccess.WRITE
-    
-    def isReadOnly(sel):
-        return self.writable == AttrAccess.READ
-
-    def isReadWrite(self):
-        return self.writable == AttrAccess.READ_WRITE
-    
-    def isScalar(self):
-        return self.format == DataFormat._0D
-    
-    def isSpectrum(self):
-        return self.format == DataFormat._1D
-    
-    def isImage(self):
-        return self.format == DataFormat._2D
+        pass
 
 
 class TaurusLockInfo(object):
-    
+
     LOCK_STATUS_UNKNOWN = 'Lock status unknown'
-    
+
     def __init__(self):
         self.status = LockStatus.Unknown
         self.status_msg = self.LOCK_STATUS_UNKNOWN
@@ -294,7 +317,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
+#del AttrQuality, AttrAccess, DataFormat, LockStatus
diff --git a/lib/taurus/core/taurusconfiguration.py b/lib/taurus/core/taurusconfiguration.py
index 70dfba9..164be13 100644
--- a/lib/taurus/core/taurusconfiguration.py
+++ b/lib/taurus/core/taurusconfiguration.py
@@ -3,35 +3,36 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 the base class for a taurus attribute configuration"""
+"""[DEPRECATED since taurus v4]
+This module contains the base class for a taurus attribute configuration"""
 
 __all__ = ["TaurusConfigurationProxy", "TaurusConfiguration"]
 
 __docformat__ = "restructuredtext"
 
-from .taurusbasetypes import AttrAccess, TaurusElementType
 from .taurusmodel import TaurusModel
+from .util.log import taurus4_deprecation
 
 
 class TaurusConfigurationProxy(object):
@@ -44,453 +45,19 @@ class TaurusConfigurationProxy(object):
     That's why to the outside world we don't give access to it directly
     but to objects of this new TaurusConfigurationProxy class.
     """
+    @taurus4_deprecation(dbg_msg='Do not use this class')
     def __init__(self, parent):
         self.__parent = parent
 
     def __getattr__(self, name):
         return getattr(self.__parent._getRealConfig(), name)
-    
+
     def getRealConfigClass(self):
         return self.__parent._getRealConfig().__class__
 
 
 class TaurusConfiguration(TaurusModel):
-    
-    no_cfg_value = '-----'
-    no_unit = 'No unit'
-    no_standard_unit = 'No standard unit'
-    no_display_unit = 'No display unit'
-    no_description = 'No description'
-    not_specified = 'Not specified'
-    no_min_value = no_max_value = not_specified
-    no_min_alarm = no_max_alarm = not_specified
-    no_min_warning = no_max_warning = not_specified
-    no_delta_t = no_delta_val = not_specified
-    no_rel_change = no_abs_change = not_specified
-    no_archive_rel_change = no_archive_abs_change = not_specified
-    no_archive_period = not_specified
-    
-    DftTimeToLive = 10000 # 10s
-    
-    def __init__(self, name, parent, storeCallback = None):
-    
-        # the last configuration value
-        self._attr_info  = None
-        
-        # the last time the configuration was read
-        self._attr_timestamp = 0
-        
-        # the configuration event identifier
-        self._cfg_evt_id = None
 
-        self.call__init__(TaurusModel, name, parent)
-        
-        # Everything went ok so now we are sure we can store the object
-        if not storeCallback is None:
-            storeCallback(self.getFullName(),self)
-        
-        self._dev_hw_obj = self._getDev().getHWObj()
-            
-        self._subscribeEvents()
-
-    def __str__(self):
-        return self.getFullName()
-        
-    def _subscribeEvents(self):
+    @taurus4_deprecation(alt='TaurusAttribute', dbg_msg='Do not use this class')
+    def __init__(self, name, parent, storeCallback=None):
         pass
-    
-    def cleanUp(self):
-        self.trace("[TaurusConfiguration] cleanUp")
-        self._unsubscribeEvents()
-        self._attr_info = None
-        self._dev_hw_obj = None
-        TaurusModel.cleanUp(self)        
-        
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusModel implementation
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
-
-    @classmethod
-    def getTaurusElementType(cls):
-        return TaurusElementType.Configuration
-
-    @classmethod
-    def buildModelName(cls, parent_model, relative_name):
-        """build an 'absolute' model name from the parent model and the 'relative'
-        name. 
-        - If parent_model is a TaurusAttribute, the return is a composition of
-        the database model name and is device name
-        - If parent_model is a TaurusConfiguration, the relative name is ignored and
-        the parent name is returned
-        """
-        if parent_model is None:
-            return relative_name
-        parent_name = parent_model.getFullName()
-        if not parent_name:
-            return relative_name
-        if isinstance(parent_model, cls):
-            return parent_name
-        return '%s%s' % (parent_name,relative_name)  
-        
-    @classmethod
-    def getNameValidator(cls):
-        import taurusvalidator
-        return taurusvalidator.ConfigurationNameValidator()
-    
-    def _getDevName(self):
-        params = self.getNameValidator().getParams(self.getFullName())
-        return params.get('devicename') or params.get('devalias')
-    
-    def _getFullAttrName(self):
-        params = self.getNameValidator().getParams(self.getFullName())
-        ret = params.get('devicename') or params.get('devalias')
-        ret += '/' + params.get('attributename')
-        return ret
-
-    def _getAttrName(self):
-        return self.getNameValidator().getParams(self.getFullName()).get('attributename')
-         
-    def _getDev(self):
-        dev = None
-        attrObj = self.getParentObj()
-        if attrObj is None or attrObj.getParent() is None:
-            devname = self._getDevName()
-            dev = self.factory().getDevice(devname)
-        else:
-            dev = attrObj.getParent()
-        return dev
-    
-    def _getAttr(self, createAttr=False):
-        attrObj = self.getParentObj()
-        if attrObj is None:
-            attrname = self._getFullAttrName()
-            if createAttr:
-                attrObj = self.factory().getAttribute(attrname)
-            else:
-                attrObj = self.factory().getExistingAttribute(attrname)
-        return attrObj
-    
-    def getValueObj(self, cache=True):
-        """ Returns the current configuration for the attribute.
-            if cache is set to True (default) and the the configuration has 
-            events active then it will return the local cached value. Otherwise
-            it will read from the tango layer."""
-        raise RuntimeError("May not be called in abstract TaurusConfiguration")
-    
-    def getDisplayValue(self,cache=True):
-        confvalue = self.getValueObj(cache=cache)
-        if not confvalue:
-            return None
-        return confvalue.label
-
-    def getDisplayDescription(self,cache=True):
-        return self.getDescription(cache)
-
-    def getDisplayDescrObj(self,cache=True):
-        attrObj = self.getParentObj()
-        if attrObj is None:
-            return [('name', self.getLabel(cache=cache))]
-        return attrObj.getDisplayDescrObj(cache=cache)
-    
-#    def isWritable(self):
-#        return True
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # API for listeners
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    s
-
-#    def addListener(self, listener):
-#        """ Add a TaurusListener object in the listeners list.
-#            If the listener is already registered nothing happens."""
-#        ret = TaurusModel.addListener(self, listener)
-#        if not ret:
-#            return ret
-        
-#        #fire a first configuration event
-#        self.fireEvent(TaurusEventType.Config, self._attr_info, listener) 
-#        return ret
-    
-    def hasEvents(self):
-        self.deprecated("Don't use this anymore. Use isUsingEvents instead")
-        return self.isUsingEvents()
-
-    def isUsingEvents(self):
-        return self._cfg_evt_id
-
-    def isWritable(self, cache=True):
-        return not self.isReadOnly(cache)
-    
-    def getWritable(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.writable
-        return None
-    
-    def getType(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.type
-        return None
-
-    def getDataFormat(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.data_format
-        return None
-
-    def getMaxDim(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.max_dim
-        return None
-
-    def getMaxDimX(self, cache=True):
-        '''.. warning: Deprecated. Use :meth:`getMaxDim`
-        '''
-        self.info('Deprecation warning: TaurusConfiguration.getMaxDimX is deprecated. Use getMaxDim')
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.max_dim[0]
-        return None
-
-    def getMaxDimY(self, cache=True):
-        '''.. warning: Deprecated. Use :meth:`getMaxDim`
-        '''
-        self.info('Deprecation warning: TaurusConfiguration.getMaxDimX is deprecated. Use getMaxDim')
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.max_dim[1]
-        return None
-        
-    def getShape(self, cache=True):
-        # force a read if not using cache. Then use cache until the
-        # end of the method
-        if not cache: self.getDataFormat(cache=cache)
-        
-        if self.isScalar():
-            return ()
-        elif self.isSpectrum():
-            return (self.getMaxDimX(),)
-        else:
-            return (self.getMaxDimX(), self.getMaxDimY())
-        
-    def getDescription(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.description
-        return None
-        
-    def getLabel(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.label
-        return None
-    
-    def getUnit(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.unit
-        return None
-    
-    def getStandardUnit(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.standard_unit
-        return None
-        
-    def getDisplayUnit(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.display_unit
-        return None
-
-    def getFormat(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.format
-        return None
-        
-    def getMinValue(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.range[0]
-        return None
-
-    def getMaxValue(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.range[1]
-        return None
-        
-    def getLimits(self, cache=True):
-        '''.. warning: Deprecated. Use :meth:`getRange`
-        '''
-        self.info('Deprecation warning: TaurusConfiguration.getLimits is deprecated. Use getRange')
-        self.getRange(cache=cache)
-    
-    def getRange(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.range
-        return None
-    
-    def getRanges(self, cache=True):
-        '''.. warning: Deprecated. Use :meth:`getRange`
-        '''
-        self.info('Deprecation warning: TaurusConfiguration.getRanges is deprecated. Use getRange')
-        c = self.getValueObj(cache=cache)
-        if c:
-            return [c.range[0], c.alarm[0], c.warning[0], c.warning[1], c.alarm[1], c.range[1]]
-        return None
-    
-    def getMinAlarm(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.alarm[0]
-        return None
-
-    def getMaxAlarm(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.alarm[1]
-        return None
-    
-    def getAlarms(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return list(c.alarm)
-        return None
-    
-    def getMinWarning(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.warning[0]
-        return None
-
-    def getMaxWarning(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return c.warning[1]
-        return None
-        
-    def getWarnings(self, cache=True):
-        c = self.getValueObj(cache=cache)
-        if c:
-            return list(c.warning)
-        return None
-    
-    def getParam(self, param_name):
-        config = self.getValueObj()
-        if config:
-            try:
-                return getattr(config, param_name)
-            except:
-                return None
-    
-    def setParam(self, param_name, value):
-        config = self.getValueObj()
-        if config and self.getParam(param_name):
-            setattr(config, param_name, value)
-            self._applyConfig()
-    
-    def setDescription(self,descr):
-        config = self.getValueObj()
-        if config:
-            config.description = descr
-            self._applyConfig()
-
-    def setLabel(self,lbl):
-        config = self.getValueObj()
-        if config:
-            config.label = lbl
-            self._applyConfig()
-
-    def setUnit(self,unit):
-        config = self.getValueObj()
-        if config:
-            config.unit = unit
-            self._applyConfig()
-
-    def setStandardUnit(self,standard_unit):
-        config = self.getValueObj()
-        if config:
-            config.standard_unit = standard_unit
-            self._applyConfig()
-        
-    def setDisplayUnit(self,display_unit):
-        config = self.getValueObj()
-        if config:
-            config.display_unit = display_unit
-            self._applyConfig()
-    
-    def setFormat(self,fmt):
-        config = self.getValueObj()
-        if config:
-            config.format = fmt
-            self._applyConfig()
-        
-    def setLimits(self, low, high):
-        '''.. warning: Deprecated. Use :meth:`setRange`
-        '''
-        self.info('Deprecation warning: TaurusConfiguration.setLimits is deprecated. Use setRange')
-        self.setRange(low, high)
-            
-    def setRange(self,low, high):
-        config = self.getValueObj()
-        if config:
-            config.range = [low, high]
-            self._applyConfig()
-
-    def setWarnings(self,low, high):
-        config = self.getValueObj()
-        if config:
-            config.warning = [low, high]
-            self._applyConfig()
-
-    def setAlarms(self,low, high):
-        config = self.getValueObj()
-        if config:
-            config.alarm = [low, high]
-            self._applyConfig()
-
-    def _applyConfig(self):
-        pass
-
-    def isBoolean(self, cache=True):
-        attr = self.getParentObj()
-        if attr is None: return False
-        v = attr.read(cache=cache)
-        return isinstance(v.value, bool)
-
-    def isScalar(self, cache=True):
-        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):
-        return self.getWritable(cache) == AttrAccess.WRITE
-    
-    def isReadOnly(self, cache=True):
-        return self.getWritable(cache) == AttrAccess.READ
-
-    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 79f579e..2f6631d 100644
--- a/lib/taurus/core/taurusdatabase.py
+++ b/lib/taurus/core/taurusdatabase.py
@@ -2,557 +2,49 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 the base class for a taurus database"""
-
-__all__ = ["TaurusInfo", "TaurusDevInfo", "TaurusServInfo", "TaurusDevClassInfo",
-           "TaurusAttrInfo", "TaurusDevTree", "TaurusServerTree",
-           "TaurusDatabaseCache", "TaurusDatabase"]
-
-__docformat__ = "restructuredtext"
-
-import weakref
-import operator
-
-from .taurusbasetypes import TaurusEventType, TaurusSWDevHealth, TaurusElementType
-from .taurusmodel import TaurusModel
-from .util.containers import CaselessDict
-
-DFT_DATABASE_DESCRIPTION = "A database"
-
-
-class TaurusInfo(object):
-    def __init__(self, container, name=None, full_name=None):
-        self._container = weakref.ref(container)
-        self._name = name
-        self._full_name = full_name
-    
-    def container(self):
-        return self._container()
-    
-    def name(self):
-        return self._name
-
-    def fullName(self):
-        return self._full_name
-    
-    def __str__(self): return "%s(%s)" % (self.__class__.__name__, self.name())
-    __repr__ = __str__
-
-
-class TaurusDevInfo(TaurusInfo):
-    def __init__(self, container, name=None, full_name=None, alias=None, server=None, klass=None, exported=False, host=None):
-        super(TaurusDevInfo, self).__init__(container, name=name, full_name=full_name)
-        self._alias = alias
-        self._server = weakref.ref(server)
-        self._klass = weakref.ref(klass)
-        self._exported = bool(int(exported))
-        self._alive = None
-        self._health = None
-        self._host = host
-        self._domain, self._family, self._member = map(str.upper, name.split("/", 2))
-        self._attributes = None
-
-    def domain(self):
-        return self._domain
-
-    def family(self):
-        return self._family
-
-    def member(self):
-        return self._member
-    
-    def alias(self):
-        return self._alias
-    
-    def server(self):
-        return self._server()
-    
-    def klass(self):
-        return self._klass()
-    
-    def exported(self):
-        return self._exported
-    
-    def alive(self):
-        return self._alive
-    
-    def health(self):
-        if self._health is None:
-            if self.exported():
-                alive = self.alive()
-                if alive == True:
-                    self._health = TaurusSWDevHealth.ExportedAlive
-                elif alive == False:
-                    self._health = TaurusSWDevHealth.ExportedNotAlive
-                else:
-                    self._health = TaurusSWDevHealth.Exported
-            else:
-                self._health = TaurusSWDevHealth.NotExported
-        return self._health
-        
-    def host(self):
-        return self._host
-    
-    def attributes(self):
-        return self._attributes
-    
-    def getAttribute(self, attrname):
-        attrname= attrname.lower()
-        for a in self.attributes():
-            if a.name() == attrname:
-                return a
-        return None
-    
-    def setAttributes(self, attributes):
-        self._attributes = attributes
-    
-
-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 = CaselessDict()
-        self._exported = False
-        self._alive = None
-        self._host = ""
-        self._server_name, self._server_instance = name.split("/", 1)
-    
-    def devices(self):
-        return self._devices
-
-    def getDeviceNames(self):
-        if not hasattr(self, "_device_name_list"):
-            self._device_name_list = sorted(map(TaurusDevInfo.name, self._devices.values()))
-        return self._device_name_list
-
-    def getClassNames(self):
-        if not hasattr(self, "_klass_name_list"):
-            klasses = set(map(TaurusDevInfo.klass, self._devices.values()))
-            self._klass_name_list = sorted(map(TaurusDevClassInfo.name, klasses))
-        return self._klass_name_list
-
-    def exported(self):
-        return self._exported
-
-    def alive(self):
-        return self._alive
-
-    def health(self):
-        exported = self.exported()
-        if exported:
-            alive = self.alive()
-            if alive == True:
-                return TaurusSWDevHealth.ExportedAlive
-            elif alive == False:
-                return TaurusSWDevHealth.ExportedNotAlive
-            else:
-                return TaurusSWDevHealth.Exported
-        return TaurusSWDevHealth.NotExported
-    
-    def host(self):
-        return self._host
-    
-    def serverName(self):
-        return self._server_name
-
-    def serverInstance(self):
-        return self._server_instance
-    
-    def addDevice(self, dev):
-        self._exported |= dev.exported()
-        self._host = dev.host()
-        self._devices[dev.name()] = dev
-
-
-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 = CaselessDict()
-    
-    def devices(self):
-        return self._devices
-    
-    def getDeviceNames(self):
-        if not hasattr(self, "_device_name_list"):
-            self._device_name_list = sorted(map(TaurusDevInfo.name, self._devices.values()))
-        return self._device_name_list
-    
-    def addDevice(self, dev):
-        self._devices[dev.name()] = dev
-
-
-class TaurusAttrInfo(TaurusInfo):
-    def __init__(self, container, name=None, full_name=None, device=None, info=None):
-        super(TaurusAttrInfo, self).__init__(container, name=name, full_name=full_name)
-        self._info = info
-        self._device = weakref.ref(device)
-
-    def device(self):
-        return self._device()
-    
-    def info(self):
-        return self._info
-    
-    def __getattr__(self, name):
-        return getattr(self._info, name)
-
-
-class TaurusDevTree(CaselessDict):
-
-    def __init__(self, other=None):
-        super(TaurusDevTree, self).__init__()
-        self._devices = CaselessDict()
-        if other is not None:
-            self._update(other)
-
-    def _update(self, other):
-        try:
-            if operator.isMappingType(other):
-                other = other.values()
-            for dev in other:
-                try:
-                    self.addDevice(dev)
-                except Exception, e:
-                    print e
-        except Exception, e:
-            raise Exception("Must give dict<obj, TaurusDevInfo> or sequence<TaurusDevInfo>")
-        
-    def addDevice(self, dev_info):
-        domain, family, member = dev_info.domain(), dev_info.family(), dev_info.member()
-        
-        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, CaselessDict())
-        
-        members[member] = dev_info
-
-    def getDomainDevices(self, domain):
-        """Returns all devices under the given domain. Returns empty list if
-        the domain doesn't exist or doesn't contain any devices"""
-        return self._devices.get(domain, {}).values()
-    
-    def getFamilyDevices(self, domain, family):
-        """Returns all devices under the given domain/family. Returns empty list if
-        the domain/family doesn't exist or doesn't contain any devices"""
-        families = self.get(domain)
-        if families is None:
-            return 
-        return families.get(family, {}).values()
-
-
-class TaurusServerTree(dict):
-    
-    def __init__(self, other=None):
-        super(TaurusServerTree, self).__init__()
-        if other is not None:
-            self._update(other)
-
-    def _update(self, other):
-        try:
-            if operator.isMappingType(other):
-                other = other.values()
-            for serv in other:
-                try:
-                    self.addServer(serv)
-                except Exception, e:
-                    print e
-        except Exception, e:
-            raise Exception("Must give dict<obj, TaurusServInfo> or sequence<TaurusServInfo>")
-        
-    def addServer(self, serv_info):
-        serverName, serverInstance = serv_info.serverName(), serv_info.serverInstance()
-        
-        serverInstances = self[serverName] = self.get(serverName, {})
-        
-        serverInstances[serverInstance] = serv_info
-
-    def getServerNameInstances(self, serverName):
-        """Returns all servers under the given serverName. Returns empty list if
-        the server name doesn't exist or doesn't contain any instances"""
-        return self.get(serverName, {}).values()
-
-
-class TaurusDatabaseCache(object):
-    
-    def __init__(self, db):
-        self._db = weakref.ref(db)
-        self._device_tree = None
-        self._server_tree = None
-        self._servers = None
-        self._server_name_list = None
-        self._devices = None
-        self._device_name_list = None
-        self._klasses = None
-        self._klass_name_list = None
-        self._aliases = None
-        self._alias_name_list = None
-        self.refresh()
-    
-    @property
-    def db(self):
-        return self._db()
-    
-    def refresh(self):
-        raise RuntimeError("Must be implemented in subclass")
-    
-    def refreshAttributes(self, device):
-        raise RuntimeError("Must be implemented in subclass")
-    
-    def getDevice(self, name):
-        """Returns a :class:`taurus.core.taurusdatabase.TaurusDevInfo` object with information 
-        about the given device name
-        
-        :param name: (str) the device name
-        
-        :return: (TaurusDevInfo) information about the device"""
-        return self._devices.get(name)
-    
-    def getDeviceNames(self):
-        """Returns a list of registered device names
-        
-        :return: (sequence<str>) a sequence with all registered device names"""
-        if self._device_name_list is None:
-            self._device_name_list = sorted(map(TaurusDevInfo.name, self.devices().values()))
-        return self._device_name_list
-
-    def getAliasNames(self):
-        if self._alias_name_list is None:
-            self._alias_name_list = sorted(map(TaurusDevInfo.alias, self.aliases().values()))
-        return self._alias_name_list
-    
-    def getServerNames(self):
-        """Returns a list of registered server names
-        
-        :return: (sequence<str>) a sequence with all registered server names"""
-        if self._server_name_list is None:
-            self._server_name_list = sorted(map(TaurusServInfo.name, self.servers().values()))
-        return self._server_name_list
-
-    def getClassNames(self):
-        """Returns a list of registered device classes
-        
-        :return: (sequence<str>) a sequence with all registered device classes"""
-        if self._klass_name_list is None:
-            self._klass_name_list = sorted(map(TaurusDevClassInfo.name, self.klasses().values()))
-        return self._klass_name_list
-
-    def deviceTree(self):
-        """Returns a tree container with all devices in three levels: domain,
-           family and member
-           
-           :return: (TaurusDevTree) a tree containning all devices"""
-        return self._device_tree
-    
-    def serverTree(self):
-        """Returns a tree container with all servers in two levels: server name
-        and server instance
-           
-           :return: (TaurusServerTree) a tree containning all servers"""
-        return self._server_tree
-    
-    def servers(self):
-        return self._servers
-    
-    def devices(self):
-        return self._devices
-    
-    def klasses(self):
-        return self._klasses
-    
-    def getDeviceDomainNames(self):
-        return self._device_tree.keys()
-    
-    def getDeviceFamilyNames(self, domain):
-        families = self._device_tree.get(domain)
-        if families is None: return []
-        return families.keys()
-    
-    def getDeviceMemberNames(self, domain, family):
-        families = self._device_tree.get(domain)
-        if families is None: return []
-        members = families.get(family)
-        if members is None: return []
-        return members.keys()
-    
-    def getDomainDevices(self, domain):
-        return self.deviceTree().getDomainDevices(domain)
-    
-    def getFamilyDevices(self, domain, family):
-        return self.deviceTree().getFamilyDevices(domain, family)
-
-    def getServerNameInstances(self, serverName):
-        return self.serverTree().getServerNameInstances(serverName)
-
-
-class TaurusDatabase(TaurusModel):
-    
-    def __init__(self, complete_name, parent=None):
-        self._descr = None
-        self.call__init__(TaurusModel, complete_name, parent)
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusModel implementation
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
-    def cleanUp(self):
-        self.trace("[TaurusDatabase] cleanUp")
-        TaurusModel.cleanUp(self)
-
-    @classmethod
-    def getTaurusElementType(cls):
-        return TaurusElementType.Database
-    
-    @classmethod
-    def buildModelName(cls, parent_model, relative_name):
-        """build an 'absolute' model name from the parent name and the 'relative'
-        name. parent_model is ignored since there is nothing above the Database
-        object"""
-        return relative_name
-    
-    @classmethod
-    def getNameValidator(cls):
-        from .taurusvalidator import DatabaseNameValidator
-        return DatabaseNameValidator()
-    
-    def getDescription(self,cache=True):
-        if self._descr is None or not cache:
-            try:
-                self._descr = self.info()
-            except:
-                self._descr = self._getDefaultDescription()
-        return self._descr
-
-    def getDisplayValue(self,cache=True):
-        return self.getDisplayDescription(cache)
-
-    def getDisplayDescription(self,cache=True):
-        return self.getFullName()
-    
-    def getDisplayDescrObj(self,cache=True):
-        obj = []
-        obj.append(('name', self.getDisplayName(cache=cache)))
-        descr = self.getDescription(cache=cache)
-        obj.append(('description', descr))
-        return obj
-    
-    def addListener(self, listener):
-        ret = TaurusModel.addListener(self, listener)
-        if not ret:
-            return ret
-        self.fireEvent(TaurusEventType.Change, self.getDisplayValue(), listener)
-        return ret
+"""Do not use. Deprecated. Backwards compatibility module for transition from
+TaurusDatabase to TaurusAuthority"""
 
-    def getChildObj(self,child_name):
-        if not child_name:
-            return None
-        return self.getDevice(child_name)
-        
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # Device access methods
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
-    
-    def getDevice(self, devname):
-        """Returns the device object given its name"""
-        import taurusdevice
-        return self.factory().getObject(taurusdevice.TaurusDevice, devname)
 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # Query capabilities built on top of a cache
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def refreshCache(self):
-        self.cache().refresh()
-    
-    def getDevice(self, name):
-        """Returns a :class:`taurus.core.tango.TangoDevInfo` object with information 
-        about the given device name
-        
-        :param name: (str) the device name
-        
-        :return: (TangoDevInfo) information about the tango device"""
-        return self.cache().getDevice(name)
-    
-    def getDeviceNames(self):
-        """Returns a list of registered tango device names
-        
-        :return: (sequence<str>) a sequence with all registered tango device names"""
-        return self.cache().getDeviceNames()
+from logging import warn
+warn('taurusdatabase module is deprecated. Use taurusauthority instead')
 
-    def getAliasNames(self):
-        """Returns a list of registered tango device alias
-        
-        :return: (sequence<str>) a sequence with all registered tango device alias"""
-        return self.cache().getAliasNames()
-    
-    def getServerNames(self):
-        """Returns a list of registered tango device servers in format<name>/<instance>
-        
-        :return: (sequence<str>) a sequence with all registered tango device servers"""
-        return self.cache().getServerNames()
+import traceback
+traceback.print_stack()
 
-    def getClassNames(self):
-        """Returns a list of registered tango device classes
-        
-        :return: (sequence<str>) a sequence with all registered tango device classes"""
-        return self.cache().getClassNames()
+from .taurusauthority import *
 
-    def getDeviceDomainNames(self):
-        return self.cache().getDeviceDomainNames()
-    
-    def getDeviceFamilyNames(self, domain):
-        return self.cache().getDeviceFamilyNames(domain)
-    
-    def getDeviceMemberNames(self, domain, family):
-        return self.cache().getDeviceMemberNames(domain, family)
-    
-    def getDomainDevices(self, domain):
-        return self.cache().getDomainDevices(domain)
-    
-    def getFamilyDevices(self, domain, family):
-        return self.cache().getFamilyDevices(domain, family)
-    
-    def getServerNameInstances(self, serverName):
-        return self.cache().getServerNameInstances(serverName)
-    
-    def deviceTree(self):
-        """Returns a tree container with all devices in three levels : domain,
-           family and member
-           
-           :return: (TangoDevTree) a tree containning all devices"""
-        return self.cache().deviceTree()
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # Mandatory methods to overwrite
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
-    def cache(self):
-        raise RuntimeError("TaurusDatabase.cache cannot be called")
+TaurusDatabase = TaurusAuthority
 
-    def getElementAlias(self, full_name):
-        raise RuntimeError("TaurusDatabase.getElementAlias cannot be called")
-        
-    def getElementFullName(self, alias):
-        raise RuntimeError("TaurusDatabase.getElementFullName cannot be called")
-    
-    def _getDefaultDescription(self):
-        return DFT_DATABASE_DESCRIPTION
\ No newline at end of file
+# The following block is commented out because it produces a circular import
+# try:
+#     from taurus.core.tango.tangodatabase import TangoInfo as TaurusInfo
+#     from taurus.core.tango.tangodatabase import TangoAttrInfo as TaurusAttrInfo
+#     from taurus.core.tango.tangodatabase import TangoDevInfo as TaurusDevInfo
+#     from taurus.core.tango.tangodatabase import TangoDevClassInfo as \
+#                                                             TaurusDevClassInfo
+#     from taurus.core.tango.tangodatabase import TangoServInfo as TaurusServInfo
+# except ImportError, e:
+#     warn('taurusdatabase: Cannot import tango info objects: %s', repr(e))
+#
diff --git a/lib/taurus/core/taurusdevice.py b/lib/taurus/core/taurusdevice.py
old mode 100644
new mode 100755
index 9b4b6ef..2f1fe91
--- a/lib/taurus/core/taurusdevice.py
+++ b/lib/taurus/core/taurusdevice.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -29,20 +29,18 @@ __all__ = ["TaurusDevice"]
 
 __docformat__ = "restructuredtext"
 
-from .taurusbasetypes import TaurusSWDevState, TaurusEventType, \
-    TaurusLockInfo, TaurusElementType
+from .taurusbasetypes import TaurusDevState, TaurusElementType
 from .taurusmodel import TaurusModel
-
-DFT_DEVICE_DESCRIPTION = "A device"
+from .taurushelper import Factory
 
 
 class TaurusDevice(TaurusModel):
 
-    SHUTDOWNS = (TaurusSWDevState.Shutdown, TaurusSWDevState.Crash,
-                 TaurusSWDevState.EventSystemShutdown)
+    """A Device object. Different schemes may assign different roles, but
+       in general it is a parent of Taurus Attribute objects and a child
+       of a Taurus Authority"""
 
-    """A Device object representing an abstraction of the PyTango.DeviceProxy
-       object in the taurus.core layer"""
+    _description = "A Taurus Device"
 
     def __init__(self, name, **kw):
         """Object initialization."""
@@ -51,106 +49,34 @@ class TaurusDevice(TaurusModel):
         self.__dict__.update(kw)
         self.call__init__(TaurusModel, name, parent)
 
-        self._deviceObj = self._createHWObject()
-        self._deviceStateObj = None
-        self._lock_info = TaurusLockInfo()
-        self._descr = None
-        self._deviceSwState = self.decode(TaurusSWDevState.Uninitialized)
-
         if storeCallback:
             storeCallback(self)
 
-    def cleanUp(self):
-        self.trace("[TaurusDevice] cleanUp")
-        self._deviceObj = None
-        self._descr = None
-        #self._deviceSwObj
-        if not self._deviceStateObj is None:
-            self._deviceStateObj.removeListener(self)
-        self._deviceStateObj = None
-        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
-    def __getattr__(self, name):
-        if '_deviceObj' in self.__dict__ and self._deviceObj is not None:
-            return getattr(self._deviceObj, name)
-        cls_name = self.__class__.__name__
-        raise AttributeError("'%s' has no attribute '%s'" % (cls_name, name))
-
-    #def __setattr__(self, name, value):
-    #    if '_deviceObj' in self.__dict__ and self._deviceObj is not None:
-    #        return setattr(self._deviceObj, name, value)
-    #    super(TaurusDevice, self).__setattr__(name, value)
-
-    # Export the 'act like dictionary' feature of PyTango.DeviceProxy
-    def __getitem__(self, key):
-        attr = self.getAttribute(key)
-        return attr.read()
-
-    def __setitem__(self, key, value):
-        attr = self.getAttribute(key)
-        return attr.write(value)
+    @classmethod
+    def factory(cls):
+        if cls._factory is None:
+            cls._factory = Factory(scheme=cls._scheme)
+        return cls._factory
 
     def __contains__(self, key):
-        hw = self.getHWObj()
-        if hw is None:
-            return False
-        return hw.__contains__(key)
-
-    def getHWObj(self):
-        return self._deviceObj
-
-    def getStateObj(self):
-        if self._deviceStateObj is None:
-            self._deviceStateObj = self.factory().getAttribute("%s/state" % self.getFullName())
-        return self._deviceStateObj
-
-    def getState(self, cache=True):
-        stateAttrValue = self.getStateObj().getValueObj(cache=cache)
-        if not stateAttrValue is None:
-            return stateAttrValue.value
-        return None
-
-    def getSWState(self, cache=True):
-        return self.getValueObj(cache=cache).value
-
-    def getAttribute(self, attrname):
-        """Returns the attribute object given its name"""
-
-        slashnb = attrname.count('/')
-        if slashnb == 0:
-            attrname = "%s/%s" % (self.getFullName(), attrname)
-        elif attrname[0] == '/':
-            attrname = "%s%s" % (self.getFullName(), attrname)
-        import taurusattribute
-        return self.factory().getObject(taurusattribute.TaurusAttribute,attrname)
-
-    def isValidDev(self):
-        """returns True if the device is in "working conditions
-
-        The default implementation always returns True. Reimplement it in
-        subclasses if there are cases in which the device cannot be queried
-        (e.g. in Tango, the TangoDevice object may exist even if there is not a real
-        hardware device associated, in which case this method should return False)
+        """Reimplement in schemes if you want to support membership testing for
+        attributes of the device
         """
-        return True
+        raise TypeError("'%s' does not support membership testing" %
+                        self.__class__.__name__)
 
-    def getLockInfo(self, cache=False):
-        return self._lock_info
+    @property
+    def state(self):
+        """Returns a scheme-agnostic representation of the state of a Taurus
+        device. This default implementation always returns
+        `TaurusDevState.Ready`
 
-    def lock(self, force=False):
-        pass
+        Subclasses of TaurusDevice may reimplement it to return other
+        :class:`taurus.core.TaurusDevState` enumeration values.
 
-    def unlock(self, force=False):
-        pass
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # Mandatory implementation in sub class
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    def _createHWObject(self):
-        raise NotImplementedError
+        :return: (TaurusDevState) `TaurusDevState.Ready`
+        """
+        return TaurusDevState.Ready
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusModel implementation
@@ -164,10 +90,13 @@ class TaurusDevice(TaurusModel):
     def buildModelName(cls, parent_model, relative_name):
         """build an 'absolute' model name from the parent model and the 'relative'
         name.
-        - If parent_model is a TaurusDatabase, the return is a composition of
-        the database model name and is device name
+        - If parent_model is a TaurusAuthority, the return is a composition of
+        the authority model name and the device name
         - If parent_model is a TaurusDevice, the relative name is ignored and
         the parent name is returned
+
+        Note: This is a basic implementation. You may need to reimplement this
+              for a specific scheme if it supports "useParentModel".
         """
         if parent_model is None:
             return relative_name
@@ -176,85 +105,24 @@ class TaurusDevice(TaurusModel):
             return relative_name
         if isinstance(parent_model, cls):
             return parent_name
-        return '%s/%s' % (parent_name,relative_name)
+        return '%s/%s' % (parent_name, relative_name)
 
     @classmethod
     def getNameValidator(cls):
-        import taurusvalidator
-        return taurusvalidator.DeviceNameValidator()
-
-    def getValueObj(self, cache=True):
-        if not self.hasListeners() or not cache:
-            try:
-                v = self.getStateObj().read(cache=cache)
-            except Exception as e:
-                v = e
-            self._deviceSwState = self.decode(v)
-        return self._deviceSwState
-
-    def getDisplayValue(self,cache=True):
-        return TaurusSWDevState.whatis(self.getValueObj(cache).value)
+        return cls.factory().getDeviceNameValidator()
 
-    def getDisplayDescrObj(self,cache=True):
+    def getDisplayDescrObj(self, cache=True):
         obj = []
         obj.append(('name', self.getDisplayName(cache=cache)))
-        descr = self.getDescription(cache=cache)
-        if descr.lower() != self._getDefaultDescription().lower():
-            obj.append(('description', descr))
-        obj.append(('device state', self.getStateObj().getDisplayValue()) or self.getNoneValue())
-        obj.append(('SW state', self.getDisplayValue()))
+        obj.append(('description', self.description))
+        obj.append(('device state', self.state.name))
         return obj
 
-    def getDescription(self,cache=True):
-        if self._descr is None or not cache:
-            try:
-                self._descr = self.description()
-            except:
-                self._descr = self._getDefaultDescription()
-        return self._descr
-
-    def 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.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
-            # 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)
-        return ret
-
     def getChildObj(self, child_name):
         if child_name is None or len(child_name) == 0:
             return None
-        return self.factory().findObject("%s%s" % (self.getFullName(), child_name))
-        return self.getAttribute(child_name)
-
-    def eventReceived(self, event_src, event_type, event_value):
-        if event_type == TaurusEventType.Config:
-            return
-        value = self.decode(event_value)
-        if value.value != self._deviceSwState.value:
-            msg = "SW Device State changed %s -> %s" %\
-                  (TaurusSWDevState.whatis(self._deviceSwState.value), 
-                   TaurusSWDevState.whatis(value.value))
-            self.debug(msg)
-            self._deviceSwState = value
-            self.fireEvent(TaurusEventType.Change, value)
-
-    def _getDefaultDescription(self):
-        return DFT_DEVICE_DESCRIPTION
+        obj_name = "%s%s" % (self.getFullName(), child_name)
+        return self.factory().findObject(obj_name)
 
     def poll(self, attrs, asynch=False, req_id=None):
         '''Polling certain attributes of the device. This default
@@ -267,3 +135,7 @@ class TaurusDevice(TaurusModel):
             return 1
         for attr in attrs.values():
             attr.poll()
+
+    @property
+    def description(self):
+        return self._description
diff --git a/lib/taurus/core/taurusexception.py b/lib/taurus/core/taurusexception.py
index 46da9ec..0af1143 100644
--- a/lib/taurus/core/taurusexception.py
+++ b/lib/taurus/core/taurusexception.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,15 +29,17 @@ __all__ = ["TaurusException", "DoubleRegistration"]
 
 __docformat__ = "restructuredtext"
 
+
 class TaurusException(Exception):
 
-    def __init__(self, description, code = None):
+    def __init__(self, description, code=None):
         #Exception.__init__(self, description, code)
         self.code = code
         self.description = description
-    
+
     def __str__(self):
         return str(self.description)
-    
+
+
 class DoubleRegistration(TaurusException):
     pass
diff --git a/lib/taurus/core/taurusfactory.py b/lib/taurus/core/taurusfactory.py
index 29ca8ea..2f05fa1 100644
--- a/lib/taurus/core/taurusfactory.py
+++ b/lib/taurus/core/taurusfactory.py
@@ -2,138 +2,158 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-  The TaurusFactory model containning the abstract base class that any valid
+  This module provides the :class:`TaurusFactory` base class that any valid
   Factory in Taurus must inherit.
-  
-  Taurus object naming is URI based:
-
-  foo://username:password@example.com:8042/over/there/index.dtb;type=animal?name=ferret#nose
-  \ /   \________________/\_________/ \__/\_________/ \___/ \_/ \_________/ \_________/ \__/
-   |           |               |        |     |         |     |       |            |     |
-scheme     userinfo         hostname  port  path  filename extension parameter(s) query fragment
-        \________________________________/
-                    authority
+
+  The Factory objects are the basic block for building and interacting with a
+  given scheme in Taurus. They provide Taurus model objects (TaurusAuthority,
+  TaurusDevice or TaurusAttribute) for a given taurus model name.
+
+  Taurus model naming is URI based (see <https://tools.ietf.org/html/rfc3986>)
+
+  All the standard components of an URI (scheme, authority, path, query and
+  fragment) may be part of a model name, and they are separated as follows:
+
+  <scheme>:<authority><path>?<query>#<fragment>
+
+
+  The following are some points to consider when using and/or implementing
+  schemes based on this Abstract class:
+
+  - It is strongly recommended that the scheme component is always present
+  explicitly in the model name, although a default scheme can be defined in
+  :mod:`taurus.tauruscustomsettings` so that model names which do not explicit
+  the scheme can be auto-completed.
+
+  - The authority component (if present on a given name) must always begin by
+  a double slash ('//'). (see
+  <https://tools.ietf.org/html/rfc3986#section-3.2>)
+
+  - The path component, if present, must start by a single slash ('/') (see
+  <https://tools.ietf.org/html/rfc3986#section-3.3>)
+
 """
 
 __all__ = ["TaurusFactory"]
 
 __docformat__ = "restructuredtext"
 
-from .taurusbasetypes import OperationMode
-from .taurusdatabase import TaurusDatabase
-from .taurusdevice import TaurusDevice
-from .taurusattribute import TaurusAttribute
-from .taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy
+import atexit
+from taurusbasetypes import TaurusElementType
+from taurusauthority import TaurusAuthority
+from taurusdevice import TaurusDevice
+from taurusattribute import TaurusAttribute
+from taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy
+
 
 class TaurusFactory(object):
     """The base class for valid Factories in Taurus."""
-    
-    schemes = ()
+
+    schemes = ()  # reimplement in derived classes to provide the supported sche
+    caseSensitive = True  # reimplement if your scheme is case insensitive
 
     DefaultPollingPeriod = 3000
-    
+
     def __init__(self):
+        atexit.register(self.cleanUp)
         self._polling_period = self.DefaultPollingPeriod
-        self.operation_mode = OperationMode.ONLINE
         self.polling_timers = {}
         self._polling_enabled = True
-        
+
         import taurusmanager
         manager = taurusmanager.TaurusManager()
         self._serialization_mode = manager.getSerializationMode()
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # API for cleanUp at exit
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
+    def cleanUp(self):
+        """Reimplement if you need to execute code on program execution exit.
+        Default implementation does nothing.
+        """
+        pass
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # API for serialization
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def setSerializationMode(self, mode):
         """Sets the serialization mode for the system.
-        
-        :param mode: (TaurusSerializationMode) the new serialization mode"""
+
+        :param mode: (TaurusSerializationMode) the new serialization mode
+        """
         self._serialization_mode = mode
-    
+
     def getSerializationMode(self):
         """Gives the serialization operation mode.
-        
-        :return: (TaurusSerializationMode) the current serialization mode"""
+
+        :return: (TaurusSerializationMode) the current serialization mode
+        """
         return self._serialization_mode
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Methods that must be implemented by the specific Factory
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-  
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    def findObjectClass(self, absolute_name):
-        """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
+    def getAuthority(self, name=None):
+        """getAuthority(string db_name) -> taurus.core.taurusauthority.TaurusAuthority
 
-        @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.TaurusDatabase
-           
-        Obtain the object corresponding to the given database name or the 
-        default database if db_name is None.
-        If the corresponding database object already exists, the existing 
+        Obtain the object corresponding to the given authority name or the
+        default authority if db_name is None.
+        If the corresponding authority object already exists, the existing
         instance is returned. Otherwise a new instance is stored and returned.
-           
-        @param[in] db_name database name string. It should be formed like: 
-                           <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.TaurusDatabase object 
-        @throws TaurusException if the given name is invalid.
+
+        :param db_name: [in] authority name string. It should be formed like:
+                           <scheme>://<authority>. If <scheme> is ommited then
+                           it will use the default scheme. if db_name is None,
+                           the default authority is used
+
+        :return: a taurus.core.taurusauthority.TaurusAuthority object
+        :raises: :TaurusException: if the given name is invalid.
         """
-        raise RuntimeError("getDatabase cannot be called for abstract" \
-                           " TaurusFactory")
+        raise NotImplementedError("getAuthority cannot be called for abstract"
+                                  " TaurusFactory")
 
     def getDevice(self, dev_name, **kw):
         """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. 
+
+        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:
-                            <scheme>://<authority>/<device name>. If <scheme> 
-                            is ommited then it will use the default scheme. 
-                            If authority is ommited then it will use the 
+
+        :param dev_name: [in] the device name string. It should be formed like:
+                            <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 scheme.
-        
-        @return a taurus.core.taurusdevice.TaurusDevice object 
-        @throws TaurusException if the given name is invalid.
+
+        :return: a taurus.core.taurusdevice.TaurusDevice object
+        :raises: :TaurusException: if the given name is invalid.
         """
-        raise RuntimeError("getDevice cannot be called for abstract" \
-                           " TaurusFactory")
+        raise NotImplementedError("getDevice cannot be called for abstract"
+                                  " TaurusFactory")
 
     def getAttribute(self, attr_name):
         """getAttribute(string attr_name) -> taurus.core.taurusattribute.TaurusAttribute
@@ -142,65 +162,60 @@ class TaurusFactory(object):
         If the corresponding attribute already exists, the existing instance
         is returned. Otherwise a new instance is stored and returned.
 
-        @param[in] attr_name string attribute name
-             
-        @return a taurus.core.taurusattribute.TaurusAttribute object 
-        @throws TaurusException if the given name is invalid.
+        :param attr_name: [in] string attribute name
+
+        :return: a taurus.core.taurusattribute.TaurusAttribute object
+        :raises: :TaurusException: if the given name is invalid.
         """
-        raise RuntimeError("getAttribute cannot be called for abstract" \
-                           " TaurusFactory")
+        raise NotImplementedError("getAttribute cannot be called for abstract"
+                                  " TaurusFactory")
 
-    def getConfiguration(self, param):
-        """getConfiguration(param) -> taurus.core.taurusconfiguration.TaurusConfiguration
+    def getAuthorityNameValidator(self):
+        raise NotImplementedError("getAuthorityNameValidator cannot be called"
+                                  " for abstract TaurusFactory")
 
-        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.
+    def getDeviceNameValidator(self):
+        raise NotImplementedError("getDeviceNameValidator cannot be called"
+                                  " for abstract TaurusFactory")
 
-        @param[in] param taurus.core.taurusattribute.TaurusAttribute object or full configuration name
-           
-        @return a taurus.core.taurusattribute.TaurusAttribute object
-        @throws TaurusException if the given name is invalid.
-        """
-        raise RuntimeError("getConfiguration cannot be called for abstract" \
-                           " TaurusFactory")
+    def getAttributeNameValidator(self):
+        raise NotImplementedError("getAttributeNameValidator cannot be called"
+                                  " for abstract TaurusFactory")
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Factory extension API
     # Override the following methods if you need to provide special classes for
     # special object types
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-  
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def registerAttributeClass(self, attr_name, attr_klass):
         pass
-    
+
     def unregisterAttributeClass(self, attr_name):
         pass
-            
+
     def registerDeviceClass(self, dev_klass_name, dev_klass):
         pass
-    
+
     def unregisterDeviceClass(self, dev_klass_name):
         pass
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Generic methods
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-  
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def supportsScheme(self, scheme):
-        return scheme in self.shemes
+        """Returns whether the given scheme is supported by this factory
 
-    def setOperationMode(self, mode):
-        """ setOperationMode(OperationMode mode) -> None
-            Sets the operation mode for the Tango system."""
-        self.operation_mode = mode
-        
-    def getOperationMode(self):
-        return self.operation_mode
+        :param scheme: (str) the name of the schem to be checked
+
+        :return: (bool) True if the scheme is supported (False otherwise)
+        """
+        return scheme in self.shemes
 
     def findObject(self, absolute_name):
         """ Must give an absolute name"""
-        if self.operation_mode == OperationMode.OFFLINE or not absolute_name:
+        if not absolute_name:
             return None
         obj = None
         cls = self.findObjectClass(absolute_name)
@@ -209,16 +224,23 @@ class TaurusFactory(object):
         return obj
 
     def getObject(self, cls, name):
-        if issubclass(cls, TaurusDatabase):
-            return self.getDatabase(name)
+        t4_msg = 'The TaurusConfiguration classes are deprecated in tep14'
+        if issubclass(cls, TaurusAuthority):
+            return self.getAuthority(name)
         elif issubclass(cls, TaurusDevice):
             return self.getDevice(name)
         elif issubclass(cls, TaurusAttribute):
             return self.getAttribute(name)
+        # For backward compatibility
         elif issubclass(cls, TaurusConfiguration):
-            return self.getConfiguration(name)
+            self.deprecated(dep='TaurusConfiguration', alt='TaurusAttribute',
+                            rel='4.0', dbg_msg=t4_msg)
+            return self.getAttribute(name)
         elif issubclass(cls, TaurusConfigurationProxy):
-            return self.getConfiguration(name)
+            self.deprecated(dep='TaurusConfigurationProxy',
+                            alt='TaurusAttribute',
+                            rel='4.0', dbg_msg=t4_msg)
+            return self.getAttribute(name)
         else:
             return None
 
@@ -228,31 +250,31 @@ class TaurusFactory(object):
 
     def getDefaultPollingPeriod(self):
         return self._polling_period
-    
+
     def isPollingEnabled(self):
         """Tells if the local tango polling is enabled
-        
-           :return: (bool) wheter or not the polling is enabled
+
+           :return: (bool) whether or not the polling is enabled
         """
         return self._polling_enabled
-        
+
     def disablePolling(self):
         """Disable the application tango polling"""
         if not self.isPollingEnabled():
             return
         self._polling_enabled = False
-        for period,timer in self.polling_timers.iteritems():
+        for period, timer in self.polling_timers.iteritems():
             timer.stop()
-            
+
     def enablePolling(self):
         """Enable the application tango polling"""
         if self.isPollingEnabled():
             return
-        for period,timer in self.polling_timers.iteritems():
+        for period, timer in self.polling_timers.iteritems():
             timer.start()
         self._polling_enabled = True
-        
-    def addAttributeToPolling(self, attribute, period, unsubscribe_evts = False):
+
+    def addAttributeToPolling(self, attribute, period, unsubscribe_evts=False):
         """Activates the polling (client side) for the given attribute with the
            given period (seconds).
 
@@ -260,20 +282,81 @@ class TaurusFactory(object):
            :param period: (float) polling period (in seconds)
            :param unsubscribe_evts: (bool) whether or not to unsubscribe from events
         """
-        raise RuntimeError("addAttributeToPolling cannot be called for abstract" \
-                           " TaurusFactory")
-        
+        raise NotImplementedError("addAttributeToPolling cannot be called"
+                                  " for abstract TaurusFactory")
+
     def removeAttributeFromPolling(self, attribute):
         """Deactivate the polling (client side) for the given attribute. If the
            polling of the attribute was not previously enabled, nothing happens.
 
            :param attribute: (str) attribute name.
         """
-        raise RuntimeError("removeAttributeFromPolling cannot be called for abstract" \
-                           " TaurusFactory")
+        raise NotImplementedError("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))
+
+    def getValidTypesForName(self, name, strict=None):
+        '''
+        Returns a list of all Taurus element types for which `name` is a valid
+        model name (while in many cases a name may only be valid for one
+        element type, this is not necessarily true in general)
+
+        In this base implementation, name is checked first for Attribute, then
+        for Device and finally for Authority, and the return value is sorted in
+        that same order.
+
+        If a given schema requires a different ordering, reimplement this method
+
+        :param name: (str) taurus model name
+
+        :return: (list<TaurusElementType.element>) where element can be one of:
+                 `Attribute`, `Device` or `Authority`
+        '''
+        ret = []
+        if self.getAttributeNameValidator().isValid(name, strict=strict):
+            ret.append(TaurusElementType.Attribute)
+        if self.getDeviceNameValidator().isValid(name, strict=strict):
+            ret.append(TaurusElementType.Device)
+        if self.getAuthorityNameValidator().isValid(name, strict=strict):
+            ret.append(TaurusElementType.Authority)
+        return ret
+
+    def findObjectClass(self, absolute_name):
+        """
+        Obtain the class object corresponding to the given name.
+
+        Note, this generic implementation expects that derived classes provide a
+        an attribute called elementTypesMap consisting in a dictionary whose
+        keys are TaurusElementTypes and whose values are the corresponding
+        specific object classes. e.g., the FooFactory should provide::
+
+          class FooFactory(TaurusFactory):
+              elementTypesMap = {TaurusElementType.Authority: FooAuthority,
+                                 TaurusElementType.Device: FooDevice,
+                                 TaurusElementType.Attribute: FooAttribute,
+                                 }
+              (...)
+
+
+        :param absolute_name: (str) the object absolute name string
+
+        :return: (taurus.core.taurusmodel.TaurusModel or None) a TaurusModel
+                 class derived type or None if the name is not valid
+
+        """
+        try:
+            elementTypesMap = self.elementTypesMap
+        except AttributeError:
+            msg = ('generic findObjectClass called but %s does ' +
+                   'not define elementTypesMap.') % self.__class__.__name__
+            raise RuntimeError(msg)
+        for t in self.getValidTypesForName(absolute_name):
+            ret = elementTypesMap.get(t, None)
+            if ret is not None:
+                return ret
+        return None
diff --git a/lib/taurus/core/taurushelper.py b/lib/taurus/core/taurushelper.py
index c5bdc32..3c234e6 100644
--- a/lib/taurus/core/taurushelper.py
+++ b/lib/taurus/core/taurushelper.py
@@ -2,32 +2,33 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
 """a list of helper methods"""
 
 __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName',
+           'getValidTypesForName', 'isValidName', 'makeSchemeExplicit',
            'Manager', 'Factory', 'Device', 'Attribute', 'Configuration',
-           'Database', 'Object', 'Logger',
+           'Database', 'Authority', 'Object', 'Logger',
            'Critical', 'Error', 'Warning', 'Info', 'Debug', 'Trace',
            'setLogLevel', 'setLogFormat', 'getLogLevel', 'getLogFormat',
            'resetLogLevel', 'resetLogFormat',
@@ -38,6 +39,13 @@ __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName',
 __docformat__ = "restructuredtext"
 
 import sys
+import re
+from taurus import tauruscustomsettings
+from .util.log import taurus4_deprecation
+
+
+# regexp for finding the scheme
+__SCHEME_RE = re.compile(r'([^:/?#]+):.*')
 
 
 def __translate_version_str2int(version_str):
@@ -45,7 +53,8 @@ def __translate_version_str2int(version_str):
     import math
     parts = version_str.split('.')
     i, v, l = 0, 0, len(parts)
-    if not l: return v
+    if not l:
+        return v
     while i < 3:
         try:
             v += int(parts[i]) * int(math.pow(10, (2 - i) * 2))
@@ -53,7 +62,8 @@ def __translate_version_str2int(version_str):
             i += 1
         except ValueError, ve:
             return v
-        if not l: return v
+        if not l:
+            return v
     return v
 
     try:
@@ -61,30 +71,37 @@ def __translate_version_str2int(version_str):
         l -= 1
     except ValueError, ve:
         return v
-    if not l: return v
+    if not l:
+        return v
 
     try:
         v += 100 * int(parts[1])
         l -= 1
     except ValueError, ve:
         return v
-    if not l: return v
+    if not l:
+        return v
 
     try:
         v += int(parts[0])
         l -= 1
     except ValueError:
         return v
-    if not l: return v
+    if not l:
+        return v
+
 
 def __get_python_version():
     return '.'.join(map(str, sys.version_info[:3]))
 
+
 def __get_python_version_number():
     pyver_str = __get_python_version()
-    if pyver_str is None: return None
+    if pyver_str is None:
+        return None
     return __translate_version_str2int(pyver_str)
 
+
 def __get_pytango_version():
     try:
         import PyTango
@@ -95,11 +112,14 @@ def __get_pytango_version():
     except:
         return '0.0.0'
 
+
 def __get_pytango_version_number():
     tgver_str = __get_pytango_version()
-    if tgver_str is None: return None
+    if tgver_str is None:
+        return None
     return __translate_version_str2int(tgver_str)
 
+
 def __get_pyqt_version():
     try:
         import PyQt4.Qt
@@ -107,11 +127,14 @@ def __get_pyqt_version():
     except:
         return None
 
+
 def __get_pyqt_version_number():
     pyqtver_str = __get_pyqt_version()
-    if pyqtver_str is None: return None
+    if pyqtver_str is None:
+        return None
     return __translate_version_str2int(pyqtver_str)
 
+
 def __get_pyqwt_version():
     try:
         import PyQt4.Qwt5
@@ -119,11 +142,14 @@ def __get_pyqwt_version():
     except:
         pass
 
+
 def __get_pyqwt_version_number():
     pyqwtver_str = __get_pyqwt_version()
-    if pyqwtver_str is None: return None
+    if pyqwtver_str is None:
+        return None
     return __translate_version_str2int(pyqwtver_str)
 
+
 def __get_qub_version():
     try:
         import Qub4
@@ -135,11 +161,14 @@ def __get_qub_version():
         except:
             pass
 
+
 def __get_qub_version_number():
     qubver_str = __get_qub_version()
-    if qubver_str is None: return None
+    if qubver_str is None:
+        return None
     return __translate_version_str2int(qubver_str)
 
+
 def __get_qtcontrols_version():
     try:
         import qtcontrols
@@ -147,11 +176,14 @@ def __get_qtcontrols_version():
     except:
         pass
 
+
 def __get_qtcontrols_version_number():
     qtcontrols_str = __get_qtcontrols_version()
-    if qtcontrols_str is None: return None
+    if qtcontrols_str is None:
+        return None
     return __translate_version_str2int(qtcontrols_str)
 
+
 def __get_spyderlib_version():
     try:
         import spyderlib
@@ -159,24 +191,31 @@ def __get_spyderlib_version():
     except:
         pass
 
+
 def __get_spyderlib_version_number():
     spyderlibver_str = __get_spyderlib_version()
-    if spyderlibver_str is None: return None
+    if spyderlibver_str is None:
+        return None
     return __translate_version_str2int(spyderlibver_str)
 
+
 def __w(msg):
     sys.stdout.write(msg)
     sys.stdout.flush()
 
+
 def __wn(msg):
     __w(msg + '\n')
 
+
 def check_dependencies():
     for msg in _check_dependencies(forlog=False):
         m = msg[1]
-        if msg[0] != -1: m = '\t%s' % m
+        if msg[0] != -1:
+            m = '\t%s' % m
         print m
 
+
 def log_dependencies():
     from taurus.core.util.log import Logger
     l = Logger("taurus")
@@ -184,34 +223,40 @@ def log_dependencies():
         if msg[0] != -1:
             l.info(msg[1])
 
+
 def _check_dependencies(forlog=False):
     """Checks for the required and optional packages of taurus"""
 
     if forlog:
-        MSG = { 'OK' : '[OK]', 'ERR' : '[ERROR]', 'WARN' : '[WARNING]' }
+        MSG = {'OK': '[OK]', 'ERR': '[ERROR]', 'WARN': '[WARNING]'}
     else:
         MSG = {
-            'OK'   : "[\033[0;32mOK\033[0m]",
-            'ERR'  : "[\033[0;31mERROR\033[0m]",
-            'WARN' : "[\033[0;33mWARNING\033[0m]" }
+            'OK': "[\033[0;32mOK\033[0m]",
+            'ERR': "[\033[0;31mERROR\033[0m]",
+            'WARN': "[\033[0;33mWARNING\033[0m]"}
 
     core_requirements = {
-    #    module       minimum  recommended
-        "Python"   : ("2.6.0", "2.6.0"),
-        "PyTango"  : ("7.1.0", "7.1.0"),
+        #    module       minimum  recommended
+        "Python": ("2.6.0", "2.6.0"),
+    }
+
+    core_optional_requirements = {
+        #    module       minimum  recommended
+        "PyTango": ("7.1.0", "7.1.0"),
     }
 
     widget_requirements = {
-    #    module       minimum  recommended
-        "PyQt"     : ("4.4.0", "4.4.0"),
-        "PyQwt"     : ("5.2.0", "5.2.0"),
+        #    module       minimum  recommended
+        "PyTango": ("7.1.0", "7.1.0"),
+        "PyQt": ("4.4.0", "4.4.0"),
+        "PyQwt": ("5.2.0", "5.2.0"),
     }
 
     widget_optional_requirements = {
-    #    module       minimum  recommended
-        "Qub"       : ("1.0.0", "1.0.0"),
+        #    module       minimum  recommended
+        "Qub": ("1.0.0", "1.0.0"),
         "qtcontrols": ("1.0.0", "1.0.0"),
-        "spyderlib" : ("2.0.0", "2.0.0"),
+        "spyderlib": ("2.0.0", "2.0.0"),
     }
 
     yield -1, "Checking required dependencies of taurus.core..."
@@ -227,6 +272,9 @@ def _check_dependencies(forlog=False):
     else:
         yield 0, "{msg} {OK} (Found {fnd})".format(msg=m, fnd=currPythonStr, **MSG)
 
+    yield -1, "Checking OPTIONAL dependencies of taurus.core..."
+    r = core_optional_requirements
+
     m = "Checking for PyTango >=%s..." % r["PyTango"][0]
     minPyTango, recPyTango = map(__translate_version_str2int, r["PyTango"])
     currPyTango, currPyTangoStr = __get_pytango_version_number(), __get_pytango_version()
@@ -240,6 +288,14 @@ def _check_dependencies(forlog=False):
     yield -1, "Checking required dependencies of taurus.qt..."
     r = widget_requirements
 
+    m = "Checking for PyTango >=%s..." % r["PyTango"][0]
+    if currPyTango is None:
+        yield 2, "{msg} {ERR} (Not found])".format(msg=m, **MSG)
+    elif currPyTango < minPyTango:
+        yield 1, "{msg} {WARN} (Found {fnd}. Recommended >={rec})".format(msg=m, fnd=currPyTangoStr, rec=r['PyTango'][1], **MSG)
+    else:
+        yield 0, "{msg} {OK} (Found {fnd})".format(msg=m, fnd=currPyTangoStr, **MSG)
+
     m = "Checking for PyQt >=%s..." % r["PyQt"][0]
     minPyQt, recPyQt = map(__translate_version_str2int, r["PyQt"])
     currPyQt, currPyQtStr = __get_pyqt_version_number(), __get_pyqt_version()
@@ -274,8 +330,10 @@ def _check_dependencies(forlog=False):
         yield 0, "{msg} {OK} (Found {fnd})".format(msg=m, fnd=currQubStr, **MSG)
 
     m = "Checking for spyderlib >=%s..." % r["spyderlib"][0]
-    minspyderlib, recspyderlib = map(__translate_version_str2int, r["spyderlib"])
-    currspyderlib, currspyderlibStr = __get_spyderlib_version_number(), __get_spyderlib_version()
+    minspyderlib, recspyderlib = map(
+        __translate_version_str2int, r["spyderlib"])
+    currspyderlib, currspyderlibStr = __get_spyderlib_version_number(
+    ), __get_spyderlib_version()
     if currspyderlib is None:
         yield 1, "{msg} {WARN} (Not found])".format(msg=m, **MSG)
     elif currspyderlib < minspyderlib:
@@ -284,8 +342,10 @@ def _check_dependencies(forlog=False):
         yield 0, "{msg} {OK} (Found {fnd})".format(msg=m, fnd=currspyderlibStr, **MSG)
 
     m = "Checking for qtcontrols >=%s..." % r["qtcontrols"][0]
-    minqtcontrols, recqtcontrols = map(__translate_version_str2int, r["qtcontrols"])
-    currqtcontrols, currqtcontrolsStr = __get_qtcontrols_version_number(), __get_qtcontrols_version()
+    minqtcontrols, recqtcontrols = map(
+        __translate_version_str2int, r["qtcontrols"])
+    currqtcontrols, currqtcontrolsStr = __get_qtcontrols_version_number(
+    ), __get_qtcontrols_version()
     if currqtcontrols is None:
         yield 1, "{msg} {WARN} (Not found])".format(msg=m, **MSG)
     elif currqtcontrols < minqtcontrols:
@@ -294,30 +354,115 @@ def _check_dependencies(forlog=False):
         yield 0, "{msg} {OK} (Found {fnd})".format(msg=m, fnd=currqtcontrolsStr, **MSG)
 
 
-def getSchemeFromName(name):
-    if name is None: return None
-    i = name.find('://')
-    if i == -1: return None
-    return name[:i]
+def getSchemeFromName(name, implicit=True):
+    """Return the scheme from a taurus name.
+
+    :param name: (str) taurus model name URI.
+    :param implicit: (bool) controls whether to return the default scheme
+                     (if implicit is True -default-) or None (if implicit is
+                     False) in case `model` does not contain the scheme name
+                     explicitly. The default scheme may be defined in
+                     :ref:`tauruscustomsettings` ('tango' is assumed if
+                     not defined)
+    """
+    m = __SCHEME_RE.match(name)
+    if m is not None:
+        return m.groups()[0]
+    if implicit:
+        return getattr(tauruscustomsettings, 'DEFAULT_SCHEME', "tango")
+    else:
+        return None
+
+
+def makeSchemeExplicit(name, default=None):
+    """return the name guaranteeing that the scheme is present. If name already
+    contains the scheme, it is returned unchanged.
+
+    :param name: (str) taurus model name URI.
+    :param default: (str) The default scheme to use. If no default is passed,
+                     the one defined in tauruscustomsettings.DEFAULT_SCHEME is
+                     used.
+
+    :return: the name with the explicit scheme.
+    """
+    if getSchemeFromName(name, implicit=False) is None:
+        if default is None:
+            default = getattr(tauruscustomsettings, 'DEFAULT_SCHEME', "tango")
+        return "%s:%s" % (default, name)
+    else:
+        return name
+
+
+def getValidTypesForName(name, strict=None):
+    """
+    Returns a list of all Taurus element types for which `name` is a valid
+    model name (while in many cases a name may only be valid for one
+    element type, this is not necessarily true in general)
+
+    :param name: (str) taurus model name
+    :param strict: (bool) If True, names that are not RFC3986-compliant but
+                   which would be accepted for backwards compatibility are
+                   considered valid.
+
+    :return: (list<TaurusElementType.element>) where element can be one of:
+             `Attribute`, `Device` or `Authority`
+    """
+    try:
+        factory = Factory(scheme=getSchemeFromName(name))
+    except:
+        return []
+    return factory.getValidTypesForName(name, strict=strict)
+
+
+def isValidName(name, etypes=None, strict=None):
+    """Returns True is the given name is a valid Taurus model name. If
+    `etypes` is passed, it returns True only if name is valid for at least
+    one of the given the element types. Otherwise it returns False.
+    For example::
+
+        isValidName('tango:foo')--> True
+        isValidName('tango:a/b/c', [TaurusElementType.Attribute]) --> False
+
+    :param name: (str) the string to be checked for validity
+    :param etypes: (seq<TaurusElementType>) if given, names will only be
+                   considered valid if they represent one of the given
+                   element types. Supported element types are:
+                   `Attribute`, `Device` and `Authority`
+    :param strict: (bool) If True, names that are not RFC3986-compliant but
+                   which would be accepted for backwards compatibility are
+                   considered valid.
+
+    :return: (bool)
+    """
+    validtypes = getValidTypesForName(name, strict=strict)
+    if etypes is None:
+        return bool(validtypes)
+    for e in etypes:
+        if e in validtypes:
+            return True
+        return False
+
 
 def Manager():
     """Returns the one and only TaurusManager
-    
+
     It is a shortcut to::
 
         import taurus.core
         manager = taurus.core.taurusmanager.TaurusManager()
-    
+
     :return: the TaurusManager
     :rtype: :class:`taurus.core.taurusmanager.TaurusManager`
-    
-    .. seealso:: :class:`taurus.core.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.taurusmanager
@@ -327,7 +472,8 @@ def Factory(scheme=None):
     :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.TaurusFactory`"""
+    :rtype: :class:`taurus.core.taurusfactory.TaurusFactory`
+    """
     manager = Manager()
     f = manager.getFactory(scheme=scheme)
     if f is None:
@@ -339,6 +485,7 @@ def Factory(scheme=None):
         raise TaurusException('Cannot create Factory for %s' % scheme)
     return f()
 
+
 def Device(device_name):
     """Returns the taurus device for the given device name
 
@@ -348,17 +495,19 @@ def Device(device_name):
         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.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):
-    """Returns the taurus attribute for either the pair (device name, attribute name) 
+    """Returns the taurus attribute for either the pair (device name, attribute name)
     or full attribute name
-    
+
     - Attribute(full_attribute_name)
     - Attribute(device_name, attribute_name)
 
@@ -368,21 +517,22 @@ def Attribute(dev_or_attr_name, attr_name=None):
         manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         attribute  = factory.getAttribute(full_attribute_name)
-    
+
     or::
-    
+
         import taurus.core.taurusmanager
         manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         device  = factory.getDevice(device_name)
         attribute = device.getAttribute(attribute_name)
-    
+
     :param dev_or_attr_name: the device name or full attribute name
     :type dev_or_attr_name: str or TaurusDevice
     :param attr_name: attribute name
     :type attr_name: str
     :return: a taurus attribute
-    :rtype: :class:`taurus.core.taurusattribute.TaurusAttribute`"""
+    :rtype: :class:`taurus.core.taurusattribute.TaurusAttribute`
+    """
     import types
 
     if attr_name is None:
@@ -394,13 +544,15 @@ def Attribute(dev_or_attr_name, attr_name=None):
             dev = dev_or_attr_name
         return dev.getAttribute(attr_name)
 
+
+ at taurus4_deprecation(alt='Attribute')
 def Configuration(attr_or_conf_name, conf_name=None):
-    """Returns the taurus configuration for either the pair (attribute name, conf name) 
-    or full conf name
-    
+    """Returns the taurus configuration for either the pair
+    (attribute name, conf name) or full conf name
+
     - Configuration(full_conf_name)
     - Configuration(attribute_name, conf_name)
-    
+
     It is a shortcut to::
 
         import taurus.core.taurusmanager
@@ -409,57 +561,77 @@ def Configuration(attr_or_conf_name, conf_name=None):
         conf  = factory.getConfiguration(attr_or_conf_name)
 
     or::
-    
+
         import taurus.core.taurusmanager
         manager = taurus.core.taurusmanager.TaurusManager()
         factory = manager.getFactory()
         attribute  = factory.getAttribute(attribute_name)
         conf = attribute.getConfig(conf_name)
-        
+
     :param attr_or_conf_name: the full attribute name or full conf name
     :type attr_or_conf_name: str
     :param conf_name: conf name
     :type conf_name: str or None
     :return: a taurus configuration
-    :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:
-        return Attribute(attr_or_conf_name).getConfig(conf_name)
+    :rtype: :class:`taurus.core.taurusconfiguration.TaurusConfiguration`
+    """
+    return Attribute(attr_or_conf_name)
+
+
+ at taurus4_deprecation(alt='Authority')
+def Database(name=None):
+    return Authority(name=name)
+
+
+def Authority(name=None):
+    """Returns a taurus authority
 
-def Database(db_name=None):
-    """Returns the taurus database
-    
     It is a shortcut to::
 
         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.TaurusDatabase`"""
-    return Factory(getSchemeFromName(db_name)).getDatabase(db_name)
-
-def Object(klass, name):
+        db  = factory.getAuthority(dname)
+
+    :param name: authority name. If None (default) it will return the default
+                 authority of the default scheme. For example, if the default
+                 scheme is tango, it will return the default TANGO_HOST database
+    :type name: str or None
+    :return: a taurus authority
+    :rtype: :class:`taurus.core.taurusauthority.TaurusAuthority`
+    """
+    return Factory(getSchemeFromName(name or '')).getAuthority(name)
+
+
+def Object(*args):
     """Returns an taurus object of given class for the given name
-    
-    It is a shortcut to::
 
-        import taurus.core.taurusmanager
-        manager = taurus.core.taurusmanager.TaurusManager()
-        factory = manager.getFactory()
-        obj  = factory.getObject(klass, name)
+    Can be called as:
+
+      - Object(name)
+      - Object(cls, name)
+
+    Where:
+
+      - `name` is a model name (str)
+      - `cls` is a class derived from TaurusModel
+
+    If `cls` is not given, Object() will try to guess it from `name`.
 
-    :param klass: a taurus model subclass (TaurusDevice, for example)
-    :type klass: class TaurusModel
-    :param name: the full object name
-    :type name: str
     :return: a taurus object
-    :rtype: :class:`taurus.core.taurusmodel.TaurusModel`"""
-    return Factory(getSchemeFromName(name)).getObject(klass, name)
+    :rtype: :class:`taurus.core.taurusmodel.TaurusModel`
+    """
+    if len(args) == 1:
+        klass, name = None, args[0]
+    elif len(args) == 2:
+        klass, name = args
+    else:
+        msg = 'Object() takes either 1 or 2 arguments (%i given)' % len(args)
+        raise TypeError(msg)
+    factory = Factory(getSchemeFromName(name))
+    if klass is None:
+        klass = factory.findObjectClass(name)
+    return factory.getObject(klass, name)
 
 from taurus.core.util import log as __log_mod
 
@@ -490,6 +662,8 @@ warning = __log_mod.warning
 error = __log_mod.error
 fatal = __log_mod.fatal
 critical = __log_mod.critical
+deprecated = __log_mod.deprecated
+
 
 def changeDefaultPollingPeriod(period):
     Manager().changeDefaultPollingPeriod(period)
diff --git a/lib/taurus/core/tauruslistener.py b/lib/taurus/core/tauruslistener.py
index 3455d17..dddd36b 100644
--- a/lib/taurus/core/tauruslistener.py
+++ b/lib/taurus/core/tauruslistener.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -31,12 +31,13 @@ __docformat__ = "restructuredtext"
 
 from .util.log import Logger
 
+
 class TaurusListener(Logger):
     """ TaurusListener Interface"""
-    
+
     def __init__(self, name, parent=None):
         self.call__init__(Logger, name, parent)
-    
+
     def eventReceived(self, src, type, evt_value):
         """ Method to implement the event notification"""
         pass
@@ -49,23 +50,24 @@ class TaurusListener(Logger):
 class TaurusExceptionListener(object):
     """Class for handling ConnectionFailed, DevFailed and TaurusException exceptions."""
 
-    def connectionFailed(self, ex):
-        self._printException(ex)
+    def connectionFailed(self, exception):
+        msg = 'Deprecation warning: please note that the "connectionFailed" ' +\
+              'method is deprecated. Scheme-specific exceptions should be ' +\
+              'implemented in each model and be transformed into taurus ' +\
+              'exceptions according Sep3 specifications'
+        self.info(msg)
+        self._printException(exception)
 
     def devFailed(self, exception):
-        self._printException(self)
+        msg = 'Deprecation warning: please note that the "devFailed" ' +\
+              'method is deprecated. Scheme-specific exceptions should be ' +\
+              'implemented in each model and be transformed into taurus ' +\
+              'exception according Sep3 specifications'
+        self.info(msg)
+        self._printException(exception)
 
     def exceptionReceived(self, exception):
-        import PyTango
-        if isinstance(exception, PyTango.ConnectionFailed):
-            self.connectionFailed(exception)
-
-        elif isinstance(exception, PyTango.DevFailed):
-            self.devFailed(exception)
-
-        else:
-            self._printException(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 de116b8..ed503dd 100644
--- a/lib/taurus/core/taurusmanager.py
+++ b/lib/taurus/core/taurusmanager.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,43 +30,43 @@ __all__ = ["TaurusManager"]
 __docformat__ = "restructuredtext"
 
 import os
-import imp
 import atexit
 
 from .util.singleton import Singleton
-from .util.log import Logger
+from .util.log import Logger, taurus4_deprecation
 from .util.threadpool import ThreadPool
 
 from .taurusbasetypes import OperationMode, ManagerState, TaurusSerializationMode
-from .taurusdatabase import TaurusDatabase
+from .taurusauthority import TaurusAuthority
 from .taurusdevice import TaurusDevice
 from .taurusattribute import TaurusAttribute
-from .taurusconfiguration import TaurusConfiguration
 from .taurusexception import TaurusException
 from .taurusfactory import TaurusFactory
+from .taurushelper import getSchemeFromName
+from taurus import tauruscustomsettings
 
 
 class TaurusManager(Singleton, Logger):
     """A :class:`taurus.core.util.singleton.Singleton` class designed to provide Taurus management.
-    
+
        Example::
-       
+
            >>> 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"
+    default_scheme = getattr(tauruscustomsettings, 'DEFAULT_SCHEME', "tango")
 
     def __init__(self):
         """ Initialization. Nothing to be done here for now."""
         pass
 
     def init(self, *args, **kwargs):
-        """Singleton instance initialization. 
+        """Singleton instance initialization.
            For internal usage only. Do **NOT** call this method directly"""
         self._state = ManagerState.UNINITIALIZED
         self.call__init__(Logger)
@@ -77,11 +77,10 @@ class TaurusManager(Singleton, Logger):
         """Reinitialization"""
         if self._state == ManagerState.INITED:
             return
-        
+
         self.trace("reInit()")
         this_path = os.path.abspath(__file__)
         self._this_path = os.path.dirname(this_path)
-        self._operation_mode = OperationMode.ONLINE
         self._serialization_mode = self.DefaultSerializationMode
         if self._serialization_mode == TaurusSerializationMode.Concurrent:
             self._thread_pool = ThreadPool(name="TaurusTP",
@@ -91,9 +90,9 @@ class TaurusManager(Singleton, Logger):
         else:
             self._thread_pool = None
         self._plugins = None
-        
+
         self._initial_default_scheme = self.default_scheme
-        
+
         self._state = ManagerState.INITED
 
     def cleanUp(self):
@@ -101,24 +100,22 @@ class TaurusManager(Singleton, Logger):
         if self._state == ManagerState.CLEANED:
             return
         self.trace("cleanUp()")
-        
+
         if self._plugins is None:
             return
         self.trace("[TaurusManager] cleanUp")
-        for f_scheme, f in self._plugins.items():
-            f().cleanUp()
         self._plugins = None
-        
+
         self._thread_pool.join()
         self._thread_pool = None
-        
+
         self._state = ManagerState.CLEANED
 
     def addJob(self, job, callback=None, *args, **kw):
         """Add a new job (callable) to the queue. The new job will be processed
         by a separate thread
-        
-        :param job: (callable) a callable object 
+
+        :param job: (callable) a callable object
         :param callback: (callable) called after the job has been processed
         :param args: (list) list of arguments passed to the job
         :param kw: (dict) keyword arguments passed to the job
@@ -126,66 +123,67 @@ class TaurusManager(Singleton, Logger):
         if self._serialization_mode == TaurusSerializationMode.Concurrent:
             if not hasattr(self, "_thread_pool") or self._thread_pool is None:
                 self.info("Job cannot be processed.")
-                self.debug("The requested job cannot be processed. Make sure this manager is initialized")
+                self.debug(
+                    "The requested job cannot be processed. Make sure this manager is initialized")
                 return
             self._thread_pool.add(job, callback, *args, **kw)
         else:
             job(*args, **kw)
-    
+
     def setSerializationMode(self, mode):
         """Sets the serialization mode for the system.
-        
+
         :param mode: (TaurusSerializationMode) the new serialization mode"""
         self._serialization_mode = mode
-    
+
     def getSerializationMode(self):
         """Gives the serialization operation mode.
-        
+
         :return: (TaurusSerializationMode) the current serialization mode"""
         return self._serialization_mode
-    
+
     def setOperationMode(self, mode):
-        """Sets the operation mode for the system.
-        
+        """Deprecated. Sets the operation mode for the system.
+
         :param mode: (OperationMode) the new operation mode"""
-        self.debug("Setting operation mode to %s" % OperationMode.whatis(mode))
-        if mode == OperationMode.OFFLINE:
-            self._initial_default_scheme = self.default_scheme
-            self.default_scheme = "simulation"
-        else:
-            self.default_scheme = self._initial_default_scheme
-            
-        self._operation_mode = mode
-        for plugin in self.getPlugins().values():
-            plugin().setOperationMode(mode)
-        
+        dep = 'setOperationMode'
+        rel = 'Taurus4'
+        dbg_msg = "Don't use this method"
+        msg = '%s is deprecated (from %s). %s' % (dep, rel, dbg_msg)
+        self.deprecated(msg)
+
     def getOperationMode(self):
-        """Gives the current operation mode.
-        
+        """Deprecated. Gives the current operation mode.
+
         :return: (OperationMode) the current operation mode"""
-        return self._operation_mode
-        
+        dep = 'getOperationMode'
+        rel = 'Taurus4'
+        dbg_msg = "Don't use this method"
+        msg = '%s is deprecated (from %s). %s' % (dep, rel, dbg_msg)
+        self.deprecated(msg)
+        return OperationMode.ONLINE
+
     def getDefaultFactory(self):
         """Gives the default factory.
-        
+
         :return: (taurus.core.taurusfactory.TaurusFactory) the default taurus 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.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.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:
@@ -194,85 +192,98 @@ class TaurusManager(Singleton, Logger):
 
     def getObject(self, cls, name):
         """Gives the object for the given class with the given name
-        
+
         :param cls: (taurus.core.taurusmodel.TaurusModel) object class
         :param name: (str) the object name
         :return: (taurus.core.taurusmodel.TaurusModel or None) a taurus model object
         """
         factory = self._get_factory(name)
-        if factory is None: return
+        if factory is None:
+            return
         return factory.getObject(cls, name)
-    
+
     def findObject(self, absolute_name):
         """Finds the object with the given name
-        
+
         :param absolute_name: (str) the object name
-        :return: (taurus.core.taurusmodel.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)
-        if factory is None: return
+        if factory is None:
+            return
         return factory.findObject(absolute_name)
 
-    def findObjectClass(self,absolute_name):
+    def findObjectClass(self, absolute_name):
         """Finds the object class for the given object name
-        
+
         :param absolute_name: (str) the object name
-        :return: (class taurus.core.taurusmodel.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)
-        if factory is None: return
+        if factory is None:
+            return
         return factory.findObjectClass(absolute_name)
-    
-    def getDatabase(self, name):
+
+    def getAuthority(self, name):
         """Returns a database object for the given name
-        
+
         :param name: (str) database name
-        :return: (taurus.core.taurusdatabase.TaurusDatabase) the database for the given name
+        :return: (taurus.core.taurusauthority.TaurusAuthority) the authority for the given name
         """
-        return self.getObject(TaurusDatabase, name)
+        return self.getObject(TaurusAuthority, name)
+
+    def getDatabase(self, name):
+        """Deprecated. Use getAuthority instead"""
+        self.warning('getDatabase is deprecated. Use getAuthority instead')
+        return self.getAuthority(self, name)
 
     def getDevice(self, name):
         """Returns a device object for the given name
-        
+
         :param name: (str) device name
         :return: (taurus.core.taurusdevice.TaurusDevice) the device for the given 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.TaurusAttribute) the attribute for the given name
         """
         return self.getObject(TaurusAttribute, name)
-    
+
+    @taurus4_deprecation(alt='getAttribute')
     def getConfiguration(self, name):
         """Returns a configuration object for the given name
-        
+
         :param name: (str) configuration name
         :return: (taurus.core.taurusconfiguration.TaurusConfiguration) the configuration for the given name
         """
-        return self.getObject(TaurusConfiguration, name)
-        
+        return self.getAttribute(name)
+
     def _get_factory(self, name):
-        scheme = self._get_scheme(name)
-        if scheme is None: return
+        scheme = self.getScheme(name)
+        if scheme is None:
+            return
         try:
             return self.getPlugins()[scheme]()
         except:
-            raise TaurusException('Invalid scheme "%s"'%scheme)
+            raise TaurusException('Invalid scheme "%s"' % scheme)
+
+    def getScheme(self, name):
+        '''Returns the scheme name for a given model name
+
+        :param name: (str) model name
+        :return: (str) scheme name
+        '''
+        return getSchemeFromName(name, implicit=True)
 
-    def _get_scheme(self, name):
-        try:
-            return name[:name.index('://')]
-        except ValueError, e:
-            return self.default_scheme
-        
     def _get_schema(self, name):
-        raise DeprecationWarning('_get_schema is deprecated. Use _get_scheme instead')
+        raise DeprecationWarning(
+            '_get_schema is deprecated. Use getScheme instead')
 
     def _build_plugins(self):
         plugin_classes = self._get_plugin_classes()
@@ -282,17 +293,23 @@ class TaurusManager(Singleton, Logger):
             for scheme in schemes:
                 if plugins.has_key(scheme):
                     k = plugins[scheme]
-                    self.warning("Conflicting plugins: %s and %s both implement " \
+                    self.warning("Conflicting plugins: %s and %s both implement "
                                  "scheme %s. Will keep using %s" % (k.__name__,
-                                 plugin_class.__name__, scheme, k.__name__) )
+                                                                    plugin_class.__name__, scheme, k.__name__))
                 else:
                     plugins[scheme] = plugin_class
         return plugins
-        
+
+    def buildPlugins(self):
+        '''Returns the current valid plugins
+
+        :return: (dic) plugins
+        '''
+        return self._build_plugins()
+
     def _get_plugin_classes(self):
-        import taurusfactory
         upgrade_classes = []
-        
+
         elems = os.listdir(self._this_path)
         dirs = []
         for elem in elems:
@@ -307,20 +324,23 @@ class TaurusManager(Singleton, Logger):
             if not os.path.exists(os.path.join(elem, '__init__.py')):
                 continue
             dirs.append(elem)
-        
+
         plugins = []
-        
-        full_module_names = ['taurus.core.%s'%d.split(os.path.sep)[-1] for d in dirs]
+
+        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',[]))
-        
+        full_module_names.extend(
+            getattr(tauruscustomsettings, 'EXTRA_SCHEME_MODULES', []))
+
         for full_module_name in full_module_names:
             try:
                 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(), ['*'])
+                    m = __import__(full_module_name,
+                                   globals(), locals(), ['*'])
                 except:
                     self.debug('Failed to inspect %s' % (full_module_name))
                     self.debug('Details:', exc_info=1)
@@ -330,7 +350,7 @@ class TaurusManager(Singleton, Logger):
                 try:
                     if issubclass(s, TaurusFactory) and \
                        issubclass(s, Singleton):
-                        if hasattr(s, 'schemes') :
+                        if hasattr(s, 'schemes'):
                             schemes = getattr(s, 'schemes')
                             if len(schemes):
                                 plugin = s
@@ -345,21 +365,21 @@ class TaurusManager(Singleton, Logger):
                     self.debug('Found plugin %s' % plugin.__name__)
                     plugins.append(plugin)
         return plugins
-        
+
     def _find_scheme(self, factory_class):
         class_name = factory_class.__name__
-        for i in xrange(1,len(class_name)):
+        for i in xrange(1, len(class_name)):
             if class_name[i].isupper():
                 return class_name[:i].lower()
 
     def applyPendingOperations(self, ops):
         """Executes the given operations
-        
+
         :param ops: the sequence of operations
         :type ops: sequence<taurus.core.taurusoperation.TaurusOperation>"""
         for o in ops:
             o.execute()
-            
+
     def changeDefaultPollingPeriod(self, period):
         plugin_classes = self._get_plugin_classes()
         for plugin_class in plugin_classes:
@@ -368,13 +388,13 @@ class TaurusManager(Singleton, Logger):
 
     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 4f11b9d..25fcd2d 100644
--- a/lib/taurus/core/taurusmodel.py
+++ b/lib/taurus/core/taurusmodel.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -37,67 +37,68 @@ from .util.log import Logger
 from .util.event import CallableRef, BoundMethodWeakref
 from .taurusbasetypes import TaurusEventType, MatchLevel
 
+
 class TaurusModel(Logger):
-    
-    RegularEvent = (TaurusEventType.Change, TaurusEventType.Config, TaurusEventType.Periodic)
 
-    def __init__(self,full_name, parent, serializationMode=None):
+    RegularEvent = (TaurusEventType.Change,
+                    TaurusEventType.Config, TaurusEventType.Periodic)
+
+    def __init__(self, full_name, parent, serializationMode=None):
         v = self.getNameValidator()
-        self._full_name, self._norm_name, self._simp_name = v.getNames(full_name, self.factory())
-        
+        self._full_name, self._norm_name, self._simp_name = v.getNames(
+            full_name, self.factory())
+
         if self._full_name is None and self._norm_name and self._simp_name is None:
             self.trace("invalid name")
-        
+
         name = self._simp_name or self._norm_name or self._full_name or 'TaurusModel'
         self.call__init__(Logger, name, parent)
-        
+
         if serializationMode is None:
             s_obj = parent
             if s_obj is None:
                 s_obj = self.factory()
                 serializationMode = s_obj.getSerializationMode()
         self._serialization_mode = serializationMode
-        
-        try:
-            self._parentObj = weakref.ref(parent)
-        except Exception:
-            self._parentObj = None
+
+        self._parentObj = parent
         self._listeners = []
 
     def __str__name__(self, name):
         return '{0}({1})'.format(self.__class__.__name__, name)
-    
+
     def __str__(self):
         return self.__str__name__(self.getNormalName())
 
     def __repr__(self):
         return self.__str__name__(self.getFullName())
-    
+
     def cleanUp(self):
         self.trace("[TaurusModel] cleanUp")
-        #self._parentObj = None
+        self._parentObj = None
         self._listeners = None
         Logger.cleanUp(self)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # API for Factory access
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-   
-    
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
     @classmethod
     def factory(cls):
-        raise RuntimeError("TaurusModel::factory cannot be called")
+        raise NotImplementedError("TaurusModel.factory cannot be called")
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # API for naming
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-    
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     @classmethod
     def getTaurusElementType(cls):
-        raise RuntimeError("TaurusModel::getTaurusElementType cannot be called")
+        raise NotImplementedError("TaurusModel.getTaurusElementType cannot"
+                                  " be called")
 
     def getFullName(self):
         return self._full_name
-    
+
     def getNormalName(self):
         return self._norm_name
 
@@ -105,158 +106,193 @@ class TaurusModel(Logger):
         return self._simp_name
 
     @classmethod
-    def isValid(cls, name, level = MatchLevel.ANY):
-        return cls.getNameValidator().isValid(name, level)
+    def isValid(cls, *args, **kwargs):
+        return cls.getNameValidator().isValid(*args, **kwargs)
 
     @classmethod
     def buildModelName(cls, parent_model, relative_name):
-        raise RuntimeError("TaurusModel::buildModelName cannot be called")
-    
+        raise NotImplementedError(
+            "TaurusModel.buildModelName cannot be called")
+
     @classmethod
     def getNameValidator(cls):
-        raise RuntimeError("TaurusModel::getNameValidator cannot be called")
-            
+        raise NotImplementedError("TaurusModel.getNameValidator cannot be"
+                                  "called")
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # API for hierarchy access 
+    # API for hierarchy access
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-        
+
     def getParentObj(self):
-        if self._parentObj is None: return None
-        return self._parentObj()
-    
-    def getChildObj(self,child_name):
-        return None
+        return self._parentObj
+
+    def getChildObj(self, child_name):
+        return None  # TODO: consider raising NotImplementedError instead
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # API for serialization
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def setSerializationMode(self, mode):
         """Sets the serialization mode for the system.
-        
+
         :param mode: (TaurusSerializationMode) the new serialization mode"""
         self._serialization_mode = mode
-    
+
     def getSerializationMode(self):
         """Gives the serialization operation mode.
-        
+
         :return: (TaurusSerializationMode) the current serialization mode"""
         return self._serialization_mode
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # API for value access 
+    # API for value access
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def getValueObj(self,cache=True):
-        raise RuntimeError("TaurusModel::getValueObj cannot be called")
-    
-    def getDisplayValue(self,cache=True):
-        raise RuntimeError("TaurusModel::getDisplayValue cannot be called")
-    
-    def getDisplayDescrObj(self,cache=True):
+
+    def getDisplayDescrObj(self, cache=True):
         """A brief description of the model. Can be used as tooltip, for example"""
-        raise RuntimeError("TaurusModel::getDisplayDescrObj cannot be called")
-    
-    def getDisplayName(self,cache=True, complete=True):
+        raise NotImplementedError("TaurusModel.getDisplayDescrObj cannot be"
+                                  " called")
+
+    def getDisplayName(self, cache=True, complete=True):
         full_name = self.getFullName()
         normal_name = self.getNormalName()
         simple_name = self.getSimpleName()
         if simple_name:
-            ret = simple_name 
-            if complete: ret += " (" + normal_name.upper() + ")"
+            ret = simple_name
+            if complete:
+                ret += " (" + normal_name.upper() + ")"
         elif normal_name:
             ret = normal_name.upper()
         else:
             ret = full_name.upper()
         return ret
-            
+
+    def getFragmentObj(self, fragmentName=None):
+        """Returns a fragment object of the model. A fragment of a model is a
+        python attribute of the model object.
+
+        Fragment names including dots will be used to recursively get fragments
+        of fragments.
+
+        For a simple fragmentName (no dots), this is roughly equivalent to
+        getattr(self, fragmentName)
+
+        If the model does not have the fragment, :class:`AttributeError` is
+        raised
+
+        :param fragmentName: (str or None) the returned value will correspond to
+                         the given fragmentName. If None is passed the
+                         defaultFragmentName will be used instead.
+
+        :return: (obj) the member of the modelObj referred by the fragment.
+        """
+        if fragmentName is None:
+            fragmentName = self.defaultFragmentName
+        obj = self
+        for fn in fragmentName.split('.'):
+            if fn == '':
+                # avoid a generic Exception, make it AttributeError instead
+                raise AttributeError('Cannot get empty fragment')
+            obj = getattr(obj, fn)
+        return obj
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # API for listeners
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def _listenerDied(self, weak_listener):
-        if self._listeners is None: 
+        if self._listeners is None:
             return
         try:
             self._listeners.remove(weak_listener)
-        except Exception,e:
+        except Exception, e:
             pass
-        
-    def _getCallableRef(self, listener, cb = None):
-        #return weakref.ref(listener, self._listenerDied)
+
+    def _getCallableRef(self, listener, cb=None):
+        # return weakref.ref(listener, self._listenerDied)
         meth = getattr(listener, 'eventReceived', None)
         if meth is not None and operator.isCallable(meth):
             return weakref.ref(listener, cb)
         else:
             return CallableRef(listener, cb)
-    
+
     def addListener(self, listener):
-        if self._listeners is None or listener is None: 
+        if self._listeners is None or listener is None:
             return False
-        
+
         weak_listener = self._getCallableRef(listener, self._listenerDied)
         if weak_listener in self._listeners:
             return False
         self._listeners.append(weak_listener)
         return True
-    
+
     def removeListener(self, listener):
-        if self._listeners is None: 
+        if self._listeners is None:
             return
         weak_listener = self._getCallableRef(listener)
         try:
             self._listeners.remove(weak_listener)
-        except Exception,e:
+        except Exception, e:
             return False
         return True
-                    
+
     def forceListening(self):
         class __DummyListener:
+
             def eventReceived(self, *args):
                 pass
         if not hasattr(self, '__dummyListener') or self.__dummyListener is None:
             self.__dummyListener = __DummyListener()
             self.addListener(self.__dummyListener)
-        
+
     def unforceListening(self):
         if hasattr(self, '__dummyListener') and self.__dummyListener is not None:
             self.removeListener(self.__dummyListener)
             self.__dummyListener = None
-    
+
     def deleteListener(self, listener):
         self.deprecated("Use removeListener(listener) instead")
         self.removeListener(listener)
-        
+
     def hasListeners(self):
         """ returns True if anybody is listening to events from this attribute """
-        if self._listeners is None: 
+        if self._listeners is None:
             return False
         return len(self._listeners) > 0
-        
+
     def fireEvent(self, event_type, event_value, listeners=None):
         """sends an event to all listeners or a specific one"""
-        
+
         if listeners is None:
             listeners = self._listeners
-        
+
         if listeners is None:
             return
-        
+
         if not operator.isSequenceType(listeners):
             listeners = listeners,
-            
+
         for listener in listeners:
             if isinstance(listener, weakref.ref) or isinstance(listener, BoundMethodWeakref):
                 l = listener()
             else:
                 l = listener
-            if l is None: continue
+            if l is None:
+                continue
             meth = getattr(l, 'eventReceived', None)
             if meth is not None and operator.isCallable(meth):
                 l.eventReceived(self, event_type, event_value)
             elif operator.isCallable(l):
                 l(self, event_type, event_value)
-            
+
     def isWritable(self):
         return False
-        
+
+    @property
+    def name(self):
+        return self._simp_name
+
+    @property
+    def fullname(self):
+        return self._full_name
diff --git a/lib/taurus/core/taurusoperation.py b/lib/taurus/core/taurusoperation.py
index 25117af..e5f4518 100644
--- a/lib/taurus/core/taurusoperation.py
+++ b/lib/taurus/core/taurusoperation.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -31,11 +31,13 @@ __docformat__ = "restructuredtext"
 
 from .util.log import Logger
 
+
 class TaurusOperation(Logger):
 
-    def __init__(self, name='TaurusOperation', parent=None, callbacks = None):
+    def __init__(self, name='TaurusOperation', parent=None, callbacks=None):
         self.call__init__(Logger, name, parent)
-        if callbacks is None: callbacks = []
+        if callbacks is None:
+            callbacks = []
         self._callbacks = callbacks
         self._dangerMessage = None
         self._isDangerous = False
@@ -51,7 +53,7 @@ class TaurusOperation(Logger):
 
     def execute(self):
         for f in self._callbacks:
-            f(operation = self)
+            f(operation=self)
 
     def isDangerous(self):
         return self._isDangerous
@@ -70,8 +72,9 @@ class TaurusOperation(Logger):
 
 class WriteAttrOperation(TaurusOperation):
 
-    def __init__(self, attr, value, callbacks = None):
-        self.call__init__(TaurusOperation, 'WriteAttrOperation', attr, callbacks=callbacks)
+    def __init__(self, attr, value, callbacks=None):
+        self.call__init__(TaurusOperation, 'WriteAttrOperation',
+                          attr, callbacks=callbacks)
         self.attr = attr
         self.value = value
 
diff --git a/lib/taurus/core/tauruspollingtimer.py b/lib/taurus/core/tauruspollingtimer.py
index e8eb563..3cf50c1 100644
--- a/lib/taurus/core/tauruspollingtimer.py
+++ b/lib/taurus/core/tauruspollingtimer.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,7 +29,10 @@ __all__ = ["TaurusPollingTimer"]
 
 __docformat__ = "restructuredtext"
 
-from .util.log import Logger
+import time
+import threading
+
+from .util.log import Logger, DebugIt
 from .util.containers import CaselessDict
 from .util.timer import Timer
 
@@ -37,10 +40,10 @@ from .util.timer import Timer
 class TaurusPollingTimer(Logger):
     """ Polling timer manages a list of attributes that have to be polled in
     the same period """
-    
+
     def __init__(self, period, parent=None):
         """Constructor
-        
+
            :param period: (int) polling period (miliseconds)
            :param parent: (Logger) parent object (default is None)
         """
@@ -48,37 +51,43 @@ class TaurusPollingTimer(Logger):
         self.call__init__(Logger, name, parent)
         self.dev_dict = {}
         self.attr_nb = 0
-        self.timer = Timer(period/1000.0, self._pollAttributes, self)
-        
+        self.timer = Timer(period / 1000.0, self._pollAttributes, self)
+        self.lock = threading.RLock()
+
     def start(self):
         """ Starts the polling timer """
         self.timer.start()
-    
+
     def stop(self):
         """ Stop the polling timer"""
         self.timer.stop()
-    
-    def containsAttribute(self,attribute):
+
+    def containsAttribute(self, attribute):
         """Determines if the polling timer already contains this attribute
-        
+
            :param attribute: (taurus.core.taurusattribute.TaurusAttribute) the attribute
-           
+
            :return: (bool) True if the attribute is registered for polling or
                     False otherwise
         """
-        attr_dict = self.dev_dict.get(attribute.getParentObj(), {})
-        return attribute.getSimpleName() in attr_dict
+        dev, attr_name = attribute.getParentObj(), attribute.getSimpleName()
+        self.lock.acquire()
+        try:
+            attr_dict = self.dev_dict.get(dev)
+            return attr_dict and attr_dict.has_key(attr_name)
+        finally:
+            self.lock.release()
 
     def getAttributeCount(self):
         """Returns the number of attributes registered for polling
-        
+
            :return: (int) the number of attributes registered for polling
         """
         return self.attr_nb
 
-    def addAttribute(self,attribute, auto_start=True):
+    def addAttribute(self, attribute, auto_start=True):
         """Registers the attribute in this polling.
-        
+
            :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
@@ -87,7 +96,10 @@ class TaurusPollingTimer(Logger):
         dev, attr_name = attribute.getParentObj(), attribute.getSimpleName()
         attr_dict = self.dev_dict.get(dev)
         if attr_dict is None:
-            self.dev_dict[dev] = attr_dict = CaselessDict()
+            if attribute.factory().caseSensitive:
+                self.dev_dict[dev] = attr_dict = {}
+            else:
+                self.dev_dict[dev] = attr_dict = CaselessDict()
         if attr_name not in attr_dict:
             attr_dict[attr_name] = attribute
             self.attr_nb += 1
@@ -96,12 +108,12 @@ class TaurusPollingTimer(Logger):
         else:
             import taurus
             taurus.Manager().addJob(attribute.poll, None)
-        
-    def removeAttribute(self,attribute):
+
+    def removeAttribute(self, attribute):
         """Unregisters the attribute from this polling. If the number of registered
            attributes decreses to 0 the polling is stopped automatically in order
            to save resources.
-        
+
            :param attribute: (taurus.core.taurusattribute.TaurusAttribute) the attribute to be added
         """
         dev, attr_name = attribute.getParentObj(), attribute.getSimpleName()
@@ -115,7 +127,7 @@ class TaurusPollingTimer(Logger):
             self.attr_nb -= 1
         if self.attr_nb < 1:
             self.stop()
-        
+
     def _pollAttributes(self):
         """Polls the registered attributes. This method is called by the timer
            when it is time to poll. Do not call this method directly
diff --git a/lib/taurus/core/taurusvalidator.py b/lib/taurus/core/taurusvalidator.py
index 33df99f..e4e08bf 100644
--- a/lib/taurus/core/taurusvalidator.py
+++ b/lib/taurus/core/taurusvalidator.py
@@ -2,311 +2,316 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 the base taurus name validator classes"""
 
-__all__ = ["AbstractTangoValidator", "DatabaseNameValidator",
-           "DeviceNameValidator", "AttributeNameValidator",
-           "ConfigurationNameValidator"]
+
+__all__ = ["TaurusAuthorityNameValidator", "TaurusDeviceNameValidator",
+           "TaurusAttributeNameValidator"]
+
 
 __docformat__ = "restructuredtext"
 
 import re
+from taurus import tauruscustomsettings
+from taurus.core.util.singleton import Singleton
+from taurus.core.taurushelper import makeSchemeExplicit
 
-from .taurusbasetypes import MatchLevel
-from .util.singleton import Singleton
-
-InvalidAlias = "nada"
-
-class AbstractTangoValidator:
-    
-    complete_name = None
-    normal_name = None
-    short_name = None
-    
-    uri_gen_delims = "\:\/\?\#\[\]\@"
-    # theoreticaly sub_delims should include '+' but we are more permissive here in tango
-    #uri_sub_delims = "\!\$\&\'\(\)\*\+\,\;\="
-    uri_sub_delims = "\!\$\&\'\(\)\*\,\;\="
-    uri_reserved = uri_gen_delims + uri_sub_delims
-    tango_word = '[^' + uri_reserved + ']+'
-    protocol_prefix = 'tango://'
+
+class _TaurusBaseValidator(Singleton):
+    '''This is a private base class for taurus base validators. Do not derive
+    from it if you are implementing a new scheme. Derive from the public
+    classes from this module instead.
+    '''
+    scheme = None
+    auth = '(?!)'  # note: '(?!)' is a pattern that will never match
+    path = '(?!)'
+    query = '(?!)'
+    fragment = '(?!)'
 
     def __init__(self):
-        self.complete_re = re.compile("^%s$" % self.complete_name)
-        self.normal_re = re.compile("^%s$" % self.normal_name)
-        self.short_re = re.compile("^%s$" % self.short_name)
-
-    def __getMatch(self,str):
-        return self.complete_re.match(str) or self.normal_re.match(str) or self.short_re.match(str)
-
-    def isValid(self,str, matchLevel = MatchLevel.ANY):
-        if matchLevel == MatchLevel.ANY:
-            return not self.__getMatch(str) is None
-        elif matchLevel == MatchLevel.SHORT:
-            return not self.short_re.match(str) is None
-        elif matchLevel == MatchLevel.NORMAL:
-            return not self.normal_re.match(str) is None
-        elif matchLevel == MatchLevel.COMPLETE:
-            return not self.complete_re.match(str) is None
-        elif matchLevel == MatchLevel.SHORT_NORMAL:
-            return self.isValid(str,MatchLevel.SHORT) or \
-                   self.isValid(str,MatchLevel.NORMAL)
-        elif matchLevel == MatchLevel.NORMAL_COMPLETE:
-            return self.isValid(str,MatchLevel.NORMAL) or \
-                   self.isValid(str,MatchLevel.COMPLETE)
-        return False
-    
-    def getParams(self,str):
-        m = self.__getMatch(str)
-        if m is None:
-            return None
-        return m.groupdict()
-    
-    def getNames(self, str, factory=None):
-        """Returns a tuple of three elements with (complete_name, normal_name, short_name)
-        or None if no match is found"""
+        if self.scheme is None:
+            msg = ('This is  an abstract name validator class. ' +
+                   'Only scheme-specific derived classes can be instantiated')
+            raise NotImplementedError(msg)
+
+        self.name_re = re.compile(self.namePattern)
+        if self.nonStrictNamePattern is not None:
+            self.nonStrictName_re = re.compile(self.nonStrictNamePattern)
+        else:
+            self.nonStrictName_re = None
+
+    @property
+    def namePattern(self):
+        '''Provides a name pattern by composing the pattern strings for the
+        URI segments'''
+        return self.pattern % dict(scheme=self.scheme,
+                                   authority=self.authority,
+                                   path=self.path,
+                                   query=self.query,
+                                   fragment=self.fragment)
+
+    @property
+    def nonStrictNamePattern(self):
+        '''implement in derived classes if a "less strict" pattern is allowed
+        (e.g. for backwards-compatibility, "tango://a/b/c" could be an accepted
+        device name, even if it breaks RFC3986).
+        '''
         return None
 
+    def isValid(self, name, matchLevel=None, strict=None):
+        '''Whether the name matches the validator pattern.
+        If strict is False, it also tries to match against the non-strict regexp
+        (It logs a warning if it matched only the non-strict alternative)
 
-class DatabaseNameValidator(Singleton, AbstractTangoValidator):
-    
-    protocol_prefix = '((?P<scheme>tango)://)?'
-    
-    db = '(?P<host>([\w\-_]+\.)*[\w\-_]+):(?P<port>\d{1,5})'
-    # for tango://host:port
-    complete_name = '(' + protocol_prefix + ')?' + db
-    # for a/b/c
-    normal_name = db
-    # for devalias
-    short_name = db
-    
-    def __init__(self):
-        pass
-    
-    def init(self, *args, **kwargs):
-        """Singleton instance initialization."""
-        AbstractTangoValidator.__init__(self)
-        
-    def getNames(self, str, factory=None):
-        elems = self.getParams(str)
-        if elems is None:
-            return str, None, None
-        
-        host = elems.get('host')
-        port = elems.get('port')
-        
-        if host is None or port is None or len(host) == 0 or len(port) == 0:
+        .. note:: The "matchLevel" keyword argument is deprecated and only
+                  implemented for backwards compatibility. Do not use it for
+                  new classes
+        '''
+        # warn if the deprecated matchLevel kwarg was received
+        if matchLevel is not None:
+            return self._isValidAtLevel(name, matchLevel=matchLevel)
+        return self.getUriGroups(name, strict=strict) is not None
+
+    def _isValidAtLevel(self, name, matchLevel=None):
+        # matchLevel is a tango-centric deprecated  argument of isValid. Warn.
+        msg = ('matchLevel is a Tango-centric concept. Avoid it outside ' +
+               'the tango scheme')
+        from taurus import warning
+        warning(msg)
+        return self.isValid(name)
+
+    def getUriGroups(self, name, strict=None):
+        '''returns the named groups dictionary from the URI regexp matching.
+        If strict is False, it also tries to match against the non-strict regexp
+        (It logs a warning if it matched only the non-strict alternative)
+        '''
+        if strict is None:
+            strict = getattr(tauruscustomsettings, 'STRICT_MODEL_NAMES', False)
+        name = makeSchemeExplicit(name, default=self.scheme)
+        m = self.name_re.match(name)
+        # if it is strictly valid, return the groups
+        if m is not None:
+            ret = m.groupdict()
+            ret['__STRICT__'] = True
+            return ret
+        # if we are strict (or no less-strict pattern is defined) return None
+        if strict or self.nonStrictName_re is None:
+            return None
+        # If a less-strict pattern is defined, use it, but warn if it works
+        m = self.nonStrictName_re.match(name)
+        if m is None:
             return None
-        
-        return 3*('%s:%s' % (host,port),)
+        else:
+            from taurus import warning
+            msg = ('Model name "%s" is supported but not strictly valid. \n' +
+                   'It is STRONGLY recommended that you change it to \n' +
+                   'strictly follow %s scheme syntax') % (name, self.scheme)
+            warning(msg)
+            ret = m.groupdict()
+            ret['__STRICT__'] = False
+            return ret
 
+    def getParams(self, name):
+        # deprecation warning
+        msg = ('%s.getParams() is deprecated. Use getUriGroups() instead.' %
+               self.__class__.__name__)
+        from taurus import warning
+        warning(msg)
+        # support old group names
+        groups = self.getUriGroups(name, strict=False)
+        if groups is None:
+            return None
+        groups = dict(groups)  # copy, just in case
+        groups['devicename'] = groups.get('devname')
+        groups['devalias'] = groups.get('_devalias')
+        groups['attributename'] = groups.get('_shortattrname')
+        groups['configparam'] = groups.get('fragment')
+        return groups
 
-class DatabaseQueryValidator(Singleton, AbstractTangoValidator):
-    """Deprecated"""
-    
-    query = '\?query=(?P<query>[\w\-_]+)(?P<params>(\?param=[\w\*\?\%\-_]+)*)'
+    def getNames(self, fullname, factory=None):
+        """Returns a tuple of three elements with  (complete_name, normal_name,
+        short_name) or None if no match is found.
+        The definitions of each name are:
 
-    complete_name = DatabaseNameValidator.complete_name + query 
-    normal_name = DatabaseNameValidator.normal_name + query
-    short_name = query
-    
-    def __init__(self):
-        pass
-    
-    def init(self, *args, **kwargs):
-        """Singleton instance initialization."""
-        AbstractTangoValidator.__init__(self)
-
-    def getNames(self, str, factory=None):
-        elems = self.getParams(str)
-        if elems is None:
-            return str,None
-        
-        query = elems.get('query')
-        params = elems.get('params')
-        
-        short = normal = query
-        if params:
-            normal += str(params.split('?param=')[1:])
-        return str, normal, short    
-            
-
-class DeviceNameValidator(Singleton, AbstractTangoValidator):
-    
-    w = AbstractTangoValidator.tango_word
-    dev = '(?P<devicename>' + w + '/' + w + '/' + w + ')'
-    # for tango://host:port/a/b/c/attrname or host:port/a/b/c
-    complete_name = DatabaseNameValidator.complete_name + '/' + dev
-    # for a/b/c
-    normal_name = DatabaseNameValidator.protocol_prefix + dev
-    # for devalias
-    short_name = '(?P<devalias>'+ w + ')'
+        - complete: the full URI allowing an unambiguous identification of the
+          model within taurus (note: it must include the scheme).
+        - normal: an unambiguous URI at the scheme level. Any parts that are
+          optional and equal to the scheme's default can be stripped.
+          In particular, the scheme name is typically stripped for all schemes.
+        - short: a short name (not necessarily a valid URI) useful for display
+          in cases where ambiguity is tolerable.
 
-    def __init__(self):
-        pass
-    
-    def init(self, *args, **kwargs):
-        """Singleton instance initialization."""
-        AbstractTangoValidator.__init__(self)
-        
-    def getNames(self, str, factory=None):
-        elems = self.getParams(str)
-        if elems is None:
-            return str,None
-        
-        dev_name = elems.get('devicename')
-        alias = elems.get('devalias')
-        
-        host = elems.get('host')
-        port = elems.get('port')
-        
-        if factory is None:
-            return dev_name or '', dev_name or '', alias or ''
-
-        db = None
-        try:
-            if host and port:
-                db = factory.getDatabase("%s:%s" % (host,port))
-                #db = PyTango.Database(host,int(port))
-            else:
-                #db = PyTango.Database()
-                db = factory.getDatabase()
-        except:
-            return dev_name or '', dev_name or '', alias or ''
-        
-        if dev_name:
-            alias = db.getElementAlias(dev_name) or dev_name
-        else:
-            dev_name = db.getElementFullName(alias)
-        
-        complete = "%s:%s/%s" % (host,port,dev_name)
-        return complete, dev_name, alias
+        Example: In a tango system where the default TANGO_HOST is "foo:123"
+        and a device "a/b/c" has been defined with alias "bar" and having an
+        attribute called "d", getNames would return:
 
+        - for the authority::
 
-class DeviceQueryValidator(Singleton, AbstractTangoValidator):
-    """Deprecated"""
-    query = DatabaseQueryValidator.query
+            ('tango://foo:123', '//foo:123', 'foo:123')
 
-    complete_name = DeviceNameValidator.complete_name + query 
-    normal_name = DeviceNameValidator.normal_name + query
-    short_name = DeviceNameValidator.short_name + query
+        - for the device::
 
-    def __init__(self):
-        pass
-    
-    def init(self, *args, **kwargs):
-        """Singleton instance initialization."""
-        AbstractTangoValidator.__init__(self)    
-
-    def getNames(self,str, factory=None):
-        elems = self.getParams(str)
-        if elems is None:
-            return str,None
-        
-        query = elems.get('query')
-        params = elems.get('params')
-        
-        short = query
-        if params:
-            short += str(params.split('?param=')[1:])
-        return str,short    
-
-    
-class AttributeNameValidator(Singleton, AbstractTangoValidator):
-    
-    w = AbstractTangoValidator.tango_word
-    attr = '/(?P<attributename>' + w + ')'
-    # for tango://host:port/a/b/c/attributename or host:port/a/b/c/attributename
-    complete_name = DeviceNameValidator.complete_name + attr
-    # for a/b/c/attributename
-    normal_name = DeviceNameValidator.normal_name + attr
-    # for devalias/attributename
-    short_name = DeviceNameValidator.short_name + attr
-    
-    def __init__(self):
-        """ Initialization. Nothing to be done here for now."""
-        pass
-    
-    def init(self, *args, **kwargs):
-        """Singleton instance initialization."""
-        AbstractTangoValidator.__init__(self)
-
-    def getNames(self, str, factory=None):
-        """Returns the complete and short names"""
-        
-        elems = self.getParams(str)
-        if elems is None:
-            return None
-        
-        dev_name = elems.get('devicename')
-        attr_name = elems.get('attributename')
-        
-        if dev_name:
-            normal_name = dev_name + "/" + attr_name
-        else:
-            normal_name = attr_name
-            
-        return str, normal_name, attr_name
-    
-    
-class ConfigurationNameValidator(Singleton, AbstractTangoValidator):
-    
-    w = AbstractTangoValidator.tango_word
-    conf = "\?(?i)configuration(=(?P<configparam>" + w + "))*"
-    # for tango://host:port/a/b/c/attrname or host:port/a/b/c/attrname
-    complete_name = AttributeNameValidator.complete_name + conf
-    # for a/b/c/attrname
-    normal_name = AttributeNameValidator.normal_name + conf
-    # for devalias/attrname
-    short_name = AttributeNameValidator.short_name + conf
+            ('tango://foo:123/a/b/c', 'a/b/c', 'bar')
 
-    def __init__(self):
-        """ Initialization. Nothing to be done here for now."""
+            note: if foo:123 wasn't the default TANGO_HOST, the normal name
+            would be '//foo:123/a/b/c'. Equivalent rules apply to Attribute
+            normal names.
+
+        - for the attribute::
 
-    def init(self, *args, **kwargs):
-        """Singleton instance initialization."""
-        AbstractTangoValidator.__init__(self)
+            ('tango://foo:123/a/b/c/d', 'a/b/c/d', 'd')
 
-    def getNames(self, str, factory=None):
-        """Returns the complete and short names"""
-        
-        elems = self.getParams(str)
-        if elems is None:
+            note: if foo123 wasn't the default TANGO_HOST, the normal name
+            would be '//foo:123/a/b/c/d'
+
+         - for the attribute (assuming we passed #label)::
+
+            ('tango://foo:123/a/b/c/d#label',
+             'a/b/c/d#label',
+             'd#label')
+
+         - for the attribute (assuming we did not pass a conf key)::
+            ('tango://foo:123/a/b/c/d#',
+             'a/b/c/d#',
+             'd#')
+
+        Note: it must always be possible to construct the 3 names from a *valid*
+        **fullname** URI. If the given URI is valid but it is not the full name,
+        it may still be possible in some cases to construct the 3 names, but
+        it may involve using defaults provided by the scheme (which may require
+        more computation than mere parsing the URI)
+        """
+        raise NotImplementedError('getNames must be implemented in derived ' +
+                                  'classes')
+
+
+class TaurusAuthorityNameValidator(_TaurusBaseValidator):
+    '''Base class for Authority name validators.
+    The namePattern will be composed from URI segments as follows:
+
+    <scheme>:<authority>[/<path>][?<query>][#<fragment>]
+
+    Derived classes must provide attributes defining a regexp string for each
+    URI segment (they can be empty strings):
+
+    - scheme
+    - authority
+    - path
+    - query
+    - fragment
+    '''
+    pattern = r'^(?P<scheme>%(scheme)s):' + \
+              r'(?P<authority>%(authority)s)' + \
+              r'((?=/)(?P<path>%(path)s))?' + \
+              r'(\?(?P<query>%(query)s))?' + \
+              r'(#(?P<fragment>%(fragment)s))?$'
+
+    def getNames(self, name, factory=None):
+        '''basic implementation for getNames for authorities. You may
+        reimplement it in your scheme if required'''
+        groups = self.getUriGroups(name)
+        if groups is None:
             return None
-                
-        dev_name = elems.get('devicename')
-        attr_name = elems.get('attributename')
-        simple = elems.get('configparam') or 'configuration'
-        
-        if dev_name:
-            normal = dev_name + "/" + attr_name + "?configuration=" + simple
-        elif attr_name:
-            normal = attr_name + "?configuration=" + simple
-        else:
-            normal = simple
-        
-        ret  = str,normal,simple
-        return ret
-    
+        complete = '%(scheme)s:%(authority)s' % groups
+        normal = '%(authority)s' % groups
+        short = ('%(authority)s' % groups).strip('/')
+        return complete, normal, short
+
+
+class TaurusDeviceNameValidator(_TaurusBaseValidator):
+    '''Base class for Device name validators.
+    The namePattern will be composed from URI segments as follows:
+
+    <scheme>:[<authority>/]<path>[?<query>][#<fragment>]
+
+    Derived classes must provide attributes defining a regexp string for each
+    URI segment (they can be empty strings):
+
+    - scheme
+    - authority
+    - path
+    - query
+    - fragment
+
+    Additionally, the namePattern resulting from composing the above segments
+    must contain a named group called "devname" (normally within the
+    path segment).
+    '''
+    pattern = r'^(?P<scheme>%(scheme)s):' + \
+              r'((?P<authority>%(authority)s)(?=/))?' + \
+              r'(?P<path>%(path)s)' + \
+              r'(\?(?P<query>%(query)s))?' + \
+              r'(#(?P<fragment>%(fragment)s))?$'
+
+
+class TaurusAttributeNameValidator(_TaurusBaseValidator):
+    '''Base class for Attribute name validators.
+    The namePattern will be composed from URI segments as follows:
+
+    <scheme>:[<authority>/]<path>[?<query>][#<fragment>]
+
+    Derived classes must provide attributes defining a regexp string for each
+    URI segment (they can be empty strings):
+
+    - scheme
+    - authority
+    - path
+    - query
+    - fragment
+
+    Additionally, the namePattern resulting from composing the above segments
+    must contain a named group called "attrname" (normally within the
+    path segment).
+    '''
+    pattern = r'^(?P<scheme>%(scheme)s):' + \
+              r'((?P<authority>%(authority)s)(?=/))?' + \
+              r'(?P<path>%(path)s)' + \
+              r'(\?(?P<query>%(query)s))?' + \
+              r'(#(?P<fragment>%(fragment)s))?$'
+
+
+class TaurusDatabaseNameValidator(TaurusAuthorityNameValidator):
+    '''Backwards-compatibility only. Use TaurusAuthorityNameValidator instead'''
+
+    def __init__(self, *args, **kwargs):
+        msg = ('%s is deprecated. Use "Authority" instead of "Database"' %
+               self.__class__.__name__)
+        from taurus import warning
+        warning(msg)
+        return TaurusAuthorityNameValidator.__init__(self, *args, **kwargs)
+
+
+if __name__ == '__main__':
+
+    class FooAttributeNameValidator(TaurusAttributeNameValidator):
+        scheme = 'foo'
+        authority = '[^?#/]+'
+        path = '[^?#]+'
+        query = '(?!)'
+        fragment = '[^?#]*'
 
+    v = FooAttributeNameValidator()
+    name = 'foo://bar#label'
+    print v.isValid(name)
+    print v.getUriGroups(name)
diff --git a/lib/taurus/core/test/__init__.py b/lib/taurus/core/test/__init__.py
new file mode 100644
index 0000000..f90808b
--- /dev/null
+++ b/lib/taurus/core/test/__init__.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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 .basevalidator import valid, invalid, names, AbstractNameValidatorTestCase
+from .modelequality import (TaurusModelEqualityTestCase,
+                            testAttributeModelEquality,
+                            testDeviceModelEquality)
diff --git a/lib/taurus/core/test/basevalidator.py b/lib/taurus/core/test/basevalidator.py
new file mode 100644
index 0000000..06f2af1
--- /dev/null
+++ b/lib/taurus/core/test/basevalidator.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test util module for creating test cases for name validators"""
+
+#__all__ = []
+
+__docformat__ = 'restructuredtext'
+
+
+from functools import partial
+from taurus.test import insertTest
+
+from taurus.core.taurusvalidator import TaurusAttributeNameValidator
+
+valid = partial(insertTest, helper_name='isValid')
+invalid = partial(insertTest, helper_name='isInvalid')
+names = partial(insertTest, helper_name='getNames')
+
+
+class AbstractNameValidatorTestCase(object):
+    '''A util class to create test cases for name validators'''
+    validator = None  # implement in derived classes
+
+    def isValid(self, name=None, groups=None, strict=True):
+        msg = '%s should be valid (with strict=%s)' % (name, strict)
+        self.assertTrue(self.validator().isValid(name, strict=strict), msg)
+        if groups is not None:
+            returned = self.validator().getUriGroups(name, strict=strict)
+            for k, v in groups.iteritems():
+                msg = ('"%s" not in %s.getUriGroups("%s"). Returned %s' %
+                       (k, self.validator.__name__, name, returned))
+                self.assertIn(k, returned, msg=msg)
+                msg = ('%s.getUriGroups("%s")["%s"] should be "%s". ' +
+                       'Returned "%s"\nGroups: %s') % (self.validator.__name__,
+                                                       name, k, v, returned[k],
+                                                       str(returned))
+                self.assertEqual(v, returned[k], msg=msg)
+
+    def isInvalid(self, name=None, groups=None, strict=True,
+                  exceptionType=None):
+        try:
+            valid = self.validator().isValid(name, strict=strict)
+            groups = self.validator().getUriGroups(name, strict=strict)
+            msg = '%s should be invalid. Matched: %s' % (name, groups)
+            self.assertFalse(valid, msg)
+        except exceptionType:
+            # do not fail if the exception is expected
+            pass
+        else:
+            # there was no exception. Check if an exception was expected
+            msg = '%s should raise %s' % (name, exceptionType)
+            self.assertTrue(exceptionType is None, msg)
+
+    def test_singleton(self):
+        '''Check that the validator is a singleton'''
+        self.assertIs(self.validator(), self.validator())
+
+    def getNames(self, name=None, out=None):
+        v = self.validator()
+        if isinstance(v, TaurusAttributeNameValidator):
+            fragment = len(out) > 3
+            names = v.getNames(name, fragment=fragment)
+        else:
+            names = v.getNames(name)
+        self.assertEqual(names, out)
diff --git a/lib/taurus/core/test/modelequality.py b/lib/taurus/core/test/modelequality.py
new file mode 100644
index 0000000..6f57e3f
--- /dev/null
+++ b/lib/taurus/core/test/modelequality.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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 functools
+
+from taurus import Device, Attribute  # , Authority
+from taurus.test import insertTest
+
+
+class TaurusModelEqualityTestCase(object):
+    """Base class for taurus model equality testing."""
+
+    def modelsEqual(self, models, class_, equal=True):
+        """A helper method to create tests that checks equality (or inequality)
+        of taurus objects e.g. TaurusAttribute.
+
+        :param models: (seq<str>): a sequence of two taurus models
+        :param class_: (function) model factory function
+        :param equal: (bool) If True, check equality. Else check inequality
+        """
+        name1, name2 = models
+        obj1 = class_(name1)
+        obj2 = class_(name2)
+        if equal:
+            msg = 'models for %s and %s are not equal (they should)' % \
+                  (name1, name2)
+            self.assertIs(obj1, obj2, msg)
+        else:
+            msg = 'models for %s and %s are equal (they should not)' % \
+                  (name1, name2)
+            self.assertIsNot(obj1, obj2, msg)
+
+
+testDeviceModelEquality = functools.partial(insertTest,
+                                            helper_name='modelsEqual',
+                                            class_=Device,
+                                            test_method_name='testDeviceModelEquality')
+
+testAttributeModelEquality = functools.partial(insertTest,
+                                               helper_name='modelsEqual',
+                                               class_=Attribute,
+                                               test_method_name='testAttributeModelEquality')
diff --git a/lib/taurus/core/test/modulemanager.py b/lib/taurus/core/test/modulemanager.py
new file mode 100644
index 0000000..cdcb770
--- /dev/null
+++ b/lib/taurus/core/test/modulemanager.py
@@ -0,0 +1,150 @@
+import imp
+import importlib
+from sys import modules
+from taurus.core.util.singleton import Singleton
+
+
+class ModuleManager(Singleton):
+    '''ModuleManager class is an helper to manager the python modules.
+       This class has methods to import, reload, and block python modules.
+    '''
+
+    def __init__(self):
+        self._modules = {}
+
+    def _deleteModule(self, modname):
+        ''' Remove the given module name from the exported python modules
+
+        :param modname: Module name
+        :type modname: str
+        '''
+        try:
+            thismod = modules[modname]
+        except KeyError:
+            # This module is not imported
+            raise ValueError(modname)
+        these_symbols = dir(thismod)
+
+        del modules[modname]
+        for mod in modules.values():
+            try:
+                delattr(mod, modname)
+            except AttributeError:
+                pass
+
+    def blockModule(self, modname):
+        ''' Remplace the given module name by None. inhibits the module.
+
+        :param modname: Module name
+        :type modname: str
+        '''
+        if self._modules.get(modname) is None:
+            self.importModule(modname)
+
+        if modules[modname] is not None:
+            _mod = {}
+            _mod['mod'] = modules[modname]
+            _mod['submod'] = []
+            # Delete and block submodules
+            for mod in modules.keys():
+                if mod.find(modname) != -1:
+                    _mod['submod'].append((mod, modules[mod]))
+                    self._deleteModule(mod)
+                    modules[mod] = None
+            # Delete and block the module
+            self._deleteModule(modname)
+            modules[modname] = None
+            self._modules[modname] = _mod
+
+    def reloadModule(self, modname):
+        '''Reload the given module name.
+
+        :param modname: Module name
+        :type modname: str
+        '''
+        if self._modules.get(modname) is None:
+            msg = 'ModuleManager: Trying to reload a not imported module, %s'\
+                  % (modname)
+            print msg
+            return
+        # Reload the submodules
+        for subname, submod in self._modules[modname]['submod']:
+            modules[subname] = submod
+        # Reload the module
+        modules[modname] = self._modules[modname]['mod']
+        imp.reload(self._modules[modname]['mod'])
+
+    def importModule(self, modname):
+        ''' Import the given module name.
+
+        :param modname: Module name
+        :type modname: str
+        '''
+        try:
+            mod = __import__(modname)
+            modules[modname] = mod
+            _mod = {}
+            _mod['mod'] = mod
+            _mod['submod'] = []
+            self._modules[modname] = _mod
+        except ImportError:
+            print 'Imposible to import the module %s' % (modname)
+
+    def _getModuleDict(self, modname):
+        ''' Return a dictionary with the given module name and its submodels
+            if exists or None.
+
+        :param modname: Module name
+        :type modname: str
+
+        :return dictionary
+        '''
+        return self._modules.get(modname)
+
+    def getModule(self, modname):
+        ''' Return a module of the given module name if exists or None.
+
+        :param modname: Module name
+        :type modname: str
+
+        :return python module
+        '''
+        d = self._getModuleDict(modname)
+        if d is None:
+            return None
+        return d['mod']
+
+#---------------------Just 4 Test-----------------------------------------
+
+
+def blockPyTango(modmanager):
+    import taurus
+    from taurus.core.taurusmanager import TaurusManager
+    tm = TaurusManager()
+    print '\n-*-*-*-*-*- Block PyTango'
+    modmanager.blockModule('PyTango')
+    taurus.check_dependencies()
+    print '\n -- Taurus plugins'
+    print tm.buildPlugins()
+
+
+def reloadPyTango(modmanager):
+    import taurus
+    from taurus.core.taurusmanager import TaurusManager
+    tm = TaurusManager()
+    print '\n-*-*-*-*-*- Reload PyTango'
+    modmanager.reloadModule('PyTango')
+    taurus.check_dependencies()
+    print '\n -- Taurus plugins'
+    print tm.buildPlugins()
+
+
+def test():
+    modmanager = ModuleManager()
+    blockPyTango(modmanager)
+    reloadPyTango(modmanager)
+    blockPyTango(modmanager)
+
+
+if __name__ == '__main__':
+    test()
diff --git a/lib/taurus/core/test/test_tauruscoreindependent.py b/lib/taurus/core/test/test_tauruscoreindependent.py
new file mode 100644
index 0000000..8e755a2
--- /dev/null
+++ b/lib/taurus/core/test/test_tauruscoreindependent.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core being PyTango Independent"""
+
+__docformat__ = 'restructuredtext'
+
+from taurus.external import unittest
+# import functools
+# from taurus.test import insertTest
+# from modulemanager import ModuleManager
+#
+# # Decorator
+# isTangoAvailable = functools.partial(insertTest, helper_name='isTangoAvailable',
+#                             blockPytango=False)
+#
+#
+# *TODO
+#@isTangoAvailable(blockPytango=True)
+#@isTangoAvailable() # Default False
+#@isTangoAvailable(blockPytango=True)
+
+
+class CoreTangoIndependentTestCase(unittest.TestCase):
+    '''Test the Tango-independent core. As part of the SEP3 specification
+       Taurus's core must be functional without PyTango.
+       This test checks that you can import taurus without PyTango.
+    '''
+
+    def _importTaurus(self):
+        ''' Helper method'''
+        try:
+            import taurus
+        except ImportError:
+            raise ImportError("Cannot import Taurus")
+
+    def test_basicImport(self):
+        '''Check if Taurus can be imported without PyTango
+        '''
+        # skip if PyTango is available
+        try:
+            import PyTango
+            msg = 'Cannot test Tango-independence if PyTango can be imported'
+            self.skipTest(msg)
+        except ImportError:
+            pass
+        # check that taurus can be imported
+        self.assertRaises(ImportError, self._importTaurus())
+
+#     _modmanager = ModuleManager()
+#     def _basicImportWithoutPyTango(self):
+#         '''Basic test just try to import taurus (without PyTango)
+#         '''
+#         # TODO:
+#         # _basicImportWithoutPyTango -> test_basicImportWithoutPyTango
+#         # We have problems blocking modules so this test failed
+#         self._modmanager.blockModule('PyTango')
+#         self.assertRaises(ImportError, self._importTaurus())
+#
+#     def isTangoAvailable(self, blockPytango=False):
+#         '''Test to check is Tango module is available for Taurus
+#         '''
+#         # TODO:
+#         # We have problems blocking modules so this test failed because that
+#         if blockPytango:
+#             self._modmanager.blockModule('PyTango')
+#
+#         from taurus.core.taurusmanager import TaurusManager
+#         plugins = TaurusManager().buildPlugins()
+#
+#         if blockPytango:
+#             print '\t***', plugins
+#             msg = 'Taurus is using Tango scheme, but you are blocking PyTango'
+#             self.assertFalse('tango' in plugins, msg)
+#         else:
+#             msg = 'Taurus can not use Tango scheme, maybe you have not' +\
+#                   ' installed PyTango'
+#             self.assertTrue('tango' in plugins, msg)
+#
+#
+#     def tearDown(self):
+#         ''' Restore the original PyTango module'''
+#         # *TODO
+#         #self._modmanager.reloadModule('PyTango')
+#         pass
+#
diff --git a/lib/taurus/core/test/test_taurushelper.py b/lib/taurus/core/test/test_taurushelper.py
new file mode 100644
index 0000000..6659396
--- /dev/null
+++ b/lib/taurus/core/test/test_taurushelper.py
@@ -0,0 +1,467 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Test for taurus.core.taurushelper"""
+
+#__all__ = []
+
+__docformat__ = 'restructuredtext'
+
+import numpy
+import functools
+from taurus.external import unittest
+from taurus.external.pint import Quantity
+import taurus
+from taurus.test import insertTest
+from taurus.core import (TaurusElementType, TaurusAttribute, TaurusDevice,
+                         TaurusAuthority, DataType, TaurusAttrValue, DataFormat)
+
+# decorators
+isValid = functools.partial(insertTest, helper_name='isValid')
+isInvalid = functools.partial(insertTest, helper_name='isValid',
+                              expected=False)
+isValidAuth = functools.partial(insertTest, helper_name='isValid',
+                                elementType=TaurusElementType.Authority)
+isInvalidAuth = functools.partial(insertTest, helper_name='isValid',
+                                  expected=False,
+                                  elementType=TaurusElementType.Authority)
+isValidDev = functools.partial(insertTest, helper_name='isValid',
+                               elementType=TaurusElementType.Device)
+isInvalidDev = functools.partial(insertTest, helper_name='isValid',
+                                 expected=False,
+                                 elementType=TaurusElementType.Device)
+isValidAttr = functools.partial(insertTest, helper_name='isValid',
+                                elementType=TaurusElementType.Attribute)
+isInvalidAttr = functools.partial(insertTest, helper_name='isValid',
+                                  expected=False,
+                                  elementType=TaurusElementType.Attribute)
+
+from taurus import tauruscustomsettings
+DEFAULT_SCHEME = getattr(tauruscustomsettings, 'DEFAULT_SCHEME')
+
+
+ at isValidAuth(name='//implicittangodb:123', skip=(DEFAULT_SCHEME != 'tango'))
+ at isValidAuth(name='tango://foo:10000')
+ at isInvalidAuth(name='tango://foo bar:10000')
+ at isInvalidAuth(name='tango://db')
+ at isInvalidAuth(name='tango://db:10000/a/b/c')
+ at isInvalidAuth(name='tango://db:')
+ at isInvalidAuth(name='tango://db:10000/')
+ at isInvalidAuth(name='tango://a/b/c')
+ at isValidDev(name='implicit/tango/devname', skip=(DEFAULT_SCHEME != 'tango'))
+ at isValidDev(name='implicittangoalias', skip=(DEFAULT_SCHEME != 'tango'))
+ at isValidDev(name='tango://db:10000/alias')
+ at isValidDev(name='tango://foo:10000/a/b/c')
+ at isValidDev(name='tango:alias')
+ at isValidDev(name='tango://alias', strict=False)
+ at isValidDev(name='tango:a/b/c')
+ at isValidDev(name='tango:a/b  /c')
+ at isValidDev(name='tango://a/b/c', strict=False)
+ at isInvalidDev(name='tango://a/b/c', strict=True)
+ at isInvalidDev(name='tango://alias', strict=True)
+ at isInvalidDev(name='tango:a/b/c/')
+ at isInvalidDev(name='tango:a/b')
+ at isInvalidDev(name='tango:a/b/c/d')
+ at isValidAttr(name='implicittangoalias/attrname',
+             skip=(DEFAULT_SCHEME != 'tango'))
+ at isValidAttr(name='implicit/tango/attr/name', skip=(DEFAULT_SCHEME != 'tango'))
+ at isValidAttr(name='tango:alias/attr')
+ at isValidAttr(name='tango://alias/attr', strict=False)
+ at isValidAttr(name='tango://foo:10000/a/b/c/d')
+ at isValidAttr(name='tango:a/b/c/d')
+ at isValidAttr(name='tango://a/b/c/d', strict=False)
+# @isValidAttr(name='epics://my:example.RBV') disabled till bug #215 is fixed
+ at isValidAttr(name='tango:a/b  /c/d')
+ at isInvalidAttr(name='tango:a/b/c/d/')
+ at isInvalidAttr(name='tango:a/b/c')
+ at isValidAttr(name='implicit/tango/attr/name#label',
+             skip=(DEFAULT_SCHEME != 'tango'))
+ at isValidAttr(name='implicittangoalias/attrname#label',
+             skip=(DEFAULT_SCHEME != 'tango'))
+ at isValidAttr(name='tango:alias/attr#label')
+ at isValidAttr(name='tango://foo:10000/a/b/c/d#label')
+ at isValidAttr(name='tango:a/b/c/d#label')
+ at isValidAttr(name='tango:a/b  /c/d#label')
+ at isValidAttr(name='tango://a/b/c/d?configuration=label', strict=False)
+ at isInvalidAttr(name='tango://a/b/c/d#label', strict=True)
+ at isInvalidAttr(name='tango://a/b')
+ at isInvalidAttr(name='tango://a/b/c')
+ at isInvalidAttr(name='tango://a/b/c/d')
+ at isValidAuth(name='eval://localhost')
+ at isInvalidAuth(name='eval://foo')
+ at isInvalidAuth(name='evaluation://db=foo')
+ at isInvalidAuth(name='evaluation://localhost')
+ at isInvalidAuth(name='eval://db=foo')
+ at isInvalidAuth(name='eval://localhost#')
+ at isInvalidAuth(name='eval://')
+ at isInvalidAuth(name='evaluation://user@host:port')
+ at isInvalidAuth(name='eval://user@host:port')
+ at isInvalidAuth(name='eval://user:host@port')
+ at isInvalidAuth(name='eval://user@host:port/1')
+ at isInvalidAuth(name='eval:{tango://localhost:10000}')
+ at isValidAuth(name='evaluation://db=foo', strict=False)
+ at isValidAuth(name='eval://db=foo', strict=False)
+ at isInvalidAuth(name='eval://foo', strict=False)
+ at isInvalidAuth(name='eval://DB=foo', strict=False)
+ at isValidDev(name='eval:@module.EvalClass')
+ at isValidDev(name='eval:@1')
+ at isValidDev(name='eval:@Foo')
+ at isValidDev(name='eval:@FOO')
+ at isValidDev(name='eval://localhost/@Foo')
+ at isValidDev(name='eval://localhost/@mod.Class')
+ at isInvalidDev(name='evaluation:@Foo')
+ at isInvalidDev(name='eval://db=foo')
+ at isInvalidDev(name='eval://dev=bar')
+ at isInvalidDev(name='eval:')
+ at isInvalidDev(name='eval:@Foo#')
+ at isInvalidDev(name='eval:1')
+ at isInvalidDev(name='eval:DEV=bar')
+ at isInvalidDev(name='eval:@DEV=bar')
+ at isValidDev(name='eval://db=foo;dev=bar', strict=False)
+ at isValidDev(name='eval://dev=bar', strict=False)
+ at isValidDev(name='eval://dev=bar?a=1;b=2', strict=False)
+# yes, this is ok
+ at isValidDev(name='eval://dev=bar?configuration', strict=False)
+ at isInvalidDev(name='eval:dev=bar', strict=False)
+ at isInvalidDev(name='eval://db=Bla/dev=bar', strict=False)
+ at isValidAttr(name='eval:1')
+ at isValidAttr(name='eval:/1')
+ at isValidAttr(name='eval:@bar/1')
+ at isValidAttr(name='evaluation://db=foo;dev=bar;1', strict=False)
+ at isValidAttr(name='eval://db=foo;dev=bar;1', strict=False)
+ at isValidAttr(name='eval://dev=bar;foo', strict=False)
+ at isValidAttr(name='eval://2+3', strict=False)
+ at isValidAttr(name='evaluation://2+3', strict=False)
+ at isValidAttr(name='eval://a+b?a=2;b=3', strict=False)
+ at isValidAttr(name='eval://a*{tango://a/b/c/d}?a=10', strict=False)
+ at isValidAttr(name='eval://dev=bar/1', strict=False)
+ at isValidAttr(name='eval://a[:2]?a=[1,2,3]', strict=False)
+ at isValidAttr(name='eval://{eval://1}', strict=False)
+ at isValidAttr(name='eval://{eval://{eval://1}}', strict=False)
+ at isValidAttr(name='eval:{tango:a/b/c/d}*2')
+ at isValidAttr(name='eval:k=2;a={tango:a/b/c/d};a*k')
+ at isValidAttr(name='eval:@mymod.MyEvalClass/k=2;a={tango:a/b/c/d};a*k')
+ at isValidAttr(name='eval://localhost/k=2;a={tango:a/b/c/d};a*k')
+ at isValidAttr(name='eval://localhost/@Foo/k=2;a={tango:a/b/c/d};a*k')
+ at isValidAttr(name='eval:a=[1,2,3];a[:2]')
+ at isValidAttr(name='eval:{eval:1}')
+ at isValidAttr(name='eval:{eval:{eval:1}}')
+ at isInvalidAttr(name='EVAL:1')
+ at isInvalidAttr(name='evaluation:1')
+ at isInvalidAttr(name='eval://db=foo;dev=bar;1')
+ at isInvalidAttr(name='eval://2+3')
+ at isInvalidAttr(name='evaluation://2+3')
+ at isInvalidAttr(name='eval:a+b?a=2;b=3')
+ at isValidAttr(name='eval:foo#')
+ at isInvalidAttr(name='eval:{tango:a/b/c}*2')
+ at isInvalidAttr(name='eval:k-a;k=2;a=3')
+ at isInvalidAttr(name='eval:a=1;b=2;a+b;a*2')
+ at isInvalidAttr(name='eval:a=1;b=2;a+b;;;')
+ at isInvalidAttr(name='eval:a=1;;;b=2;a+b')
+ at isValidAttr(name='eval:a=2;b=3;a+b#label')
+ at isValidAttr(name='eval:{tango:a/b/c/d}#')
+ at isValidAttr(name='eval:{tango:a/b/c/d}*2#label')
+ at isValidAttr(name='eval:k=2;a=3;a*k#units')
+ at isValidAttr(name='eval://localhost/@mymod.MyClass/1#label')
+ at isValidAttr(name='eval:{tango:a/b/c/d}*2#1+2')
+ at isInvalidAttr(name='eval:{tango:a/b/c}*2#')
+ at isInvalidAttr(name='eval:2# ')
+ at isInvalidAttr(name='evaluation:1#label')
+ at isInvalidAttr(name='eval://dev=bar;foo#label')
+ at isInvalidAttr(name='eval:a+b;a=2;b=3#label')
+ at isInvalidAttr(name='eval://foo')
+ at isValidAttr(name='evaluation://db=foo;dev=bar;1?configuration=label', strict=False)
+ at isValidAttr(name='eval://db=foo;dev=bar;1?configuration=label', strict=False)
+ at isValidAttr(name='eval://dev=bar;foo?configuration=label', strict=False)
+ at isValidAttr(name='eval://2+3?configuration=label', strict=False)
+ at isValidAttr(name='eval://a+b?a=2;b=3?configuration=label', strict=False)
+class IsValidNameTestCase(unittest.TestCase):
+    '''Class to test validity or invalidity of taurus URIs'''
+
+    def isValid(self, name=None, expected=True, elementType=None,
+                strict=True, skip=False, skipmsg='Test explicitly disabled'):
+        '''Helper method to test validity or invalidity of taurus URIs'''
+        if skip:
+            self.skipTest(skipmsg)
+        if elementType is None:
+            elementName = '<any>'
+        else:
+            elementName = TaurusElementType.whatis(elementType)
+            elementType = [elementType]
+        manager = taurus.Manager()
+        scheme = manager.getScheme(name)
+        supportedSchemes = manager.getPlugins().keys()
+        if scheme not in supportedSchemes:
+            self.skipTest('"%s" scheme not supported' % scheme)
+        returned = taurus.isValidName(name, etypes=elementType, strict=strict)
+
+        msg = ('isValidName returns %s (expected %s for name=%s and etype=%s)' %
+               (returned, expected, name, elementName))
+        self.assertEqual(returned, expected, msg)
+
+    def test_unsupported(self):
+        '''Testing that an unsupported scheme validates as False'''
+        returned = taurus.isValidName('_unsupported_://foo')
+        msg = ('Validating unsupported schemes must return False (got %s)' %
+               returned)
+        self.assertFalse(returned, msg)
+
+
+#@insertTest(helper_name='get_object', name='eval://foo')
+ at insertTest(helper_name='get_object', name='eval://localhost')
+class AuthorityTestCase(unittest.TestCase):
+    '''TestCase for the taurus.Authority helper'''
+
+    def get_object(self, name=None, klass=None):
+        '''check if Authority returns the expected type'''
+        if klass is None:
+            klass = TaurusAuthority
+        manager = taurus.Manager()
+        scheme = manager.getScheme(name)
+        supportedSchemes = manager.getPlugins().keys()
+        if scheme not in supportedSchemes:
+            self.skipTest('"%s" scheme not supported' % scheme)
+        a = taurus.Authority(name)
+        msg = ('%s("%s") is not an instance of %s (it is %s)' %
+               (taurus.Authority.__name__, name,
+                klass.__name__, a.__class__.__name__))
+        self.assertTrue(isinstance(a, klass), msg)
+
+
+ at insertTest(helper_name='get_object', name='tango:a/b/c')
+ at insertTest(helper_name='get_object', name='eval://localhost/@Foo')
+ at insertTest(helper_name='get_object', name='eval:@Foo')
+ at insertTest(helper_name='get_object', name='eval://dev=Foo')
+ at insertTest(helper_name='get_object',
+            name='eval:@taurus.core.evaluation.dev_example.FreeSpaceDevice')
+ at insertTest(helper_name='get_object',
+            name='eval://dev=taurus.core.evaluation.dev_example.FreeSpaceDevice'
+            )
+class DeviceTestCase(unittest.TestCase):
+    '''TestCase for the taurus.Device helper'''
+
+    def get_object(self, name=None, klass=None):
+        '''check if Device returns the expected type'''
+        if klass is None:
+            klass = TaurusDevice
+        manager = taurus.Manager()
+        scheme = manager.getScheme(name)
+        supportedSchemes = manager.getPlugins().keys()
+        if scheme not in supportedSchemes:
+            self.skipTest('"%s" scheme not supported' % scheme)
+
+        a = taurus.Device(name)
+        msg = ('%s("%s") is not an instance of %s (it is %s)' %
+               (taurus.Device.__name__, name,
+                klass.__name__, a.__class__.__name__))
+
+        self.assertTrue(isinstance(a, klass), msg)
+
+
+ at insertTest(helper_name='read_attr',
+            name='eval:2*{eval:x=2;x}',
+            expected=dict(label='2*x', data_format=DataFormat._0D,
+                          type=DataType.Integer))
+ at insertTest(helper_name='read_attr',
+            name='eval:x=-1;x+{eval:x=2;x}+{eval:x=10;x}',
+            expected=dict(data_format=DataFormat._0D, wvalue=None, w_value=None,
+                          label='x+x+x',
+                          type=DataType.Integer))
+ at insertTest(helper_name='read_attr', name='eval://2*{eval://1.0}+{eval://2.0}',
+            expected=dict(data_format=DataFormat._0D, type=DataType.Float,
+                          label='2*1.0+2.0'))
+ at insertTest(helper_name='read_attr',
+            name='eval:2*{tango:sys/tg_test/1/short_scalar}',
+            expected=dict(data_format=DataFormat._0D, type=DataType.Integer,
+                          label='2*short_scalar'))
+ at insertTest(helper_name='read_attr',
+            name='eval:1==1',
+            expected=dict(data_format=DataFormat._0D, type=DataType.Boolean,
+                          label='1==1'))
+ at insertTest(helper_name='read_attr',
+            name='eval:[1,2,3]',
+            expected=dict(data_format=DataFormat._1D, type=DataType.Integer,
+                          label='[1,2,3]'))
+ at insertTest(helper_name='read_attr',
+            name='eval:img={tango:sys/tg_test/1/short_image_ro};img+10*rand(*img.shape)',
+            expected=dict(data_format=DataFormat._2D, type=DataType.Float))
+ at insertTest(helper_name='read_attr',
+            name='eval:{tango:sys/tg_test/1/string_image}',
+            expected=dict(data_format=DataFormat._2D, type=DataType.String))
+ at insertTest(helper_name='get_object', name='tango:a/b/c/d')
+ at insertTest(helper_name='read_attr', name='tango:sys/tg_test/1/short_scalar',
+            expected=dict(data_format=DataFormat._0D, type=DataType.Integer,
+                          label='short_scalar'))
+ at insertTest(helper_name='read_attr', name='tango:sys/tg_test/1/float_image',
+            expected=dict(data_format=DataFormat._2D, type=DataType.Float,
+                          label='float_image'))
+ at insertTest(helper_name='read_attr', name='tango:sys/tg_test/1/boolean_scalar',
+            expected=dict(data_format=DataFormat._0D, type=DataType.Boolean,
+                          label='boolean_scalar'))
+ at insertTest(helper_name='read_attr', name='tango:sys/tg_test/1/double_spectrum',
+            expected=dict(data_format=DataFormat._1D, type=DataType.Float,
+                          label='double_spectrum'))
+ at insertTest(helper_name='read_attr', name='eval:1.0',
+            expected=dict(rvalue=1.0, value=1.0,
+                          wvalue=None, w_value=None, label='1.0',
+                          type=DataType.Float, data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:x=3;x+1',
+            expected=dict(rvalue=4, value=4, wvalue=None, w_value=None,
+                          label='x+1',
+                          type=DataType.Integer, data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:2*{eval:3}',
+            expected=dict(rvalue=6, value=6, label='2*3',
+                          wvalue=None, w_value=None,
+                          type=DataType.Integer, data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:2*{eval:3*{eval:4}}',
+            expected=dict(rvalue=24, value=24, label='2*3*4',
+                          wvalue=None, w_value=None, type=DataType.Integer,
+                          data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:1*{eval:2*{eval:3*{eval:4}}}',
+            expected=dict(rvalue=24, value=24,
+                          label='1*2*3*4',
+                          wvalue=None, w_value=None, type=DataType.Integer,
+                          data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:{eval:1}+{eval:9}',
+            expected=dict(rvalue=10, value=10, label='1+9',
+                          wvalue=None, w_value=None, type=DataType.Integer,
+                          data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:"aaa"+"bbb"',
+            expected=dict(rvalue="aaabbb", value="aaabbb", label='"aaa"+"bbb"',
+                          wvalue=None, w_value=None, type=DataType.String,
+                          data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:{eval:"aaa"}+{eval:"bbb"}',
+            expected=dict(rvalue="aaabbb", value="aaabbb",
+                          wvalue=None, w_value=None,
+                          label='"aaa"+"bbb"',
+                          type=DataType.String, data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:{eval:"a"}*3',
+            expected=dict(rvalue="aaa", value="aaa", label='"a"*3',
+                          wvalue=None, w_value=None, type=DataType.String,
+                          data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:len("abc")',
+            expected=dict(rvalue=3, wvalue=None, value=3, w_value=None,
+                          label='len("abc")',
+                          type=DataType.Integer, data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:"a.b.c".split(".")',
+            expected=dict(rvalue=['a', 'b', 'c'], value=['a', 'b', 'c'],
+                          wvalue=None, w_value=None,
+                          label='"a.b.c".split(".")', type=DataType.String,
+                          data_format=DataFormat._1D))
+ at insertTest(helper_name='read_attr', name='eval:[1,1,1].count(1)',
+            expected=dict(rvalue=3, wvalue=None, value=3, w_value=None,
+                          type=DataType.Integer, data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:[1,2,3].reverse()',
+            expected=dict(rvalue=None, value=None, wvalue=None, w_value=None,
+                          label='[1,2,3].reverse()'))
+ at insertTest(helper_name='read_attr',
+            name='eval:[1,1,3].count(1)*{eval:[1,1,3].count(1)*{eval:2}}',
+            expected=dict(rvalue=8, value=8, wvalue=None, w_value=None,
+                          type=DataType.Integer))
+ at insertTest(helper_name='read_attr', name='eval:"split.split".split("split")',
+            expected=dict(rvalue=['', '.', ''], value=['', '.', ''],
+                          wvalue=None, w_value=None,
+                          label='"split.split".split("split")',
+                          type=DataType.String))
+ at insertTest(helper_name='read_attr', name='eval:Quantity(1.0)',
+            expected=dict(rvalue=Quantity(1.0), value=1.0,
+                          w_value=None, wvalue=None, label='Quantity(1.0)',
+                          type=DataType.Float, data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:Quantity("1km")',
+            expected=dict(rvalue=Quantity(1000, 'm'), value=1,
+                          w_value=None, wvalue=None, label='Quantity("1km")',
+                          type=DataType.Integer, data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:Quantity("0.1km")',
+            expected=dict(rvalue=Quantity(100, 'm'), value=0.1,
+                          w_value=None, wvalue=None, label='Quantity("0.1km")',
+                          type=DataType.Float, data_format=DataFormat._0D))
+ at insertTest(helper_name='read_attr', name='eval:Q("1m")*3+{eval:Q(3,"dm")}',
+            expected=dict(rvalue=Quantity("3.3m"), value=3.3,
+                          wvalue=None, w_value=None,
+                          label='Q("1m")*3+Q(3,"dm")',
+                          type=DataType.Float))
+ at insertTest(helper_name='read_attr', name='eval:Q("1km").to("mm").magnitude',
+            expected=dict(rvalue=1e6, value=1e6, wvalue=None, w_value=None,
+                          label='Q("1km").to("mm").magnitude',
+                          type=DataType.Float))
+ at insertTest(helper_name='read_attr', name='eval:1#')
+class AttributeTestCase(unittest.TestCase):
+    '''TestCase for the taurus.Attribute helper'''
+
+    def get_object(self, name=None, klass=None):
+        '''check if Attribute returns the expected type'''
+        if klass is None:
+            klass = TaurusAttribute
+        manager = taurus.Manager()
+        scheme = manager.getScheme(name)
+        supportedSchemes = manager.getPlugins().keys()
+        if scheme not in supportedSchemes:
+            self.skipTest('"%s" scheme not supported' % scheme)
+        a = taurus.Attribute(name)
+        msg = ('%s("%s") is not an instance of %s (it is %s)' %
+               (taurus.Attribute.__name__, name,
+                klass.__name__, a.__class__.__name__))
+        self.assertTrue(isinstance(a, klass), msg)
+        return a
+
+    def read_attr(self, name=None, expected=None, skip=False,
+                  skipmsg='Test explicitly disabled'):
+        '''check creation and correct reading of an attribute'''
+        if skip:
+            self.skipTest(skipmsg)
+        if expected is None:
+            expected = {}
+        a = self.get_object(name)
+        readvalue = a.read()
+        msg = ('read() for "%s" did not return a TaurusAttrValue (got a %s)' %
+               (name, readvalue.__class__.__name__))
+        self.assertTrue(isinstance(readvalue, TaurusAttrValue), msg)
+        for k, exp in expected.iteritems():
+            try:
+                got = getattr(readvalue, k)
+            except AttributeError:
+                msg = ('The read value for "%s" does not provide info on %s' %
+                       (name, k))
+                self.fail(msg)
+            msg = ('Expected %s=%r for "%s" (got %r)' % (k, exp, name, got))
+
+            try:
+                self.assertEqual(got, exp, msg)
+            except ValueError:
+                # Validate the arrays
+                try:
+                    # for those values that can be handled by numpy.allclose()
+                    chk = numpy.allclose(got, exp)
+                except:
+                    # for the rest
+                    if isinstance(got, numpy.ndarray):
+                        got = got.tolist()
+                    chk = bool(got == exp)
+
+                self.assertTrue(chk, msg)
+
+
+if __name__ == '__main__':
+    pass
diff --git a/lib/taurus/core/util/__init__.py b/lib/taurus/core/util/__init__.py
index fa13d8b..207517d 100644
--- a/lib/taurus/core/util/__init__.py
+++ b/lib/taurus/core/util/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -38,9 +38,10 @@ __docformat__ = "restructuredtext"
 
 import taurus.tauruscustomsettings
 
-LIGHTWEIGHT_IMPORTS = getattr(taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False)
+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
+    from init_bkcomp import *
diff --git a/lib/taurus/core/util/argparse/__init__.py b/lib/taurus/core/util/argparse/__init__.py
index 3e8e7de..5d1b5fa 100644
--- a/lib/taurus/core/util/argparse/__init__.py
+++ b/lib/taurus/core/util/argparse/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -27,4 +27,4 @@ __docformat__ = "restructuredtext"
 
 from .taurusargparse import *
 
-__doc__ = taurusargparse.__doc__
\ No newline at end of file
+__doc__ = taurusargparse.__doc__
diff --git a/lib/taurus/core/util/argparse/taurusargparse.py b/lib/taurus/core/util/argparse/taurusargparse.py
index d8eda87..e03cb51 100644
--- a/lib/taurus/core/util/argparse/taurusargparse.py
+++ b/lib/taurus/core/util/argparse/taurusargparse.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -81,6 +81,7 @@ __all__ = ["get_taurus_parser", "init_taurus_args", "parse_taurus_args",
 
 __docformat__ = "restructuredtext"
 
+
 def get_taurus_parser(parser=None):
     """ Returns a :class:`optparse.OptionParser` initialized with a
     :class:`optparse.OptionGroup` containning some taurus options.
@@ -98,14 +99,14 @@ def get_taurus_parser(parser=None):
     g = parser.get_option_group('--taurus-log-level')
     if g is None:
         group = optparse.OptionGroup(parser, "Taurus Options",
-                "Basic options present in any taurus application")
+                                     "Basic options present in any taurus application")
 
         help_tauruslog = "taurus log level. Allowed values are (case insensitive): critical, "\
                          "error, warning/warn, info, debug, trace"
         help_tangohost = "Tango host name"
         help_tauruspolling = "taurus global polling period in milliseconds"
-        help_taurusserial= "taurus serialization mode. Allowed values are (case insensitive): "\
-                           "serial, concurrent (default)"
+        help_taurusserial = "taurus serialization mode. Allowed values are (case insensitive): "\
+            "serial, concurrent (default)"
         help_rcport = "enables remote debugging using the given port"
         group.add_option("--taurus-log-level", dest="taurus_log_level", metavar="LEVEL",
                          help=help_tauruslog, type="str", default="info")
@@ -120,6 +121,7 @@ def get_taurus_parser(parser=None):
         parser.add_option_group(group)
     return parser
 
+
 def parse_taurus_args(parser=None, args=None, values=None):
     """Parses the command line. If parser is not given, then a new parser
     is created. In any case, the parser is initialized using the
@@ -140,6 +142,7 @@ def parse_taurus_args(parser=None, args=None, values=None):
     options, args = parser.parse_args(args=args, values=values)
     return parser, options, args
 
+
 def init_taurus_args(parser=None, args=None, values=None):
     """Parses the command line using :func:`taurus.core.util.argparse.parse_taurus_args`.
 
@@ -156,7 +159,8 @@ def init_taurus_args(parser=None, args=None, values=None):
     :return: a tuple of three elements: parser, options, args
     :rtype: :class:`optparse.OptionParser`, :class:`optparse.Values`, seq<str> """
     import taurus
-    parser, options, args = parse_taurus_args(parser=parser, args=args, values=values)
+    parser, options, args = parse_taurus_args(
+        parser=parser, args=args, values=values)
 
     # initialize taurus log level
     log_level_str = options.taurus_log_level.capitalize()
@@ -187,12 +191,14 @@ def init_taurus_args(parser=None, args=None, values=None):
         try:
             import rfoo.utils.rconsole
             rfoo.utils.rconsole.spawn_server(port=options.remote_console_port)
-            taurus.info("rconsole started. You can connect to it by typing: rconsole -p %d", options.remote_console_port)
+            taurus.info("rconsole started. You can connect to it by typing: rconsole -p %d",
+                        options.remote_console_port)
         except Exception, e:
-            taurus.warning("Cannot spawn debugger. Reason: %s",str(e))
+            taurus.warning("Cannot spawn debugger. Reason: %s", str(e))
 
     return parser, options, args
 
+
 def split_taurus_args(parser, args=None):
     """Splits arguments into valid parser arguments and non valid parser
     arguments.
@@ -204,7 +210,7 @@ def split_taurus_args(parser, args=None):
     :type args: seq<str>
     :return: a tuple of two elements: parser args, non parser args
     :rtype: seq<seq<str>, seq<str>>"""
-    
+
     if args is None:
         import sys
         args = sys.argv
@@ -216,6 +222,5 @@ def split_taurus_args(parser, args=None):
             taurus_args.append(arg)
         else:
             non_taurus_args.append(arg)
-    
-    return taurus_args, non_taurus_args
 
+    return taurus_args, non_taurus_args
diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py
index 0ce4d8c..d39701f 100644
--- a/lib/taurus/core/util/codecs.py
+++ b/lib/taurus/core/util/codecs.py
@@ -2,36 +2,36 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 a list of codecs for the DEV_ENCODED attribute type.
-All codecs are based on the pair *format, data*. The format is a string 
-containing the codec signature and data is a sequence of bytes (string) 
-containing the encoded data. 
+All codecs are based on the pair *format, data*. The format is a string
+containing the codec signature and data is a sequence of bytes (string)
+containing the encoded data.
 
 This module contains a list of codecs capable of decoding several codings like
 bz2, zip and json.
 
-The :class:`CodecFactory` class allows you to get a codec object for a given 
+The :class:`CodecFactory` class allows you to get a codec object for a given
 format and also to register new codecs.
 The :class:`CodecPipeline` is a special codec that is able to code/decode a
 sequence of codecs. This way you can have codecs 'inside' codecs.
@@ -47,7 +47,7 @@ Example::
     >>> f2, enc_d2 = bz2_json_codec.encode(('', data))
     >>> print len(enc_d1), len(enc_d2)
     688890 123511
-    >>> 
+    >>>
     >>> f1, dec_d1 = json_codec.decode((f1, enc_d1))
     >>> f2, dec_d2 = bz2_json_codec.decode((f2, enc_d2))
 
@@ -70,7 +70,7 @@ __docformat__ = "restructuredtext"
 
 import copy
 
-#need by VideoImageCodec
+# need by VideoImageCodec
 import struct
 import numpy
 
@@ -81,38 +81,38 @@ from containers import CaselessDict
 
 class Codec(Logger):
     """The base class for all codecs"""
-    
+
     def __init__(self):
         """Constructor"""
         Logger.__init__(self, self.__class__.__name__)
-    
+
     # TODO: similar code exists in encode and decode methods from different
     # codecs. It should be implemented in this base class 'Codec'.
     def encode(self, data, *args, **kwargs):
         """encodes the given data. This method is abstract an therefore must
         be implemented in the subclass.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
-        :raises: RuntimeError"""
-        raise RuntimeError("decode cannot be called on abstract Codec")
-    
+
+        :raises: NotImplementedError"""
+        raise NotImplementedError("encode cannot be called on abstract Codec")
+
     def decode(self, data, *args, **kwargs):
         """decodes the given data. This method is abstract an therefore must
         be implemented in the subclass.
-        
+
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
-        :raises: RuntimeError"""
-        raise RuntimeError("decode cannot be called on abstract Codec")
+
+        :raises: NotImplementedError"""
+        raise NotImplementedError("decode cannot be called on abstract Codec")
 
     def __str__(self):
         return '%s()' % self.__class__.__name__
-    
+
     def __repr__(self):
         return '%s()' % self.__class__.__name__
 
@@ -123,18 +123,18 @@ class NullCodec(Codec):
         """encodes with Null encoder. Just returns the given data
 
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
         format = 'null'
         if len(data[0]):
             format += '_%s' % data[0]
         return format, data[1]
-    
+
     def decode(self, data, *args, **kwargs):
         """decodes with Null encoder. Just returns the given data
 
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
         if not data[0].startswith('null'):
             return data
@@ -144,11 +144,11 @@ class NullCodec(Codec):
 
 class ZIPCodec(Codec):
     """A codec able to encode/decode to/from gzip format. It uses the :mod:`zlib` module
-    
+
     Example::
-    
+
         >>> from taurus.core.util.codecs import CodecFactory
-        
+
         >>> # first encode something
         >>> data = 100 * "Hello world\\n"
         >>> cf = CodecFactory()
@@ -159,23 +159,24 @@ class ZIPCodec(Codec):
         >>> format, decoded_data = codec.decode((format, encoded_data))
         >>> print decoded_data[20]
         'Hello world\\nHello wo'"""
-    
+
     def encode(self, data, *args, **kwargs):
         """encodes the given data to a gzip string. The given data **must** be a string
-        
+
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
         import zlib
         format = 'zip'
-        if len(data[0]): format += '_%s' % data[0]
+        if len(data[0]):
+            format += '_%s' % data[0]
         return format, zlib.compress(data[1])
-    
+
     def decode(self, data, *args, **kwargs):
         """decodes the given data from a gzip string.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
         import zlib
         if not data[0].startswith('zip'):
@@ -188,9 +189,9 @@ class BZ2Codec(Codec):
     """A codec able to encode/decode to/from BZ2 format. It uses the :mod:`bz2` module
 
     Example::
-    
+
         >>> from taurus.core.util.codecs import CodecFactory
-        
+
         >>> # first encode something
         >>> data = 100 * "Hello world\\n"
         >>> cf = CodecFactory()
@@ -201,23 +202,24 @@ class BZ2Codec(Codec):
         >>> format, decoded_data = codec.decode((format, encoded_data))
         >>> print decoded_data[20]
         'Hello world\\nHello wo'"""
-    
+
     def encode(self, data, *args, **kwargs):
         """encodes the given data to a bz2 string. The given data **must** be a string
-        
+
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
         import bz2
         format = 'bz2'
-        if len(data[0]): format += '_%s' % data[0]
+        if len(data[0]):
+            format += '_%s' % data[0]
         return format, bz2.compress(data[1])
-    
+
     def decode(self, data, *args, **kwargs):
         """decodes the given data from a bz2 string.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
         import bz2
         if not data[0].startswith('bz2'):
@@ -229,11 +231,11 @@ class BZ2Codec(Codec):
 class PickleCodec(Codec):
     """A codec able to encode/decode to/from pickle format. It uses the
     :mod:`pickle` module.
-    
+
     Example::
-        
+
         >>> from taurus.core.util.codecs import CodecFactory
-        
+
         >>> cf = CodecFactory()
         >>> codec = cf.getCodec('pickle')
         >>>
@@ -245,50 +247,51 @@ class PickleCodec(Codec):
         >>> format, decoded_data = codec.decode((format, encoded_data))
         >>> print decoded_data
         {'hello': 'world', 'goodbye': 1000}"""
-    
+
     def encode(self, data, *args, **kwargs):
         """encodes the given data to a pickle string. The given data **must** be
         a python object that :mod:`pickle` is able to convert.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the
                      first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the
                  first item is the encoding format of the second item object"""
         import pickle
         format = 'pickle'
-        if len(data[0]): format += '_%s' % data[0]
+        if len(data[0]):
+            format += '_%s' % data[0]
         # make it compact by default
         kwargs['protocol'] = kwargs.get('protocol', pickle.HIGHEST_PROTOCOL)
         return format, pickle.dumps(data[1], *args, **kwargs)
-    
+
     def decode(self, data, *args, **kwargs):
         """decodes the given data from a pickle string.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the
                      first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the
                  first item is the encoding format of the second item object"""
         import pickle
         if not data[0].startswith('pickle'):
             return data
         format = data[0].partition('_')[2]
-        
+
         if isinstance(data[1], buffer):
             data = data[0], str(data[1])
-        
+
         return format, pickle.loads(data[1])
 
 
 class JSONCodec(Codec):
     """A codec able to encode/decode to/from json format. It uses the
     :mod:`json` module.
-    
+
     Example::
-        
+
         >>> from taurus.core.util.codecs import CodecFactory
-        
+
         >>> cf = CodecFactory()
         >>> codec = cf.getCodec('json')
         >>>
@@ -302,41 +305,42 @@ class JSONCodec(Codec):
         >>> format, decoded_data = codec.decode((format, encoded_data))
         >>> print decoded_data
         {'hello': 'world', 'goodbye': 1000}"""
-    
+
     def encode(self, data, *args, **kwargs):
         """encodes the given data to a json string. The given data **must** be
         a python object that json is able to convert.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the
                      first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the
                  first item is the encoding format of the second item object"""
         import json
         format = 'json'
-        if len(data[0]): format += '_%s' % data[0]
+        if len(data[0]):
+            format += '_%s' % data[0]
         # make it compact by default
-        kwargs['separators'] = kwargs.get('separators', (',',':'))
+        kwargs['separators'] = kwargs.get('separators', (',', ':'))
         return format, json.dumps(data[1], *args, **kwargs)
-    
+
     def decode(self, data, *args, **kwargs):
         """decodes the given data from a json string.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the
                      first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the
                  first item is the encoding format of the second item object"""
         import json
         if not data[0].startswith('json'):
             return data
         format = data[0].partition('_')[2]
-        
+
         ensure_ascii = kwargs.pop('ensure_ascii', False)
-        
+
         if isinstance(data[1], buffer):
             data = data[0], str(data[1])
-        
+
         data = json.loads(data[1])
         if ensure_ascii:
             data = self._transform_ascii(data)
@@ -353,9 +357,9 @@ class JSONCodec(Codec):
             return tuple(self._transform_list(data))
         else:
             return data
-        
+
     def _transform_list(self, lst):
-        return [ self._transform_ascii(item) for item in lst ]
+        return [self._transform_ascii(item) for item in lst]
 
     def _transform_dict(self, dct):
         newdict = {}
@@ -367,11 +371,11 @@ class JSONCodec(Codec):
 class BSONCodec(Codec):
     """A codec able to encode/decode to/from bson format. It uses the
     :mod:`bson` module.
-    
+
     Example::
-        
+
         >>> from taurus.core.util.codecs import CodecFactory
-        
+
         >>> cf = CodecFactory()
         >>> codec = cf.getCodec('bson')
         >>>
@@ -383,27 +387,28 @@ class BSONCodec(Codec):
         >>> _, decoded_data = codec.decode((format, encoded_data))
         >>> print decoded_data
         {'hello': 'world', 'goodbye': 1000}"""
-    
+
     def encode(self, data, *args, **kwargs):
         """encodes the given data to a bson string. The given data **must** be
         a python object that bson is able to convert.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the
                      first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the
                  first item is the encoding format of the second item object"""
         import bson
         format = 'bson'
-        if len(data[0]): format += '_%s' % data[0]
+        if len(data[0]):
+            format += '_%s' % data[0]
         return format, bson.BSON.encode(data[1], *args, **kwargs)
-    
+
     def decode(self, data, *args, **kwargs):
         """decodes the given data from a bson string.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the
                      first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the
                  first item is the encoding format of the second item object"""
         import bson
@@ -411,9 +416,9 @@ class BSONCodec(Codec):
             return data
         format = data[0].partition('_')[2]
         ensure_ascii = kwargs.pop('ensure_ascii', False)
-        
+
         data = data[0], bson.BSON(data[1])
-        
+
         data = self.decode(data[1])
         if ensure_ascii:
             data = self._transform_ascii(data)
@@ -430,9 +435,9 @@ class BSONCodec(Codec):
             return tuple(self._transform_list(data))
         else:
             return data
-        
+
     def _transform_list(self, lst):
-        return [ self._transform_ascii(item) for item in lst ]
+        return [self._transform_ascii(item) for item in lst]
 
     def _transform_dict(self, dct):
         newdict = {}
@@ -443,15 +448,17 @@ class BSONCodec(Codec):
 
 class FunctionCodec(Codec):
     """A generic function codec"""
+
     def __init__(self, func_name):
         Codec.__init__(self)
         self._func_name = func_name
-    
+
     def encode(self, data, *args, **kwargs):
         format = self._func_name
-        if len(data[0]): format += '_%s' % data[0]
-        return format, { 'type' : self._func_name, 'data' : data[1] }
-    
+        if len(data[0]):
+            format += '_%s' % data[0]
+        return format, {'type': self._func_name, 'data': data[1]}
+
     def decode(self, data, *args, **kwargs):
         if not data[0].startswith(self._func_name):
             return data
@@ -460,19 +467,20 @@ class FunctionCodec(Codec):
 
 
 class PlotCodec(FunctionCodec):
-    """A specialization of the :class:`FunctionCodec` for plot function"""    
+    """A specialization of the :class:`FunctionCodec` for plot function"""
+
     def __init__(self):
         FunctionCodec.__init__(self, 'plot')
 
 
 class VideoImageCodec(Codec):
     """A codec able to encode/decode to/from LImA video_image format.
-    
+
     Example::
-    
+
         >>> from taurus.core.util.codecs import CodecFactory
         >>> import PyTango
-        
+
         >>> #first get an image from a LImA device to decode
         >>> data = PyTango.DeviceProxy(ccdName).read_attribute('video_last_image').value
         >>> cf = CodecFactory()
@@ -488,45 +496,45 @@ class VideoImageCodec(Codec):
         >>> struct.unpack('!IHHqiiHHHH',encoded_data[:32])
         (1447314767, 1, 0, -1, 1294, 964, 0, 32, 0, 0)
     """
-    
+
     VIDEO_HEADER_FORMAT = '!IHHqiiHHHH'
-    
+
     def encode(self, data, *args, **kwargs):
         """encodes the given data to a LImA's video_image. The given data **must** be an numpy.array
-        
+
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
-        
-        #TODO: support encoding for colour imgage modes 
+
+        # TODO: support encoding for colour imgage modes
 
         fmt = 'videoimage'
-        if len(data[0]): fmt += '_%s' % data[0]
-        #imgMode depends on numpy.array dtype
+        if len(data[0]):
+            fmt += '_%s' % data[0]
+        # imgMode depends on numpy.array dtype
         imgMode = self.__getModeId(str(data[1].dtype))
-        #frameNumber, unknown then -1
-        height,width = data[1].shape
-        header = self.__packHeader(imgMode,-1,width,height)
+        # frameNumber, unknown then -1
+        height, width = data[1].shape
+        header = self.__packHeader(imgMode, -1, width, height)
         buffer = data[1].tostring()
-        return fmt, header+buffer
-    
+        return fmt, header + buffer
+
     def decode(self, data, *args, **kwargs):
         """decodes the given data from a LImA's video_image.
-            
+
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
-        
+
         if data[0].startswith('VIDEO_IMAGE'):
-            self.warning(('"VIDEO_IMAGE" format name is deprecated.' + 
-                          'Use "videoimage" instead'))
-            fixedformat = data[0].replace('VIDEO_IMAGE','videoimage')
+            fixedformat = data[0].replace('VIDEO_IMAGE', 'videoimage')
             _, _, fmt = fixedformat.partition('_')
         elif data[0].startswith('videoimage'):
-            _, _, fmt = data[0].partition('_') 
+            _, _, fmt = data[0].partition('_')
         else:
             return data
-        header = self.__unpackHeader(data[1][:struct.calcsize(self.VIDEO_HEADER_FORMAT)])
+        header = self.__unpackHeader(
+            data[1][:struct.calcsize(self.VIDEO_HEADER_FORMAT)])
 
         imgBuffer = data[1][struct.calcsize(self.VIDEO_HEADER_FORMAT):]
         dtype = self.__getDtypeId(header['imageMode'])
@@ -537,11 +545,11 @@ class VideoImageCodec(Codec):
             gbuf = rgba[1::4]
             rbuf = rgba[2::4]
             #abuf = rgba[3::4]
-            r = rbuf.reshape(header['height'],header['width'])
-            g = gbuf.reshape(header['height'],header['width'])
-            b = bbuf.reshape(header['height'],header['width'])
+            r = rbuf.reshape(header['height'], header['width'])
+            g = gbuf.reshape(header['height'], header['width'])
+            b = bbuf.reshape(header['height'], header['width'])
             #a = abuf.reshape(header['height'],header['width'])
-            img2D = numpy.dstack((r,g,b))
+            img2D = numpy.dstack((r, g, b))
 
         elif header['imageMode'] == 17:
             # YUV444 3 bytes per pixel
@@ -550,15 +558,15 @@ class VideoImageCodec(Codec):
             u = yuv[1::3]
             v = yuv[2::3]
 
-            rbuff, gbuff, bbuff = self.__yuv2rgb(y,u,v)
+            rbuff, gbuff, bbuff = self.__yuv2rgb(y, u, v)
 
             # Shape buffers to image size
-            r = rbuff.reshape(header['height'],header['width'])
-            g = gbuff.reshape(header['height'],header['width'])
-            b = bbuff.reshape(header['height'],header['width'])
+            r = rbuff.reshape(header['height'], header['width'])
+            g = gbuff.reshape(header['height'], header['width'])
+            b = bbuff.reshape(header['height'], header['width'])
 
             # Build the RGB image
-            img2D = numpy.dstack((r,g,b))
+            img2D = numpy.dstack((r, g, b))
 
         elif header['imageMode'] == 16:
             # YUV422 4 bytes per 2 pixels
@@ -568,21 +576,24 @@ class VideoImageCodec(Codec):
             v = yuv[2::4]
             y2 = yuv[3::4]
 
-            r1, g1, b1 = self.__yuv2rgb(y1,u,v)
-            r2, g2, b2 = self.__yuv2rgb(y2,u,v)
+            r1, g1, b1 = self.__yuv2rgb(y1, u, v)
+            r2, g2, b2 = self.__yuv2rgb(y2, u, v)
 
             # Create RGB buffers
-            rbuff = numpy.dstack((r1,r2)).reshape(header['height']*header['width'])
-            gbuff = numpy.dstack((g1,g2)).reshape(header['height']*header['width'])
-            bbuff = numpy.dstack((b1,b2)).reshape(header['height']*header['width'])
+            rbuff = numpy.dstack((r1, r2)).reshape(
+                header['height'] * header['width'])
+            gbuff = numpy.dstack((g1, g2)).reshape(
+                header['height'] * header['width'])
+            bbuff = numpy.dstack((b1, b2)).reshape(
+                header['height'] * header['width'])
 
             # Shape buffers to image size
-            r = rbuff.reshape(header['height'],header['width'])
-            g = gbuff.reshape(header['height'],header['width'])
-            b = bbuff.reshape(header['height'],header['width'])
+            r = rbuff.reshape(header['height'], header['width'])
+            g = gbuff.reshape(header['height'], header['width'])
+            b = bbuff.reshape(header['height'], header['width'])
 
             # Build the RGB image
-            img2D = numpy.dstack((r,g,b))
+            img2D = numpy.dstack((r, g, b))
 
         elif header['imageMode'] == 15:
             # YUV411 6 bytes per 4 pixels
@@ -594,26 +605,29 @@ class VideoImageCodec(Codec):
             y3 = yuv[4::6]
             y4 = yuv[5::6]
 
-            r1, g1, b1 = self.__yuv2rgb(y1,u,v)
-            r2, g2, b2 = self.__yuv2rgb(y2,u,v)
-            r3, g3, b3 = self.__yuv2rgb(y3,u,v)
-            r4, g4, b4 = self.__yuv2rgb(y4,u,v)
+            r1, g1, b1 = self.__yuv2rgb(y1, u, v)
+            r2, g2, b2 = self.__yuv2rgb(y2, u, v)
+            r3, g3, b3 = self.__yuv2rgb(y3, u, v)
+            r4, g4, b4 = self.__yuv2rgb(y4, u, v)
 
             # Create RGB buffers
-            rbuff = numpy.dstack((r1,r2,r3,r4)).reshape(header['height']*header['width'])
-            gbuff = numpy.dstack((g1,g2,g3,g4)).reshape(header['height']*header['width'])
-            bbuff = numpy.dstack((b1,b2,b3,b4)).reshape(header['height']*header['width'])
+            rbuff = numpy.dstack((r1, r2, r3, r4)).reshape(
+                header['height'] * header['width'])
+            gbuff = numpy.dstack((g1, g2, g3, g4)).reshape(
+                header['height'] * header['width'])
+            bbuff = numpy.dstack((b1, b2, b3, b4)).reshape(
+                header['height'] * header['width'])
 
             # Shape buffers to image size
-            r = rbuff.reshape(header['height'],header['width'])
-            g = gbuff.reshape(header['height'],header['width'])
-            b = bbuff.reshape(header['height'],header['width'])
+            r = rbuff.reshape(header['height'], header['width'])
+            g = gbuff.reshape(header['height'], header['width'])
+            b = bbuff.reshape(header['height'], header['width'])
 
-            img2D = numpy.dstack((r,g,b))
+            img2D = numpy.dstack((r, g, b))
 
         else:
             img1D = numpy.fromstring(imgBuffer, dtype)
-            img2D = img1D.reshape(header['height'],header['width'])
+            img2D = img1D.reshape(header['height'], header['width'])
 
         return fmt, img2D
 
@@ -626,26 +640,26 @@ class VideoImageCodec(Codec):
         G = y - 0.344 * Cb - 0.714 * Cr
         B = y + 1.772 * Cb
 
-        return (numpy.clip(R,0,255), numpy.clip(G,0,255), numpy.clip(B,0,255))
+        return (numpy.clip(R, 0, 255), numpy.clip(G, 0, 255), numpy.clip(B, 0, 255))
 
-    def __unpackHeader(self,header):
-        h = struct.unpack(self.VIDEO_HEADER_FORMAT,header)
-        headerDict={}
-        headerDict['magic']         = h[0]
+    def __unpackHeader(self, header):
+        h = struct.unpack(self.VIDEO_HEADER_FORMAT, header)
+        headerDict = {}
+        headerDict['magic'] = h[0]
         headerDict['headerVersion'] = h[1]
-        headerDict['imageMode']     = h[2]
-        headerDict['frameNumber']   = h[3]
-        headerDict['width']         = h[4]
-        headerDict['height']        = h[5]
-        headerDict['endianness']    = h[6]
-        headerDict['headerSize']    = h[7]
-        headerDict['padding']       = h[8:]
+        headerDict['imageMode'] = h[2]
+        headerDict['frameNumber'] = h[3]
+        headerDict['width'] = h[4]
+        headerDict['height'] = h[5]
+        headerDict['endianness'] = h[6]
+        headerDict['headerSize'] = h[7]
+        headerDict['padding'] = h[8:]
         return headerDict
-    
-    def __packHeader(self,imgMode,frameNumber,width,height):
+
+    def __packHeader(self, imgMode, frameNumber, width, height):
         magic = 0x5644454f
         version = 1
-        endian = ord(struct.pack('=H',1)[-1])
+        endian = ord(struct.pack('=H', 1)[-1])
         hsize = struct.calcsize(self.VIDEO_HEADER_FORMAT)
         return struct.pack(self.VIDEO_HEADER_FORMAT,
                            magic,
@@ -656,46 +670,46 @@ class VideoImageCodec(Codec):
                            height,
                            endian,
                            hsize,
-                           0,0)#padding
-
-    def __getModeId(self,mode):
-        return {#when encode
-                'uint8'      : 0,#Core.Y8,
-                'uint16'     : 1,#Core.Y16,
-                'uint32'     : 2,#Core.Y32,
-                'uint64'     : 3,#Core.Y64,
-                #when decode
-                'Y8'         : 0,#Core.Y8,
-                'Y16'        : 1,#Core.Y16,
-                'Y32'        : 2,#Core.Y32,
-                'Y64'        : 3,#Core.Y64,
-                #TODO: other modes
-                #'RGB555'     : 4,#Core.RGB555,
-                #'RGB565'     : 5,#Core.RGB565,
-                #'RGB24'      : 6,#Core.RGB24,
-                'RGB32'      : 7,#Core.RGB32,
-                #'BGR24'      : 8,#Core.BGR24,
-                #'BGR32'      : 9,#Core.BGR32,
-                #'BAYER RG8'  : 10,#Core.BAYER_RG8,
-                #'BAYER RG16' : 11,#Core.BAYER_RG16,
-                #'BAYER BG8'  : 12,#Core.BAYER_BG8,
-                #'BAYER BG16' : 13,#Core.BAYER_BG16,
-                #'I420'       : 14,#Core.I420,
-                #'YUV411'     : 15,#Core.YUV411,
-                'YUV422'     : 16,#Core.YUV422,
-                #'YUV444'     : 17,#Core.YUV444
-               }[mode]
-
-    def __getFormatId(self,mode):
-        return {0      : 'B',
-                1      : 'H',
-                2      : 'I',
-                3      : 'L',
+                           0, 0)  # padding
+
+    def __getModeId(self, mode):
+        return {  # when encode
+            'uint8': 0,  # Core.Y8,
+            'uint16': 1,  # Core.Y16,
+            'uint32': 2,  # Core.Y32,
+            'uint64': 3,  # Core.Y64,
+            # when decode
+            'Y8': 0,  # Core.Y8,
+            'Y16': 1,  # Core.Y16,
+            'Y32': 2,  # Core.Y32,
+            'Y64': 3,  # Core.Y64,
+            # TODO: other modes
+            #'RGB555'     : 4,#Core.RGB555,
+            #'RGB565'     : 5,#Core.RGB565,
+            #'RGB24'      : 6,#Core.RGB24,
+            'RGB32': 7,  # Core.RGB32,
+            #'BGR24'      : 8,#Core.BGR24,
+            #'BGR32'      : 9,#Core.BGR32,
+            #'BAYER RG8'  : 10,#Core.BAYER_RG8,
+            #'BAYER RG16' : 11,#Core.BAYER_RG16,
+            #'BAYER BG8'  : 12,#Core.BAYER_BG8,
+            #'BAYER BG16' : 13,#Core.BAYER_BG16,
+            #'I420'       : 14,#Core.I420,
+            #'YUV411'     : 15,#Core.YUV411,
+            'YUV422': 16,  # Core.YUV422,
+            #'YUV444'     : 17,#Core.YUV444
+        }[mode]
+
+    def __getFormatId(self, mode):
+        return {0: 'B',
+                1: 'H',
+                2: 'I',
+                3: 'L',
                 #'RGB555'     : Core.RGB555,
                 #'RGB565'     : Core.RGB565,
                 #'RGB24'      : Core.RGB24,
-                7     : 'RGB32',#Core.RGB32,
-                #8     : 'BGR24',#Core.BGR24,
+                7: 'RGB32',  # Core.RGB32,
+                # 8     : 'BGR24',#Core.BGR24,
                 #'BGR32'      : Core.BGR32,
                 #'BAYER RG8'  : Core.BAYER_RG8,
                 #'BAYER RG16' : Core.BAYER_RG16,
@@ -703,19 +717,19 @@ class VideoImageCodec(Codec):
                 #'BAYER BG16' : Core.BAYER_BG16,
                 #'I420'       : Core.I420,
                 #'YUV411'     : Core.YUV411,
-                16     : 'YUV422',#Core.YUV422,
+                16: 'YUV422',  # Core.YUV422,
                 #'YUV444'     : Core.YUV444
-               }[mode]
+                }[mode]
 
-    def __getDtypeId(self,mode):
-        return {0       : 'uint8',
-                1      : 'uint16',
-                2      : 'uint32',
-                3      : 'uint64',
+    def __getDtypeId(self, mode):
+        return {0: 'uint8',
+                1: 'uint16',
+                2: 'uint32',
+                3: 'uint64',
                 #'RGB555'     : Core.RGB555,
                 #'RGB565'     : Core.RGB565,
-                #6      : 'uint8', # Core.RGB24,
-                7      : 'uint8', # Core.RGB32,
+                # 6      : 'uint8', # Core.RGB24,
+                7: 'uint8',  # Core.RGB32,
                 #'BGR24'      : Core.BGR24,
                 #'BGR32'      : Core.BGR32,
                 #'BAYER RG8'  : Core.BAYER_RG8,
@@ -724,59 +738,61 @@ class VideoImageCodec(Codec):
                 #'BAYER BG16' : Core.BAYER_BG16,
                 #'I420'       : Core.I420,
                 #'YUV411'     : Core.YUV411,
-                16     : 'uint8', # Core.YUV422,
+                16: 'uint8',  # Core.YUV422,
                 #'YUV444'     : Core.YUV444
-               }[mode]
+                }[mode]
+
 
 class CodecPipeline(Codec, list):
     """The codec class used when encoding/decoding data with multiple encoders
 
     Example usage::
-        
+
         >>> from taurus.core.util.codecs import CodecPipeline
-        
+
         >>> data = range(100000)
         >>> codec = CodecPipeline('bz2_json')
         >>> format, encoded_data = codec.encode(("", data))
-        
-        # decode it 
+
+        # decode it
         format, decoded_data = codec.decode((format, encoded_data))
         print decoded_data"""
-        
+
     def __init__(self, format):
-        """Constructor. The CodecPipeline object will be created using 
+        """Constructor. The CodecPipeline object will be created using
         the :class:`CodecFactory` to search for format(s) given in the format
         parameter.
-        
+
         :param format: (str) a string representing the format."""
-        
+
         Codec.__init__(self)
         list.__init__(self)
 
         f = CodecFactory()
         for i in format.split('_'):
             codec = f.getCodec(i)
-            self.debug("Appending %s => %s" % (i,codec))
+            self.debug("Appending %s => %s" % (i, codec))
             if codec is None:
-                raise TypeError('Unsupported codec %s (namely %s)' % (format, i))
+                raise TypeError(
+                    'Unsupported codec %s (namely %s)' % (format, i))
             self.append(codec)
         self.debug("Done")
-        
+
     def encode(self, data, *args, **kwargs):
         """encodes the given data.
-        
+
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
         for codec in reversed(self):
             data = codec.encode(data, *args, **kwargs)
         return data
-    
+
     def decode(self, data, *args, **kwargs):
         """decodes the given data.
 
         :param data: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object
-        
+
         :return: (sequence[str, obj]) a sequence of two elements where the first item is the encoding format of the second item object"""
         for codec in self:
             data = codec.decode(data, *args, **kwargs)
@@ -785,13 +801,13 @@ class CodecPipeline(Codec, list):
 
 class CodecFactory(Singleton, Logger):
     """The singleton CodecFactory class.
-    
+
     To get the singleton object do::
-    
+
         from taurus.core.util.codecs import CodecFactory
         f = CodecFactory()
-        
-    The :class:`CodecFactory` class allows you to get a codec object for a given 
+
+    The :class:`CodecFactory` class allows you to get a codec object for a given
     format and also to register new codecs.
     The :class:`CodecPipeline` is a special codec that is able to code/decode a
     sequence of codecs. This way you can have codecs 'inside' codecs.
@@ -807,7 +823,7 @@ class CodecFactory(Singleton, Logger):
         >>> f2, enc_d2 = bz2_json_codec.encode(('', data))
         >>> print len(enc_d1), len(enc_d2)
         688890 123511
-        >>> 
+        >>>
         >>> f1, dec_d1 = json_codec.decode((f1, enc_d1))
         >>> f2, dec_d2 = bz2_json_codec.decode((f2, enc_d2))
 
@@ -822,20 +838,20 @@ class CodecFactory(Singleton, Logger):
         >>> codec = CodecFactory().getCodec(v.format)
         >>> f, d = codec.decode((v.format, v.value))
     """
-    
+
     #: Default minimum map of registered codecs
     CODEC_MAP = CaselessDict({
-        'json'   : JSONCodec,
-        'bson'   : BSONCodec,
-        'bz2'    : BZ2Codec,
-        'zip'    : ZIPCodec,
-        'pickle' : PickleCodec,
-        'plot'   : PlotCodec,
-        'VIDEO_IMAGE' : VideoImageCodec, #deprecated
-        'videoimage' : VideoImageCodec,
-        'null'   : NullCodec,
-        'none'   : NullCodec,
-        ''       : NullCodec })
+        'json': JSONCodec,
+        'bson': BSONCodec,
+        'bz2': BZ2Codec,
+        'zip': ZIPCodec,
+        'pickle': PickleCodec,
+        'plot': PlotCodec,
+        'VIDEO_IMAGE': VideoImageCodec,  # deprecated
+        'videoimage': VideoImageCodec,
+        'null': NullCodec,
+        'none': NullCodec,
+        '': NullCodec})
 
     def __init__(self):
         """ Initialization. Nothing to be done here for now."""
@@ -845,10 +861,10 @@ class CodecFactory(Singleton, Logger):
         """Singleton instance initialization."""
         name = self.__class__.__name__
         self.call__init__(Logger, name)
-        
+
         self._codec_klasses = copy.copy(CodecFactory.CODEC_MAP)
-        
-        # dict<str, Codec> 
+
+        # dict<str, Codec>
         # where:
         #  - key is the codec format
         #  - value is the codec object that supports the format
@@ -857,11 +873,11 @@ class CodecFactory(Singleton, Logger):
     def registerCodec(self, format, klass):
         """Registers a new codec. If a codec already exists for the given format
         it is removed.
-        
+
         :param format: (str) the codec id
         :param klass: (Codec class) the class that handles the format"""
         self._codec_klasses[format] = klass
-        
+
         # del old codec if exists
         if self._codecs.has_key(format):
             del self._codecs[format]
@@ -869,29 +885,30 @@ class CodecFactory(Singleton, Logger):
     def unregisterCodec(self, format):
         """Unregisters the given format. If the format does not exist an exception
         is thrown.
-        
+
         :param format: (str) the codec id
-        
+
         :raises: KeyError"""
         if self._codec_klasses.has_key(format):
             del self._codec_klasses[format]
-        
+
         if self._codecs.has_key(format):
             del self._codecs[format]
 
     def getCodec(self, format):
         """Returns the codec object for the given format or None if no suitable
         codec is found
-        
+
         :param format: (str) the codec id
-        
+
         :return: (Codec or None) the codec object for the given format"""
         codec = self._codecs.get(format)
         if codec is None:
             codec = self._getNewCodec(format)
-            if not codec is None: self._codecs[format] = codec
+            if not codec is None:
+                self._codecs[format] = codec
         return codec
-        
+
     def _getNewCodec(self, format):
         klass = self._codec_klasses.get(format)
         if not klass is None:
@@ -902,12 +919,11 @@ class CodecFactory(Singleton, Logger):
             except:
                 ret = self._codec_klasses.get('')()
         return ret
-    
+
     def decode(self, data, *args, **kwargs):
         while len(data[0]):
             data = self.getCodec(data[0]).decode(data, *args, **kwargs)
         return data[1]
-        
+
     def encode(self, format, data, *args, **kwargs):
         return self.getCodec(format).encode(data, *args, **kwargs)
-    
diff --git a/lib/taurus/core/util/colors.py b/lib/taurus/core/util/colors.py
index 94c754b..9f9780e 100644
--- a/lib/taurus/core/util/colors.py
+++ b/lib/taurus/core/util/colors.py
@@ -2,86 +2,100 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 :mod:`PyTango` color codes for state and quality"""
+"""This module contains color codes for state and quality"""
 
 __all__ = ["DEVICE_STATE_DATA", "ATTRIBUTE_QUALITY_DATA", "ColorPalette",
            "DEVICE_STATE_PALETTE", "ATTRIBUTE_QUALITY_PALETTE"]
 
-__docformat__ = "restructuredtext"
-
 import types
-import PyTango
 
 DEVICE_STATE_DATA = {
-    str(PyTango.DevState.ON)      : ("Dead Frog Green",      0, 255,   0, 0),
-##  str(PyTango.DevState.OFF)     : ("Scarlet Red 3", 164,   0,   0, 1),
-    str(PyTango.DevState.OFF)     : ('White',         255, 255, 255, 0),
-##  str(PyTango.DevState.CLOSE)   : ("Pastel Yellow", 255, 255, 128, 3),
-    str(PyTango.DevState.CLOSE)   : ("White",         255, 255, 255, 3),
-##  str(PyTango.DevState.OPEN)    : ("Dark Green",     32, 112,  32, 1),
-    str(PyTango.DevState.OPEN)    : ("Green",           0, 255,  0,  0),
-    str(PyTango.DevState.INSERT)  : ("White",         255, 255, 255, 0),
-    str(PyTango.DevState.EXTRACT) : ("Green",           0, 255,   0 ,0),
-##  str(PyTango.DevState.MOVING)  : ("Sky Blue 2",     32,  72, 135, 1),
-    str(PyTango.DevState.MOVING)  : ("Light Blue",    128, 160, 255 ,0),
-##  str(PyTango.DevState.STANDBY) : ("Yellow Butter", 252, 224,   0, 0),
-    str(PyTango.DevState.STANDBY) : ("Yellow",        255, 255,   0, 0),
-    str(PyTango.DevState.FAULT)   : ("Red",           255,   0,   0, 0),
-    str(PyTango.DevState.INIT)    : ("Grenoble",      204, 204, 122, 0),
-##  str(PyTango.DevState.RUNNING) : ("Electric Blue",   0, 128, 255, 1),
-    str(PyTango.DevState.RUNNING) : ("Light Blue",    128, 160, 255 ,0),
-    str(PyTango.DevState.ALARM)   : ("Tangorange",    255, 140,   0, 1),
-##  str(PyTango.DevState.DISABLE) : ("Plum 1",        173, 127, 168, 1),
-    str(PyTango.DevState.DISABLE) : ("Magenta",       255,   0, 255, 0),
-##  str(PyTango.DevState.UNKNOWN) : ("Aluminium 4",   136, 138, 133, 0),
-    str(PyTango.DevState.UNKNOWN) : ("Gray",          128, 128, 128, 0),
-    str(None)                     : ("Gray",          128, 128, 128, 0),
+    # map for TaurusDevState states (used for agnostic TaurusDevice.state)
+    "TaurusDevState.Ready": ("Green", 0, 255, 0, 0),
+    "TaurusDevState.NotReady": ("Red", 255, 0, 0, 0),
+    "TaurusDevState.Undefined": ("Gray", 128, 128, 128, 0),
+
+    # The following is a bck-compat map for taurus.core.tango.DevState
+    # (i.e. PyTango.DevState). Used for "state" TangoAttribute rvalues
+    "ON": ("Dead Frog Green", 0, 255, 0, 0),
+    "OFF": ('White', 255, 255, 255, 0),
+    "CLOSE": ("White", 255, 255, 255, 3),
+    "OPEN": ("Green", 0, 255, 0, 0),
+    "INSERT": ("White", 255, 255, 255, 0),
+    "EXTRACT": ("Green", 0, 255, 0, 0),
+    "MOVING": ("Light Blue", 128, 160, 255, 0),
+    "STANDBY": ("Yellow", 255, 255, 0, 0),
+    "FAULT": ("Red", 255, 0, 0, 0),
+    "INIT": ("Grenoble", 204, 204, 122, 0),
+    "RUNNING": ("Light Blue", 128, 160, 255, 0),
+    "ALARM": ("Tangorange", 255, 140,   0, 1),
+    "DISABLE": ("Magenta", 255,   0, 255, 0),
+    "UNKNOWN": ("Gray", 128, 128, 128, 0),
+    str(None): ("Gray", 128, 128, 128, 0),
+    # Support also explicit keys from str representations of
+    # taurus.core.tango.util.enums.DevState
+    "DevState.ON": ("Dead Frog Green", 0, 255, 0, 0),
+    "DevState.OFF": ('White', 255, 255, 255, 0),
+    "DevState.CLOSE": ("White", 255, 255, 255, 3),
+    "DevState.OPEN": ("Green", 0, 255, 0, 0),
+    "DevState.INSERT": ("White", 255, 255, 255, 0),
+    "DevState.EXTRACT": ("Green", 0, 255, 0, 0),
+    "DevState.MOVING": ("Light Blue", 128, 160, 255, 0),
+    "DevState.STANDBY": ("Yellow", 255, 255, 0, 0),
+    "DevState.FAULT": ("Red", 255, 0, 0, 0),
+    "DevState.INIT": ("Grenoble", 204, 204, 122, 0),
+    "DevState.RUNNING": ("Light Blue", 128, 160, 255, 0),
+    "DevState.ALARM": ("Tangorange", 255, 140,   0, 1),
+    "DevState.DISABLE": ("Magenta", 255,   0, 255, 0),
+    "DevState.UNKNOWN": ("Gray", 128, 128, 128, 0),
 }
 
 ATTRIBUTE_QUALITY_DATA = {
-    str(PyTango.AttrQuality.ATTR_INVALID)   : ("Gray",          128, 128,  128, 1),
-    str(PyTango.AttrQuality.ATTR_VALID)     : ("Frog Green",      0, 255,   0, 0),
-    str(PyTango.AttrQuality.ATTR_ALARM)     : ("Orange",        255, 140,   0, 1),
-    str(PyTango.AttrQuality.ATTR_WARNING)   : ("Orange",        255, 140,   0, 1),
-    str(PyTango.AttrQuality.ATTR_CHANGING)  : ("Lightblue",     128, 160, 255 ,0),
-    "UNKNOWN"                               : ("Gray",          128, 128, 128, 0),
-    str(None)                               : ("Gray",          128, 128, 128, 0),
+    "ATTR_INVALID": ("Gray", 128, 128, 128, 1),
+    "ATTR_VALID": ("Frog Green", 0, 255, 0, 0),
+    "ATTR_ALARM": ("Orange", 255, 140, 0, 1),
+    "ATTR_WARNING": ("Orange", 255, 140, 0, 1),
+    "ATTR_CHANGING": ("Lightblue", 128, 160, 255, 0),
+    "UNKNOWN": ("Gray", 128, 128, 128, 0),
+    str(None): ("Gray", 128, 128, 128, 0),
 }
 
-_BW_RGB = [ (0,0,0, "Black") , (255,255,255, "White"), (255,255,0, "Yellow"), (0,128,0, "Green") ]
+_BW_RGB = [(0, 0, 0, "Black"), (255, 255, 255, "White"),
+           (255, 255, 0, "Yellow"), (0, 128, 0, "Green")]
+
 
 class ColorPalette(object):
-    """Provides the list of tango colors, used at ALBA / taurus toolkit."""
+    """Provides the list of taurus colors equivalent to Tango colors."""
 
-    def __init__(self, dat, int_decoder_dict):
+    def __init__(self, dat, int_decoder_dict=None):
 
         self._rgb_data = dat
         self._int_decoder_dict = int_decoder_dict
-        
+
     def _decoder(self, elem):
         if type(elem) == types.IntType or type(elem) == types.LongType:
-            elem = self._int_decoder_dict.values[elem]
+            elem = self._int_decoder_dict.get(elem)
         return str(elem)
 
     def rgb(self, stoq, fg=False):
@@ -95,16 +109,17 @@ class ColorPalette(object):
 
     def rgb_pair(self, stoq):
         """Returns pair of foreground and background colors."""
-        return ( self.rgb(stoq) , self.rgb(stoq, fg=True) )
+        return (self.rgb(stoq), self.rgb(stoq, fg=True))
 
     def hex(self, stoq, fmt="%06x", fg=False):
         """Returns the rgb colors as string of lowercase hexadecimal characters"""
         return fmt % self.number(stoq, fg)
 
     def number(self, stoq, fg=False):
-        """Returns the colors as a number, suitable for conversion to hexadecimal as argument to QtGui.QColor."""
+        """Returns the colors as a number,
+        suitable for conversion to hexadecimal as argument to QtGui.QColor."""
         r = self.rgb(stoq, fg)
-        return r[0]*256*256 + r[1]*256 + r[2]
+        return r[0] * 256 * 256 + r[1] * 256 + r[2]
 
     def __iter__(self):
         return self._rgb_data.keys().__iter__()
@@ -124,31 +139,74 @@ class ColorPalette(object):
         return len(self._rgb_data)
 
     def format_SimStates(self, var="T1"):
-        count = DEVICE_STATE_PALETTE.size()-1
+        count = DEVICE_STATE_PALETTE.size() - 1
         txt = ""
         for state in DEVICE_STATE_PALETTE:
-            txt+="%s=Attr('%s')>%d\n" % (state,var,count)
-            count = count-1
+            txt += "%s=Attr('%s')>%d\n" % (state, var, count)
+            count = count - 1
         return txt
 
-    def htmlStyle(self,htmlTag,stoq):
+    def htmlStyle(self, htmlTag, stoq):
         name = self._decoder(stoq)
         bg = str(self.rgb(stoq))
-        fg = str(self.rgb(stoq,fg=True))
+        fg = str(self.rgb(stoq, fg=True))
         txt = """<style type='text/css'>
 %s.%s { background-color : rgb%s;  color : rgb%s; }
 </style>""" % (htmlTag, name, bg, fg)
         return txt
-    
-    def qtStyleSheet(self,stoq):
+
+    def qtStyleSheet(self, stoq):
         name = self._decoder(stoq)
         bg = str(self.rgb(stoq))
-        fg = str(self.rgb(stoq,fg=True))
-        txt = "background-color : rgb%s;  color : rgb%s; "%(bg, fg)
+        fg = str(self.rgb(stoq, fg=True))
+        txt = "background-color : rgb%s;  color : rgb%s; " % (bg, fg)
         return txt
 
-DEVICE_STATE_PALETTE = ColorPalette(DEVICE_STATE_DATA, PyTango.DevState)
-ATTRIBUTE_QUALITY_PALETTE = ColorPalette(ATTRIBUTE_QUALITY_DATA, PyTango.AttrQuality)
+
+class _DeprecationDecoder(list):
+    def __init__(self, palette, elements):
+        self.palette = palette
+        list.__init__(self, elements)
+
+    def get(self, i):
+        from taurus.core.util.log import deprecated
+        deprecated(dep='Using ints for accessing elements of %s' % self.palette,
+                   alt='"%s"' % self[i], rel='4.0')
+        return self[i]
+
+
+_PYTANGO_DEVSTATE_INT_DECODER = _DeprecationDecoder(
+        'DEVICE_STATE_PALETTE',
+        ["ON",
+         "OFF",
+         "CLOSE",
+         "OPEN",
+         "INSERT",
+         "EXTRACT",
+         "MOVING",
+         "STANDBY",
+         "FAULT",
+         "INIT",
+         "RUNNING",
+         "ALARM",
+         "DISABLE",
+         "UNKNOWN",])
+
+_PYTANGO_ATTRQUALITY_INT_DECODER = _DeprecationDecoder(
+        'ATTRIBUTE_QUALITY_PALETTE',
+        ["ATTR_VALID",
+         "ATTR_INVALID",
+         "ATTR_ALARM",
+         "ATTR_CHANGING",
+         "ATTR_WARNING",])
+
+
+DEVICE_STATE_PALETTE = ColorPalette(DEVICE_STATE_DATA,
+                                    _PYTANGO_DEVSTATE_INT_DECODER)
+
+ATTRIBUTE_QUALITY_PALETTE = ColorPalette(ATTRIBUTE_QUALITY_DATA,
+                                         _PYTANGO_ATTRQUALITY_INT_DECODER)
+
 
 def print_color_palette(pal):
     """Prints a list of colors to stdout."""
@@ -163,3 +221,10 @@ def print_color_palette(pal):
 if __name__ == "__main__":
     print_color_palette(DEVICE_STATE_PALETTE)
     print_color_palette(ATTRIBUTE_QUALITY_PALETTE)
+    from taurus.core import TaurusDevState
+    import PyTango
+    print
+    print DEVICE_STATE_PALETTE.rgb(TaurusDevState.Ready)
+    print DEVICE_STATE_PALETTE.rgb('TaurusDevState.Ready')
+    print DEVICE_STATE_PALETTE.rgb(PyTango.DevState.ON)
+    print DEVICE_STATE_PALETTE.rgb(0)
diff --git a/lib/taurus/core/util/console.py b/lib/taurus/core/util/console.py
index 1679b99..dcece96 100644
--- a/lib/taurus/core/util/console.py
+++ b/lib/taurus/core/util/console.py
@@ -2,238 +2,97 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 ANSI color codes"""
 
-__all__ = ["make_color_table", "NoColors", "TermColors", "HTMLColors",
-           "NoTangoColors", "TermTangoColors", "HTMLTangoColors", 
-           "NoTaurusSWDevStateColors", "TermTaurusSWDevStateColors",
-           "NoTauSWDevStateColors", "TermTauSWDevStateColors",
-           "ANSIEscapeCodeHandler"]
+__all__ = ["make_color_table", "NoColors", "TermColors", "HTMLColors"]
 
 __docformat__ = "restructuredtext"
 
-import os
-
-__color_templates = (
-    ("Black"       , "0;30"),
-    ("Red"         , "0;31"),
-    ("Green"       , "0;32"),
-    ("Brown"       , "0;33"),
-    ("Blue"        , "0;34"),
-    ("Purple"      , "0;35"),
-    ("Cyan"        , "0;36"),
-    ("LightGray"   , "0;37"),
-    ("DarkGray"    , "1;30"),
-    ("LightRed"    , "1;31"),
-    ("LightGreen"  , "1;32"),
-    ("Yellow"      , "1;33"),
-    ("LightBlue"   , "1;34"),
-    ("LightPurple" , "1;35"),
-    ("LightCyan"   , "1;36"),
-    ("White"       , "1;37"),  )
-
-def make_color_table(in_class,use_name=False,fake=False):
+
+def make_color_table(in_class, use_name=False, fake=False):
     """Build a set of color attributes in a class.
 
     Helper function for building the *TermColors classes."""
-    global __color_templates
+    color_templates = (
+        ("Black", "0;30"),
+        ("Red", "0;31"),
+        ("Green", "0;32"),
+        ("Brown", "0;33"),
+        ("Blue", "0;34"),
+        ("Purple", "0;35"),
+        ("Cyan", "0;36"),
+        ("LightGray", "0;37"),
+        ("DarkGray", "1;30"),
+        ("LightRed", "1;31"),
+        ("LightGreen", "1;32"),
+        ("Yellow", "1;33"),
+        ("LightBlue", "1;34"),
+        ("LightPurple", "1;35"),
+        ("LightCyan", "1;36"),
+        ("White", "1;37"),)
     if fake:
-        for name, value in __color_templates:
+        for name, value in color_templates:
             setattr(in_class, name, "")
     else:
         if use_name:
-            for name,value in __color_templates:
-                setattr(in_class,name,in_class._base % name)
+            for name, value in color_templates:
+                setattr(in_class, name, in_class._base % name)
         else:
-            for name,value in __color_templates:
-                setattr(in_class,name,in_class._base % value)
+            for name, value in color_templates:
+                setattr(in_class, name, in_class._base % value)
+
 
 class NoColors:
     NoColor = ''  # for color schemes in color-less terminals.
     Normal = ''   # Reset normal coloring
-    _base  = ''  # Template for all other colors
-    
+    _base = ''  # Template for all other colors
+
+
 class TermColors:
     """Color escape sequences.
 
-    This class defines the escape sequences for all the standard (ANSI?) 
+    This class defines the escape sequences for all the standard (ANSI?)
     colors in terminals. Also defines a NoColor escape which is just the null
     string, suitable for defining 'dummy' color schemes in terminals which get
     confused by color escapes.
 
     This class should be used as a mixin for building color schemes.
-    
+
     Basicaly this class is just a copy of IPython.ColorANSI.TermColors class"""
-    
+
     NoColor = ''  # for color schemes in color-less terminals.
     Normal = '\033[0m'   # Reset normal coloring
-    _base  = '\033[%sm'  # Template for all other colors
+    _base = '\033[%sm'  # Template for all other colors
+
 
 class HTMLColors:
-    
+
     NoColor = ''
     Normal = '</font>'
     _base = '<font color=%s>'
 
 # Build the actual color table as a set of class attributes:
-make_color_table(NoColors,fake=True)
+make_color_table(NoColors, fake=True)
 make_color_table(TermColors)
-make_color_table(HTMLColors,True)
-
-import PyTango
-
-NoTangoColors = { PyTango.DevState.ON      : NoColors.Green,
-                    PyTango.DevState.ALARM   : NoColors.Brown,
-                    PyTango.DevState.FAULT   : NoColors.Red,
-                    PyTango.DevState.UNKNOWN : NoColors.LightGray,
-                    None                     : NoColors.DarkGray }
-
-TermTangoColors = { PyTango.DevState.ON      : TermColors.Green,
-                    PyTango.DevState.ALARM   : TermColors.Brown,
-                    PyTango.DevState.FAULT   : TermColors.Red,
-                    PyTango.DevState.UNKNOWN : TermColors.LightGray,
-                    None                     : TermColors.DarkGray }
-
-HTMLTangoColors = { PyTango.DevState.ON      : HTMLColors.Green,
-                    PyTango.DevState.ALARM   : HTMLColors.Brown,
-                    PyTango.DevState.FAULT   : HTMLColors.Red,
-                    PyTango.DevState.UNKNOWN : HTMLColors.LightGray,
-                    None                     : HTMLColors.DarkGray }
-                    
-from taurus.core.taurusbasetypes import TaurusSWDevState
-
-NoTaurusSWDevStateColors = {
-    TaurusSWDevState.Uninitialized       : NoColors.LightGray,
-    TaurusSWDevState.Running             : NoColors.Green, 
-    TaurusSWDevState.Shutdown            : NoColors.DarkGray, 
-    TaurusSWDevState.Crash               : NoColors.Red,
-    TaurusSWDevState.EventSystemShutdown : NoColors.Brown }
-
-TermTaurusSWDevStateColors = {
-    TaurusSWDevState.Uninitialized       : TermColors.LightGray,
-    TaurusSWDevState.Running             : TermColors.Green, 
-    TaurusSWDevState.Shutdown            : TermColors.DarkGray, 
-    TaurusSWDevState.Crash               : TermColors.Red,
-    TaurusSWDevState.EventSystemShutdown : TermColors.Brown }
-
-NoTauSWDevStateColors = NoTaurusSWDevStateColors
-TermTauSWDevStateColors = TermTaurusSWDevStateColors
-
-class ANSIEscapeCodeHandler(object):
-    """ANSI Escape sequences handler"""
-    if os.name == 'nt':
-        # Windows terminal colors:
-        ANSI_COLORS = ( # Normal, Bright/Light
-                       ('#000000', '#808080'), # 0: black
-                       ('#800000', '#ff0000'), # 1: red
-                       ('#008000', '#00ff00'), # 2: green
-                       ('#808000', '#ffff00'), # 3: yellow
-                       ('#000080', '#0000ff'), # 4: blue
-                       ('#800080', '#ff00ff'), # 5: magenta
-                       ('#008080', '#00ffff'), # 6: cyan
-                       ('#c0c0c0', '#ffffff'), # 7: white
-                       )
-    elif os.name == 'mac':
-        # Terminal.app colors:
-        ANSI_COLORS = ( # Normal, Bright/Light
-                       ('#000000', '#818383'), # 0: black
-                       ('#C23621', '#FC391F'), # 1: red
-                       ('#25BC24', '#25BC24'), # 2: green
-                       ('#ADAD27', '#EAEC23'), # 3: yellow
-                       ('#492EE1', '#5833FF'), # 4: blue
-                       ('#D338D3', '#F935F8'), # 5: magenta
-                       ('#33BBC8', '#14F0F0'), # 6: cyan
-                       ('#CBCCCD', '#E9EBEB'), # 7: white
-                       )
-    else:
-        # xterm colors:
-        ANSI_COLORS = ( # Normal, Bright/Light
-                       ('#000000', '#7F7F7F'), # 0: black
-                       ('#CD0000', '#ff0000'), # 1: red
-                       ('#00CD00', '#00ff00'), # 2: green
-                       ('#CDCD00', '#ffff00'), # 3: yellow
-                       ('#0000EE', '#5C5CFF'), # 4: blue
-                       ('#CD00CD', '#ff00ff'), # 5: magenta
-                       ('#00CDCD', '#00ffff'), # 6: cyan
-                       ('#E5E5E5', '#ffffff'), # 7: white
-                       )
-    def __init__(self):
-        self.intensity = 0
-        self.italic = None
-        self.bold = None
-        self.underline = None
-        self.foreground_color = None
-        self.background_color = None
-        self.default_foreground_color = 30
-        self.default_background_color = 47
-        
-    def set_code(self, code):
-        assert isinstance(code, int)
-        if code == 0:
-            # Reset all settings
-            self.reset()
-        elif code == 1:
-            # Text color intensity
-            self.intensity = 1
-            # The following line is commented because most terminals won't 
-            # change the font weight, against ANSI standard recommendation:
-#            self.bold = True
-        elif code == 3:
-            # Italic on
-            self.italic = True
-        elif code == 4:
-            # Underline simple
-            self.underline = True
-        elif code == 22:
-            # Normal text color intensity
-            self.intensity = 0
-            self.bold = False
-        elif code == 23:
-            # No italic
-            self.italic = False
-        elif code == 24:
-            # No underline
-            self.underline = False
-        elif code >= 30 and code <= 37:
-            # Text color
-            self.foreground_color = code
-        elif code == 39:
-            # Default text color
-            self.foreground_color = self.default_foreground_color
-        elif code >= 40 and code <= 47:
-            # Background color
-            self.background_color = code
-        elif code == 49:
-            # Default background color
-            self.background_color = self.default_background_color
-        self.set_style()
-        
-    def reset(self):
-        self.current_format = None
-        self.intensity = 0
-        self.italic = False
-        self.bold = False
-        self.underline = False
-        self.foreground_color = None
-        self.background_color = None
\ No newline at end of file
+make_color_table(HTMLColors, True)
diff --git a/lib/taurus/core/util/constant.py b/lib/taurus/core/util/constant.py
index 37c5aca..2221d72 100644
--- a/lib/taurus/core/util/constant.py
+++ b/lib/taurus/core/util/constant.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,7 +34,7 @@ re-binding. Easy solution (in Python 2.1 and up): use an instance as "module"...
 In Python 2.1 and up, no check is made any more to force entries in sys.modules
 to be actually module objects. You can install an instance object there and take
 advantage of its attribute-access special methods (e.g., as in this snippet, to
-prevent type rebindings. 
+prevent type rebindings.
 
 Usage::
 
@@ -48,18 +48,24 @@ Usage::
 
 __docformat__ = "restructuredtext"
 
+
 class _consttype:
+
     class _ConstTypeError(TypeError):
         pass
+
     def __repr__(self):
         return "Constant type definitions."
+
     def __setattr__(self, name, value):
         v = self.__dict__.get(name, value)
         if type(v) is not type(value):
-            raise self._ConstTypeError, "Can't rebind %s to %s" % (type(v), type(value))
+            raise self._ConstTypeError, "Can't rebind %s to %s" % (
+                type(v), type(value))
         self.__dict__[name] = value
+
     def __del__(self):
         self.__dict__.clear()
 
 import sys
-sys.modules[__name__] = _consttype()
\ No newline at end of file
+sys.modules[__name__] = _consttype()
diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py
index f0b8f32..eba3a46 100644
--- a/lib/taurus/core/util/containers.py
+++ b/lib/taurus/core/util/containers.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,8 +30,8 @@ python distribution.
 
 __all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList",
            "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict",
-           "defaultdict", "defaultdict_fromkey","CaselessDefaultDict",
-           "DefaultThreadDict", "getDictAsTree", "ArrayBuffer",]
+           "defaultdict", "defaultdict_fromkey", "CaselessDefaultDict",
+           "DefaultThreadDict", "getDictAsTree", "ArrayBuffer", ]
 
 __docformat__ = "restructuredtext"
 
@@ -42,8 +42,8 @@ import operator
 
 
 class CaselessList(list):
-    """A case insensitive lists that has some caseless methods. Only allows 
-    strings as list members. Most methods that would normally return a list, 
+    """A case insensitive lists that has some caseless methods. Only allows
+    strings as list members. Most methods that would normally return a list,
     return a CaselessList. (Except list() and lowercopy())
     Sequence Methods implemented are :
     __contains__, remove, count, index, append, extend, insert,
@@ -54,44 +54,47 @@ class CaselessList(list):
     Inherited methods :
     __imul__, __len__, __iter__, pop, reverse, sort
     """
+
     def __init__(self, inlist=[]):
         list.__init__(self)
         for entry in inlist:
-            if not isinstance(entry, basestring): 
-                raise TypeError('Members of this object must be strings. ' \
-                                'You supplied \"%s\" which is \"%s\"' % 
+            if not isinstance(entry, basestring):
+                raise TypeError('Members of this object must be strings. '
+                                'You supplied \"%s\" which is \"%s\"' %
                                 (entry, type(entry)))
             self.append(entry)
-            
-    def __lowerstreq(self,a,b):
-        a = type(a)==str and a or str(a)
-        b = type(b)==str and b or str(b)
+
+    def __lowerstreq(self, a, b):
+        a = type(a) == str and a or str(a)
+        b = type(b) == str and b or str(b)
         return (a.lower() == b.lower())
 
     def findentry(self, item):
         """A caseless way of checking if an item is in the list or not.
         It returns None or the entry."""
-        if not isinstance(item, basestring): 
-            raise TypeError('Members of this object must be strings. '\
+        if not isinstance(item, basestring):
+            raise TypeError('Members of this object must be strings. '
                             'You supplied \"%s\"' % type(item))
         for entry in self:
-            if self.__lowerstreq(item,entry): return entry
+            if self.__lowerstreq(item, entry):
+                return entry
         return None
-    
+
     def __contains__(self, item):
         """A caseless way of checking if a list has a member in it or not."""
         for entry in self:
-            if self.__lowerstreq(item,entry): return True
+            if self.__lowerstreq(item, entry):
+                return True
         return False
-        
+
     def remove(self, item):
         """Remove the first occurence of an item, the caseless way."""
         for entry in self:
-            if self.__lowerstreq(item,entry):
+            if self.__lowerstreq(item, entry):
                 list.remove(self, entry)
                 return
         raise ValueError(': list.remove(x): x not in list')
-    
+
     def copy(self):
         """Return a CaselessList copy of self."""
         return CaselessList(self)
@@ -99,87 +102,90 @@ class CaselessList(list):
     def list(self):
         """Return a normal list version of self."""
         return list(self)
-        
+
     def lowercopy(self):
         """Return a lowercase (list) copy of self."""
         return [str(entry).lower() for entry in self]
-    
+
     def append(self, item):
         """Adds an item to the list and checks it's a string."""
-        if not isinstance(item, basestring): 
-            raise TypeError('Members of this object must be strings. ' \
+        if not isinstance(item, basestring):
+            raise TypeError('Members of this object must be strings. '
                             'You supplied \"%s\"' % type(item))
         list.append(self, item)
-        
+
     def extend(self, item):
-        """Extend the list with another list. Each member of the list must be 
+        """Extend the list with another list. Each member of the list must be
         a string."""
-        if not isinstance(item, list): 
-            raise TypeError('You can only extend lists with lists. ' \
+        if not isinstance(item, list):
+            raise TypeError('You can only extend lists with lists. '
                             'You supplied \"%s\"' % type(item))
         for entry in item:
-            if not isinstance(entry, basestring): 
-                raise TypeError('Members of this object must be strings. '\
+            if not isinstance(entry, basestring):
+                raise TypeError('Members of this object must be strings. '
                                 'You supplied \"%s\"' % type(entry))
-            list.append(self, entry)        
+            list.append(self, entry)
 
     def count(self, item):
         """Counts references to 'item' in a caseless manner.
         If item is not a string it will always return 0."""
-        if not isinstance(item, basestring): return 0
+        if not isinstance(item, basestring):
+            return 0
         count = 0
         for entry in self:
-            if self.__lowerstreq(item,entry):
+            if self.__lowerstreq(item, entry):
                 count += 1
-        return count    
+        return count
 
     def index(self, item, minindex=0, maxindex=None):
-        """Provide an index of first occurence of item in the list. (or raise 
+        """Provide an index of first occurence of item in the list. (or raise
         a ValueError if item not present)
         If item is not a string, will raise a TypeError.
         minindex and maxindex are also optional arguments
         s.index(x[, i[, j]]) return smallest k such that s[k] == x and i <= k < j
         """
-        if maxindex == None: maxindex = len(self)
-        minindex = max(0, minindex)-1
+        if maxindex is None:
+            maxindex = len(self)
+        minindex = max(0, minindex) - 1
         maxindex = min(len(self), maxindex)
-        if not isinstance(item, basestring): 
-            raise TypeError('Members of this object must be strings. '\
+        if not isinstance(item, basestring):
+            raise TypeError('Members of this object must be strings. '
                             'You supplied \"%s\"' % type(item))
         index = minindex
         while index < maxindex:
             index += 1
-            if self.__lowerstreq(item,self[index]):
+            if self.__lowerstreq(item, self[index]):
                 return index
         raise ValueError(': list.index(x): x not in list')
-    
+
     def insert(self, i, x):
         """s.insert(i, x) same as s[i:i] = [x]
         Raises TypeError if x isn't a string."""
-        if not isinstance(x, basestring): 
-            raise TypeError('Members of this object must be strings. ' \
+        if not isinstance(x, basestring):
+            raise TypeError('Members of this object must be strings. '
                             'You supplied \"%s\"' % type(x))
         list.insert(self, i, x)
 
     def __setitem__(self, index, value):
         """For setting values in the list.
-        index must be an integer or (extended) slice object. (__setslice__ used 
+        index must be an integer or (extended) slice object. (__setslice__ used
         for simple slices)
         If index is an integer then value must be a string.
-        If index is a slice object then value must be a list of strings - with 
+        If index is a slice object then value must be a list of strings - with
         the same length as the slice object requires.
         """
         if isinstance(index, int):
-            if not isinstance(value, basestring): 
-                raise TypeError('Members of this object must be strings. ' \
+            if not isinstance(value, basestring):
+                raise TypeError('Members of this object must be strings. '
                                 'You supplied \"%s\"' % type(value))
             list.__setitem__(self, index, value)
         elif isinstance(index, slice):
-            if not hasattr(value, '__len__'): 
-                raise TypeError('Value given to set slice is not a sequence object.')
+            if not hasattr(value, '__len__'):
+                raise TypeError(
+                    'Value given to set slice is not a sequence object.')
             for entry in value:
-                if not isinstance(entry, basestring): 
-                    raise TypeError('Members of this object must be strings. ' \
+                if not isinstance(entry, basestring):
+                    raise TypeError('Members of this object must be strings. '
                                     'You supplied \"%s\"' % type(entry))
             list.__setitem__(self, index, value)
         else:
@@ -188,14 +194,14 @@ class CaselessList(list):
     def __setslice__(self, i, j, sequence):
         """Called to implement assignment to self[i:j]."""
         for entry in sequence:
-            if not isinstance(entry, basestring): 
-                raise TypeError('Members of this object must be strings. ' \
+            if not isinstance(entry, basestring):
+                raise TypeError('Members of this object must be strings. '
                                 'You supplied \"%s\"' % type(entry))
         list.__setslice__(self, i, j, sequence)
 
     def __getslice__(self, i, j):
         """Called to implement evaluation of self[i:j].
-        Although the manual says this method is deprecated - if I don't define 
+        Although the manual says this method is deprecated - if I don't define
         it the list one is called.
         (Which returns a list - this returns a CaselessList)"""
         return CaselessList(list.__getslice__(self, i, j))
@@ -207,7 +213,7 @@ class CaselessList(list):
             return list.__getitem__(self, index)
         else:
             return CaselessList(list.__getitem__(self, index))
-            
+
     def __add__(self, item):
         """To add a list, and return a CaselessList.
         Every element of item must be a string."""
@@ -217,10 +223,11 @@ class CaselessList(list):
         """To add a list, and return a CaselessList.
         Every element of item must be a string."""
         return CaselessList(list.__add__(self, item))
-    
+
     def __iadd__(self, item):
         """To add a list in place."""
-        for entry in item: self.append(entry)        
+        for entry in item:
+            self.append(entry)
 
     def __mul__(self, item):
         """To multiply itself, and return a CaselessList.
@@ -236,14 +243,15 @@ class CaselessList(list):
 class CaselessDict(dict):
     """A case insensitive dictionary. Use this class as a normal dictionary.
     The keys must be strings"""
+
     def __init__(self, other=None):
         if other:
             # Doesn't do keyword args
             if isinstance(other, dict):
-                for k,v in other.items():
+                for k, v in other.items():
                     dict.__setitem__(self, k.lower(), v)
             else:
-                for k,v in other:
+                for k, v in other:
                     dict.__setitem__(self, k.lower(), v)
 
     def __getitem__(self, key):
@@ -269,7 +277,7 @@ class CaselessDict(dict):
 
     def update(self, other):
         """overwritten from :meth:`dict.update`"""
-        for k,v in other.items():
+        for k, v in other.items():
             dict.__setitem__(self, k.lower(), v)
 
     def fromkeys(self, iterable, value=None):
@@ -284,19 +292,19 @@ class CaselessDict(dict):
 
     def __delitem__(self, k):
         dict.__delitem__(self, k.lower())
-        
+
 
 class CaselessWeakValueDict(weakref.WeakValueDictionary):
-    
+
     def __init__(self, other=None):
         weakref.WeakValueDictionary.__init__(self)
         if other:
             # Doesn't do keyword args
             if isinstance(other, dict):
-                for k,v in other.items():
+                for k, v in other.items():
                     weakref.WeakValueDictionary.__setitem__(self, k.lower(), v)
             else:
-                for k,v in other:
+                for k, v in other:
                     weakref.WeakValueDictionary.__setitem__(self, k.lower(), v)
 
     def __getitem__(self, key):
@@ -322,7 +330,7 @@ class CaselessWeakValueDict(weakref.WeakValueDictionary):
 
     def update(self, other):
         """overwritten from :meth:`weakref.WeakValueDictionary.update`"""
-        for k,v in other.items():
+        for k, v in other.items():
             weakref.WeakValueDictionary.__setitem__(self, k.lower(), v)
 
     def fromkeys(self, iterable, value=None):
@@ -337,10 +345,15 @@ class CaselessWeakValueDict(weakref.WeakValueDictionary):
 
     def __delitem__(self, k):
         weakref.WeakValueDictionary.__delitem__(self, k.lower())
-        
 
-## {{{ http://code.activestate.com/recipes/576642/ (r10)
-import pickle, json, csv, os, shutil
+
+# {{{ http://code.activestate.com/recipes/576642/ (r10)
+import pickle
+import json
+import csv
+import os
+import shutil
+
 
 class PersistentDict(dict):
     ''' Persistent dictionary with an API compatible with shelve and anydbm.
@@ -362,7 +375,7 @@ class PersistentDict(dict):
         self.format = format                # 'csv', 'json', or 'pickle'
         self.filename = filename
         if flag != 'n' and os.access(filename, os.R_OK):
-            fileobj = open(filename, 'rb' if format=='pickle' else 'r')
+            fileobj = open(filename, 'rb' if format == 'pickle' else 'r')
             with fileobj:
                 self.load(fileobj)
         dict.__init__(self, *args, **kwds)
@@ -373,7 +386,7 @@ class PersistentDict(dict):
             return
         filename = self.filename
         tempname = filename + '.tmp'
-        fileobj = open(tempname, 'wb' if self.format=='pickle' else 'w')
+        fileobj = open(tempname, 'wb' if self.format == 'pickle' else 'w')
         try:
             self.dump(fileobj)
         except Exception:
@@ -418,69 +431,81 @@ class PersistentDict(dict):
 class LoopList(object):
     '''this class provides an effectively cyclic list.
     It can be used, e.g., for storing colors or pen properties to be changed automatically in a plot
-    
+
     A LoopList stores an internal index to remember the last accessed item in the list
     It provides  previous(), current() and next() methods that return the previous,current and next items in the list.
     The method allItems() returns a copy of all items contained in the list.
     The index can be accessed by setCurrentIndex() and getCurrentIndex()  (setCurrentIndex(i) additionally returns new current item)
     Items can be accessed ***without modifying the current index*** by using llist[i]  and llist[i]=x syntax
     len(llist) returns the **period** of the list.
-    
+
     .. note::
-        
+
         only basic methods of lists are implemented for llists. In particular,
         the following are **not** implemented:
-        
+
             - slicing
             - resizing (append, insert, del,...)
             - binary operators (+,*,...)
-        
+
     ..note::
-    
+
         it can be used for loops, but the loop will be infinite unless other
         condition is used for exiting it:
-            
+
             - for item in llist: print item  # This is a infinite loop!!
             - for i in range(len(llist)):print  llist[i]  #This is not infinite
               since len(llist) returns the period of the list'''
+
     def __init__(self, itemlist=[]):
         self.setItemList(itemlist)
-    def setItemList(self,itemlist):
+
+    def setItemList(self, itemlist):
         '''sets the item list'''
-        self._itemlist=list(itemlist)
-        self._index=0
-        self._nitems=len(self._itemlist)
+        self._itemlist = list(itemlist)
+        self._index = 0
+        self._nitems = len(self._itemlist)
+
     def current(self):
         '''returns current item'''
         try:
-            return self._itemlist[self._index%self._nitems] # makes the list effectively cyclic 
+            # makes the list effectively cyclic
+            return self._itemlist[self._index % self._nitems]
         except ZeroDivisionError:
             raise IndexError('cyclic list is empty')
-    def setCurrentIndex(self,index):
+
+    def setCurrentIndex(self, index):
         '''sets current index (and returns the corresponding item)'''
-        self._index=index
+        self._index = index
         return self.current()
+
     def getCurrentIndex(self):
         '''returns the current index'''
         return self._index
+
     def next(self):
         '''advances one item in the list and returns it'''
-        self._index+=1
+        self._index += 1
         return self.current()
+
     def previous(self):
         '''goes one item back in the list and returns it'''
-        self._index-=1
+        self._index -= 1
         return self.current()
+
     def allItems(self):
         """returns the items list (one period)"""
         return self._itemlist
+
     def __getitem__(self, i):
         try:
-            return self._itemlist[i%self._nitems] 
+            return self._itemlist[i % self._nitems]
         except ZeroDivisionError:
             raise IndexError('cyclic list is empty')
-    def __setitem__(self,i,y):
-        self._itemlist[i%self._nitems]=y
+
+    def __setitem__(self, i, y):
+        self._itemlist[i % self._nitems] = y
+
     def __len__(self):
         return self._nitems
 
@@ -489,7 +514,7 @@ class CircBuf(object):
     """A circular buffer of Python values.
 
     Examples::
-        
+
         >>> cb = CircBuf(3)
         >>> cb.is_empty()
         1
@@ -509,10 +534,11 @@ class CircBuf(object):
         'fourth'
         >>> cb.is_empty()
         1"""
+
     def __init__(self, leng):
         """Construct an empty circular buffer."""
 
-        self.buf = leng*[None]
+        self.buf = leng * [None]
         self.len = self.g = self.p = 0
 
     def is_empty(self):
@@ -541,42 +567,45 @@ class CircBuf(object):
 
 
 class LIFO(object):
+
     def __init__(self, max=10):
         self._data = []
         self._max = max
-    
+
     def append(self, elem):
-        if self._max == 0: return
-        
+        if self._max == 0:
+            return
+
         while len(self._data) >= self._max:
             self._data.pop(0)
         self._data.append(elem)
-    
+
     def extend(self, lst):
-        if self._max == 0: return
+        if self._max == 0:
+            return
         s = len(lst)
         if s >= self._max:
-            self._data = lst[s-self._max:]
+            self._data = lst[s - self._max:]
         else:
             while len(self._data) + len(lst) > self._max:
                 self._data.pop(0)
             self._data.extend(lst)
-        
+
     def pop(self, index=0):
         self._data.pop(index)
-        
+
     def clear(self):
         self._data = []
-    
+
     def get(self):
         return self._data
-    
+
     def getCopy(self):
         return copy.copy(self._data)
-    
+
     def __str__(self):
         return "%s(%s)" % (self.__class__.__name__, str(self._data))
-    
+
 
 class TimedQueue(list):
     """ A FIFO that keeps all the values introduced at least for a given time.
@@ -585,90 +614,101 @@ class TimedQueue(list):
     pop(): The value is removed only if delete_time has been reached.
     at least 1 value is always kept in the list
     """
-    def __init__(self,arg=None):
+
+    def __init__(self, arg=None):
         """ Initializes the list with a sequence or an initial value. """
         if arg is None:
             list.__init__(self)
         elif operator.isSequenceType(arg):
-            list.__init__(self,arg)
+            list.__init__(self, arg)
         else:
             list.__init__(self)
-            self.append(arg,1)
-    def append(self,obj,keep=15):
+            self.append(arg, 1)
+
+    def append(self, obj, keep=15):
         """ Inserts a tuple with (value,insert_time,delete_time=now+keep) """
-        now=time.time()
-        l=(obj,now,now+keep)
-        list.append(self,l)
-    def pop(self,index=0):
+        now = time.time()
+        l = (obj, now, now + keep)
+        list.append(self, l)
+
+    def pop(self, index=0):
         """ Returns the indicated value, or the first one; but removes only if delete_time has been reached.
         All values are returned at least once.
         When the queue has only a value, it is not deleted.
         """
-        if not self: return None #The list is empty
-        now=time.time()
-        s,t1,t2 = self[index]
-        if now<t2 or len(self)==1:
+        if not self:
+            return None  # The list is empty
+        now = time.time()
+        s, t1, t2 = self[index]
+        if now < t2 or len(self) == 1:
             return s
         else:
-            return list.pop(self,index)[0]
-    def index(self,obj):
-        for i in range(len(self)): 
-            if self[i][0]==obj: return i
+            return list.pop(self, index)[0]
+
+    def index(self, obj):
+        for i in range(len(self)):
+            if self[i][0] == obj:
+                return i
         return None
-    def __contains__(self,obj):
-        for t in self: 
-            if t[0]==obj: return True
+
+    def __contains__(self, obj):
+        for t in self:
+            if t[0] == obj:
+                return True
         return False
     pass
-    
 
-def self_locked(func,reentrant=True):
+
+def self_locked(func, reentrant=True):
     '''Decorator to make thread-safe class members
        Decorator to create thread-safe objects.
-       
+
        .. warning::
-            
+
             - With Lock() this decorator should not be used to decorate
               nested functions; it will cause Deadlock!
             - With RLock this problem is avoided ... but you should rely more
               on python threading'''
     import threading
-    def lock_fun(self,*args,**kwargs):
-        if not hasattr(self,'lock'):
+
+    def lock_fun(self, *args, **kwargs):
+        if not hasattr(self, 'lock'):
             if reentrant:
-                setattr(self,'lock', threading.RLock())
+                setattr(self, 'lock', threading.RLock())
             else:
-                setattr(self,'lock',threading.Lock())
-        if not hasattr(self,'trace'):
-            setattr(self,'trace',False)
+                setattr(self, 'lock', threading.Lock())
+        if not hasattr(self, 'trace'):
+            setattr(self, 'trace', False)
         self.lock.acquire()
-        try: 
-            if self.trace: print "locked: %s"%self.lock
-            result = func(self,*args,**kwargs)
-        finally: 
+        try:
+            if self.trace:
+                print "locked: %s" % self.lock
+            result = func(self, *args, **kwargs)
+        finally:
             self.lock.release()
-            if self.trace: print "released: %s"%self.lock
-        return result       
+            if self.trace:
+                print "released: %s" % self.lock
+        return result
     return lock_fun
-            
+
 
 class ThreadDict(dict):
-    ''' Thread safe dictionary with redefinable read/write methods and a 
-    background thread for hardware update.  All methods are thread-safe using 
+    ''' Thread safe dictionary with redefinable read/write methods and a
+    background thread for hardware update.  All methods are thread-safe using
     *@self_lock* decorator.
-    
+
     .. note::
         any method decorated in this way CANNOT call other decorated methods!
         All values of the dictionary will be automatically updated in a separate
-        Thread using read_method provided. Any value overwritten in the dict 
+        Thread using read_method provided. Any value overwritten in the dict
         should launch the write_method.
-    
+
     Briefing::
-    
+
         a[2] equals to a[2]=read_method(2)
         a[2]=1 equals to a[2]=write_method(2,1)'''
-    
-    def __init__(self,other=None,read_method=None,write_method=None,timewait=0.1,threaded=True):
+
+    def __init__(self, other=None, read_method=None, write_method=None, timewait=0.1, threaded=True):
         self.read_method = read_method
         self.write_method = write_method
         self.timewait = timewait
@@ -677,32 +717,40 @@ class ThreadDict(dict):
         self.trace = False
         self.last_update = 0
         self.last_cycle_start = 0
-        self.parent = type(self).mro()[1] #equals to self.__class__.__base__ or type(self).__bases__[0]
-    
-    def tracer(self,text): print text
-        
+        # equals to self.__class__.__base__ or type(self).__bases__[0]
+        self.parent = type(self).mro()[1]
+
+    def tracer(self, text):
+        print text
+
     def start(self):
         import threading
         if not self.threaded:
             return
-        if hasattr(self,'_Thread') and self._Thread and self._Thread.isAlive():
+        if hasattr(self, '_Thread') and self._Thread and self._Thread.isAlive():
             return
         self.event = threading.Event()
         self.event.clear()
         self._Thread = threading.Thread(target=self.run)
         self._Thread.setDaemon(True)
         self._Thread.start()
+
     def stop(self):
-        if self.threaded and hasattr(self,'event'): self.event.set()
-        if hasattr(self,'_Thread'): self._Thread.join()
+        if self.threaded and hasattr(self, 'event'):
+            self.event.set()
+        if hasattr(self, '_Thread'):
+            self._Thread.join()
 
     def alive(self):
-        if not hasattr(self,'_Thread') or not self._Thread: return False
-        else: return self._Thread.isAlive()
+        if not hasattr(self, '_Thread') or not self._Thread:
+            return False
+        else:
+            return self._Thread.isAlive()
+
     def __del__(self):
         self.stop()
-        #dict.__del__(self)
-        
+        # dict.__del__(self)
+
     def run(self):
         while not self.event.isSet():
             keys = self.threadkeys()
@@ -710,175 +758,201 @@ class ThreadDict(dict):
                 try:
                     #@todo It must be checked wich method for reading is better for thread_safe
                     if True:
-                        self.__getitem__(k,hw=True)
-                    else: #try this alternative in case of deadlock (it could need extra locks inside read_method)
+                        self.__getitem__(k, hw=True)
+                    # try this alternative in case of deadlock (it could need
+                    # extra locks inside read_method)
+                    else:
                         if self.read_method:
                             value = self.read_method(k)
-                            self.__setitem__(k,value,hw=False)
+                            self.__setitem__(k, value, hw=False)
                 finally:
                     self.event.wait(self.timewait)
-                if self.event.isSet(): break
+                if self.event.isSet():
+                    break
             timewait = self.get_timewait()
             self.event.wait(timewait)
-        
+
     @self_locked
-    def get_last_update(self): return self.last_update
+    def get_last_update(self):
+        return self.last_update
+
     @self_locked
-    def set_last_update(self,value): self.last_update=value
-    
+    def set_last_update(self, value):
+        self.last_update = value
+
     @self_locked
-    def get_last_cycle_start(self): return self.last_cycle_start
+    def get_last_cycle_start(self):
+        return self.last_cycle_start
+
     @self_locked
-    def set_last_cycle_start(self,value): self.last_cycle_start=value
-    
+    def set_last_cycle_start(self, value):
+        self.last_cycle_start = value
+
     @self_locked
-    def get_timewait(self): return self.timewait
+    def get_timewait(self):
+        return self.timewait
+
     @self_locked
-    def set_timewait(self,value): self.timewait=value    
-    
+    def set_timewait(self, value):
+        self.timewait = value
+
     @self_locked
-    def append(self,key,value=None): 
-        if not dict.has_key(self,key): self.parent.__setitem__(self,key,value)
-        if key not in self._threadkeys: self._threadkeys.append(key)
-    
+    def append(self, key, value=None):
+        if not dict.has_key(self, key):
+            self.parent.__setitem__(self, key, value)
+        if key not in self._threadkeys:
+            self._threadkeys.append(key)
+
     @self_locked
     def threadkeys(self):
         return self._threadkeys[:]
-    
+
     @self_locked
-    def __getitem__(self,key,hw=False):
+    def __getitem__(self, key, hw=False):
         ''' This method launches a read_method execution if there's no thread on charge of doing that or if the hw flag is set to True. '''
         import time
-        if (hw or not self.threaded) and self.read_method: 
-            dict.__setitem__(self,key,self.read_method(key))
+        if (hw or not self.threaded) and self.read_method:
+            dict.__setitem__(self, key, self.read_method(key))
             self.last_update = time.time()
-        return dict.__getitem__(self,key)    
+        return dict.__getitem__(self, key)
 
     @self_locked
-    def __setitem__(self,key,value,hw=True):
+    def __setitem__(self, key, value, hw=True):
         ''' This method launches a write_method execution if the hw flag is not explicitly set to False. '''
         import time
-        if hw and self.write_method: 
-            #It implies that a key will not be added here to read thread!
-            dict.__setitem__(self,key,self.write_method(*[key,value]))
-        else: dict.__setitem__(self,key,value)
+        if hw and self.write_method:
+            # It implies that a key will not be added here to read thread!
+            dict.__setitem__(self, key, self.write_method(*[key, value]))
+        else:
+            dict.__setitem__(self, key, value)
         self.last_update = time.time()
-    
+
     @self_locked
-    def get(self,key,default=None):
+    def get(self, key, default=None):
         import time
-        if not self.threaded and self.read_method: 
-            dict.__setitem__(self,key,self.read_method(key))
+        if not self.threaded and self.read_method:
+            dict.__setitem__(self, key, self.read_method(key))
             self.last_update = time.time()
-        if default is False: return dict.get(self,key)
-        else: return dict.get(self,key,default)
-    
+        if default is False:
+            return dict.get(self, key)
+        else:
+            return dict.get(self, key, default)
+
     #__getitem__ = self_locked(dict.__getitem__)
     #__setitem__ = self_locked(dict.__setitem__)
     __delitem__ = self_locked(dict.__delitem__)
     __contains__ = self_locked(dict.__contains__)
     __iter__ = self_locked(dict.__iter__)
-    
+
     pop = self_locked(dict.pop)
     #@self_locked
-    #def pop(self,k,d=None):
-        #if k in self.keys():
-            #self.stop()
-            #d = dict.pop(self,k)
-            #self.start()
-        #return d
-    
+    # def pop(self,k,d=None):
+    # if k in self.keys():
+    # self.stop()
+    #d = dict.pop(self,k)
+    # self.start()
+    # return d
+
     @self_locked
     def __str__(self):
-        return "{" +",".join(["'"+str(k)+"'"+":"+"'"+str(v)+"'" for k,v in zip(dict.keys(self),dict.values(self))])+ "}"
+        return "{" + ",".join(["'" + str(k) + "'" + ":" + "'" + str(v) + "'" for k, v in zip(dict.keys(self), dict.values(self))]) + "}"
+
     @self_locked
     def __repr__(self):
-        return "{\n" +"\n,".join(["'"+str(k)+"'"+":"+"'"+str(v)+"'" for k,v in zip(dict.keys(self),dict.values(self))])+ "\n}"      
+        return "{\n" + "\n,".join(["'" + str(k) + "'" + ":" + "'" + str(v) + "'" for k, v in zip(dict.keys(self), dict.values(self))]) + "\n}"
     #__str__ = self_locked(dict.__str__)
     #__repr__ = self_locked(dict.__repr__)
-    
+
     #get = self_locked(dict.get)
     has_key = self_locked(dict.has_key)
     update = self_locked(dict.update)
     copy = self_locked(dict.copy)
-    
+
     keys = self_locked(dict.keys)
     values = self_locked(dict.values)
     items = self_locked(dict.items)
     iterkeys = self_locked(dict.iterkeys)
-    itervalues = self_locked(dict.itervalues)   
-    iteritems = self_locked(dict.iteritems) 
+    itervalues = self_locked(dict.itervalues)
+    iteritems = self_locked(dict.iteritems)
+
 
 class SortedDict(dict):
     """ This class implements a dictionary that returns keys in the same order they were inserted. """
-    
-    def __init__(self,other=None):
+
+    def __init__(self, other=None):
         dict.__init__(self)
         self._keys = []
         if other is not None:
             self.update(other)
         return
-    
-    def sort(self,key):
+
+    def sort(self, key):
         """
         This method modifies the sorting of the dictionary overriding the existing sort key.
-        :param key: it can be a sequence containing all the keys already existing in the dictionary 
+        :param key: it can be a sequence containing all the keys already existing in the dictionary
                     or a callable providing a sorting key algorithm.
         """
         import operator
         if operator.isCallable(key):
-            self._keys = sorted(self._keys,key=key)
+            self._keys = sorted(self._keys, key=key)
         else:
             for k in self._keys:
-                if k not in self._keys: raise KeyError(k)
+                if k not in self._keys:
+                    raise KeyError(k)
             self._keys = list(key)
         return self._keys[:]
-        
-    def __setitem__(self,k,v):
+
+    def __setitem__(self, k, v):
         if k not in self._keys:
             self._keys.append(k)
-        dict.__setitem__(self,k,v)
-        
-    def update(self,other):
-        if hasattr(other,'items'):
+        dict.__setitem__(self, k, v)
+
+    def update(self, other):
+        if hasattr(other, 'items'):
             other = other.items()
-        for k,v in other:
-            self.__setitem__(k,v)
-    
+        for k, v in other:
+            self.__setitem__(k, v)
+
     @staticmethod
-    def fromkeys(S,v=None):
-        return SortedDict((s,v) for s in S)
-            
-    def pop(self,k,d=None):
+    def fromkeys(S, v=None):
+        return SortedDict((s, v) for s in S)
+
+    def pop(self, k, d=None):
         """Removes key and returns its (self[key] or d or None)"""
-        if k not in self: return d
+        if k not in self:
+            return d
         self._keys.remove(k)
-        return dict.pop(self,k)
-    
+        return dict.pop(self, k)
+
     def popitem(self):
         """Removes and returns last key,value pair"""
         k = self._keys[-1]
         v = self[k]
         self.pop(k)
-        return k,v
-    
+        return k, v
+
     def clear(self):
         self._keys = []
         return dict.clear(self)
-    
+
     def keys(self):
         return self._keys[:]
+
     def values(self):
         return [self[k] for k in self._keys]
+
     def items(self):
-        return [(k,self[k]) for k in self._keys]
-    
+        return [(k, self[k]) for k in self._keys]
+
     def __iter__(self):
-        return (i for i in self._keys)    
+        return (i for i in self._keys)
+
     def iteritems(self):
-        return ((k,self[k]) for k in self._keys)
+        return ((k, self[k]) for k in self._keys)
+
     def iterkeys(self):
         return (i for i in self._keys)
+
     def itervalues(self):
         return (self[k] for k in self._keys)
 
@@ -886,336 +960,358 @@ try:
     from collections import defaultdict
 except:
     class defaultdict(dict):
+
         def __init__(self, default_factory=None, *a, **kw):
             if (default_factory is not None and
-                not hasattr(default_factory, '__call__')):
+                    not hasattr(default_factory, '__call__')):
                 raise TypeError('first argument must be callable')
             dict.__init__(self, *a, **kw)
             self.default_factory = default_factory
+
         def __getitem__(self, key):
             try:
                 return dict.__getitem__(self, key)
             except KeyError:
                 return self.__missing__(key)
+
         def __missing__(self, key):
             if self.default_factory is None:
                 raise KeyError(key)
             self[key] = value = self.default_factory()
             return value
+
         def __reduce__(self):
             if self.default_factory is None:
                 args = tuple()
             else:
                 args = self.default_factory,
             return type(self), args, None, None, self.items()
+
         def copy(self):
             return self.__copy__()
+
         def __copy__(self):
             return type(self)(self.default_factory, self)
+
         def __deepcopy__(self, memo):
             import copy
             return type(self)(self.default_factory,
                               copy.deepcopy(self.items()))
+
         def __repr__(self):
             return 'defaultdict(%s, %s)' % (self.default_factory,
                                             dict.__repr__(self))
 
+
 class defaultdict_fromkey(defaultdict):
     """ Creates a dictionary with a default_factory function that creates new elements using key as argument.
     Usage : new_dict = defaultdict_fromkey(method); where method like (lambda key: return new_obj(key))
     Each time that new_dict[key] is called with a key that doesn't exist, method(key) is used to create the value
     Copied from PyAlarm device server
     """
+
     def __missing__(self, key):
-        if self.default_factory is None: raise KeyError(key)
+        if self.default_factory is None:
+            raise KeyError(key)
         self[key] = value = self.default_factory(key)
         return value
-        
 
-class CaselessDefaultDict(defaultdict_fromkey,CaselessDict):
+
+class CaselessDefaultDict(defaultdict_fromkey, CaselessDict):
     """ a join venture between caseless and default dict
     This class merges the two previous ones.
     This declaration equals to::
-    
+
         CaselessDefaultDict = type('CaselessDefaultType',(CaselessDict,defaultdict_fromkey),{})
     """
+
     def __getitem__(self, key):
         return defaultdict_fromkey.__getitem__(self, key.lower())
     pass
 
 
-class DefaultThreadDict(defaultdict_fromkey,ThreadDict):
+class DefaultThreadDict(defaultdict_fromkey, ThreadDict):
     """a join venture between thread and default dict
     This class merges the two previous ones.
     @todo This two classes are not yet well integrated ... the way a new key is added to the dict must be rewritten explicitly.
     """
-    def __init__(self,other=None,default_factory=None,read_method=None,write_method=None,timewait=0.1,threaded=True):
-        defaultdict_fromkey.__init__(self,default_factory)
-        ThreadDict.__init__(self,other,read_method,write_method,timewait,threaded)
-    pass    
-    
+
+    def __init__(self, other=None, default_factory=None, read_method=None, write_method=None, timewait=0.1, threaded=True):
+        defaultdict_fromkey.__init__(self, default_factory)
+        ThreadDict.__init__(self, other, read_method,
+                            write_method, timewait, threaded)
+    pass
+
 
 def getDictAsTree(dct):
     """This method will print a recursive dict in a tree-like
        shape::
-       
+
            >>> print getDictAsTree({'A':{'B':[1,2],'C':[3]}})"""
-    def add_to_level(l,d):
+    def add_to_level(l, d):
         lines = []
-        if isinstance(d,dict):
-            for k,v in d.items():
+        if isinstance(d, dict):
+            for k, v in d.items():
                 print 'with key "%s"' % k
-                lines.append(['']*l+[str(k)])
-                lines +=add_to_level(l+1,v)
-        elif type(d) in [list,set]: #End of recursion
+                lines.append([''] * l + [str(k)])
+                lines += add_to_level(l + 1, v)
+        elif type(d) in [list, set]:  # End of recursion
             for e in d:
-                if isinstance(e,dict):
-                    lines +=add_to_level(l,e)
+                if isinstance(e, dict):
+                    lines += add_to_level(l, e)
                 else:
-                    lines.append(['']*l+[str(e)])
+                    lines.append([''] * l + [str(e)])
         else:
-            lines.append(['']*l+[str(d)])
+            lines.append([''] * l + [str(d)])
         return lines
-    ls = ['\t'.join(line) for line in add_to_level(0,dct)]
-    print 'lines are : \n',ls
+    ls = ['\t'.join(line) for line in add_to_level(0, dct)]
+    print 'lines are : \n', ls
     return '\n'.join(ls)
-    
+
 
 class ArrayBuffer(object):
     '''A data buffer which internally uses a preallocated numpy.array.
     An ArrayBuffer will only present the actual contents, not the full internal
     buffer, so when appending or extending, it behaves as if dynamic
     reallocation was taking place.
-    
+
     The contents of the class:`ArrayBuffer` can be accessed as if it was a numpy
     array (i.e slicing notation like b[2:3], b[:,2], b[-1],... are all valid).
-    
+
     For retrieving the full contents, see :meth:`ArrayBuffer.contents` and
     :meth:`ArrayBuffer.toArray`
-    
+
     On creation, a given initial internal buffer and a maximum size are set. If
     the maximum size is larger than the original internal buffer, this will be
     automatically grown in geometrical steps if needed to accommodate the
     contents, up to the maximum size. Once the contents fill the maximum size,
     appending or extending the contents will result in older contents being
     discarded (in a FIFO way)
-    
+
     The :meth:`append` and meth:`extend` methods are designed to be cheap
     (especially if the internal buffer size is already at the maximum size), at
     the expense of memory usage'''
-    
+
     def __init__(self, buffer, maxSize=0):
         '''Creator.
-        
+
         :param buffer: (numpy.array) a numpy.array suitable to be used as the
                        internal buffer.
-                    
+
         :param maxSize: (int) Maximum size of the internal buffer. The internal
                         buffer length will be allowed to grow up to this value.
                         If maxSize=0 (default), the maximum size will be that of
-                        the given buffer 
+                        the given buffer
         '''
-        
+
         self.__buffer = buffer
         self.__end = 0
         self.__bsize = self.__buffer.shape[0]
         self.__maxSize = max(maxSize, self.__bsize)
-        
-        
+
     def __getitem__(self, i):
-        return self.__buffer[:self.__end].__getitem__(i)        
-    
+        return self.__buffer[:self.__end].__getitem__(i)
+
     def __getslice__(self, i, j):
-        return self.__buffer[:self.__end].__getslice__(i,j)
-    
+        return self.__buffer[:self.__end].__getslice__(i, j)
+
     def __len__(self):
         return self.__end
-    
+
     def __repr__(self):
-        return "ArrayBuffer with contents = %s"%self.__buffer[:self.__end].__repr__()
-    
+        return "ArrayBuffer with contents = %s" % self.__buffer[:self.__end].__repr__()
+
     def __str__(self):
         return self.__buffer[:self.__end].__str__()
-        
+
     def __nonzero__(self):
         return self.__buffer[:self.__end].__nonzero__()
-        
+
     def __setitem__(self, i, x):
         self.__buffer[:self.__end].__setitem__(i, x)
-    
+
     def __setslice__(self, i, j, a):
-        if i >= self.__end or j>self.__end: raise IndexError()
+        if i >= self.__end or j > self.__end:
+            raise IndexError()
         self.__buffer[:self.__end].__setslice__(i, j, a)
-    
+
     def resizeBuffer(self, newlen):
         '''resizes the internal buffer'''
         if newlen < self.__end:
-            self.__end = newlen 
+            self.__end = newlen
         shape = list(self.__buffer.shape)
         shape[0] = newlen
         try:
-            self.__buffer.resize(shape) #first try to resize in-place
+            self.__buffer.resize(shape)  # first try to resize in-place
         except:
             import numpy
-            self.__buffer = numpy.resize(self.__buffer, shape) #if not possible, do it by copying
+            # if not possible, do it by copying
+            self.__buffer = numpy.resize(self.__buffer, shape)
         self.__bsize = self.__buffer.shape[0]
-    
-    def append(self,x):
+
+    def append(self, x):
         ''' similar to the append method in a list, except that once the maximum
         buffer size is reached, elements get discarded on the begginning to keep
         the size within the limit
-        
+
         :param x: (scalar) element to be appended
-        
+
         .. seealso:: :meth:`extend`
         '''
         try:
             self.__buffer[self.__end] = x
         except IndexError:
             if self.__bsize < self.__maxSize:
-                self.resizeBuffer(min(2*self.__bsize, self.__maxSize))
-                return self.append(x) #recursively call itself again after resizing
+                self.resizeBuffer(min(2 * self.__bsize, self.__maxSize))
+                # recursively call itself again after resizing
+                return self.append(x)
             self.moveLeft(1)
             self.__buffer[self.__end] = x
         self.__end += 1
-    
+
     def extend(self, a):
         ''' similar to the extend method of a list, except that once the maximum
         buffer size is reached, elements get discarded on the begginning to keep
         the size within the limit
-        
+
         :param a: (numpy.array) array of elements to append
-        
+
         .. seealso:: :meth:`append`, :meth:`extendLeft`
         '''
         newend = self.__end + a.shape[0]
-        if  newend < self.__bsize:
+        if newend < self.__bsize:
             self.__buffer[self.__end:newend] = a
             self.__end = newend
         elif self.__bsize < self.__maxSize:
-            self.resizeBuffer(min(2*self.__bsize, self.__maxSize))
-            return self.extend(a) #recursively call itself again after resizing
+            self.resizeBuffer(min(2 * self.__bsize, self.__maxSize))
+            # recursively call itself again after resizing
+            return self.extend(a)
         else:
             self.moveLeft(newend - self.__bsize)
-            self.__buffer[self.__end:] = a[-min(a.shape[0],self.__bsize):]
+            self.__buffer[self.__end:] = a[-min(a.shape[0], self.__bsize):]
             self.__end = self.__bsize
-    
+
     def extendLeft(self, a):
         ''' Prepends data to the current contents. Note that, contrary to the
         extent method, no data will be discarded if the maximum size limit is
         reached. Instead, an exception will be raised.
-        
+
         :param a: (numpy.array) array of elements to append
-        
+
         .. seealso:: :meth:`extend`'''
         len_a = a.shape[0]
         newend = self.__end + len_a
-        if  newend < self.__bsize:
-            self.__buffer[len_a:newend] = self.__buffer[0:self.__end] #move the contents to the right
+        if newend < self.__bsize:
+            self.__buffer[len_a:newend] = self.__buffer[
+                0:self.__end]  # move the contents to the right
             self.__buffer[0:len_a] = a
             self.__end = newend
         elif newend < self.__maxSize:
-            self.resizeBuffer(min(2*self.__bsize, self.__maxSize))
-            return self.extendLeft(a)  #recursively call itself again after resizing
+            self.resizeBuffer(min(2 * self.__bsize, self.__maxSize))
+            # recursively call itself again after resizing
+            return self.extendLeft(a)
         else:
-            raise ValueError('Maximum buffer size cannot be exceeded when calling extendLeft ')
-        
+            raise ValueError(
+                'Maximum buffer size cannot be exceeded when calling extendLeft ')
+
     def moveLeft(self, n):
         '''discards n elements from the begginning to make space at the end of
         the buffer. Moves all elements n positions to the left and the contents
         size gets decreased by n
-        
+
         **Note:** if n is larger or equal than the maximum buffer size, the
         whole buffer is wiped
-        
+
         :param n: (int)'''
         newend = max(0, self.__end - n)
         self.__buffer[0:newend] = self.__buffer[n:self.__end]
         self.__end = newend
-        
+
     def contents(self):
         '''returns the array of the contents that have already been filled. Note
         that it does not return the full buffer, only those elements that have
         been already set.
-        
+
         It is equivalent to b[:]
-        
+
         :return: (numpy.array) array of contents
-        
+
         .. seealso:: :meth:`toArray`
         '''
         return self.__buffer[:self.__end]
-    
+
     def toArray(self):
         '''returns a copy of the array of the contents. It is equivalent to
         ``b.contents.copy()``
-        
+
         :return: (numpy.array) copy of array of contents
-        
+
         .. seealso:: :meth:`contents`
         '''
         return self.contents().copy()
-    
+
     def contentsSize(self):
         '''Equivalent to len(b)
-        
+
         :return: (int) length of the current contents of the ArrayBuffer (not
                  the maximum size of the buffer)
-        
+
         .. seealso:: :meth:`maxSize`
         '''
         return self.__end
-    
+
     def bufferSize(self):
         '''Returns the current size of the internal buffer
-        
+
         :return: (int) lcurrent length of the internal buffer
-        
+
         .. seealso:: :meth:`contentsSize`, :meth:`maxSize`
         '''
         return self.__bsize
-    
+
     def maxSize(self):
         '''Returns the maximum size of the internal buffer, beyond which the
         ArrayBuffer starts discarding elements when appending
-        
+
         :return: (int) maximum length of the internal buffer
-        
+
         .. seealso:: :meth:`contentsSize`, :meth:`append`, :meth:`extend`, :meth:`isFull`
         '''
         return self.__maxSize
-    
+
     def setMaxSize(self, maxSize):
         '''Sets the maximum size of the internal buffer, beyond which the
         ArrayBuffer starts discarding elements when appending
-        
+
         :param maxSize: (int) maximum length of the internal buffer
-        
+
         .. seealso:: :meth:`contentsSize`, :meth:`append`, :meth:`extend`, :meth:`isFull`
         '''
-        if maxSize<self.__bsize:
-            raise ValueError('Cannot set a maximum size below the current buffer size (%i)'%self.__bsize)
+        if maxSize < self.__bsize:
+            raise ValueError(
+                'Cannot set a maximum size below the current buffer size (%i)' % self.__bsize)
         self.__maxSize = maxSize
-        
+
     def isFull(self):
         '''Whether the contents fill the whole of the internal buffer
-        
+
         :return: (bool) True if the contents fill the maximum size. False otherwise.
-        
+
         .. seealso:: :meth:`maxSize`
         '''
         return self.__end >= self.__maxSize
-    
+
     def remainingSize(self):
         '''returns the remaining free space in the internal buffer (e.g., 0 if it is full)
-        
+
         :return: (int) length of the unused space in the internal buffer
-        
+
         .. seealso:: :meth:`contentsSize`, :meth:`maxSize`,
-        ''' 
+        '''
         return self.maxSize() - self.contentsSize()
 
+
 def chunks(l, n):
     '''Generator which yields successive n-sized chunks from l'''
     for i in xrange(0, len(l), n):
-        yield l[i:i+n]
+        yield l[i:i + n]
diff --git a/lib/taurus/core/util/decorator/decorator.py b/lib/taurus/core/util/decorator/decorator.py
index df109a2..e26227f 100644
--- a/lib/taurus/core/util/decorator/decorator.py
+++ b/lib/taurus/core/util/decorator/decorator.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -39,7 +39,7 @@ Allow to use decorator either with arguments or not. Example::
         def __call__(self, func):
             return func(*self.args, **self.kw)
 
-    # 
+    #
     # Usage in both cases:
     #
     @apply
@@ -61,6 +61,7 @@ __docformat__ = "restructuredtext"
 import functools
 import inspect
 
+
 def decorator(func):
     """Allow to use decorator either with arguments or not. Example::
 
@@ -77,7 +78,7 @@ def decorator(func):
             def __call__(self, func):
                 return func(*self.args, **self.kw)
 
-        # 
+        #
         # Usage in both cases:
         #
         @apply
@@ -100,7 +101,7 @@ def decorator(func):
     if isinstance(func, type):
         def class_wrapper(*args, **kw):
             if isFuncArg(*args, **kw):
-                return func()(*args, **kw) # create class before usage
+                return func()(*args, **kw)  # create class before usage
             return func(*args, **kw)
         class_wrapper.__name__ = func.__name__
         class_wrapper.__module__ = func.__module__
diff --git a/lib/taurus/core/util/decorator/deprecated.py b/lib/taurus/core/util/decorator/deprecated.py
deleted file mode 100644
index 3e4393d..0000000
--- a/lib/taurus/core/util/decorator/deprecated.py
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 is a decorator which can be used to mark functions as deprecated. 
-It will result in a warning being emitted when the function is used. Examples::
-
-    @deprecated
-    def my_func():
-        pass
-
-    @other_decorators_must_be_upper
-    @deprecated
-    def my_func():
-        pass
-"""
-
-__all__ = ["deprecated"]
-
-__docformat__ = "restructuredtext"
-
-import functools
-import warnings
-
-def deprecated(func):
-    """This is a decorator which can be used to mark functions
-    as deprecated. It will result in a warning being emitted
-    when the function is used. Examples::
-    
-        @deprecated
-        def my_func():
-            pass
-
-        @other_decorators_must_be_upper
-        @deprecated
-        def my_func():
-            pass
-    """
-    
-    @functools.wraps(func)
-    def new_func(*args, **kwargs):
-        warnings.warn_explicit(
-            "Call to deprecated function %(funcname)s." % {
-                'funcname': func.__name__,
-            },
-            category=DeprecationWarning,
-            filename=func.func_code.co_filename,
-            lineno=func.func_code.co_firstlineno + 1
-        )
-        return func(*args, **kwargs)
-    return new_func
\ No newline at end of file
diff --git a/lib/taurus/core/util/decorator/memoize.py b/lib/taurus/core/util/decorator/memoize.py
index 4dbb1d2..d4a4129 100644
--- a/lib/taurus/core/util/decorator/memoize.py
+++ b/lib/taurus/core/util/decorator/memoize.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/core/util/decorator/typecheck.py b/lib/taurus/core/util/decorator/typecheck.py
index 932008c..6694702 100644
--- a/lib/taurus/core/util/decorator/typecheck.py
+++ b/lib/taurus/core/util/decorator/typecheck.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -69,6 +69,7 @@ __docformat__ = "restructuredtext"
 
 import sys
 
+
 def accepts(*types, **kw):
     """ Function decorator. Checks that inputs given to decorated function
     are of the expected type.
@@ -127,6 +128,7 @@ def returns(ret_type, **kw):
             debug = 1
         else:
             debug = kw['debug']
+
         def decorator(f):
             def newf(*args):
                 result = f(*args)
@@ -148,6 +150,7 @@ def returns(ret_type, **kw):
     except TypeError, msg:
         raise TypeError, msg
 
+
 def info(fname, expected, actual, flag):
     """ Convenience function returns nicely formatted error/warning msg. """
     format = lambda types: ', '.join([str(t).split("'")[1] for t in types])
@@ -155,4 +158,4 @@ def info(fname, expected, actual, flag):
     msg = "'%s' method " % fname \
           + ("accepts", "returns")[flag] + " (%s), but " % expected\
           + ("was given", "result is")[flag] + " (%s)" % actual
-    return msg
\ No newline at end of file
+    return msg
diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py
index d0adc7a..7a21656 100644
--- a/lib/taurus/core/util/enumeration.py
+++ b/lib/taurus/core/util/enumeration.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -39,20 +39,20 @@ __docformat__ = "restructuredtext"
 
 
 class EnumException(Exception):
-    """Exception thrown by :class:`Enumeration` when trying to declare an 
+    """Exception thrown by :class:`Enumeration` when trying to declare an
     invalid enumeration."""
     pass
 
 
 class Enumeration(object):
-    """ Enumeration class intended to provide the 'enum' feature present in many 
-    programming languages. 
+    """ Enumeration class intended to provide the 'enum' feature present in many
+    programming languages.
     The elements of the enumeration can be accessed in an "object member way" or
     as elements of a dictionary.
     Usage::
-        
+
         from taurus.core.util.enumeration import Enumeration
-        
+
         Volkswagen = Enumeration("Volkswagen",
             ["JETTA",
              "RABBIT",
@@ -67,24 +67,24 @@ class Enumeration(object):
              ])
 
     In the command line::
-                
+
         >>> my_car = Volkswagen.BEETLE
         >>> homer_car = Volkswagen.PASSAT
-        
+
         >>> print Volkswagen.BEETLE
         2
 
         >>> print Volkswagen['BEETLE']
         2
-        
+
         >>>print Volkswagen.whatis(homer_car)
         'PASSAT'
     """
 
     def __init__(self, name, enumList, flaggable=False, no_doc=False):
         self._name = name
-        lookup = { }
-        reverseLookup = { }
+        lookup = {}
+        reverseLookup = {}
         uniqueNames = set()
         self._flaggable = flaggable
         self._uniqueValues = uniqueValues = set()
@@ -92,16 +92,19 @@ class Enumeration(object):
         for x in enumList:
             if isinstance(x, tuple):
                 if flaggable:
-                    raise EnumException("flagable enum does not accept tuple items")
+                    raise EnumException(
+                        "flagable enum does not accept tuple items")
                 x, i = x
                 if not isinstance(x, (str, unicode)):
                     raise EnumException("enum name is not a string: " + str(x))
                 if not isinstance(i, (int, long)):
-                    raise EnumException("enum value is not an integer: " + str(i))
+                    raise EnumException(
+                        "enum value is not an integer: " + str(i))
                 if x in uniqueNames:
                     raise EnumException("enum name is not unique: " + str(x))
                 if i in uniqueValues:
-                    raise EnumException("enum value is not unique for " + str(x))
+                    raise EnumException(
+                        "enum value is not unique for " + str(x))
                 uniqueNames.add(x)
                 uniqueValues.add(i)
                 lookup[x] = i
@@ -122,6 +125,13 @@ class Enumeration(object):
         if not no_doc:
             self.__doc_enum()
 
+    def __call__(self, i):
+        # TODO: Dummy implementation to simulate Python Enum behaviour.
+        # It is not a complete replacement because although we can use
+        # Enumeration as Callable, it still return an int instead of an
+        # Enumeration member.
+        return self.lookup[self.whatis(i)]
+
     def _generateUniqueId(self):
         if self._flaggable:
             n = 2 ** self._uniqueId
@@ -147,22 +157,22 @@ class Enumeration(object):
         rl = self.reverseLookup
         keys = rl.keys()
         keys.sort()
-        values = "\n".join([ "    - {0} ({1})".format(rl[k], k) for k in keys ])
+        values = "\n".join(["    - {0} ({1})".format(rl[k], k) for k in keys])
         self.__doc__ = self._name + " enumeration. " + \
-                       "Possible values are:\n\n" + values
+            "Possible values are:\n\n" + values
 
     def __str__(self):
         rl = self.reverseLookup
         keys = rl.keys()
         keys.sort()
-        values = ", ".join([ rl[k] for k in keys ])
+        values = ", ".join([rl[k] for k in keys])
         return self._name + "(" + values + ")"
 
     def __repr__(self):
         rl = self.reverseLookup
         keys = rl.keys()
         keys.sort()
-        values = [ rl[k] for k in keys ]
+        values = [rl[k] for k in keys]
         return "Enumeration('" + self._name + "', " + str(values) + ")"
 
     def has_key(self, key):
diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py
index 7748225..8fe9af2 100644
--- a/lib/taurus/core/util/event.py
+++ b/lib/taurus/core/util/event.py
@@ -2,32 +2,32 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-event.py: 
+event.py:
 """
 
-__all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", 
+__all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator",
            "ConfigEventGenerator", "ListEventGenerator", "EventListener",
            "AttributeEventWait", "AttributeEventIterator"]
 
@@ -41,13 +41,14 @@ import operator
 
 import taurus.core
 
+
 class BoundMethodWeakref(object):
     """This class represents a weak reference to a method of an object since
     weak references to methods don't work by themselves"""
-    
+
     def __init__(self, bound_method, del_cb=None):
         cb = (del_cb and self._deleted)
-        self.func_ref = weakref.ref(bound_method.im_func, cb) 
+        self.func_ref = weakref.ref(bound_method.im_func, cb)
         self.obj_ref = weakref.ref(bound_method.im_self, cb)
         if cb:
             self.del_cb = CallableRef(del_cb)
@@ -55,11 +56,11 @@ class BoundMethodWeakref(object):
 
     def _deleted(self, obj):
         if not self.already_deleted:
-            del_cb=self.del_cb()
+            del_cb = self.del_cb()
             if del_cb is not None:
                 del_cb(self)
                 self.already_deleted = 1
-        
+
     def __call__(self):
         obj = self.obj_ref()
         if obj is not None:
@@ -81,16 +82,16 @@ class BoundMethodWeakref(object):
         obj, func = self.obj_ref(), self.func_ref()
         return 'BoundMethodWeakRef of %s.%s' % (obj, func)
 
-    
+
 def CallableRef(object, del_cb=None):
-    """This function returns a callable weak reference to a callable object. 
+    """This function returns a callable weak reference to a callable object.
     Object can be a callable object, a function or a method.
-    
+
     :param object: a callable object
     :type object: callable object
     :param del_cb: calback function. Default is None meaning to callback.
     :type del_cb: callable object or None
-    
+
     :return: a weak reference for the given callable
     :rtype: BoundMethodWeakref or weakref.ref"""
     if hasattr(object, 'im_self'):
@@ -101,7 +102,7 @@ def CallableRef(object, del_cb=None):
 
 class EventStack(object):
     "internal usage event stack"
-    
+
     def __init__(self, history=True):
         self.unread_stack = []
         self.read_stack = []
@@ -120,14 +121,14 @@ class EventStack(object):
         del self.unread_stack[0]
         if self.history:
             self.read_stack.append(event)
-        
+
         return event
 
     def getAllUnread(self):
         unread = self.unread_stack
         self.unread_stack = []
         return unread
-    
+
     def getAllRead(self):
         read = self.read_stack
         self.read_stack = []
@@ -136,14 +137,15 @@ class EventStack(object):
 
 from object import Object
 
+
 class EventGenerator(Object):
     """Base class capable of firing events"""
 
     WaitTimeout = 0.1
-    
+
     def __init__(self, name, events_active=True):
         """Event generator constructor.
-        
+
         :param name: the event generator name
         :type  name: str
         :param events_active: generate events (default is True)
@@ -158,7 +160,7 @@ class EventGenerator(Object):
         self.events_active = events_active
         self.cond = threading.Condition()
         self.wait_list = []
-        
+
     def lock(self):
         """Locks this event generator"""
         self.cond.acquire()
@@ -172,23 +174,23 @@ class EventGenerator(Object):
 
     def subscribeEvent(self, cb, data=None):
         """Subscribes to the event
-        
+
         :param cb: a callable object
         :type  cb: callable
         :param data: extra data to send each time an event is triggered on the
                      given callback. Default is None
         :type  data: object"""
         if not self.events_active:
-            raise RuntimeError, ('%s does not have ' \
+            raise RuntimeError, ('%s does not have '
                                  'events/polling active' % self.event_name)
-        
+
         cb_ref = CallableRef(cb, self.unsubscribeDeletedEvent)
 
         try:
             self.lock()
             if (cb_ref, data) in self.cb_list:
                 raise RuntimeError, ('Callback %s(%s) already reg. on %s' %
-                                    (cb, data, self.event_name))
+                                     (cb, data, self.event_name))
             self.cb_list.append((cb_ref, data))
             cb(data, self.first_event_val)
         finally:
@@ -205,11 +207,11 @@ class EventGenerator(Object):
                     del self.cb_list[i]
         finally:
             self.unlock()
-                
+
     def unsubscribeEvent(self, cb, data=None):
         """Unsubscribes the given callback from the event. If the callback is not
         a listener for this event a debug message is generated an nothing happens.
-        
+
         :param cb: a callable object
         :type  cb: callable
         :param data: extra data to send each time an event is triggered on the
@@ -221,10 +223,11 @@ class EventGenerator(Object):
             if (cb_ref, data) in self.cb_list:
                 self.cb_list.remove((cb_ref, data))
             else:
-                self.debug("Trying to unsubscribe: %s is not a listener of %s" % (str(cb_ref),self.event_name))
+                self.debug("Trying to unsubscribe: %s is not a listener of %s" % (
+                    str(cb_ref), self.event_name))
         finally:
             self.unlock()
-    
+
     def isSubscribed(self, cb, data=None):
         """Determines if the given callback is registered for this event.
 
@@ -237,10 +240,10 @@ class EventGenerator(Object):
         :rtype: bool"""
         cb_ref = CallableRef(cb, self.unsubscribeDeletedEvent)
         return (cb_ref, data) in self.cb_list
-         
+
     def setEventsActive(self, events_active):
         """(De)activates events on this event generator.
-        
+
         :param events_active: activate/deactivate events
         :type  events_active: bool"""
         self.events_active = events_active
@@ -250,7 +253,7 @@ class EventGenerator(Object):
         :return: True if events are active or False otherwise
         :rtype: bool"""
         return self.events_active
-    
+
     def fireEvent(self, val, event_val=None):
         """Fires an event.
         :param val: event value
@@ -270,11 +273,11 @@ class EventGenerator(Object):
                     cb(data, event_val)
         finally:
             self.unlock()
-            
+
     def waitEvent(self, val=None, equal=True, any=False, timeout=None,
                   stack=None):
         """Waits for an event to occur
-        
+
         :param val: event value
         :type  val: object
         :param equal: check for equality. Default is True
@@ -289,7 +292,7 @@ class EventGenerator(Object):
         :return: the value of the event that unblocked the wait
         :rtype: object"""
         if not self.events_active:
-            raise RuntimeError, ('%s does not have ' \
+            raise RuntimeError, ('%s does not have '
                                  'events/polling active' % self.event_name)
         try:
             self.lock()
@@ -304,7 +307,7 @@ class EventGenerator(Object):
                 if any:
                     block = not avail
                 else:
-                    block = ((equal and (val != curr_val)) or \
+                    block = ((equal and (val != curr_val)) or
                              (not equal and (val == curr_val)))
                 if timeout:
                     timeout_expired = (time.time() - t0 > timeout)
@@ -321,7 +324,7 @@ class EventGenerator(Object):
 
     def read(self):
         """Read the last event
-        
+
         :return: the last event value
         :rtype: object"""
         return self.last_val
@@ -329,7 +332,7 @@ class EventGenerator(Object):
 
 class EventListener(object):
     """A class that listens for an event with a specific value
-    
+
     Note: Since this class stores for each event value the last timestamp when
     it occured, it should only be used for events for which the event value
     domain (possible values) is limited and well known (ex: an enum)"""
@@ -337,12 +340,12 @@ class EventListener(object):
     def __init__(self):
         self.last_val = None
         self.cond = threading.Condition()
-        
+
         # a set implemented as a dictionary
         # dict<object, float>
         # key - event value
         # value - timestamp of last event with that value
-        self.event_set = {} 
+        self.event_set = {}
         self.attr.addListener(self)
 
     def lock(self):
@@ -364,7 +367,7 @@ class EventListener(object):
         """Notifies that a given event has arrived
         This function is protected inside with the object's lock. Do NOT call
         this function when you have the lock acquired on this object.
-        
+
         :param v: event value
         :type  v: object"""
         try:
@@ -378,15 +381,15 @@ class EventListener(object):
 
     def waitEvent(self, val, after=0, equal=True):
         """Wait for an event with the given value. You MUST protect this function
-        with this object's lock before calling this method and always unlock it 
+        with this object's lock before calling this method and always unlock it
         afterward, of course::
-        
+
             from taurus.core.util.event import EventListener
-            
+
             class MyEvtListener(EventListener):
                 # Your specific listener code here
                 pass
-            
+
             evt_listener = EventListener()
             try:
                 evt_listener.lock()
@@ -395,13 +398,13 @@ class EventListener(object):
                 evt_listener.waitEvent(Stop, t)
             finally:
                 evt_listener.unlock()
-        
+
         :param val: value to compare
         :type  val: object
         :param after: timestamp. wait for events comming after the given time.
                       default value is 0 meaning any event after Jan 1, 1970
         :type  after: float
-        :param equal: compare for equality. equal=True means an event with the 
+        :param equal: compare for equality. equal=True means an event with the
                       given value, equal=False means any event which as a different value
         :type  equal: bool
         """
@@ -409,11 +412,14 @@ class EventListener(object):
         while True:
             if equal:
                 t = s.get(val)
-                if t and t >= after: return
+                if t and t >= after:
+                    return
             else:
                 for v, t in s.items():
-                    if v == val: continue
-                    if t >= after: return
+                    if v == val:
+                        continue
+                    if t >= after:
+                        return
             self.cond.wait()
 
 
@@ -422,7 +428,7 @@ class ConfigEventGenerator(EventGenerator):
 
     def fireEvent(self, val, event_val=None):
         EventGenerator.fireEvent(self, val, event_val)
-        
+
 
 class ListEventGenerator(EventGenerator):
     """Manage list events, detecting changes in the list"""
@@ -431,12 +437,12 @@ class ListEventGenerator(EventGenerator):
         self.call__init__(EventGenerator, name, events_active)
         self.last_val = []
         self.first_event_val = [], [], []
-        
+
     def fireEvent(self, val):
         """Notifies that a given event has arrived
         This function is protected inside with the object's lock. Do NOT call
         this function when you have the lock acquired on this object.
-        
+
         :param val: event value
         :type  val: object"""
         # if attribute is not alive and last time was also not alive then
@@ -445,13 +451,13 @@ class ListEventGenerator(EventGenerator):
             if len(self.last_val) == 0:
                 return
             val = []
-            
+
         try:
             self.lock()
             val = list(val)
             last_val = self.last_val
-            rm  = [x for x in last_val if x not in val]
-            add  = [x for x in val if x not in last_val]
+            rm = [x for x in last_val if x not in val]
+            add = [x for x in val if x not in last_val]
             event_val = val, rm, add
             EventGenerator.fireEvent(self, val, event_val)
             self.first_event_val = val, [], val
@@ -470,7 +476,7 @@ class AttributeEventWait(object):
         self._event_set = {}
         if attr is not None:
             self.connect(attr)
-    
+
     def connect(self, attr):
         """Connect to the given attribute
         :param attr: the attribute to connect to
@@ -479,11 +485,13 @@ class AttributeEventWait(object):
         if self._attr is not None:
             if attr == self._attr:
                 needAdd = False
-            else: self._attr.removeListener(self)
+            else:
+                self._attr.removeListener(self)
         self.clearEventSet()
         self._last_val = None
         self._attr = attr
-        if needAdd: self._attr.addListener(self)
+        if needAdd:
+            self._attr.addListener(self)
 
     def disconnect(self):
         """Disconnects from the attribute. If not connected nothing happens."""
@@ -527,12 +535,12 @@ class AttributeEventWait(object):
             self.fireEvent(None)
         else:
             self.fireEvent(v.value)
-        
+
     def fireEvent(self, v):
         """Notifies that a given event has arrived
         This function is protected inside with the object's lock. Do NOT call
         this function when you have the lock acquired on this object.
-        
+
         :param v: event value
         :type  v: object"""
         t = time.time()
@@ -543,49 +551,49 @@ class AttributeEventWait(object):
             self._cond.notifyAll()
         finally:
             self.unlock()
-    
+
     def getLastRecordedEvent(self):
         """returns the value of the last recorded event or None if no event has
         been received or the last event was an error event
-        
+
         :return: the last event value to be recorded
         :rtype: object"""
         return self._last_val
-    
+
     def getRecordedEvents(self):
         """Returns a reference to the internal dictionary used to store the internal
         events. Modify the return dictionary at your own risk!
-        
+
         :return: reference to the internal event dictionary
         :rtype: dict"""
         return self._event_set
-    
+
     def getRecordedEvent(self, v):
         """Returns the the recorded local timestamp for the event with the given
         value or None if no event with the given value has been recorded.
-        
+
         :param v: event value
         :type  v: object
         :return: local timestamp for the event or None if no event has been recorded
         :rtype: float"""
         return self._event_set.get(v)
-    
+
     def waitEvent(self, val, after=0, equal=True, timeout=None, retries=-1,
                   any=False):
         """Wait for an event with the given value.
-        
+
         :param val: value to compare
         :type  val: object
         :param after: timestamp. wait for events comming after the given time.
                       default value is 0 meaning any event after Jan 1, 1970
         :type  after: float
-        :param equal: compare for equality. equal=True means an event with the 
+        :param equal: compare for equality. equal=True means an event with the
                       given value, equal=False means any event which as a different value
         :type  equal: bool
         :param timeout: maximum time to wait (seconds). Default is None meaning
                wait forever.
         :type  timeout: float
-        :param retries: number of maximum retries of max timeout to attempts. 
+        :param retries: number of maximum retries of max timeout to attempts.
                         Default is -1 meaning infinite number of retries.
                         0 means no wait. Positive number is obvious.
         :param any: if any is True ignore 'val' parameter and accept any event.
@@ -608,19 +616,23 @@ class AttributeEventWait(object):
             while retries != 0:
                 if any:
                     for v, t in s.items():
-                        if t >= after: return
+                        if t >= after:
+                            return
                 if equal:
                     t = s.get(val)
                     if (t is not None) and (t >= after):
                         return
                 else:
                     for v, t in s.items():
-                        if v == val: continue
-                        if t >= after: return
+                        if v == val:
+                            continue
+                        if t >= after:
+                            return
                 self._cond.wait(timeout)
                 retries -= 1
         except Exception, e:
-            sys.stderr.write("AttributeEventWait: Caught exception while waitting: %s\n" % str(e))
+            sys.stderr.write(
+                "AttributeEventWait: Caught exception while waitting: %s\n" % str(e))
             raise e
         finally:
             self.unlock()
@@ -634,7 +646,7 @@ class AttributeEventIterator(object):
         self._cond = threading.Condition()
         if len(attrs) > 0:
             self.connect(attrs)
-    
+
     def connect(self, attrs):
         if not operator.isSequenceType(attrs):
             attrs = (attrs,)
@@ -642,15 +654,16 @@ class AttributeEventIterator(object):
         self._attrs = attrs
         for attr in self._attrs:
             attr.addListener(self)
-    
+
     def disconnect(self):
-        if self._attrs is None: return
+        if self._attrs is None:
+            return
         for attr in self._attrs:
             attr.removeListener(self)
-    
+
     def lock(self):
         self._cond.acquire()
-    
+
     def unlock(self):
         if self._cond._is_owned():
             self._cond.release()
@@ -660,12 +673,12 @@ class AttributeEventIterator(object):
             curr_th = threading.current_thread()
             print "WARNING: Thread %s trying to unlock condition previously " \
                   "locked by thread %s" % (curr_th.name, th.name)
-    
+
     def eventReceived(self, s, t, v):
         if t not in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic):
             return
         self.fireEvent(s, v.value)
-    
+
     def fireEvent(self, s, v):
         t = time.time()
         self.lock()
@@ -684,4 +697,4 @@ class AttributeEventIterator(object):
         except Exception, e:
             print "INFO: Caught exception while waiting", str(e)
         finally:
-            self.unlock()
\ No newline at end of file
+            self.unlock()
diff --git a/lib/taurus/core/util/eventfilters.py b/lib/taurus/core/util/eventfilters.py
index 8dc52a1..1656792 100644
--- a/lib/taurus/core/util/eventfilters.py
+++ b/lib/taurus/core/util/eventfilters.py
@@ -2,149 +2,171 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
-"""event filters library to be used with 
+"""event filters library to be used with
 :meth:`taurus.qt.qtgui.base.TaurusBaseComponent.setFilters`"""
 
-import PyTango
-import taurus
 
 def IGNORE_ALL(s, t, v):
     '''Will discard all events'''
     return None
 
+
 def ONLY_CHANGE(s, t, v):
     '''Only change events pass'''
-    if t == taurus.core.taurusbasetypes.TaurusEventType.Change: return s,t,v
-    else: return None
+    from taurus.core import TaurusEventType
+    if t == TaurusEventType.Change:
+        return s, t, v
+    else:
+        return None
+
 
 def IGNORE_CHANGE(s, t, v):
     '''Config events are discarded'''
-    if t != taurus.core.taurusbasetypes.TaurusEventType.Change: return s,t,v
-    else: return None
+    from taurus.core import TaurusEventType
+    if t != 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.taurusbasetypes.TaurusEventType.Change, 
-             taurus.core.taurusbasetypes.TaurusEventType.Periodic]: 
-        return s,t,v
-    else: return None
+    from taurus.core import TaurusEventType
+    if t in [TaurusEventType.Change,
+             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.taurusbasetypes.TaurusEventType.Change, 
-                 taurus.core.taurusbasetypes.TaurusEventType.Periodic]: 
-        return s,t,v
-    else: return None
-    
+    from taurus.core import TaurusEventType
+    if t not in [TaurusEventType.Change,
+                 TaurusEventType.Periodic]:
+        return s, t, v
+    else:
+        return None
+
+
 def ONLY_CONFIG(s, t, v):
     '''Only config events pass'''
-    if t == taurus.core.taurusbasetypes.TaurusEventType.Config: return s,t,v
-    else: return None
-    
+    from taurus.core import TaurusEventType
+    if t == TaurusEventType.Config:
+        return s, t, v
+    else:
+        return None
+
+
 def IGNORE_CONFIG(s, t, v):
     '''Config events are discarded'''
-    if t != taurus.core.taurusbasetypes.TaurusEventType.Config: return s,t,v
-    else: return None
-    
-def ONLY_VALID(s, t, v):
-    '''Only events whose quality is VALID pass'''
-    if getattr(v,'quality',None) == PyTango.AttrQuality.ATTR_VALID: return s,t,v
-    else: return None
-    
+    from taurus.core import TaurusEventType
+    if t != TaurusEventType.Config:
+        return s, t, v
+    else:
+        return None
+
+
 def IGNORE_FAKE(s, t, v):
     '''Only events with actual value (!=None) pass'''
-    if v is not None: return s,t,v
-    else: return None
+    if v is not None:
+        return s, t, v
+    else:
+        return None
+
+
+def ONLY_VALID(s, t, v):
+    '''Only events whose quality is VALID pass'''
+    from taurus.core import AttrQuality
+    if t == AttrQuality.ATTR_VALID:
+        return s, t, v
+    else:
+        return None
 
 
 class EventValueMap(dict):
     """A filter destined to change the original value into another one according
-    to a given map. Example::
-           
+    to a given map. Example:
+
         filter = EventValueMap({1:"OPEN", 2:"CHANGING", 3:"CLOSED"})
-       
+
     this will create a filter that changes the integer value of the event
     into a string. The event type is changed according to the python type in
     the map value.
-       
+
     For now it only supports simple types: str, int, long, float, bool
     """
 
-    PYTYPE_TO_TANGO = {
-        str   : PyTango.DevString,
-        int   : PyTango.DevLong,
-        long  : PyTango.DevLong64,
-        float : PyTango.DevDouble,
-        bool  : PyTango.DevBoolean,
-    }
-
     def __call__(self, s, t, v):
-        if not t in (taurus.core.taurusbasetypes.TaurusEventType.Change, 
-                     taurus.core.taurusbasetypes.TaurusEventType.Periodic):
+        import copy
+        from taurus.core import TaurusEventType, DataType
+
+        if not t in (TaurusEventType.Change, TaurusEventType.Periodic):
             return s, t, v
         if v is None:
             return s, t, v
-        
+
         # make a copy
-        v = PyTango.DeviceAttribute(v)
-        
-        v.value = self.get(v.value, v.value)
-        
-        v.type = EventValueMap.PYTYPE_TO_TANGO.get(type(v.value), v.type)
+        v = copy.copy(v)
+
+        v.value = self.get(v.rvalue, v.rvalue)
+
+        v.type = DataType.from_python_type(type(v.rvalue), v.type)
         return s, t, v
 
 
 class RepeatedEventFilter(object):
     """
-    The instances of this class will be callables that can be used as filters 
-    of repeated-value events. 
-    If the event type is Change or Periodic, it will only pass when its 
-    evt_value.value is different from that of the last event received from the 
-    same source and type. If evt_value.value is not available in the current 
+    The instances of this class will be callables that can be used as filters
+    of repeated-value events.
+    If the event type is Change or Periodic, it will only pass when its
+    evt_value.value is different from that of the last event received from the
+    same source and type. If evt_value.value is not available in the current
     event, the whole evt_value is used for comparison and as a future reference.
-    
+
     This is useful to avoid processing repetitive events.
-    
-    Note that you cannot use this class as a filter: you need to use an 
+
+    Note that you cannot use this class as a filter: you need to use an
     instance of it.
-    
-    Note 2: Use a different instance each time you insert this filter 
+
+    Note 2: Use a different instance each time you insert this filter
     into a different widget unless you *really* know what you are doing.
-    
+
     Example of usage::
-           
+
         filters = [RepeatedEventFilter(), IGNORE_CONFIG]
         filterEvent(s, t, v, filters)
-        
+
     """
+
     def __init__(self):
         self._lastValues = {}
 
     def __call__(self, s, t, v):
-        # restrict this  filter only to change and periodic events. 
+        # restrict this  filter only to change and periodic events.
         if ONLY_CHANGE_AND_PERIODIC(s, t, v) is None:
-            return s,t,v
+            return s, t, v
         # block event if we recorded one before with same src, type and v.value
         new_value = getattr(v, 'value', v)
         try:
@@ -153,7 +175,7 @@ class RepeatedEventFilter(object):
         except KeyError:
             pass
         # if it was't blocked, store src, type and v.value for future checks
-        self._lastValues[(s, t)] =  new_value
+        self._lastValues[(s, t)] = new_value
         return s, t, v
 
 
@@ -162,14 +184,14 @@ def filterEvent(evt_src=-1, evt_type=-1, evt_value=-1, filters=()):
     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.taurusbasetypes.TaurusEventType) type of event
+    :param evt_type: (TaurusEventType) type of event
     :param evt_value: (object) event value
     :param filters: (sequence<callable>) a sequence of callables, each returning
-                    either None (to discard the event) or the tuple (with 
-                    possibly transformed values) of 
+                    either None (to discard the event) or the tuple (with
+                    possibly transformed values) of
                     (evt_src, evt_type, evt_value)
-    
-    :return: (None or tuple) The result of piping the event through the given 
+
+    :return: (None or tuple) The result of piping the event through the given
              filters.
     """
     evt = evt_src, evt_type, evt_value
diff --git a/lib/taurus/core/util/excepthook.py b/lib/taurus/core/util/excepthook.py
index 1cbb626..7ba8967 100644
--- a/lib/taurus/core/util/excepthook.py
+++ b/lib/taurus/core/util/excepthook.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,19 +35,19 @@ import sys
 class BaseExceptHook(object):
     """A callable class that acts as an excepthook that handles an exception.
     This base class simply calls the :obj:`sys.__excepthook__`
-    
+
     :param hook_to: callable excepthook that will be called at the end of
                     this hook handling [default: None]
     :type hook_to: callable"""
-    
+
     def __init__(self, hook_to=None):
         self._excepthook = hook_to
-        
+
     def __call__(self, *exc_info):
         self.report(*exc_info)
         if self._excepthook is not None:
             return self._excepthook(*exc_info)
-    
+
     def report(self, *exc_info):
         """Report an exception. Overwrite as necessary"""
         return sys.__excepthook__(*exc_info)
diff --git a/lib/taurus/core/util/init_bkcomp.py b/lib/taurus/core/util/init_bkcomp.py
index 2dedc28..ccd1a95 100644
--- a/lib/taurus/core/util/init_bkcomp.py
+++ b/lib/taurus/core/util/init_bkcomp.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -36,7 +36,7 @@ The json implementation follows the rule:
 
 __docformat__ = "restructuredtext"
 
-# taurus cannot work properly without the following modules so 
+# 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.
@@ -68,10 +68,11 @@ try:
 except:
     etree = None
 
+
 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):
diff --git a/lib/taurus/core/util/init_lightweight.py b/lib/taurus/core/util/init_lightweight.py
index a52b250..6ce8663 100644
--- a/lib/taurus/core/util/init_lightweight.py
+++ b/lib/taurus/core/util/init_lightweight.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -36,7 +36,7 @@ The json implementation follows the rule:
 
 __docformat__ = "restructuredtext"
 
-# taurus cannot work properly without the following modules so 
+# 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.
@@ -64,14 +64,15 @@ from .singleton import *
 # import eventfilters
 
 # try:
-    # from lxml import etree
+# from lxml import etree
 # except:
-    # etree = None
+# etree = None
+
 
 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):
diff --git a/lib/taurus/core/util/lock.py b/lib/taurus/core/util/lock.py
index ed547a8..66b97f9 100644
--- a/lib/taurus/core/util/lock.py
+++ b/lib/taurus/core/util/lock.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,6 +35,7 @@ import logging
 
 _VERBOSE = False
 
+
 def TaurusLock(verbose=None, name=None, lock=None):
     if verbose is None:
         verbose = _VERBOSE
@@ -44,9 +45,10 @@ def TaurusLock(verbose=None, name=None, lock=None):
         return threading.Lock()
     return lock
 
+
 class _TaurusLock(object):
     """A sardana lock"""
-    
+
     def __init__(self, name=None, lock=None, level=logging.DEBUG):
         name = name or self.__class__.__name__
         self.__name = name
@@ -62,12 +64,12 @@ class _TaurusLock(object):
         if owner is not None:
             owner = owner.name
         return "<%s owner=%r>" % (self.__name, owner)
-    
+
     def owner_name(self):
         owner = self.__owner
         if owner is not None:
             return owner.name
-    
+
     def _note(self, msg, *args):
         self.__logger.log(self.__level, msg, *args)
 
@@ -86,9 +88,9 @@ class _TaurusLock(object):
             self._note("[ END ] acquire(%s) %s [owner=%s]", blocking, state,
                        self.owner_name())
         return rc
-    
+
     __enter__ = acquire
-    
+
     def release(self):
         if __debug__:
             self._note("[START] release() [owner=%s]", self.owner_name())
@@ -96,7 +98,6 @@ class _TaurusLock(object):
         self.__owner = None
         if __debug__:
             self._note("[ END ] release() [owner=%s]", self.owner_name())
-    
+
     def __exit__(self, t, v, tb):
         self.release()
-    
\ No newline at end of file
diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py
index aa98e87..189e005 100644
--- a/lib/taurus/core/util/log.py
+++ b/lib/taurus/core/util/log.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -30,7 +30,8 @@ __all__ = ["LogIt", "TraceIt", "DebugIt", "InfoIt", "WarnIt", "ErrorIt",
            "CriticalIt", "MemoryLogHandler", "LogExceptHook", "Logger",
            "LogFilter",
            "_log", "trace", "debug", "info", "warning", "error", "fatal",
-           "critical"]
+           "critical", "deprecated", "deprecation_decorator",
+           "taurus4_deprecation"]
 
 __docformat__ = "restructuredtext"
 
@@ -42,11 +43,38 @@ import warnings
 import traceback
 import inspect
 import threading
+import functools
 
 from object import Object
 from wrap import wraps
 from excepthook import BaseExceptHook
 
+# ------------------------------------------------------------------------------
+# TODO: substitute this ugly hack (below) by a more general mechanism
+from collections import defaultdict
+
+
+class _DeprecationCounter(defaultdict):
+
+    def __init__(self):
+        defaultdict.__init__(self, int)
+
+    def getTotal(self):
+        c = 0
+        for v in self.itervalues():
+            c += v
+        return c
+
+    def pretty(self):
+        from operator import itemgetter
+        sorted_items = sorted(
+            self.iteritems(), key=itemgetter(1), reverse=True)
+        ret = '\n'.join(['\t%d * "%s"' % (v, k) for k, v in sorted_items])
+        return "< Deprecation Counts (%d):\n%s >" % (self.getTotal(), ret)
+
+_DEPRECATION_COUNT = _DeprecationCounter()
+# ------------------------------------------------------------------------------
+
 TRACE = 5
 logging.addLevelName(TRACE, "TRACE")
 
@@ -54,7 +82,7 @@ logging.addLevelName(TRACE, "TRACE")
 # _srcfile is used when walking the stack to check when we've got the first
 # caller stack frame.
 #
-if hasattr(sys, 'frozen'): #support for py2exe
+if hasattr(sys, 'frozen'):  # support for py2exe
     _srcfile = "logging%s__init__%s" % (os.sep, __file__[-4:])
 elif __file__[-4:].lower() in ['.pyc', '.pyo']:
     _srcfile = __file__[:-4] + '.py'
@@ -63,6 +91,8 @@ else:
 _srcfile = os.path.normcase(_srcfile)
 
 # next bit filched from 1.5.2's inspect.py
+
+
 def currentframe():
     """Return the frame object for the caller's stack frame."""
     try:
@@ -70,7 +100,8 @@ def currentframe():
     except:
         return sys.exc_info()[2].tb_frame.f_back
 
-if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)
+if hasattr(sys, '_getframe'):
+    currentframe = lambda: sys._getframe(3)
 # done filching
 
 
@@ -147,9 +178,12 @@ class LogIt(object):
                     pass
             in_msg = "-> %s" % fname
             if self._showargs:
-                if len(args) > 1: in_msg += str(args[1:])
-                if len(kwargs):   in_msg += str(kwargs)
-            if self._col_limit and len(in_msg) > self._col_limit: in_msg = "%s [...]" % in_msg[:self._col_limit-6]
+                if len(args) > 1:
+                    in_msg += str(args[1:])
+                if len(kwargs):
+                    in_msg += str(kwargs)
+            if self._col_limit and len(in_msg) > self._col_limit:
+                in_msg = "%s [...]" % in_msg[:self._col_limit - 6]
             log_obj.log(self._level, in_msg)
             out_msg = "<-"
             try:
@@ -163,7 +197,7 @@ class LogIt(object):
             if not ret is None and self._showret:
                 out_msg += " = %s" % str(ret)
             if self._col_limit and len(out_msg) > self._col_limit:
-                out_msg = "%s [...]" % out_msg[:self._col_limit-6]
+                out_msg = "%s [...]" % out_msg[:self._col_limit - 6]
             log_obj.log(self._level, out_msg)
             return ret
         return wrapper
@@ -181,6 +215,7 @@ class TraceIt(LogIt):
                 print "Hello world"
 
     .. seealso:: :class:`LogIt`"""
+
     def __init__(self, showargs=False, showret=False):
         LogIt.__init__(self, level=TRACE, showargs=showargs, showret=showret)
 
@@ -197,8 +232,10 @@ class DebugIt(LogIt):
                 print "Hello world"
 
     .. seealso:: :class:`LogIt`"""
+
     def __init__(self, showargs=False, showret=False):
-        LogIt.__init__(self, level=logging.DEBUG, showargs=showargs, showret=showret)
+        LogIt.__init__(self, level=logging.DEBUG,
+                       showargs=showargs, showret=showret)
 
 
 class InfoIt(LogIt):
@@ -213,8 +250,10 @@ class InfoIt(LogIt):
                 print "Hello world"
 
     .. seealso:: :class:`LogIt`"""
+
     def __init__(self, showargs=False, showret=False):
-        LogIt.__init__(self, level=logging.INFO, showargs=showargs, showret=showret)
+        LogIt.__init__(self, level=logging.INFO,
+                       showargs=showargs, showret=showret)
 
 
 class WarnIt(LogIt):
@@ -229,8 +268,10 @@ class WarnIt(LogIt):
                 print "Hello world"
 
     .. seealso:: :class:`LogIt`"""
+
     def __init__(self, showargs=False, showret=False):
-        LogIt.__init__(self, level=logging.WARN, showargs=showargs, showret=showret)
+        LogIt.__init__(self, level=logging.WARN,
+                       showargs=showargs, showret=showret)
 
 
 class ErrorIt(LogIt):
@@ -245,8 +286,10 @@ class ErrorIt(LogIt):
                 print "Hello world"
 
     .. seealso:: :class:`LogIt`"""
+
     def __init__(self, showargs=False, showret=False):
-        LogIt.__init__(self, level=logging.ERROR, showargs=showargs, showret=showret)
+        LogIt.__init__(self, level=logging.ERROR,
+                       showargs=showargs, showret=showret)
 
 
 class CriticalIt(LogIt):
@@ -261,8 +304,50 @@ class CriticalIt(LogIt):
                 print "Hello world"
 
     .. seealso:: :class:`LogIt`"""
+
+    def __init__(self, showargs=False, showret=False):
+        LogIt.__init__(self, level=logging.CRITICAL,
+                       showargs=showargs, showret=showret)
+
+
+class PrintIt(object):
+    '''A decorator similar to TraceIt, DebugIt,... etc but which does not
+    require the decorated class to inherit from Logger.
+    It just uses print statements instead of logging. It is here just to be
+    used as a replacement of those decorators if you cannot use them on a
+    non-logger class.
+    '''
+
     def __init__(self, showargs=False, showret=False):
-        LogIt.__init__(self, level=logging.CRITICAL, showargs=showargs, showret=showret)
+        self._showargs = showargs
+        self._showret = showret
+
+    def __call__(self, f):
+        @wraps(f)
+        def wrapper(*args, **kwargs):
+            fname = f.func_name
+            in_msg = "-> %s" % fname
+            if self._showargs:
+                if len(args) > 1:
+                    in_msg += str(args[1:])
+                if len(kwargs):
+                    in_msg += str(kwargs)
+            print
+            print in_msg
+            out_msg = "<-"
+            try:
+                ret = f(*args, **kwargs)
+            except Exception, e:
+                out_msg += " (with %s) %s" % (e.__class__.__name__, fname)
+                print out_msg
+                raise
+            out_msg += " %s" % fname
+            if not ret is None and self._showret:
+                out_msg += " = %s" % str(ret)
+            print out_msg
+            print
+            return ret
+        return wrapper
 
 
 class MemoryLogHandler(list, logging.handlers.BufferingHandler):
@@ -281,8 +366,8 @@ class MemoryLogHandler(list, logging.handlers.BufferingHandler):
            :return: (bool) wheter or not the handler should be flushed
         """
         return (len(self.buffer) >= self.capacity) or \
-                (record.levelno >= Logger.getLogLevel()) or \
-                self._handler_list_changed
+            (record.levelno >= Logger.getLogLevel()) or \
+            self._handler_list_changed
 
     def flush(self):
         """Flushes this handler"""
@@ -324,15 +409,15 @@ class LogExceptHook(BaseExceptHook):
 
 
 class _Logger(logging.Logger):
-    
+
     def findCaller(self):
         """
         Find the stack frame of the caller so that we can note the source
         file name, line number and function name.
         """
         f = currentframe()
-        #On some versions of IronPython, currentframe() returns None if
-        #IronPython isn't run with -X:Frames.
+        # On some versions of IronPython, currentframe() returns None if
+        # IronPython isn't run with -X:Frames.
         if f is not None:
             f = f.f_back
         rv = "(unknown file)", 0, "(unknown function)"
@@ -345,7 +430,7 @@ class _Logger(logging.Logger):
             rv = (co.co_filename, f.f_lineno, co.co_name)
             break
         return rv
-   
+
 
 class Logger(Object):
     """The taurus logger class. All taurus pertinent classes should inherit
@@ -353,7 +438,7 @@ class Logger(Object):
     facilities."""
 
     #: Internal usage
-    root_inited    = False
+    root_inited = False
 
     #: Internal usage
     root_init_lock = threading.Lock()
@@ -365,19 +450,19 @@ class Logger(Object):
     Fatal = logging.FATAL
 
     #: Error message level (constant)
-    Error    = logging.ERROR
+    Error = logging.ERROR
 
     #: Warning message level (constant)
-    Warning  = logging.WARNING
+    Warning = logging.WARNING
 
     #: Info message level (constant)
-    Info     = logging.INFO
+    Info = logging.INFO
 
     #: Debug message level (constant)
-    Debug    = logging.DEBUG
+    Debug = logging.DEBUG
 
     #: Trace message level (constant)
-    Trace    = TRACE
+    Trace = TRACE
 
     #: Default log level (constant)
     DftLogLevel = Info
@@ -397,7 +482,6 @@ class Logger(Object):
     #: the main stream handler
     stream_handler = None
 
-
     def __init__(self, name='', parent=None, format=None):
         """The Logger constructor
 
@@ -407,7 +491,8 @@ class Logger(Object):
         """
         self.call__init__(Object)
 
-        if format: self.log_format = format
+        if format:
+            self.log_format = format
         Logger.initRoot()
 
         if name is None or len(name) == 0:
@@ -417,7 +502,7 @@ class Logger(Object):
             self.log_full_name = '%s.%s' % (parent.log_full_name, name)
         else:
             self.log_full_name = name
-        
+
         self.log_obj = self._getLogger(self.log_full_name)
         self.log_handlers = []
 
@@ -491,7 +576,7 @@ class Logger(Object):
         cls.initRoot().removeHandler(cls.stream_handler)
 
     @classmethod
-    def setLogLevel(cls,level):
+    def setLogLevel(cls, level):
         """sets the new log level (the root log level)
 
            :param level: (int) the new log level
@@ -508,7 +593,7 @@ class Logger(Object):
         return cls.log_level
 
     @classmethod
-    def setLogFormat(cls,format):
+    def setLogFormat(cls, format):
         """sets the new log message format
 
            :param level: (str) the new log message format
@@ -605,7 +690,7 @@ class Logger(Object):
            :param child: (logging.Logger) the new child
         """
         if not self.log_children.get(id(child)):
-            self.log_children[id(child)]=weakref.ref(child)
+            self.log_children[id(child)] = weakref.ref(child)
 
     def addLogHandler(self, handler):
         """Registers a new handler in this object's logger
@@ -670,7 +755,7 @@ class Logger(Object):
         stack = stack_func(line_count)
         out = ''
         for frame_record in stack:
-            out += '\n\t' + 60*'-'
+            out += '\n\t' + 60 * '-'
             frame, filename, line, funcname, lines, index = frame_record
             #out += '\n\t    depth = %d' % frame[5]
             out += '\n\t filename = %s' % filename
@@ -679,16 +764,16 @@ class Logger(Object):
                 code = '<code could not be found>'
                 out += '\n\t     line = [%d]: %s' % (line, code)
             else:
-                lines, line_nb = [ s.strip(' \n') for s in lines ], len(lines)
+                lines, line_nb = [s.strip(' \n') for s in lines], len(lines)
                 if line_nb >= 3:
-                    out += '\n\t     line = [%d]: %s' % (line-1, lines[0])
+                    out += '\n\t     line = [%d]: %s' % (line - 1, lines[0])
                     out += '\n\t  -> line = [%d]: %s' % (line, lines[1])
-                    out += '\n\t     line = [%d]: %s' % (line+1, lines[2])
+                    out += '\n\t     line = [%d]: %s' % (line + 1, lines[2])
                 elif line_nb > 0:
                     out += '\n\t  -> line = [%d]: %s' % (line, lines[0])
             if frame:
                 out += '\n\t   locals = '
-                for k,v in frame.f_locals.items():
+                for k, v in frame.f_locals.items():
                     out += '\n\t\t%20s = ' % k
                     try:
                         cut = False
@@ -699,9 +784,11 @@ class Logger(Object):
                         else:
                             i = min(i, 80)
                             cut = True
-                        if len(v) > 80: cut = True
+                        if len(v) > 80:
+                            cut = True
                         out += v[:i]
-                        if cut: out += '[...]'
+                        if cut:
+                            out += '[...]'
                     except:
                         out += '<could not find suitable string representation>'
         return out
@@ -747,17 +834,57 @@ class Logger(Object):
         """
         self.log_obj.warning(msg, *args, **kw)
 
-    def deprecated(self, msg, *args, **kw):
-        """Record a deprecated warning message in this object's logger. Accepted *args* and
-           *kwargs* are the same as :meth:`logging.Logger.warning`.
-
-           :param msg: (str) the message to be recorded
-           :param args: list of arguments
-           :param kw: list of keyword arguments
+    def deprecated(self, msg=None, dep=None, alt=None, rel=None, dbg_msg=None,
+                   _callerinfo=None, **kw):
+        """Record a deprecated warning message in this object's logger.
+           If message is not passed, a estandard deprecation message is
+           constructued using dep, alt, rel arguments.
+           Also, an extra debug message can be recorded, followed by traceback
+           info.
+
+           :param msg: (str) the message to be recorded (if None passed, it will
+                       be constructed using dep (and, optionally, alt and rel)
+           :param dep: (str) name of deprecated feature (in case msg is None)
+           :param alt: (str) name of alternative feature (in case msg is None)
+           :param rel: (str) name of release from which the feature was
+                       deprecated (in case msg is None)
+           :param dbg_msg: (str) msg for debug (or None to log only the warning)
+           :param _callerinfo: for internal use only. Do not use this argument.
+           :param kw: any additional keyword arguments, are passed to
+                     :meth:`logging.Logger.warning`
         """
-        filename, lineno, func = self.log_obj.findCaller()
-        depr_msg = warnings.formatwarning(msg, DeprecationWarning, filename, lineno)
-        self.log_obj.warning(depr_msg, *args, **kw)
+        if msg is None:
+            if dep is None:
+                raise TypeError('deprecated takes either msg or dep argument')
+            msg = '%s is deprecated' % dep
+            if rel is not None:
+                msg += ' since %s' % rel
+            if alt is not None:
+                msg += '. Use %s instead' % alt
+
+        # count the number of calls (classified by msg)
+        # TODO: substitute this ugly hack (below) by a more general mechanism
+        _DEPRECATION_COUNT[msg] += 1
+        # limit the output to 1 deprecation message of each type
+        from taurus import tauruscustomsettings
+        _MAX_DEPRECATIONS_LOGGED = getattr(tauruscustomsettings,
+                                           '_MAX_DEPRECATIONS_LOGGED', None)
+        if _MAX_DEPRECATIONS_LOGGED is not None:
+            if _MAX_DEPRECATIONS_LOGGED < 0:
+                self.stack(self.Warning)
+                raise Exception(msg)
+            if _DEPRECATION_COUNT[msg] > _MAX_DEPRECATIONS_LOGGED:
+                return
+
+        if _callerinfo is None:
+            _callerinfo = self.log_obj.findCaller()
+        filename, lineno, _ = _callerinfo
+        depr_msg = warnings.formatwarning(
+            msg, DeprecationWarning, filename, lineno)
+        self.log_obj.warning(depr_msg, **kw)
+        if dbg_msg:
+            self.debug(dbg_msg)
+            self.stack()
 
     def error(self, msg, *args, **kw):
         """Record an error message in this object's logger. Accepted *args* and
@@ -833,7 +960,7 @@ class Logger(Object):
         """
         return self.log_full_name
 
-    def changeLogName(self,name):
+    def changeLogName(self, name):
         """Change the log name for this object.
 
            :param name: (str) the new log name
@@ -864,31 +991,83 @@ class LogFilter(logging.Filter):
         ok = (record.levelno == self.filter_level)
         return ok
 
+
 def __getrootlogger():
     return Logger.getLogger("TaurusRootLogger")
-    
-# cannot export log because upper package taurus.core.util imports this 'log' 
+
+# cannot export log because upper package taurus.core.util imports this 'log'
 # module and it would itself be overwritten by this log function
+
+
 def _log(level, msg, *args, **kw):
     return __getrootlogger().log(level, msg, *args, **kw)
 
+
 def trace(msg, *args, **kw):
     return _log(Logger.Trace, msg, *args, **kw)
 
+
 def debug(msg, *args, **kw):
     return __getrootlogger().debug(msg, *args, **kw)
 
+
 def info(msg, *args, **kw):
     return __getrootlogger().info(msg, *args, **kw)
 
+
 def warning(msg, *args, **kw):
     return __getrootlogger().warning(msg, *args, **kw)
 
+
 def error(msg, *args, **kw):
     return __getrootlogger().error(msg, *args, **kw)
 
+
 def fatal(msg, *args, **kw):
     return __getrootlogger().fatal(msg, *args, **kw)
 
+
 def critical(msg, *args, **kw):
     return __getrootlogger().critical(msg, *args, **kw)
+
+
+def deprecated(*args, **kw):
+    kw['_callerinfo'] = __getrootlogger().findCaller()
+    return Logger("TaurusRootLogger").deprecated(*args, **kw)
+
+
+def deprecation_decorator(func=None, alt=None, rel=None, dbg_msg=None):
+    """decorator to mark methods as deprecated"""
+    if func is None:
+        return functools.partial(deprecation_decorator, alt=alt, rel=rel,
+                                 dbg_msg=dbg_msg)
+
+    def new_func(*args, **kwargs):
+        deprecated(dep=func.__name__, alt=alt, rel=rel, dbg_msg=dbg_msg)
+        return func(*args, **kwargs)
+
+    doc = (func.__doc__ or '')
+    doc += '\n\n.. deprecated:: %s\n' % (rel or '')
+    if alt:
+        doc += '   Use %s instead\n' % alt
+
+    new_func.__name__ = func.__name__
+    new_func.__doc__ = doc
+    new_func.__dict__.update(func.__dict__)
+    return new_func
+
+
+taurus4_deprecation = functools.partial(deprecation_decorator, rel='4.0')
+
+
+if __name__ == '__main__':
+
+    @taurus4_deprecation(alt='bar')
+    def foo(x):
+        """Does this and that and also:
+
+        - baz
+        - zab
+        """
+
+    print foo.__doc__
diff --git a/lib/taurus/core/util/object.py b/lib/taurus/core/util/object.py
index d61bb2d..29c623d 100644
--- a/lib/taurus/core/util/object.py
+++ b/lib/taurus/core/util/object.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,38 +34,37 @@ class Object(object):
 
     def __init__(self):
         pass
-        
+
     def call__init__(self, klass, *args, **kw):
         """Method to be called from subclasses to call superclass corresponding
-        __init__ method. This method ensures that classes from diamond like 
-        class hierarquies don't call their super classes __init__ more than 
+        __init__ method. This method ensures that classes from diamond like
+        class hierarquies don't call their super classes __init__ more than
         once."""
-        
+
         if 'inited_class_list' not in self.__dict__:
             self.inited_class_list = []
 
         if klass not in self.inited_class_list:
             self.inited_class_list.append(klass)
             klass.__init__(self, *args, **kw)
-    
+
     def call__init__wo_kw(self, klass, *args):
         """Same as call__init__ but without keyword arguments because PyQT does
         not support them."""
-        
+
         if 'inited_class_list' not in self.__dict__:
             self.inited_class_list = []
 
         if klass not in self.inited_class_list:
             self.inited_class_list.append(klass)
             klass.__init__(self, *args)
-    
+
     def getAttrDict(self):
         attr = dict(self.__dict__)
         if 'inited_class_list' in attr:
             del attr['inited_class_list']
         return attr
-        
+
     def updateAttrDict(self, other):
         attr = other.getAttrDict()
         self.__dict__.update(attr)
-        
diff --git a/lib/taurus/core/util/prop.py b/lib/taurus/core/util/prop.py
index 647c428..cb6d41c 100644
--- a/lib/taurus/core/util/prop.py
+++ b/lib/taurus/core/util/prop.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,28 +29,31 @@ __all__ = ["propertx"]
 
 __docformat__ = "restructuredtext"
 
+
 def propertx(fct):
     '''
         Decorator to simplify the use of property.
         Like @property for attrs who need more than a getter.
         For getter only property use @property.
-        
+
         adapted from http://code.activestate.com/recipes/502243/
     '''
-    arg=[None, None, None, None]
+    arg = [None, None, None, None]
     for i, f in enumerate(fct()):
         arg[i] = f
-    if not arg[3] :
-        arg[3]=fct.__doc__
+    if not arg[3]:
+        arg[3] = fct.__doc__
     return property(*arg)
 
 if __name__ == '__main__':
 
     from log import Logger
+
     class example(object, Logger):
+
         def __init__(self):
             Logger.__init__(self, "example")
-            self._a=100
+            self._a = 100
             self.bar = "why"
 
         @propertx
@@ -59,12 +62,13 @@ if __name__ == '__main__':
             def get(self):
                 print "\tgetting", self._a
                 return self._a
+
             def set(self, val):
                 print "\tsetting", val
-                self._a=val
+                self._a = val
             return get, set
 
-    foo=example()
+    foo = example()
     print foo.bar
-    #foo.bar='egg'
-    #print foo.bar
+    # foo.bar='egg'
+    # print foo.bar
diff --git a/lib/taurus/core/util/property_parser.py b/lib/taurus/core/util/property_parser.py
index b5e4fc6..e8fae07 100644
--- a/lib/taurus/core/util/property_parser.py
+++ b/lib/taurus/core/util/property_parser.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,20 +34,20 @@ from .containers import CaselessDict
 from .log import Logger
 
 reserved = CaselessDict({
-    'true'  : 'true',
-    'false' : 'false',
-    'yes'   : 'yes',
-    'no'    : 'no'
+    'true': 'true',
+    'false': 'false',
+    'yes': 'yes',
+    'no': 'no'
 })
 
-tokens = [ 'EQUALS', 
-           'KEY', 
-           'STRING', 
-           'NUMBER', 
-           'COMMA',
-           'LLST', 'RLST',
-           #'LBRACKET', 'RBRACKET',
-        ] + reserved.values()
+tokens = ['EQUALS',
+          'KEY',
+          'STRING',
+          'NUMBER',
+          'COMMA',
+          'LLST', 'RLST',
+          #'LBRACKET', 'RBRACKET',
+          ] + reserved.values()
 
 t_EQUALS = r'\='
 t_LLST = r'\['
@@ -56,6 +56,7 @@ t_COMMA = r'\,'
 #t_LBRACKET = r'\{'
 #t_RBRACKET = r'\}'
 
+
 def t_NUMBER(t):
     r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?'
     try:
@@ -67,11 +68,14 @@ def t_NUMBER(t):
         else:
             t.value = float(t.value)
     except:
-        print "[%d]: Number %s is not valid!" % (t.lineno,t.value)
+        print "[%d]: Number %s is not valid!" % (t.lineno, t.value)
         t.value = 0
     return t
 
-# The following backslash sequences have their usual special meaning: \", \\, \n, and \t.
+# The following backslash sequences have their usual special meaning: \",
+# \\, \n, and \t.
+
+
 def t_STRING(t):
     r'\"([^\\"]|(\\.))*\"'
     escaped = 0
@@ -94,31 +98,37 @@ def t_STRING(t):
     t.value = new_str
     return t
 
+
 def t_KEY(t):
     r'[a-zA-Z0-9_\.\/]+'
-    t.type = reserved.get(t.value,'KEY')    # Check for reserved words
+    t.type = reserved.get(t.value, 'KEY')    # Check for reserved words
     return t
 
 
-# Ignored characters 
+# Ignored characters
 t_ignore = ' \t'
 
 t_ignore_COMMENT = r'\#.*'
 
+
 def t_newline(t):
-    r'\n+' 
-    t.lexer.lineno += t.value.count("\n") 
-    
-def t_error(t): 
-    print "[%d]: Illegal character '%s'" % (t.lexer.lineno,t.value[0])
+    r'\n+'
+    t.lexer.lineno += t.value.count("\n")
+
+
+def t_error(t):
+    print "[%d]: Illegal character '%s'" % (t.lexer.lineno, t.value[0])
     t.lexer.skip(1)
 
+
 def p_error(p):
-    print "[%d]: Syntax error in input [%s]" % (p.lineno,(str(p)))
-    
-#-------------------------------------------------------------------------------
+    print "[%d]: Syntax error in input [%s]" % (p.lineno, (str(p)))
+
+#-------------------------------------------------------------------------
 # Yacc Starting symbol
-#-------------------------------------------------------------------------------
+#-------------------------------------------------------------------------
+
+
 def p_property_file(p):
     '''property_file : statement_list
                      |'''
@@ -126,55 +136,64 @@ def p_property_file(p):
         p[0] = {}
     else:
         p[0] = p[1]
-    
+
+
 def p_statement_list(p):
     '''statement_list : statement_list statement'''
     p[1].update(p[2])
     p[0] = p[1]
 
+
 def p_statement(p):
     '''statement_list : statement'''
     p[0] = p[1]
 
+
 def p_statement_assign(p):
     '''statement : KEY EQUALS value'''
-    p[0] = { p[1] : p[3] }
-    
+    p[0] = {p[1]: p[3]}
+
+
 def p_value(p):
     '''value : atomic
              | list'''
     p[0] = p[1]
 
+
 def p_value_atomic(p):
     '''atomic : KEY
               | STRING
               | NUMBER
               | boolean'''
     p[0] = p[1]
-    
+
+
 def p_value_boolean(p):
-    '''boolean : true 
+    '''boolean : true
                | false
                | yes
                | no'''
     v = p[1].lower()
     p[0] = v in ('true', 'yes')
 
+
 def p_value_list(p):
     '''list : LLST value_list RLST'''
     p[0] = p[2]
 
+
 def p_value_list_elems1(p):
     '''value_list : value_list COMMA value'''
     p[0] = p[1] + [p[3]]
 
+
 def p_value_list_elems2(p):
     '''value_list : value'''
     p[0] = [p[1]]
 
 
 class PropertyParser(Logger):
-    
+
     def __init__(self, parent=None):
         name = self.__class__.__name__
         self.call__init__(Logger, name, parent)
@@ -182,22 +201,23 @@ class PropertyParser(Logger):
 
     def parse_file(self, f, logger=None, debug=0, optimize=1):
         self._last_filename = os.path.abspath(f.name)
-        
+
         kw = {
-            'debuglog' : logger or self,
-            'errorlog' : logger or self,
-            'debug'    : debug,
-            'optimize' : optimize,
+            'debuglog': logger or self,
+            'errorlog': logger or self,
+            'debug': debug,
+            'optimize': optimize,
         }
-        
-        kw_lex  = kw.copy()
-        kw_lex.update({ 'lextab' : 'property_lextab' })
+
+        kw_lex = kw.copy()
+        kw_lex.update({'lextab': 'property_lextab'})
         kw_yacc = kw.copy()
-        kw_yacc.update({ 'tabmodule' : 'property_yacctab'})
+        kw_yacc.update({'tabmodule': 'property_yacctab'})
         lexer = lex.lex(**kw_lex)
         parser = yacc.yacc(**kw_yacc)
-        
-        if debug: debug = self
+
+        if debug:
+            debug = self
         return parser.parse(f.read(), debug=debug, lexer=lexer)
 
     def parse(self, filename, logger=None, debug=0, optimize=1):
@@ -205,10 +225,12 @@ class PropertyParser(Logger):
         f, res = None, None
         try:
             f = open(filename)
-            res = self.parse_file(f, logger=logger, debug=debug, optimize=optimize)
+            res = self.parse_file(
+                f, logger=logger, debug=debug, optimize=optimize)
             f.close()
         except IOError, e:
-            if f: f.close()
+            if f:
+                f.close()
             raise
         return res
 
diff --git a/lib/taurus/core/util/propertyfile.py b/lib/taurus/core/util/propertyfile.py
index 14082b9..15a3ab6 100644
--- a/lib/taurus/core/util/propertyfile.py
+++ b/lib/taurus/core/util/propertyfile.py
@@ -2,30 +2,30 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-propertyfile.py: 
-    
+propertyfile.py:
+
 A Python replacement for java.util.Properties class
 This is modelled as closely as possible to the Java original.
 
@@ -38,13 +38,15 @@ __all__ = ["Properties"]
 
 __docformat__ = "restructuredtext"
 
-import sys,os
+import sys
+import os
 import re
 import time
 
+
 class Properties(object):
     """ A Python replacement for java.util.Properties """
-    
+
     def __init__(self, props=None):
 
         # Note: We don't take a default properties object
@@ -60,17 +62,17 @@ class Properties(object):
         # Dictionary mapping keys from property
         # dictionary to pristine dictionary
         self._keymap = {}
-        
+
         self.othercharre = re.compile(r'(?<!\\)(\s*\=)|(?<!\\)(\s*\:)')
         self.othercharre2 = re.compile(r'(\s*\=)|(\s*\:)')
         self.bspacere = re.compile(r'\\(?!\s$)')
-        
+
     def __str__(self):
-        s='{'
-        for key,value in self._props.items():
-            s = ''.join((s,key,'=',value,', '))
+        s = '{'
+        for key, value in self._props.items():
+            s = ''.join((s, key, '=', value, ', '))
 
-        s=''.join((s[:-2],'}'))
+        s = ''.join((s[:-2], '}'))
         return s
 
     def __parse(self, lines):
@@ -101,26 +103,28 @@ class Properties(object):
         # key
         # This key= this value
         # key = value1 value2 value3
-        
+
         # Any line that starts with a '#' is considerered a comment
         # and skipped. Also any trailing or preceding whitespaces
         # are removed from the key/value.
-        
+
         # This is a line parser. It parses the
         # contents like by line.
 
-        lineno=0
+        lineno = 0
         i = iter(lines)
 
         for line in i:
             lineno += 1
             line = line.strip()
             # Skip null lines
-            if not line: continue
+            if not line:
+                continue
             # Skip lines which are comments
-            if line[0] == '#': continue
+            if line[0] == '#':
+                continue
             # Some flags
-            escaped=False
+            escaped = False
             # Position of first separation char
             sepidx = -1
             # A flag for performing wspace re check
@@ -139,13 +143,13 @@ class Properties(object):
                     # Check if either '=' or ':' is present
                     # in the line. If they are then it means
                     # they are preceded by a backslash.
-                    
+
                     # This means, we need to modify the
                     # wspacere a bit, not to look for
                     # : or = characters.
                     wspacere = re.compile(r'(?<![\\])(\s)')
                 start, end = 0, len(line)
-                
+
             m2 = wspacere.search(line, start, end)
             if m2:
                 # print 'Space match=>',line
@@ -159,8 +163,7 @@ class Properties(object):
                 first, last = m.span()
                 sepidx = last - 1
                 # print line[sepidx]
-                
-                
+
             # If the last character is a backslash
             # it has to be preceded by a space in which
             # case the next line is read as part of the
@@ -175,18 +178,18 @@ class Properties(object):
 
             # Now split to key,value according to separation char
             if sepidx != -1:
-                key, value = line[:sepidx], line[sepidx+1:]
+                key, value = line[:sepidx], line[sepidx + 1:]
             else:
-                key,value = line,''
+                key, value = line, ''
 
             self.processPair(key, value)
-            
+
     def processPair(self, key, value):
         """ Process a (key, value) pair """
 
         oldkey = key
         oldvalue = value
-        
+
         # Create key intelligently
         keyparts = self.bspacere.split(key)
         # print keyparts
@@ -195,7 +198,7 @@ class Properties(object):
         lastpart = keyparts[-1]
 
         if lastpart.find('\\ ') != -1:
-            keyparts[-1] = lastpart.replace('\\','')
+            keyparts[-1] = lastpart.replace('\\', '')
 
         # If no backspace is found at the end, but empty
         # space is found, strip it
@@ -206,10 +209,10 @@ class Properties(object):
         if strippable:
             key = key.strip()
             oldkey = oldkey.strip()
-        
+
         oldvalue = self.unescape(oldvalue)
         value = self.unescape(value)
-        
+
         self._props[key] = value.strip()
 
         # Check if an entry exists in pristine keys
@@ -220,34 +223,34 @@ class Properties(object):
             self._origprops[oldkey] = oldvalue.strip()
             # Store entry in keymap
             self._keymap[key] = oldkey
-        
+
     def escape(self, value):
 
         # Java escapes the '=' and ':' in the value
         # string with backslashes in the store method.
         # So let us do the same.
-        newvalue = value.replace(':','\:')
-        newvalue = newvalue.replace('=','\=')
+        newvalue = value.replace(':', '\:')
+        newvalue = newvalue.replace('=', '\=')
 
         return newvalue
 
     def unescape(self, value):
 
         # Reverse of escape
-        newvalue = value.replace('\:',':')
-        newvalue = newvalue.replace('\=','=')
+        newvalue = value.replace('\:', ':')
+        newvalue = newvalue.replace('\=', '=')
+
+        return newvalue
 
-        return newvalue    
-        
     def load(self, stream):
         """ Load properties from an open file stream """
-        
+
         # For the time being only accept file input streams
         if type(stream) is not file:
-            raise TypeError,'Argument should be a file object!'
+            raise TypeError, 'Argument should be a file object!'
         # Check for the opened mode
         if stream.mode != 'r':
-            raise ValueError,'Stream should be opened in read-only mode!'
+            raise ValueError, 'Stream should be opened in read-only mode!'
 
         try:
             lines = stream.readlines()
@@ -257,8 +260,8 @@ class Properties(object):
 
     def getProperty(self, key):
         """ Return a property for the given key """
-        
-        return self._props.get(key,'')
+
+        return self._props.get(key, '')
 
     def setProperty(self, key, value):
         """ Set the property for the given key """
@@ -266,7 +269,7 @@ class Properties(object):
         if type(key) is str and type(value) is str:
             self.processPair(key, value)
         else:
-            raise TypeError,'both key and value should be strings!'
+            raise TypeError, 'both key and value should be strings!'
 
     def propertyNames(self):
         """ Return an iterator over all the keys of the property
@@ -279,25 +282,25 @@ class Properties(object):
         stream 'out' which defaults to the standard output """
 
         out.write('-- listing properties --\n')
-        for key,value in self._props.items():
-            out.write(''.join((key,'=',value,'\n')))
+        for key, value in self._props.items():
+            out.write(''.join((key, '=', value, '\n')))
 
     def store(self, out, header=""):
         """ Write the properties list to the stream 'out' along
         with the optional 'header' """
 
         if out.mode[0] != 'w':
-            raise ValueError,'Steam should be opened in write mode!'
+            raise ValueError, 'Steam should be opened in write mode!'
 
         try:
-            out.write(''.join(('#',header,'\n')))
+            out.write(''.join(('#', header, '\n')))
             # Write timestamp
             tstamp = time.strftime('%a %b %d %H:%M:%S %Z %Y', time.localtime())
-            out.write(''.join(('#',tstamp,'\n')))
+            out.write(''.join(('#', tstamp, '\n')))
             # Write properties from the pristine dictionary
             for prop, val in self._origprops.items():
-                out.write(''.join((prop,'=',self.escape(val),'\n')))
-                
+                out.write(''.join((prop, '=', self.escape(val), '\n')))
+
             out.close()
         except IOError, e:
             raise
@@ -314,7 +317,7 @@ class Properties(object):
         """ To support direct dictionary like access """
 
         self.setProperty(name, value)
-        
+
     def __getattr__(self, name):
         """ For attributes not found in self, redirect
         to the properties dictionary """
@@ -322,19 +325,19 @@ class Properties(object):
         try:
             return self.__dict__[name]
         except KeyError:
-            if hasattr(self._props,name):
+            if hasattr(self._props, name):
                 return getattr(self._props, name)
-            
-if __name__=="__main__":
+
+if __name__ == "__main__":
     p = Properties()
     p.load(open('test2.properties'))
     p.list()
     p['hello'] = "no"
-    
+
 #    print p
 #    print p.items()
 #    print p['name3']
 #    p['name3'] = 'changed = value'
-#    print p['name3']    
+#    print p['name3']
 #    p['new key'] = 'new value'
-    p.store(open('test2.properties','w'))
+    p.store(open('test2.properties', 'w'))
diff --git a/lib/taurus/core/util/remotelogmonitor.py b/lib/taurus/core/util/remotelogmonitor.py
index 87940b5..b164341 100644
--- a/lib/taurus/core/util/remotelogmonitor.py
+++ b/lib/taurus/core/util/remotelogmonitor.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -68,7 +68,7 @@ class LogRecordStreamHandler(socketserver.StreamRequestHandler):
             record = self.makeLogRecord(obj)
             self.handleLogRecord(record)
             stop = self._stop
-        
+
     def unPickle(self, data):
         return pickle.loads(data)
 
@@ -131,7 +131,7 @@ class LogRecordSocketReceiver(socketserver.ThreadingTCPServer):
                 self.handle_request()
             stop = self._stop
         self._stopped = 1
-    
+
     def stop(self):
         self._stop = True
         while not self._stopped:
diff --git a/lib/taurus/core/util/report/__init__.py b/lib/taurus/core/util/report/__init__.py
index b0f01bf..82389e2 100644
--- a/lib/taurus/core/util/report/__init__.py
+++ b/lib/taurus/core/util/report/__init__.py
@@ -2,27 +2,27 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides a panel to display taurus messages"""
 
-from .report import *
\ No newline at end of file
+from .report import *
diff --git a/lib/taurus/core/util/report/report.py b/lib/taurus/core/util/report/report.py
index 229fdde..a3444b4 100644
--- a/lib/taurus/core/util/report/report.py
+++ b/lib/taurus/core/util/report/report.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -31,12 +31,11 @@ __docformat__ = 'restructuredtext'
 
 
 class TaurusMessageReportHandler(object):
-    
+
     Label = "Default report handler"
-    
+
     def __init__(self, parent):
         self.parent = parent
-    
+
     def report(self, message):
         pass
-
diff --git a/lib/taurus/core/util/safeeval.py b/lib/taurus/core/util/safeeval.py
index ee9d5f6..ea075bb 100644
--- a/lib/taurus/core/util/safeeval.py
+++ b/lib/taurus/core/util/safeeval.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -32,47 +32,59 @@ __all__ = ["SafeEvaluator"]
 __docformat__ = "restructuredtext"
 
 
-import numpy
+class SafeEvaluator(object):
+    """This class provides a safe eval replacement.
 
-class SafeEvaluator:
-    """This class provides a safe eval replacement. 
-    
     The method eval() will only evaluate the expressions considered safe (whitelisted).
     By default it has a whitelist of mathematical expressions that can be turn off using defaultSafe=False at init
-    
+
     The user can add more safe functions passing a safedict to the addSafe() or init methods.
-    
+
     Functions can be removed by name using removeSafe()
-    
-    Note: In order to use variables defined outside, the user must explicitly declare them safe. 
+
+    Note: In order to use variables defined outside, the user must explicitly declare them safe.
     """
+
     def __init__(self, safedict=None, defaultSafe=True):
-        self._default_numpy = ('abs', 'array', 'arange','arccos', 'arcsin', 'arctan', 'arctan2', 'average',
-                               'ceil', 'cos', 'cosh', 'degrees', 'dot', 'e', 'exp', 'fabs', 'floor', 'fmod', 
-                               'frexp', 'hypot', 'ldexp', 'linspace', 'log', 'log10', 'logspace', 
-                               'modf', 'ones', 'pi', 'radians', 'shape', 'sin', 'sinh', 'sqrt', 'sum', 'tan', 
-                               'tanh','zeros')
-        self._default_numpy_random = ('randn', 'rand', 'randint') 
-        
-        if safedict is None: safedict={}    
+        self._default_numpy = ('abs', 'array', 'arange', 'arccos', 'arcsin', 'arctan', 'arctan2', 'average',
+                               'ceil', 'cos', 'cosh', 'degrees', 'dot', 'e', 'exp', 'fabs', 'floor', 'fmod',
+                               'frexp', 'hypot', 'ldexp', 'linspace', 'log', 'log10', 'logspace',
+                               'modf', 'ones', 'pi', 'radians', 'shape', 'sin', 'sinh', 'sqrt', 'sum', 'tan',
+                               'tanh', 'zeros')
+        self._default_numpy_random = ('randn', 'rand', 'randint')
+
+        if safedict is None:
+            safedict = {}
         self.safe_dict = safedict
         if defaultSafe:
+            import numpy
+            from taurus.external.pint import Quantity
             self.safe_dict['pow'] = pow
             self.safe_dict['len'] = len
             self.safe_dict['int'] = int
             self.safe_dict['float'] = float
+            self.safe_dict['bool'] = bool
+            self.safe_dict['str'] = str
+            self.safe_dict['bytes'] = bytes
+            self.safe_dict['list'] = list
+            self.safe_dict['range'] = range
+            self.safe_dict['True'] = True
+            self.safe_dict['False'] = False
+            self.safe_dict['None'] = None
             for n in self._default_numpy:
                 self.safe_dict[n] = getattr(numpy, n)
             for n in self._default_numpy_random:
                 self.safe_dict[n] = getattr(numpy.random, n)
-        
+            self.safe_dict['Quantity'] = Quantity
+            self.safe_dict['Q'] = Quantity  # Q() is an alias for Quantity()
+
         self._originalSafeDict = self.safe_dict.copy()
-        
-    def eval(self,expr):
+
+    def eval(self, expr):
         """safe eval"""
-        return eval(expr, {"__builtins__":None}, self.safe_dict) 
-    
-    def addSafe(self,safedict, permanent=False):
+        return eval(expr, {"__builtins__": None}, self.safe_dict)
+
+    def addSafe(self, safedict, permanent=False):
         """The values in safedict will be evaluable (whitelisted)
         The safedict is as follows: {"eval_name":object, ...}. The evaluator will interpret eval_name as object.
         """
@@ -92,50 +104,46 @@ class SafeEvaluator:
     def resetSafe(self):
         """restores the safe dict with wich the evaluator was instantiated"""
         self.safe_dict = self._originalSafeDict.copy()
-    
+
     def getSafe(self):
         """returns the currently whitelisted expressions"""
         return self.safe_dict
-        
-        
-
-
-
-
 
 
 ##-----------------------------------------------##
-#A demo of use
+# A demo of use
 
 if __name__ == '__main__':
-    
-    x=range(6)
-    sev=SafeEvaluator()
+
+    x = range(6)
+    sev = SafeEvaluator()
     print "trying to evaluate a variable that has not been registered"
     try:
-        print sev.safeEval('x+2')  #This will fail because 'x' is not registered in sev
+        # This will fail because 'x' is not registered in sev
+        print sev.safeEval('x+2')
     except:
-        print "failed!!" 
-   
-    sev.addSafe({'x':x}) #After registering x, we can use it...
-    f0='x'
-    f1='sqrt(x)'
-    f2='pow(2,8)'
-    f3='ceil(array(x)/2.)'
-    f4='x[3]*2'
-    f5='open("/etc/passwd")' #This is something we do not want to be evaluated
-    
-    
-    for f in [f0,f1,f2,f3,f4,f5]:
-        print 'Evaluating "%s":'%f
+        print "failed!!"
+
+    sev.addSafe({'x': x})  # After registering x, we can use it...
+    f0 = 'x'
+    f1 = 'sqrt(x)'
+    f2 = 'pow(2,8)'
+    f3 = 'ceil(array(x)/2.)'
+    f4 = 'x[3]*2'
+    # This is something we do not want to be evaluated
+    f5 = 'open("/etc/passwd")'
+
+    for f in [f0, f1, f2, f3, f4, f5]:
+        print 'Evaluating "%s":' % f
         try:
             print sev.eval(f)
-        except: 
-            print 'ERROR: %s cannot be evaluated'%f
-    
-    vector=numpy.arange(6)
-    sev2=SafeEvaluator({'x':x, 'y':vector},defaultSafe=False) #Another way of registering a variable is using the init method...
-    print 'x*y=',sev2.eval('x*y')
-    y=0 #note that the registered variable is local to the evaluator!!
-    print 'x*y=',sev2.eval('x*y')  #here, y still has the previously registered value instead of 0
-    
\ No newline at end of file
+        except:
+            print 'ERROR: %s cannot be evaluated' % f
+
+    vector = numpy.arange(6)
+    # Another way of registering a variable is using the init method...
+    sev2 = SafeEvaluator({'x': x, 'y': vector}, defaultSafe=False)
+    print 'x*y=', sev2.eval('x*y')
+    y = 0  # note that the registered variable is local to the evaluator!!
+    # here, y still has the previously registered value instead of 0
+    print 'x*y=', sev2.eval('x*y')
diff --git a/lib/taurus/core/util/singleton.py b/lib/taurus/core/util/singleton.py
index ba8edc1..89f8faa 100644
--- a/lib/taurus/core/util/singleton.py
+++ b/lib/taurus/core/util/singleton.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,54 +30,54 @@ __all__ = ["Singleton"]
 
 __docformat__ = "restructuredtext"
 
+
 class Singleton(object):
     """ This class allows Singleton objects
     The __new__ method is overriden to force Singleton behaviour.
     The Singleton is created for the lowest subclass.
     Usage::
-    
+
         from taurus.core.util.singleton import Singleton
-        
+
         class MyManager(Singleton):
-        
+
             def init(self, *args, **kwargs):
                 print "Singleton initialization"
-    
+
     command line::
-    
+
         >>> manager1 = MyManager()
         Singleton initialization
-        
+
         >>> manager2 = MyManager()
-        
+
         >>> print(manager1,manager2)
-        <__main__.MyManager object at 0x9c2a0ec> 
+        <__main__.MyManager object at 0x9c2a0ec>
         <__main__.MyManager object at 0x9c2a0ec>
 
     Notice that the two instances of manager point to the same object even
-    though you *tried* to construct two instances of MyManager. 
-    
+    though you *tried* to construct two instances of MyManager.
+
     .. warning::
-    
-        although __new__ is overriden __init__ is still being called for 
+
+        although __new__ is overriden __init__ is still being called for
         each instance=Singleton()
     """
-    
-    ## Singleton object
+
+    # Singleton object
     _the_instance = None
-    
+
     def __new__(cls, *p, **k):
-        #srubio: added type checking
+        # srubio: added type checking
         if cls != type(cls._the_instance):
             cls._the_instance = object.__new__(cls)
-            
-            #srubio: added init_single check
-            if 'init_single' in cls.__dict__: 
-                cls._the_instance.init_single(*p,**k)
-            else: cls._the_instance.init(*p,**k)
+
+            # srubio: added init_single check
+            if 'init_single' in cls.__dict__:
+                cls._the_instance.init_single(*p, **k)
+            else:
+                cls._the_instance.init(*p, **k)
         return cls._the_instance
-     
-    def init(self, *p,**k):
-        pass
 
-    
+    def init(self, *p, **k):
+        pass
diff --git a/lib/taurus/core/util/sourcecode.py b/lib/taurus/core/util/sourcecode.py
index ef26040..ba6339a 100644
--- a/lib/taurus/core/util/sourcecode.py
+++ b/lib/taurus/core/util/sourcecode.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,33 +34,37 @@ __docformat__ = 'restructuredtext'
 # Order is important:
 EOL_CHARS = (("\r\n", 'nt'), ("\n", 'posix'), ("\r", 'mac'))
 
+
 def get_eol_chars(text):
     """Get text EOL characters"""
     for eol_chars, _os_name in EOL_CHARS:
         if text.find(eol_chars) > -1:
             return eol_chars
 
+
 def get_os_name_from_eol_chars(eol_chars):
     """Return OS name from EOL characters"""
     for chars, os_name in EOL_CHARS:
         if eol_chars == chars:
             return os_name
 
+
 def get_eol_chars_from_os_name(os_name):
     """Return EOL characters from OS name"""
     for eol_chars, name in EOL_CHARS:
         if name == os_name:
             return eol_chars
 
+
 def has_mixed_eol_chars(text):
     """Detect if text has mixed EOL characters"""
     eol_chars = get_eol_chars(text)
     if eol_chars is None:
         return False
-    correct_text = eol_chars.join((text+eol_chars).splitlines())
+    correct_text = eol_chars.join((text + eol_chars).splitlines())
     return repr(correct_text) != repr(text)
 
+
 def fix_indentation(text):
     """Replace tabs by spaces"""
-    return text.replace('\t', ' '*4)
-    
\ No newline at end of file
+    return text.replace('\t', ' ' * 4)
diff --git a/lib/taurus/core/util/tablepprint.py b/lib/taurus/core/util/tablepprint.py
index 0e166ef..d65b96f 100644
--- a/lib/taurus/core/util/tablepprint.py
+++ b/lib/taurus/core/util/tablepprint.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -32,15 +32,16 @@ import operator
 import re
 import math
 
+
 def indent(rows, hasHeader=False, headerChar='-', delim=' | ', justify='left',
-           separateRows=False, prefix='', postfix='', wrapfunc=lambda x:x):
+           separateRows=False, prefix='', postfix='', wrapfunc=lambda x: x):
     """Indents a table by column.
        - rows: A sequence of sequences of items, one sequence per row.
        - hasHeader: True if the first row consists of the columns' names.
        - headerChar: Character to be used for the row separator line
          (if hasHeader==True or separateRows==True).
        - delim: The column delimiter.
-       - justify: Determines how are data justified in their column. 
+       - justify: Determines how are data justified in their column.
          Valid values are 'left','right' and 'center'.
        - separateRows: True if rows are to be separated by a line
          of 'headerChar's.
@@ -48,47 +49,53 @@ def indent(rows, hasHeader=False, headerChar='-', delim=' | ', justify='left',
        - postfix: A string appended to each printed row.
        - wrapfunc: A function f(text) for wrapping text; each element in
          the table is first wrapped by this function.
-         
+
         Returns a list of strings. One for each row of the table
     """
-    
+
     # closure for breaking logical rows to physical, using wrapfunc
     def rowWrapper(row):
         newRows = [wrapfunc(item).split('\n') for item in row]
-        return [[substr or '' for substr in item] for item in map(None,*newRows)]
+        return [[substr or '' for substr in item] for item in map(None, *newRows)]
 
     # break each logical row into one or more physical ones
     logicalRows = [rowWrapper(row) for row in rows]
     # columns of physical rows
-    
-    columns = map(None,*reduce(operator.add,logicalRows))
-    
+
+    columns = map(None, *reduce(operator.add, logicalRows))
+
     # get the maximum of each column by the string length of its items
-    maxWidths = [max([len(str(item)) for item in column]) for column in columns]
-    if separateRows or hasHeader: 
-        rowSeparator = headerChar * (len(prefix) + len(postfix) + sum(maxWidths) + \
-                                     len(delim)*(len(maxWidths)-1))
-    else: 
+    maxWidths = [max([len(str(item)) for item in column])
+                 for column in columns]
+    if separateRows or hasHeader:
+        rowSeparator = headerChar * (len(prefix) + len(postfix) + sum(maxWidths) +
+                                     len(delim) * (len(maxWidths) - 1))
+    else:
         rowSeparator = "<ERR>"
-        
+
     # select the appropriate justify method
-    justify = {'center':str.center, 'right':str.rjust, 'left':str.ljust}[justify.lower()]
-    
+    justify = {'center': str.center, 'right': str.rjust,
+               'left': str.ljust}[justify.lower()]
+
     output = []
-    if separateRows: output.append(rowSeparator)
+    if separateRows:
+        output.append(rowSeparator)
     for physicalRows in logicalRows:
         for row in physicalRows:
-            line =  prefix
-            line += delim.join([justify(str(item),width) for (item,width) in zip(row,maxWidths)])
+            line = prefix
+            line += delim.join([justify(str(item), width)
+                                for (item, width) in zip(row, maxWidths)])
             line += postfix
             output.append(line)
-        if separateRows or hasHeader: 
+        if separateRows or hasHeader:
             output.append(rowSeparator)
-            hasHeader=False
+            hasHeader = False
     return output
 
 # written by Mike Brown
 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/148061
+
+
 def wrap_onspace(text, width):
     """
     A word-wrap function that preserves existing line breaks
@@ -97,58 +104,62 @@ def wrap_onspace(text, width):
     """
     return reduce(lambda line, word, width=width: '%s%s%s' %
                   (line,
-                   ' \n'[(len(line[line.rfind('\n')+1:])
-                         + len(word.split('\n',1)[0]
-                              ) >= width)],
+                   ' \n'[(len(line[line.rfind('\n') + 1:])
+                          + len(word.split('\n', 1)[0]
+                                ) >= width)],
                    word),
                   text.split(' ')
-                 )
+                  )
 
 
 def wrap_onspace_strict(text, width):
     """Similar to wrap_onspace, but enforces the width constraint:
        words longer than width are split."""
-    wordRegex = re.compile(r'\S{'+str(width)+r',}')
-    return wrap_onspace(wordRegex.sub(lambda m: wrap_always(m.group(),width),text),width)
+    wordRegex = re.compile(r'\S{' + str(width) + r',}')
+    return wrap_onspace(wordRegex.sub(lambda m: wrap_always(m.group(), width), text), width)
 
 import math
+
+
 def wrap_always(text, width):
     """A simple word-wrap function that wraps text on exactly width characters.
        It doesn't split the text in words."""
-    return '\n'.join([ text[width*i:width*(i+1)] \
-                       for i in xrange(int(math.ceil(1.*len(text)/width))) ])
-    
+    return '\n'.join([text[width * i:width * (i + 1)]
+                      for i in xrange(int(math.ceil(1. * len(text) / width)))])
+
 if __name__ == '__main__':
     labels = ('First Name', 'Last Name', 'Age', 'Position')
     data = \
-    '''John,Smith,24,Software Engineer
+        '''John,Smith,24,Software Engineer
        Mary,Brohowski,23,Sales Manager
        Aristidis,Papageorgopoulos,28,Senior Reseacher'''
-    rows = [row.strip().split(',')  for row in data.splitlines()]
+    rows = [row.strip().split(',') for row in data.splitlines()]
 
     print 'Without wrapping function\n'
-    for l in indent([labels]+rows, hasHeader=True): print l
-    
+    for l in indent([labels] + rows, hasHeader=True):
+        print l
+
     # test indent with different wrapping functions
     width = 10
-    for wrapper in (wrap_always,wrap_onspace,wrap_onspace_strict):
-        print 'Wrapping function: %s(x,width=%d)\n' % (wrapper.__name__,width)
-        o = indent([labels]+rows, headerChar='=', hasHeader=True, separateRows=False,
+    for wrapper in (wrap_always, wrap_onspace, wrap_onspace_strict):
+        print 'Wrapping function: %s(x,width=%d)\n' % (wrapper.__name__, width)
+        o = indent([labels] + rows, headerChar='=', hasHeader=True, separateRows=False,
                    prefix='|', postfix='|', delim=' ',
-                   wrapfunc=lambda x: wrapper(x,width))
-        for l in o : print l
-    
+                   wrapfunc=lambda x: wrapper(x, width))
+        for l in o:
+            print l
+
     # output:
     #
-    #Without wrapping function
+    # Without wrapping function
     #
-    #First Name | Last Name        | Age | Position         
+    # First Name | Last Name        | Age | Position
     #-------------------------------------------------------
-    #John       | Smith            | 24  | Software Engineer
-    #Mary       | Brohowski        | 23  | Sales Manager    
-    #Aristidis  | Papageorgopoulos | 28  | Senior Reseacher 
+    # John       | Smith            | 24  | Software Engineer
+    # Mary       | Brohowski        | 23  | Sales Manager
+    # Aristidis  | Papageorgopoulos | 28  | Senior Reseacher
     #
-    #Wrapping function: wrap_always(x,width=10)
+    # Wrapping function: wrap_always(x,width=10)
     #
     #----------------------------------------------
     #| First Name | Last Name  | Age | Position   |
@@ -163,7 +174,7 @@ if __name__ == '__main__':
     #|            | poulos     |     | eacher     |
     #----------------------------------------------
     #
-    #Wrapping function: wrap_onspace(x,width=10)
+    # Wrapping function: wrap_onspace(x,width=10)
     #
     #---------------------------------------------------
     #| First Name | Last Name        | Age | Position  |
@@ -178,7 +189,7 @@ if __name__ == '__main__':
     #|            |                  |     | Reseacher |
     #---------------------------------------------------
     #
-    #Wrapping function: wrap_onspace_strict(x,width=10)
+    # Wrapping function: wrap_onspace_strict(x,width=10)
     #
     #---------------------------------------------
     #| First Name | Last Name  | Age | Position  |
diff --git a/lib/taurus/core/util/tb.py b/lib/taurus/core/util/tb.py
index ff11cc1..94ff863 100644
--- a/lib/taurus/core/util/tb.py
+++ b/lib/taurus/core/util/tb.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 a set of useful traceback elements based on python's 
+"""This module contains a set of useful traceback elements based on python's
 :mod:`traceback` system."""
 
 import sys
@@ -31,6 +31,7 @@ import inspect
 import traceback
 import threading
 
+
 def _get_thread(ident=None):
     if ident is None:
         return threading.current_thread()
@@ -38,15 +39,17 @@ def _get_thread(ident=None):
         if th.ident == ident:
             return th
 
+
 def _get_frames():
     return sys._current_frames()
-    
+
+
 def format_frame_stacks(frames=None, limit=None):
     if frames is None:
         frames = _get_frames()
     frame_stacks = extract_frame_stacks(frames=frames, limit=limit)
     ret = []
-    
+
     for ident, (frame, frame_stack) in frame_stacks.items():
         curr_th, th = _get_thread(), _get_thread(ident)
         if th is None:
@@ -64,7 +67,8 @@ def format_frame_stacks(frames=None, limit=None):
             line = "  " + line.replace("\n  ", "\n    ")
             ret.append(line)
     return ret
-    
+
+
 def extract_frame_stacks(frames=None, limit=None):
     if frames is None:
         frames = _get_frames()
@@ -73,4 +77,3 @@ def extract_frame_stacks(frames=None, limit=None):
         frame_stack = traceback.extract_stack(frame, limit=limit)
         ret[ident] = frame, frame_stack
     return ret
-   
diff --git a/lib/taurus/core/util/test/__init__.py b/lib/taurus/core/util/test/__init__.py
index 5551527..f0235e6 100644
--- a/lib/taurus/core/util/test/__init__.py
+++ b/lib/taurus/core/util/test/__init__.py
@@ -2,26 +2,26 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-"""
\ No newline at end of file
+"""
diff --git a/lib/taurus/core/util/test/test_codecs.py b/lib/taurus/core/util/test/test_codecs.py
index 71f1fbb..f1658dd 100644
--- a/lib/taurus/core/util/test/test_codecs.py
+++ b/lib/taurus/core/util/test/test_codecs.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -36,42 +36,41 @@ from taurus.core.util.codecs import CodecFactory
 import numpy
 
 
- at insertTest(helper_name= 'encDec', cname='json', data=[1,2,3])
- at insertTest(helper_name= 'encDec', cname='zip', data='foobar')
- at insertTest(helper_name= 'encDec', cname='zip_json', data=[1,2,3])
- at insertTest(helper_name= 'encDec', cname='videoimage', 
-            data=numpy.ones((2,2), dtype='uint8'))
- at insertTest(helper_name= 'encDec', cname='zip_null_zip_videoimage', 
-            data=numpy.ones((2,2), dtype='uint8'))
- at insertTest(helper_name= 'dec', cname='videoimage', 
-            data = 'VDEO\x00\x01\x00\x07\x00\x00\x00\x00\x00\x00\x00' + \
-                 '\x01\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00 ' + \
-                 '\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01' + \
-                 '\x01\x01\x01\x01\x01\x01\x01\x01',
-            expected=numpy.ones((2,2,3),dtype='uint8'))
-
+ at insertTest(helper_name='encDec', cname='json', data=[1, 2, 3])
+ at insertTest(helper_name='encDec', cname='zip', data='foobar')
+ at insertTest(helper_name='encDec', cname='zip_json', data=[1, 2, 3])
+ at insertTest(helper_name='encDec', cname='videoimage',
+            data=numpy.ones((2, 2), dtype='uint8'))
+ at insertTest(helper_name='encDec', cname='zip_null_zip_videoimage',
+            data=numpy.ones((2, 2), dtype='uint8'))
+ at insertTest(helper_name='dec', cname='videoimage',
+            data='VDEO\x00\x01\x00\x07\x00\x00\x00\x00\x00\x00\x00' +
+            '\x01\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00 ' +
+            '\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01' +
+            '\x01\x01\x01\x01\x01\x01\x01\x01',
+            expected=numpy.ones((2, 2, 3), dtype='uint8'))
 class CodecTest(unittest.TestCase):
     '''TestCase for checking codecs'''
+
     def encDec(self, cname=None, data=None, expected=None):
         '''Check that data can be encoded-decoded properly'''
         if expected is None:
             expected = copy.deepcopy(data)
         _, enc = self.enc(cname=cname, data=data)
         self.dec(cname=cname, data=enc, expected=expected)
-        
-        
+
     def enc(self, cname=None, data=None, expected=None):
         '''Check that data can be encoded-decoded properly'''
         cf = CodecFactory()
         codec = cf.getCodec(cname)
         fmt, enc = codec.encode(('', data))
-        if  expected is not None:
-            msg = ('Wrong data after encoding with %s:\n' + 
+        if expected is not None:
+            msg = ('Wrong data after encoding with %s:\n' +
                    ' -expected:%s\n -obtained:%s') % (cname, expected, enc)
             if numpy.isscalar(expected):
-                equal = enc==expected
+                equal = enc == expected
             else:
-                equal = numpy.all(enc==expected)
+                equal = numpy.all(enc == expected)
             self.assertTrue(equal, msg)
         return fmt, enc
 
@@ -79,14 +78,14 @@ class CodecTest(unittest.TestCase):
         '''Check that data can be encoded-decoded properly'''
         cf = CodecFactory()
         codec = cf.getCodec(cname)
-        fmt, dec =codec.decode((cname, data))
+        fmt, dec = codec.decode((cname, data))
         if expected is not None:
-            msg = ('Wrong data after decoding with %s:\n' + 
+            msg = ('Wrong data after decoding with %s:\n' +
                    ' -expected:%s\n -obtained:%s') % (cname, expected, dec)
             if numpy.isscalar(expected):
-                equal = dec==expected
+                equal = dec == expected
             else:
-                equal = numpy.all(dec==expected)
+                equal = numpy.all(dec == expected)
             self.assertTrue(equal, msg)
         return fmt, dec
 
diff --git a/lib/taurus/core/util/test/test_timer.py b/lib/taurus/core/util/test/test_timer.py
index 9ae1898..d7971cf 100644
--- a/lib/taurus/core/util/test/test_timer.py
+++ b/lib/taurus/core/util/test/test_timer.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,6 +35,7 @@ import numpy
 from taurus.external import unittest
 from taurus.core.util.timer import Timer
 
+
 class TimerTest(unittest.TestCase):
     '''Test case for testing the taurus.core.util.timer.Timer class'''
 
@@ -49,33 +50,33 @@ class TimerTest(unittest.TestCase):
 
     def test_calltimes(self):
         '''check the quality of the Timer's timing'''
-        period = .1 # in s
-        n = 10 # make this >2 ! 
-        timeout = n * period + 2 # expected time +2 seconds margin
-        tol = 0.001 # time tolerance for the various checks (in s)
-        
+        period = .1  # in s
+        n = 10  # make this >2 !
+        timeout = n * period + 2  # expected time +2 seconds margin
+        tol = 0.001  # time tolerance for the various checks (in s)
+
         timer = Timer(period, self._callback, None, strict_timing=True,
-                            sleep=.05, n=n)
-        
+                      sleep=.05, n=n)
+
         # Start the timer, wait till the callback is called n times and then s
         # and then stop it
         self.__nCalls = threading.Event()
         timer.start()
-        self.__nCalls.wait(timeout) 
+        self.__nCalls.wait(timeout)
         timer.stop()
         self.__nCalls.clear()
-        
+
         # checking number of calls
         ts = numpy.array(self.__calltimes)
-        msg = '%i calls expected (got %i)' % (n , ts.size)
+        msg = '%i calls expected (got %i)' % (n, ts.size)
         self.assertEqual(ts.size, n, msg)
-        
+
         # checking drift
         totaltime = ts[-1] - ts[0]
-        drift = abs(totaltime - ((n-1) * period))
+        drift = abs(totaltime - ((n - 1) * period))
         msg = 'Too much drift (%g). Tolerance=%g' % (drift, tol)
         self.assertLess(drift, tol, msg)
-        
+
         # checking period jitter (mean period and its standard dev)
         periods = numpy.diff(ts)
         mean = periods.mean()
@@ -84,7 +85,7 @@ class TimerTest(unittest.TestCase):
                                                                     mean, std)
         self.assertAlmostEqual(mean, period, msg=msg, delta=tol)
         self.assertLess(std, tol, msg)
-        
+
     def _callback(self, sleep=0, n=5):
         '''store times at which it has been called, and signal when n calls
         have been done. If sleep>0 is passed, sleep that much in each call '''
@@ -92,8 +93,8 @@ class TimerTest(unittest.TestCase):
         self.__count += 1
         time.sleep(sleep)
         if self.__count == n:
-            self.__nCalls.set() # signal that we have been called n times 
-        
+            self.__nCalls.set()  # signal that we have been called n times
+
 
 if __name__ == '__main__':
     pass
diff --git a/lib/taurus/core/util/threadpool.py b/lib/taurus/core/util/threadpool.py
index 445e4ff..c020897 100644
--- a/lib/taurus/core/util/threadpool.py
+++ b/lib/taurus/core/util/threadpool.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -40,9 +40,9 @@ from log import Logger, DebugIt, TraceIt
 
 class ThreadPool(Logger):
     """"""
-    
-    NoJob = 6*(None,)
-    
+
+    NoJob = 6 * (None,)
+
     def __init__(self, name=None, parent=None, Psize=20, Qsize=20, daemons=True):
         Logger.__init__(self, name, parent)
         self._daemons = daemons
@@ -59,7 +59,7 @@ class ThreadPool(Logger):
             nb_workers = len(self.workers)
             if newSize == nb_workers:
                 return
-            
+
             for i in range(newSize - nb_workers):
                 self.localThreadId += 1
                 name = "%s.W%03i" % (self.log_name, self.localThreadId)
@@ -67,37 +67,38 @@ class ThreadPool(Logger):
                 self.workers.append(new)
                 self.debug("Starting %s" % name)
                 new.start()
-            
+
             # remove the old worker threads
             nb_workers = len(self.workers)
             for i in range(nb_workers - newSize):
                 self.jobs.put(self.NoJob)
-                
+
         def get(self):
             """get method for the size property"""
             return len(self.workers)
-        
+
         return get, set, None, "number of threads"
-    
+
     def add(self, job, callback=None, *args, **kw):
         if self.accept:
             # first gather some information on the object which requested the
             # job in case the job throws an exception
             th_id, stack = currentThread().name, extract_stack()[:-1]
             self.jobs.put((job, args, kw, callback, th_id, stack))
-            
+
     def join(self):
-        self.accept=False
+        self.accept = False
         while True:
             for w in self.workers:
-                if w.isAlive() :
+                if w.isAlive():
                     self.jobs.put(self.NoJob)
                     break
             else:
                 break
 
     @property
-    def qsize(self): return self.jobs.qsize()
+    def qsize(self):
+        return self.jobs.qsize()
 
     def getNumOfBusyWorkers(self):
         ''' Get the number of workers that are in busy mode.
@@ -110,16 +111,16 @@ class ThreadPool(Logger):
 
 
 class Worker(Thread, Logger):
-    
+
     def __init__(self, pool, name=None, daemon=True):
         name = name or self.__class__.__name__
         Thread.__init__(self, name=name)
         Logger.__init__(self, name, pool)
         self.daemon = daemon
         self.pool = pool
-        self.cmd=''
+        self.cmd = ''
         self.busy = False
-    
+
     def run(self):
         get = self.pool.jobs.get
         while True:
@@ -147,21 +148,24 @@ class Worker(Thread, Logger):
     def isBusy(self):
         return self.busy
 
-if __name__=='__main__':
+if __name__ == '__main__':
 
     def easyJob(*arg, **kw):
-        n=arg[0]
+        n = arg[0]
         print '\tSleep\t\t', n
         sleep(n)
         return 'Slept\t%d' % n
+
     def longJob(*arg, **kw):
         print "\tStart\t\t\t", arg, kw
-        n=arg[0]*3
+        n = arg[0] * 3
         sleep(n)
         return "Job done in %d" % n
+
     def badJob(*a, **k):
         print '\n !!! OOOPS !!!\n'
-        a=1/0
+        a = 1 / 0
+
     def show(*arg, **kw):
         print 'callback : %s' % arg[0]
 
@@ -171,7 +175,8 @@ if __name__=='__main__':
         pool = ThreadPool(name='ThreadPool', Psize=workers, Qsize=jobqueue)
         print "\n\t\t... let's add some jobs ...\n"
         for j in range(5):
-            if j==1: pool.add(badJob)
+            if j == 1:
+                pool.add(badJob)
             for i in range(5, 0, -1):
                 pool.add(longJob, show, i)
                 pool.add(easyJob, show, i)
@@ -181,7 +186,7 @@ if __name__=='__main__':
         sleep(15)
         print "\n\t\t... ok, that may take a while, let's get some reinforcement ...\n"
         sleep(5)
-        pool.size=50
+        pool.size = 50
         print '\n\t\t... Joining ...\n'
         pool.join()
         print '\n\t\t... Ok ...\n'
@@ -200,11 +205,11 @@ if __name__=='__main__':
             pool.add(easyJob, None, sleep_t)
         print '\n\t\t... Monitoring the busy workers ...\n'
         t0 = time()
-        while pool.getNumOfBusyWorkers() > 0 :
+        while pool.getNumOfBusyWorkers() > 0:
             print "busy workers = %s" % (pool.getNumOfBusyWorkers())
             sleep(0.5)
         t1 = time()
-        print "Run %s jobs of 1 second took %.3f" % (numjobs, t1-t0)
+        print "Run %s jobs of 1 second took %.3f" % (numjobs, t1 - t0)
         print '\n\t\t... Joining ...\n'
         pool.join()
         print '\n\t\t... Ok ...\n'
diff --git a/lib/taurus/core/util/timer.py b/lib/taurus/core/util/timer.py
index fd87aa0..c7fc7d1 100644
--- a/lib/taurus/core/util/timer.py
+++ b/lib/taurus/core/util/timer.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,6 +34,7 @@ import threading
 
 from .log import Logger
 
+
 class Timer(Logger):
     """
     Timer Object.
@@ -57,7 +58,7 @@ class Timer(Logger):
         self.__start_nb = 0
         self.__thread = None
         self.__strict_timing = strict_timing
-        
+
     def start(self):
         """ Start Timer Object """
         self.__lock.acquire()
@@ -68,19 +69,20 @@ class Timer(Logger):
                 self.__alive = True
                 self.__start_nb += 1
                 thread_name = "TimerLoop %d" % self.__start_nb
-                self.__thread = threading.Thread(target=self.__run, name = thread_name)
+                self.__thread = threading.Thread(
+                    target=self.__run, name=thread_name)
                 self.__thread.setDaemon(True)
                 self.__thread.start()
         finally:
             self.__lock.release()
-    
+
     def stop(self):
         """ Stop Timer Object """
         self.debug("Timer::stop()")
         self.__lock.acquire()
         self.__loop = False
         self.__lock.release()
-    
+
     def __run(self):
         """ Private Thread Function """
         self.debug("Timer thread starting")
diff --git a/lib/taurus/core/util/user.py b/lib/taurus/core/util/user.py
index fe55d3e..b965cbb 100644
--- a/lib/taurus/core/util/user.py
+++ b/lib/taurus/core/util/user.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-Finds out user inf (currently just the logged user name) for Windows and 
+Finds out user inf (currently just the logged user name) for Windows and
 Posix machines. sets a USER_NAME variable containing the logged user name
 defines a UNKNOWN_USER variable to which username falls back.
 It also provides the getSystemUserName() function"""
@@ -36,14 +36,15 @@ __docformat__ = "restructuredtext"
 #import os
 import getpass
 
-#fallback. The caller of this module can check if username != UNKNOWN_USER
-UNKNOWN_USER='UnknownUser' 
+# fallback. The caller of this module can check if username != UNKNOWN_USER
+UNKNOWN_USER = 'UnknownUser'
+
 
 def getSystemUserName():
-    """Finds out user inf (currently just the logged user name) for Windows and 
+    """Finds out user inf (currently just the logged user name) for Windows and
     Posix machines. sets a USER_NAME variable containing the logged user name
     defines a UNKNOWN_USER variable to which username falls back.
-    
+
     :return: (str) current user name
     """
     try:
@@ -54,9 +55,8 @@ def getSystemUserName():
 #    if os.name is 'posix': #this works for linux and macOSX
 #        username=os.getenv('USER', UNKNOWN_USER)
 #    elif os.name is 'nt': #win NT, XP... (and Vista?)
-#        username=os.getenv('USERNAME', UNKNOWN_USER)    
+#        username=os.getenv('USERNAME', UNKNOWN_USER)
 #    if username == '': username=UNKNOWN_USER
 #    return username
 
-USER_NAME=getSystemUserName()
-
+USER_NAME = getSystemUserName()
diff --git a/lib/taurus/core/util/whichexecutable.py b/lib/taurus/core/util/whichexecutable.py
index 6399481..29ce10e 100644
--- a/lib/taurus/core/util/whichexecutable.py
+++ b/lib/taurus/core/util/whichexecutable.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -32,23 +32,24 @@ __docformat__ = "restructuredtext"
 
 import os
 
+
 def whichfile(filename, exts=None):
-    '''Find path of executable specified by filename. 
+    '''Find path of executable specified by filename.
     It Takes into consideration
-    the PATHEXT variable (found in MS Windows systems) to try also executable 
+    the PATHEXT variable (found in MS Windows systems) to try also executable
     names extended with executable extensions.
-    
+
     Example::
-      
+
       # on a debian machine with taurus installed in the default path:
       whichfile('taurusform') --> '/usr/bin/taurusform'
-      
+
       # or, on a winXP machine:
       whichfile('command') --> 'C:\\WINDOWS\\system32\\command.COM'
 
     :param filename: (str) executable name.
-    :param exts: (list<str>) a list of valid executable extensions. 
-                 If None given, the PATHEXT environmental variable is used 
+    :param exts: (list<str>) a list of valid executable extensions.
+                 If None given, the PATHEXT environmental variable is used
                  if available.
 
     :return: (str) absolute path to the executable in the file system
diff --git a/lib/taurus/core/util/wrap.py b/lib/taurus/core/util/wrap.py
index bf82c22..f323f2e 100644
--- a/lib/taurus/core/util/wrap.py
+++ b/lib/taurus/core/util/wrap.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -33,6 +33,7 @@ from functools import wraps as _wraps
 __WRAPPED = "__wrapped__"
 __WRAPPER = "__wrapper__"
 
+
 def wraps(wrapped, *args, **kwargs):
     """A wrap decorator which stores in the returned function a reference to
     the wrapped function (in member '__wrapped__')"""
@@ -41,14 +42,17 @@ def wraps(wrapped, *args, **kwargs):
     setattr(wrapped, __WRAPPER, weakref.ref(wrapper))
     return wrapper
 
+
 def is_wrapping(wrapper):
     """Determines if the given callable is a wrapper for another callable"""
     return hasattr(wrapper, __WRAPPED)
 
+
 def is_wrapped(wrapped):
     """Determines if the given callable is being wrapped by another callable"""
     return hasattr(wrapped, __WRAPPER)
-    
+
+
 def wrapped(wrapper, recursive=True):
     """Returns the wrapped function around the given wrapper. If the given
     callable is not "wrapping" any function, the wrapper itself is returned"""
@@ -60,5 +64,3 @@ def wrapped(wrapper, recursive=True):
     if recursive:
         return wrapped(_wrapped)
     return _wrapped
-
-    
\ No newline at end of file
diff --git a/lib/taurus/core/utils/__init__.py b/lib/taurus/core/utils/__init__.py
deleted file mode 100644
index 9ec35d7..0000000
--- a/lib/taurus/core/utils/__init__.py
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 is deprecated. It is here to maintain compatibility with
-tau V1. Please use taurus.core.util instead"""
-
-from taurus.core.util import *
\ No newline at end of file
diff --git a/lib/taurus/external/pint/__init__.py b/lib/taurus/external/pint/__init__.py
index 5bebb89..6be7a01 100644
--- a/lib/taurus/external/pint/__init__.py
+++ b/lib/taurus/external/pint/__init__.py
@@ -26,19 +26,21 @@
 from __future__ import absolute_import
 
 try:
+    from pint import __version__
+    if __version__.split('.') < ['0','7']:
+        raise ImportError()
     from pint import *
+
 except ImportError:
-    # pint from local import
-    import os
-    import sys
     import warnings
-    warnings.warn("pint not available. Using local pint", ImportWarning)
-    sys.path.append(os.path.dirname(__file__))
-    from pint import *
+    warnings.warn("pint >=0.7 not available. Using local pint", ImportWarning)
+    from .pint_local import *
+    from .pint_local import __version__ as __local_pint_version
+    __version__ = __local_pint_version + '-taurus'
     del warnings
-    del sys
-    del os
 
+# Ininitialize the unit registry for taurus
 UR = UnitRegistry()
-UR.default_format = '~P'
-Quantity = UR.Quantity
+UR.default_format = '~' # use abbreviated units
+Q_ = Quantity = UR.Quantity
+
diff --git a/lib/taurus/external/qt/QtHelp.py b/lib/taurus/external/qt/QtHelp.py
old mode 100644
new mode 100755
diff --git a/lib/taurus/external/test/test_qt.py b/lib/taurus/external/test/test_qt.py
index 00935b7..c41159c 100644
--- a/lib/taurus/external/test/test_qt.py
+++ b/lib/taurus/external/test/test_qt.py
@@ -54,6 +54,9 @@ class QtTestCase(unittest.TestCase):
         self.opt_mods = ("QtDesigner", "QtNetwork", "Qt", "QtSvg",
                          "QtUiTools", "QtWebKit", "Qwt5", "uic")
 
+        # store a "snapshot" of the currently loaded modules
+        self._orig_mods = set(sys.modules.keys())
+
         # auto initialize Qt by taurus using forcibly the self.QtAPI
         tauruscustomsettings.QT_AUTO_INIT = True
         tauruscustomsettings.QT_AUTO_API = self.QtAPI
@@ -64,7 +67,7 @@ class QtTestCase(unittest.TestCase):
         self.__qt = Qt
 
     def test_qt_base_import(self):
-        mods = sys.modules
+        mods = set(sys.modules.keys())
 
         other_apis = set(_QtAPIs)
         other_apis.remove(self.QtAPI)
@@ -81,7 +84,7 @@ class QtTestCase(unittest.TestCase):
 
         for opt_mod in self.opt_mods:
             mod = "{0}.{1}".format(self.QtAPI, opt_mod)
-            self.assertFalse(mod in mods, mod + " is loaded")
+            self.assertFalse(mod in mods-self._orig_mods, mod + " is loaded")
 
     def __test_qt_module(self, qt_mod_name):
         taurus_qt_mod_name = "taurus.external.qt.{0}".format(qt_mod_name)
@@ -103,8 +106,8 @@ class QtTestCase(unittest.TestCase):
 
     def test_icons(self):
         '''check that theme icons work'''
-        from taurus.qt.qtgui.resource import getThemeIcon
-        icon = getThemeIcon("folder-open")
+        from taurus.external.qt import Qt
+        icon = Qt.QIcon.fromTheme("folder-open")
         msg = ('Theme icons not available ' + 
                '(if PyQt<4.6, make sure to build resources first!)')
         self.assertFalse(icon.isNull(), msg)
diff --git a/lib/taurus/qt/Qt.py b/lib/taurus/qt/Qt.py
index fe51e01..001a35d 100644
--- a/lib/taurus/qt/Qt.py
+++ b/lib/taurus/qt/Qt.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/QtCore.py b/lib/taurus/qt/QtCore.py
index e495d96..9e946ba 100644
--- a/lib/taurus/qt/QtCore.py
+++ b/lib/taurus/qt/QtCore.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/QtDesigner.py b/lib/taurus/qt/QtDesigner.py
index 5a12bcc..7ffda68 100644
--- a/lib/taurus/qt/QtDesigner.py
+++ b/lib/taurus/qt/QtDesigner.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/QtGui.py b/lib/taurus/qt/QtGui.py
index 3173fa8..554c163 100644
--- a/lib/taurus/qt/QtGui.py
+++ b/lib/taurus/qt/QtGui.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/QtNetwork.py b/lib/taurus/qt/QtNetwork.py
index 8c32056..d39c960 100644
--- a/lib/taurus/qt/QtNetwork.py
+++ b/lib/taurus/qt/QtNetwork.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/QtSvg.py b/lib/taurus/qt/QtSvg.py
index 6cd41d2..d96ae79 100644
--- a/lib/taurus/qt/QtSvg.py
+++ b/lib/taurus/qt/QtSvg.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/QtUiTools.py b/lib/taurus/qt/QtUiTools.py
index 33060e7..0ddbaa5 100644
--- a/lib/taurus/qt/QtUiTools.py
+++ b/lib/taurus/qt/QtUiTools.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/QtWebKit.py b/lib/taurus/qt/QtWebKit.py
index a6746c8..e66cf62 100644
--- a/lib/taurus/qt/QtWebKit.py
+++ b/lib/taurus/qt/QtWebKit.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/Qwt5.py b/lib/taurus/qt/Qwt5.py
index d88d9e3..5567850 100644
--- a/lib/taurus/qt/Qwt5.py
+++ b/lib/taurus/qt/Qwt5.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/__init__.py b/lib/taurus/qt/__init__.py
index c8595b5..cb776e3 100644
--- a/lib/taurus/qt/__init__.py
+++ b/lib/taurus/qt/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtcore/__init__.py b/lib/taurus/qt/qtcore/__init__.py
index 39c21a4..132ec91 100644
--- a/lib/taurus/qt/qtcore/__init__.py
+++ b/lib/taurus/qt/qtcore/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtcore/communication/__init__.py b/lib/taurus/qt/qtcore/communication/__init__.py
index eb8be41..d7c7d2c 100644
--- a/lib/taurus/qt/qtcore/communication/__init__.py
+++ b/lib/taurus/qt/qtcore/communication/__init__.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
-"""The taurus.qt.qtcore.communication submodule. It contains non-gui components 
+"""The taurus.qt.qtcore.communication submodule. It contains non-gui components
 of taurus.qt"""
 
-from .communication import *
\ No newline at end of file
+from .communication import *
diff --git a/lib/taurus/qt/qtcore/communication/communication.py b/lib/taurus/qt/qtcore/communication/communication.py
index 13746f5..1707242 100644
--- a/lib/taurus/qt/qtcore/communication/communication.py
+++ b/lib/taurus/qt/qtcore/communication/communication.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-comunications.py: 
+comunications.py:
 """
 
 from taurus.external.qt import QtCore
@@ -32,17 +32,30 @@ import weakref
 
 _DEBUG = False
 
+
+def get_signal(obj, signalname):
+    """Return signal from object and signal name."""
+    if '(' not in signalname:
+        return getattr(obj, signalname)
+    name, dtype = signalname.strip(')').split('(')
+    dtype = tuple(dtype.split(','))
+    return getattr(obj, name)[dtype]
+
+
 class DataModel(QtCore.QObject):
     '''
     An object containing one piece of data which is intended to be shared. The
-    data will be identified by its UID (a unique identifier known to objects 
+    data will be identified by its UID (a unique identifier known to objects
     that intend to access the data)
-    
+
     In general, you are not supposed to instantiate objects of this class
     directly. Instead, you should interact via the :class:`SharedDataManager`,
     which uses :meth:`SharedDataManager.__getDataModel` to ensure that the
     DataModels are singletons.
     '''
+
+    dataChanged = QtCore.pyqtSignal(object)
+
     def __init__(self, parent, dataUID, defaultData=None):
         '''
         creator
@@ -53,116 +66,123 @@ class DataModel(QtCore.QObject):
         self.__dataUID = dataUID
         self.__data = defaultData
         self.__isDataSet = False
-        
+
         self.__readerSlots = []
         self.__writerSignals = []
-        
+
     def __repr__(self):
-        return '<DataModel object with dataUID="%s">'%self.dataUID()
-    
+        return '<DataModel object with dataUID="%s">' % self.dataUID()
+
     def dataUID(self):
-        ''' 
+        '''
         returns the data unique identifier
-        
+
         :return: (str)
         '''
         return self.__dataUID
-    
+
     def getData(self):
         '''
         Returns the data object.
-        
+
         :return: (object) the data object
         '''
         return self.__data
-    
+
     def setData(self, data):
         '''
         sets the data object and emits a "dataChanged" signal with the data as the parameter
-        
+
         :param data: (object) the new value for the Model's data
         '''
         self.__data = data
         self.__isDataSet = True
-        self.emit(QtCore.SIGNAL("dataChanged"), self.__data)
-        
+        self.dataChanged.emit(self.__data)
+
     def connectReader(self, slot, readOnConnect=True):
         '''
         Registers the given slot method to receive notifications whenever the
         data is changed.
-        
+
         :param slot: (callable) a method that will be called when the data changes.
                      This slot will be the receiver of a signal which has the
                      data as its first argument.
         :param readOnConnect: (bool) if True (default) the slot will be called
                               immediately with the current value of the data
                               if the data has been already initialized
-        
+
         .. seealso:: :meth:`connectWriter`, :meth:`getData`
         '''
-        self.connect(self, QtCore.SIGNAL("dataChanged"), slot)
-        if readOnConnect and self.__isDataSet: slot(self.__data)
-        obj=getattr(slot,'__self__',slot)
+        self.dataChanged.connect(slot)
+
+        if readOnConnect and self.__isDataSet:
+            slot(self.__data)
+        obj = getattr(slot, '__self__', slot)
         self.__readerSlots.append((weakref.ref(obj), slot.__name__))
-    
+
     def connectWriter(self, writer, signalname):
         '''
         Registers the given writer object as a writer of the data. The writer is
         then expected to emit a `QtCore.SIGNAL(signalname)` with the new data as the
         first parameter.
-                        
+
         :param writer: (QObject) object that will change the data
         :param signalname: (str) the signal name that will notify changes
-                           of the data 
-                
+                           of the data
+
         .. seealso:: :meth:`connectReader`, :meth:`setData`
         '''
-        self.connect(writer, QtCore.SIGNAL(signalname),self.setData)
-        self.__writerSignals.append((weakref.ref(writer),signalname))
-        
+        try:
+            get_signal(writer, signalname).connect(self.setData)
+        except AttributeError:
+            # support old-style signal
+            self.connect(writer, QtCore.SIGNAL(signalname), self.setData)
+        self.__writerSignals.append((weakref.ref(writer), signalname))
+
     def disconnectWriter(self, writer, signalname):
         '''unregister a writer from this data model
-                        
+
         :param writer: (QObject) object to unregister
         :param signalname: (str) the signal that was registered
-                           
+
         .. seealso:: :meth:`SharedDataManager.disconnectWriter`
         '''
-        ok = self.disconnect(writer, QtCore.SIGNAL(signalname), self.setData)
-        self.__writerSignals.remove((weakref.ref(writer),signalname))
-        
+        ok = get_signal(writer, signalname).disconnect(self.setData)
+        self.__writerSignals.remove((weakref.ref(writer), signalname))
+
     def disconnectReader(self, slot):
         '''
         unregister a reader
-        
+
         :param slot: (callable) the slot to which this was connected
-        
+
         .. seealso:: :meth:`SharedDataManager.disconnectReader`, :meth:`getData`
         '''
-        ok = self.disconnect(self, QtCore.SIGNAL("dataChanged"), slot)
-        self.__readerSlots.remove((weakref.ref(slot.__self__),slot.__name__))
-        
+        ok = self.dataChanged.disconnect(slot)
+        self.__readerSlots.remove((weakref.ref(slot.__self__), slot.__name__))
+
     def isDataSet(self):
         '''Whether the data has been set at least once or if it is uninitialized
-        
+
         :return: (bool) True if the data has been set. False it is uninitialized'''
         return self.__isDataSet
-    
+
     def info(self):
-        readers=["%s::%s"%(repr(r()),s) for r,s in self.__readerSlots]
-        writers=["%s::%s"%(repr(r()),s) for r,s in self.__writerSignals]
-        return "UID: %s\n\t Readers (%i):%s\n\t Writers (%i):%s\n"%(self.__dataUID, len(readers),
-                                                                  readers, len(writers), writers)
+        readers = ["%s::%s" % (repr(r()), s) for r, s in self.__readerSlots]
+        writers = ["%s::%s" % (repr(r()), s) for r, s in self.__writerSignals]
+        return "UID: %s\n\t Readers (%i):%s\n\t Writers (%i):%s\n" % (self.__dataUID, len(readers),
+                                                                      readers, len(writers), writers)
+
     def readerCount(self):
         '''returns the number of currently registered readers of this model
-        
+
         :return: (int)
-        '''        
+        '''
         return len(self.__readerSlots)
-    
+
     def writerCount(self):
         '''returns the number of currently registered writers of this model
-        
+
         :return: (int)
         '''
         return len(self.__writerSignals)
@@ -175,146 +195,148 @@ class SharedDataManager(QtCore.QObject):
     alive unless there at least some Reader or Writer registered to it (or
     another object referencing them)
     '''
+
     def __init__(self, parent):
         QtCore.QObject.__init__(self, parent)
         self.__models = {}
 
-    
     def __getDataModel(self, dataUID):
         '''
         Returns the :class:`DataModel` object for the given data UID (which is a singleton).
         If it does not previously exist, it creates one).
-        
+
         .. note:: This is a private method. You are probably more interested
                   in using :meth:`connectReader` and :meth:`connectWriter`
-        
+
         :param dataUID: (str) the unique identifier of the data
-        
+
         :return: (DataModel)
-        
+
         .. seealso:: :meth:`connectReader`,  :meth:`connectWriter`, :class:`DataModel`
         '''
         if dataUID not in self.__models:
-            self.__models[dataUID] = DataModel(self,dataUID)
+            self.__models[dataUID] = DataModel(self, dataUID)
         return self.__models[dataUID]
-    
+
     def getDataModelProxy(self, dataUID, callback=None):
         '''
         Returns a :class:`weakref.proxy` to a :class:`DataModel` object for the
         given data UID or None if the UID is not registered.
-        
+
         .. note:: The underlying :class:`DataModel` object may cease to exist if
                   all its readers and writers are unregistered.
-        
+
         :param dataUID: (str) the unique identifier of the data
         :param callback: (callable) same as in :class:`weakref.ref` callback parameter
-        
+
         :return: (weakref.proxy or None)
-        
+
         .. seealso:: :meth:`connectReader`,  :meth:`connectWriter`, :class:`DataModel`
         '''
         if dataUID not in self.__models:
             return None
         dm = self.__getDataModel(dataUID)
-        return weakref.proxy(dm,callback)
-    
+        return weakref.proxy(dm, callback)
+
     def connectReader(self, dataUID, slot, readOnConnect=True):
         '''
         Registers the given slot method to receive notifications whenever the
         data identified by dataUID is changed.
-        
+
         Note that it returns the :meth:`DataModel.getData` method for the given data
         UID, which can be used for reading the data at any moment.
-                
-        :param dataUID: (str) the unique identifier of the data 
+
+        :param dataUID: (str) the unique identifier of the data
         :param slot: (callable) a method that will be called when the data changes
                      this slot will be the receiver of a signal which has the
                      data as its first argument.
         :param readOnConnect: (bool) if True (default) the slot will be called
                               immediately with the current value of the data
                               if the data has been already initialized
-        
+
         :return: (callable) a callable that can be used for reading the data
-        
+
         .. seealso:: :meth:`connectWriter`, :meth:`__getDataModel`
         '''
         m = self.__getDataModel(dataUID)
         m.connectReader(slot, readOnConnect=True)
-        if _DEBUG: m.connectReader(self.debugReader)     #@todo: comment this line out. ONLY FOR DEBUGGING
+        if _DEBUG:
+            # @todo: comment this line out. ONLY FOR DEBUGGING
+            m.connectReader(self.debugReader)
         return m.getData
-        
+
     def connectWriter(self, dataUID, writer, signalname):
         '''
         Registers the given writer object as a changer of the shared data
         identified by dataUID. The writer is then expected to emit a
         `QtCore.SIGNAL(signalname)` with the new data as the first parameter
-        
+
         Note that it returns the :meth:`DataModel.setData` method for the given data
         UID, which can be used for changing the data at any moment.
-                
-        :param dataUID: (str) the unique identifier of the data 
+
+        :param dataUID: (str) the unique identifier of the data
         :param writer: (QObject) object that will change the data
         :param signalname: (str) the signal name that will notify changes
-                           of the data 
-                            
+                           of the data
+
         :return: (callable) a callable that can be used for setting the data.
                  When using it, one parameter has to be passed containing the
                  new data
-        
+
         .. seealso:: :meth:`connectWriter`, :meth:`__getDataModel`
         '''
         m = self.__getDataModel(dataUID)
         m.connectWriter(writer, signalname)
-        if _DEBUG: m.connectReader(self.debugReader)     #@todo: comment this line out. ONLY FOR DEBUGGING
+        if _DEBUG:
+            # @todo: comment this line out. ONLY FOR DEBUGGING
+            m.connectReader(self.debugReader)
         return m.setData
-    
+
     def disconnectWriter(self, dataUID, writer, signalname):
         '''Unregister the given object as writer of the shared data
-        
-        :param dataUID: (str) the unique identifier of the data                 
+
+        :param dataUID: (str) the unique identifier of the data
         :param writer: (QObject) object to unregister
         :param signalname: (str) the signal that was registered
-                           
+
         .. seealso:: :meth:`DataModel.disconnectWriter`
         '''
         m = self.__getDataModel(dataUID)
         m.disconnectWriter(writer, signalname)
-        if m.readerCount() < 1 and   m.writerCount()<1:
+        if m.readerCount() < 1 and m.writerCount() < 1:
             self.__models.pop(dataUID)
-        
+
     def disconnectReader(self, dataUID, slot):
-        '''Unregister the given method as data receiver 
-        
+        '''Unregister the given method as data receiver
+
         :param dataUID: (str) the unique identifier of the data
         :param slot: (str) the slot that was registered
-                           
+
         .. seealso:: :meth:`DataModel.disconnectReader`
         '''
         m = self.__getDataModel(dataUID)
         m.disconnectReader(slot)
-        if m.readerCount() < 1 and   m.writerCount()<1:
+        if m.readerCount() < 1 and m.writerCount() < 1:
             self.__models.pop(dataUID)
-        
+
     def activeDataUIDs(self):
         '''
         Returns a list of currently shared data. Note that this list only
         reflects the situation at the moment of calling this method: a given
         DataModel may die at any moment if there are no references to it.
-        
+
         :returns: (list<str>) UIDs of currently shared data.
         '''
         return self.__models.keys()
-    
+
     def debugReader(self, data):
         '''
-        A slot which you can connect as a reader for debugging. It will print info to the stdout 
+        A slot which you can connect as a reader for debugging. It will print info to the stdout
         '''
-        print "SharedDataManager: \n\tSender=: %s\n\tData=%s"%(self.sender(),repr(data))
-    
+        print "SharedDataManager: \n\tSender=: %s\n\tData=%s" % (self.sender(), repr(data))
+
     def info(self):
-        s=""
-        for uid,m in sorted(self.__models.iteritems()):
-            s+=m.info()+'\n'
-        return s   
-            
-    
\ No newline at end of file
+        s = ""
+        for uid, m in sorted(self.__models.iteritems()):
+            s += m.info() + '\n'
+        return s
diff --git a/lib/taurus/qt/qtcore/configuration/__init__.py b/lib/taurus/qt/qtcore/configuration/__init__.py
index 155bd62..7e905de 100644
--- a/lib/taurus/qt/qtcore/configuration/__init__.py
+++ b/lib/taurus/qt/qtcore/configuration/__init__.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides the set of base classes designed to provide
 configuration features to the classes that inherit from them"""
 
-from .configuration import *
\ No newline at end of file
+from .configuration import *
diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py
index 0227f35..7e8979d 100644
--- a/lib/taurus/qt/qtcore/configuration/configuration.py
+++ b/lib/taurus/qt/qtcore/configuration/configuration.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,69 +30,70 @@ __all__ = ["configurableProperty", "BaseConfigurableClass"]
 
 __docformat__ = 'restructuredtext'
 
+
 class configurableProperty:
     '''A dummy class used to handle properties with the configuration API
-    
+
     .. warning:: this class is intended for internal use by the configuration
-                 package. Do not instantiate it directly in your code. 
+                 package. Do not instantiate it directly in your code.
                  Use :meth:`BaseConfigurableClass.registerConfigProperty` instead.
     '''
+
     def __init__(self, name, fget, fset, obj=None):
         self.name = name
-        self.fget = fget #this may either be a method or a method name
-        self.fset = fset #this may either be a method or a method name
-        self._obj = obj  #obj is only needed if fset or fget are method names
-        
+        self.fget = fget  # this may either be a method or a method name
+        self.fset = fset  # this may either be a method or a method name
+        self._obj = obj  # obj is only needed if fset or fget are method names
+
     def createConfig(self, allowUnpickable=False):
         '''returns value returned by the fget function of this property. the allowUnpickable parameter is ignored'''
-        if isinstance(self.fget, basestring):# fget is not a method but a method name...
+        if isinstance(self.fget, basestring):  # fget is not a method but a method name...
             result = getattr(self._obj, self.fget)()
         else:
-            result = self.fget() 
+            result = self.fget()
         return result
-    
+
     def applyConfig(self, value, depth=-1):
         '''calls the fset function for this property with the given value. The depth parameter is ignored'''
-        if isinstance(self.fget, basestring):# fget is not a method but a method name...
+        if isinstance(self.fget, basestring):  # fget is not a method but a method name...
             getattr(self._obj, self.fset)(value)
         else:
             self.fset(value)
-            
+
     def objectName(self):
         '''returns the name of this property'''
         return self.name
 
 
-
 class BaseConfigurableClass:
     '''
     A base class defining the API for configurable objects.
-    
+
     .. note:: One implicit requisite is that a configurable object must also provide a
               `meth:`objectName` method which returns the object name. This is typically
               fulfilled by inheriting from QObject.
-              
+
     Using objects that inherit from :class:`BaseConfigurableClass` automates
     saving and restoring of application settings and also enables the use of
-    perspectives in Taurus GUIs. 
-    
+    perspectives in Taurus GUIs.
+
     The basic idea is that each object/widget in your application is responsible
     for providing a dictionary containing information on its properties (see
     :meth:`createConfig`). The same object/widget is also responsible for
     restoring such properties when provided with a configuration dictionary (see
     :meth:`applyConfig`).
-    
+
     For a certain property to be saved/restored it is usually enough to
     *register* it using :meth:`registerConfigProperty`. When the objects are
     structured in a hierarchical way (e.g. as the widgets in a Qt application),
     the parent widget can (should) delegate the save/restore of its children to
     the children themselves. This delegation is done by registering the children
-    using :meth:`registerConfigDelegate`. 
-    
+    using :meth:`registerConfigDelegate`.
+
     Consider the following example: I am creating a groupbox container which
     contains a :class:`TaurusForm` and I want to save/restore the state of the
     checkbox and the properties of the form::
-      
+
         #The class looks like this:
         class MyBox(Qt.QGroupBox, BaseConfigurableClass):
             def __init__(self):
@@ -102,71 +103,75 @@ class BaseConfigurableClass:
                 self.registerConfigProperty(self.isChecked, self.setChecked, 'checked')
                 self.registerConfigDelegate(self.form)   #the TaurusForm already handles its own configuration!
                 ...
-         
+
         #and we can retrieve the configuration doing:
         b1 = MyBox()
         b1.setChecked(True)  #checked is a registered property of MyBox class
-        b1.form.setModifiableByUser(True)  #modifiableByUser is a registered property of a TaurusForm 
+        b1.form.setModifiableByUser(True)  #modifiableByUser is a registered property of a TaurusForm
         cfg = b1.createConfig()  #we get the configuration as a dictionary
         ...
         b2 = MyBox()
         b2.applyConfig(cfg)  #now b2 has the same configuration as b1 when cfg was created
-                
+
     :meth:`createConfig` and :meth:`applyConfig` methods use a dictionary for
     passing the configuration, but :class:`BaseConfigurableClass` also provides
     some other convenience methods for working with files
     (:meth:`saveConfigFile` and :meth:`loadConfigFile`) or as QByteArrays
     (:meth:`createQConfig` and :meth:`applyQConfig`)
-    
+
     Finally, we recommend to use :class:`TaurusMainWindow` for all Taurus GUIs
     since it automates all the steps for *saving properties when closing* and
     *restoring the settings on startup*. It also provides a mechanism for
     implementing "perspectives" in your application.
-    
+
     '''
-    
+
     defaultConfigRecursionDepth = -1
-    _supportedConfigVersions = ("__UNVERSIONED__",)#the latest element of this list is considered the current version
-    
+    # the latest element of this list is considered the current version
+    _supportedConfigVersions = ("__UNVERSIONED__",)
+
     def __init__(self):
         self.resetConfigurableItems()
-    
+
     @staticmethod
     def isTaurusConfig(x):
         '''Checks if the given argument has the structure of a configdict
-        
+
         :param x: (object) object to test
-        
+
         :return: (bool) True if it is a configdict, False otherwise.
         '''
-        if not isinstance(x,dict): return False
+        if not isinstance(x, dict):
+            return False
         for k in ('__orderedConfigNames__', '__itemConfigurations__', 'ConfigVersion', '__pickable__'):
-            if k not in x: return False
-        
+            if k not in x:
+                return False
+
         for k in x['__orderedConfigNames__']:
-            if k not in x['__itemConfigurations__']: print 'missing configuration for "%s" in %s'%(k,repr(x))
+            if k not in x['__itemConfigurations__']:
+                print 'missing configuration for "%s" in %s' % (k, repr(x))
         return True
-        
+
     def createConfig(self, allowUnpickable=False):
         '''
         Returns a dictionary containing configuration information about the
-        current state of the object. 
-        
-        In most usual situations, using :meth:`registerConfigProperty` and 
+        current state of the object.
+
+        In most usual situations, using :meth:`registerConfigProperty` and
         :meth:`registerConfigDelegate`, should be enough to cover all needs using
         this method, although it can be reimplemented in children classes to support
         very specific configurations.
-        
+
         By default, meth:`createQConfig` and meth:`saveConfigFile` call to this
         method for obtaining the data.
-        
+
         Hint: The following code allows you to serialize the configuration
         dictionary as a string (which you can store as a QSetting, or as a Tango
         Attribute, provided that allowUnpickable==False)::
-        
+
             import pickle
             s = pickle.dumps(widget.createConfig())  #s is a string that can be stored
-                
+
         :param alllowUnpickable:  (bool) if False the returned dict is
                                   guaranteed to be a pickable object. This is
                                   the default and preferred option because it
@@ -175,184 +180,193 @@ class BaseConfigurableClass:
                                   limitation is not enforced, which allows to
                                   use more complex objects as values (but limits
                                   its persistence).
-        
+
         :return: (dict<str,object>) configurations (which can be loaded with :meth:`applyConfig`).
-        
+
         .. seealso: :meth:`applyConfig` , :meth:`registerConfigurableItem`,  meth:`createQConfig`, meth:`saveConfigFile`
         '''
-        configdict = {"ConfigVersion":self._supportedConfigVersions[-1],
+        configdict = {"ConfigVersion": self._supportedConfigVersions[-1],
                       "__pickable__": True}
-        #store the configurations for all registered configurable items as well
+        # store the configurations for all registered configurable items as
+        # well
         itemcfgs = {}
-        for k,v in self.__configurableItems.iteritems():
-            itemcfgs[k] = v.createConfig(allowUnpickable=allowUnpickable) 
+        for k, v in self.__configurableItems.iteritems():
+            itemcfgs[k] = v.createConfig(allowUnpickable=allowUnpickable)
         configdict["__itemConfigurations__"] = itemcfgs
         configdict["__orderedConfigNames__"] = self.__configurableItemNames
         return configdict
-    
+
     def applyConfig(self, configdict, depth=None):
         """applies the settings stored in a configdict to the current object.
-        
-        In most usual situations, using :meth:`registerConfigProperty` and 
+
+        In most usual situations, using :meth:`registerConfigProperty` and
         :meth:`registerConfigDelegate`, should be enough to cover all needs using
         this method, although it can be reimplemented in children classes to support
         very specific configurations.
-        
+
         :param configdict: (dict)
-        :param depth: (int)  If depth = 0, applyConfig will only be called 
+        :param depth: (int)  If depth = 0, applyConfig will only be called
                       for this object, and not for any other object registered
                       via :meth:`registerConfigurableItem`. If depth > 0,
                       applyConfig will be called recursively as many times as
                       the depth value. If depth < 0 (default, see note), no
                       limit is imposed to recursion (i.e., it will recurse for
                       as deep as there are registered items).
-                      
+
         .. note:: the default recursion depth can be tweaked in derived classes
                   by changing the class property `defaultConfigRecursionDepth`
-        
+
         .. seealso:: :meth:`createConfig`
         """
         if depth is None:
             depth = self.defaultConfigRecursionDepth
-        if not self.checkConfigVersion(configdict): 
-            raise ValueError('the given configuration is of unsupported version')
-        #delegate restoring the configuration of any registered configurable item
+        if not self.checkConfigVersion(configdict):
+            raise ValueError(
+                'the given configuration is of unsupported version')
+        # delegate restoring the configuration of any registered configurable
+        # item
         if depth != 0:
             itemcfgs = configdict["__itemConfigurations__"]
-            for key in configdict["__orderedConfigNames__"]: #we use the sorted item names that was stored in the configdict
+            # we use the sorted item names that was stored in the configdict
+            for key in configdict["__orderedConfigNames__"]:
                 if key in self.__configurableItems:
-                    self.__configurableItems[key].applyConfig(itemcfgs[key], depth=depth-1)
-                    
+                    self.__configurableItems[key].applyConfig(
+                        itemcfgs[key], depth=depth - 1)
+
     def getConfigurableItemNames(self):
-        '''returns an ordered list of the names of currently registered 
+        '''returns an ordered list of the names of currently registered
         configuration items (delegates and properties)
-        
+
         :return: (list<unicode>)
         '''
         return self.__configurableItemNames
-    
+
     def resetConfigurableItems(self):
         ''' clears the record of configurable items depending of this object
-        
+
         .. seealso:: :meth:`registerConfigurableItem`
         '''
         self.__configurableItemNames = []
         self.__configurableItems = {}
-    
+
     def registerConfigurableItem(self, item, name=None):
-        print "Deprecation WARNING: %s.registerConfigurableItem() has been deprecated. Use registerConfigDelegate() instead"%repr(self)
+        print "Deprecation WARNING: %s.registerConfigurableItem() has been deprecated. Use registerConfigDelegate() instead" % repr(self)
         self._registerConfigurableItem(item, name=name)
-        
+
     def registerConfigDelegate(self, delegate, name=None):
         '''
         Registers the given object as a delegate for configuration.
-        Delegates are typically other objects inheriting from BaseConfigurableClass 
+        Delegates are typically other objects inheriting from BaseConfigurableClass
         (or at least they must provide the following methods:
-         
+
           - `createConfig` (as provided by, e.g., BaseConfigurableClass)
           - `applyConfig` (as provided by, e.g., BaseConfigurableClass)
           - `objectName` (as provided by, e.g., QObject)
-          
-        :param delegate: (BaseConfigurableClass) The delegate object to be registered. 
+
+        :param delegate: (BaseConfigurableClass) The delegate object to be registered.
         :param name: (str) The name to be used as a key for this item in the configuration
                      dictionary. If None given, the object name is used by default.
 
         .. note:: the registration order will be used when restoring configurations
-        
+
         .. seealso:: :meth:`unregisterConfigurableItem`, :meth:`registerConfigProperty`, :meth:`createConfig`
         '''
         return self._registerConfigurableItem(delegate, name=name)
-    
+
     def registerConfigProperty(self, fget, fset, name):
         '''
-        Registers a certain property to be included in the config dictionary. 
-        
+        Registers a certain property to be included in the config dictionary.
+
         In this context a "property" is some named value that can be obtained
         via a getter method and can be set via a setter method.
-          
+
         :param fget: (method or str) method (or name of a method) that gets no
                      arguments and returns the value of a property.
-        :param fset: (method or str) method (or name of a method) that gets as 
+        :param fset: (method or str) method (or name of a method) that gets as
                      an argument the value of a property, and sets it
         :param name: (str) The name to be used as a key for this property in the configuration
                      dictionary
-        
+
         .. note:: the registration order will be used when restoring configurations
-        
+
         .. seealso:: :meth:`unregisterConfigurableItem`, :meth:`registerConfigDelegate`, :meth:`createConfig`
         '''
-        if isinstance(fget,str) or isinstance(fset,str):
+        if isinstance(fget, str) or isinstance(fset, str):
             import weakref
             obj = weakref.proxy(self)
         else:
             obj = None
         p = configurableProperty(name, fget, fset, obj=obj)
         return self._registerConfigurableItem(p, name=name)
-        
+
     def _registerConfigurableItem(self, item, name=None):
         '''
         Registers the given item as a configurable item which depends of this
-        Taurus widget. 
-        
+        Taurus widget.
+
         .. note:: This method is not meant to be called directly. Use
                   :meth:`registerConfigProperty`, :meth:`registerConfigDelegate`
                   instead
-        
+
         Registered items are expected to implement the
         following methods:
           - `createConfig` (as provided by, e.g., BaseConfigurableClass)
           - `applyConfig` (as provided by, e.g., BaseConfigurableClass)
-          - `objectName` (as provided by, e.g., QObject) 
-          
-        :param item: (object) The object that should be registered. 
+          - `objectName` (as provided by, e.g., QObject)
+
+        :param item: (object) The object that should be registered.
         :param name: (str) The name to be used as a key for this item in the configuration
                      dictionary. If None given, the object name is used by default.
 
         .. note:: the registration order will be used when restoring configurations
-        
+
         .. seealso:: :meth:`unregisterConfigurableItem`, :meth:`createConfig`
         '''
-        if name is None: name = item.objectName()
+        if name is None:
+            name = item.objectName()
         name = str(name)
         if name in self.__configurableItemNames:
-            raise ValueError('_registerConfigurableItem: An object with name "%s" is already registered'%name) #abort if duplicated names
+            # abort if duplicated names
+            raise ValueError(
+                '_registerConfigurableItem: An object with name "%s" is already registered' % name)
         self.__configurableItemNames.append(name)
         self.__configurableItems[name] = item
-        
+
     def unregisterConfigurableItem(self, item, raiseOnError=True):
         '''
         unregisters the given item (either a delegate or a property) from the
         configurable items record. It raises an exception if the item is not
         registered
-        
+
         :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 
-        
+        :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`
         '''
-        if isinstance(item,basestring): name = str(item)
-        else: name = str(item.objectName())
+        if isinstance(item, basestring):
+            name = str(item)
+        else:
+            name = str(item.objectName())
         if name in self.__configurableItemNames and name in self.__configurableItems:
             self.__configurableItemNames.remove(name)
             self.__configurableItems.pop(name)
             return True
         elif raiseOnError:
-            raise KeyError('"%s" was not registered.'%name)
+            raise KeyError('"%s" was not registered.' % name)
         else:
-            self.debug('"%s" was not registered. Skipping'%name)
+            self.debug('"%s" was not registered. Skipping' % name)
             return False
 
-      
     def checkConfigVersion(self, configdict, showDialog=False, supportedVersions=None):
         '''
         Check if the version of configdict is supported. By default, the
         BaseConfigurableClass objects have ["__UNVERSIONED__"] as their list of supported
         versions, so unversioned config dicts will be accepted.
-        
+
         :param configdict: (dict) configuration dictionary to check
         :param showDialog: (bool) whether to show a QtWarning dialog if check
                            failed (false by default)
@@ -360,80 +374,89 @@ class BaseConfigurableClass:
                                   numbers, if None given, the versions supported
                                   by this widget will be used (i.e., those
                                   defined in self._supportedConfigVersions)
-        
+
         :return: (bool) returns True if the configdict is of the right version
         '''
-        if supportedVersions is None: supportedVersions = self._supportedConfigVersions
-        version = configdict.get("ConfigVersion","__UNVERSIONED__")
+        if supportedVersions is None:
+            supportedVersions = self._supportedConfigVersions
+        version = configdict.get("ConfigVersion", "__UNVERSIONED__")
         if version not in supportedVersions:
-            msg = 'Unsupported Config Version %s. (Supported: %s)'%(version, repr(supportedVersions))
+            msg = 'Unsupported Config Version %s. (Supported: %s)' % (
+                version, repr(supportedVersions))
             self.warning(msg)
-            if showDialog: 
+            if showDialog:
                 from taurus.external.qt import Qt
-                Qt.QMessageBox.warning(self, "Wrong Configuration Version", msg, Qt.QMessageBox.Ok)
+                Qt.QMessageBox.warning(
+                    self, "Wrong Configuration Version", msg, Qt.QMessageBox.Ok)
             return False
         return True
-    
+
     def createQConfig(self):
         '''
         returns the current configuration status encoded as a QByteArray. This
         state can therefore be easily stored using QSettings
-        
+
         :return: (QByteArray) (in the current implementation this is just a
                  pickled configdict encoded as a QByteArray
-        
+
         .. seealso:: :meth:`restoreQConfig`
         '''
         from taurus.external.qt import Qt
         import cPickle as pickle
         configdict = self.createConfig(allowUnpickable=False)
         return Qt.QByteArray(pickle.dumps(configdict))
-        
+
     def applyQConfig(self, qstate):
         '''
         restores the configuration from a qstate generated by :meth:`getQState`.
-        
-        :param qstate: (QByteArray)  
-        
+
+        :param qstate: (QByteArray)
+
         .. seealso:: :meth:`createQConfig`
         '''
-        if qstate.isNull(): return
+        if qstate.isNull():
+            return
         import cPickle as pickle
         configdict = pickle.loads(qstate.data())
         self.applyConfig(configdict)
-        
+
     def saveConfigFile(self, ofile=None):
         """Stores the current configuration on a file
-        
-        :param ofile: (file or string) file or filename to store the configuration 
-        
+
+        :param ofile: (file or string) file or filename to store the configuration
+
         :return: (str) file name used
         """
         import cPickle as pickle
         if ofile is None:
             from taurus.external.qt import Qt
-            ofile = unicode(Qt.QFileDialog.getSaveFileName( self, 'Save Configuration', '%s.pck'%self.__class__.__name__, 'Configuration File (*.pck)'))
-            if not ofile: return
-        if not isinstance(ofile,file): ofile=open(ofile,'w')
-        configdict=self.createConfig(allowUnpickable=False)
-        self.info("Saving current settings in '%s'"%ofile.name)
+            ofile = unicode(Qt.QFileDialog.getSaveFileName(
+                self, 'Save Configuration', '%s.pck' % self.__class__.__name__, 'Configuration File (*.pck)'))
+            if not ofile:
+                return
+        if not isinstance(ofile, file):
+            ofile = open(ofile, 'w')
+        configdict = self.createConfig(allowUnpickable=False)
+        self.info("Saving current settings in '%s'" % ofile.name)
         pickle.dump(configdict, ofile)
         return ofile.name
-        
+
     def loadConfigFile(self, ifile=None):
         """Reads a file stored by :meth:`saveConfig` and applies the settings
-        
+
         :param ifile: (file or string) file or filename from where to read the configuration
-        
+
         :return: (str) file name used
         """
         import cPickle as pickle
         if ifile is None:
             from taurus.external.qt import Qt
-            ifile = unicode(Qt.QFileDialog.getOpenFileName( self, 'Load Configuration', '', 'Configuration File (*.pck)'))
-            if not ifile: return
-        if not isinstance(ifile,file): ifile=open(ifile,'r')
-        configdict=pickle.load(ifile)
+            ifile = unicode(Qt.QFileDialog.getOpenFileName(
+                self, 'Load Configuration', '', 'Configuration File (*.pck)'))
+            if not ifile:
+                return
+        if not isinstance(ifile, file):
+            ifile = open(ifile, 'r')
+        configdict = pickle.load(ifile)
         self.applyConfig(configdict)
         return ifile.name
-    
\ No newline at end of file
diff --git a/lib/taurus/qt/qtcore/mimetypes/__init__.py b/lib/taurus/qt/qtcore/mimetypes/__init__.py
index 0f90702..0e219bc 100644
--- a/lib/taurus/qt/qtcore/mimetypes/__init__.py
+++ b/lib/taurus/qt/qtcore/mimetypes/__init__.py
@@ -2,27 +2,27 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """contains MIME type definitions used by taurus widgets"""
 
-from .mimetypes import *
\ No newline at end of file
+from .mimetypes import *
diff --git a/lib/taurus/qt/qtcore/mimetypes/mimetypes.py b/lib/taurus/qt/qtcore/mimetypes/mimetypes.py
index b937054..bf7b0bc 100644
--- a/lib/taurus/qt/qtcore/mimetypes/mimetypes.py
+++ b/lib/taurus/qt/qtcore/mimetypes/mimetypes.py
@@ -2,33 +2,32 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """mimetypes.py: contains MIME type definitions used by taurus widgets"""
 
-
-TAURUS_DB_MIME_TYPE = 'application/taurus-database'
+TAURUS_AUTH_MIME_TYPE = 'application/taurus-authority'
 TAURUS_DEV_MIME_TYPE = 'application/taurus-device'
 TAURUS_ATTR_MIME_TYPE = 'application/taurus-attribute'
-TAURUS_MODEL_MIME_TYPE = 'application/taurus-model' #a generic model type
+TAURUS_MODEL_MIME_TYPE = 'application/taurus-model'  # a generic model type
 #TAURUS_MODEL_LIST_MIME_TYPE = 'application/taurus-model-list'
-TAURUS_MODEL_LIST_MIME_TYPE = 'text/uri-list'
\ No newline at end of file
+TAURUS_MODEL_LIST_MIME_TYPE = 'text/uri-list'
diff --git a/lib/taurus/qt/qtcore/model/__init__.py b/lib/taurus/qt/qtcore/model/__init__.py
index a696457..d65eba1 100644
--- a/lib/taurus/qt/qtcore/model/__init__.py
+++ b/lib/taurus/qt/qtcore/model/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -51,10 +51,10 @@ And now inside a :class:`PyQt4.QtGui.QComboBox`::
     model = taurus.qt.qtcore.TaurusDbPlainDeviceModel()
     model.setDataSource(db)
     view.setModel(model)
-    
+
 """
 
 __docformat__ = 'restructuredtext'
 
 from taurusmodel import *
-from taurusdatabasemodel import *
\ No newline at end of file
+from taurusdatabasemodel import *
diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
index 25e9ef8..1913132 100644
--- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
+++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py
@@ -2,80 +2,85 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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 provides widgets that display the database in a tree format"""
 
 __all__ = ["TaurusTreeDevicePartItem", "TaurusTreeDeviceDomainItem",
-    "TaurusTreeDeviceFamilyItem", "TaurusTreeDeviceMemberItem", "TaurusTreeSimpleDeviceItem",
-    "TaurusTreeDeviceItem", "TaurusTreeAttributeItem", "TaurusTreeServerNameItem",
-    "TaurusTreeServerItem", "TaurusTreeDeviceClassItem", "TaurusDbBaseModel",
-    "TaurusDbSimpleDeviceModel", "TaurusDbPlainDeviceModel", "TaurusDbDeviceModel",
-    "TaurusDbSimpleDeviceAliasModel",
-    "TaurusDbPlainServerModel", "TaurusDbServerModel",
-    "TaurusDbDeviceClassModel",
-    "TaurusDbBaseProxyModel",
-    "TaurusDbDeviceProxyModel", "TaurusDbServerProxyModel", "TaurusDbDeviceClassProxyModel"]
+           "TaurusTreeDeviceFamilyItem", "TaurusTreeDeviceMemberItem", "TaurusTreeSimpleDeviceItem",
+           "TaurusTreeDeviceItem", "TaurusTreeAttributeItem", "TaurusTreeServerNameItem",
+           "TaurusTreeServerItem", "TaurusTreeDeviceClassItem", "TaurusDbBaseModel",
+           "TaurusDbSimpleDeviceModel", "TaurusDbPlainDeviceModel", "TaurusDbDeviceModel",
+           "TaurusDbSimpleDeviceAliasModel",
+           "TaurusDbPlainServerModel", "TaurusDbServerModel",
+           "TaurusDbDeviceClassModel",
+           "TaurusDbBaseProxyModel",
+           "TaurusDbDeviceProxyModel", "TaurusDbServerProxyModel", "TaurusDbDeviceClassProxyModel"]
 
 __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
-from taurus.core.taurusbasetypes import TaurusElementType, TaurusSWDevHealth
-from taurus.core.taurusdatabase import TaurusInfo, TaurusDatabase
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusDevState
 import taurus.qt.qtcore.mimetypes
 
+from taurus.core.tango.tangodatabase import TangoInfo, TangoDatabase
+
 from .taurusmodel import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel
 
 ElemType = TaurusElementType
-DevHealth = TaurusSWDevHealth
+
 
 def getElementTypeIcon(*args, **kwargs):
     """Wrapper to prevent loading qtgui when this module is imported"""
-    import taurus.qt.qtgui.resource
-    return taurus.qt.qtgui.resource.getElementTypeIcon(*args, **kwargs)
+    from taurus.qt.qtgui.icon import getElementTypeIcon
+    return getElementTypeIcon(*args, **kwargs)
+
 
 def getElementTypeToolTip(*args, **kwargs):
     """Wrapper to prevent loading qtgui when this module is imported"""
-    import taurus.qt.qtgui.resource
-    return taurus.qt.qtgui.resource.getElementTypeToolTip(*args, **kwargs)
+    from taurus.qt.qtgui.icon import getElementTypeToolTip
+    return getElementTypeToolTip(*args, **kwargs)
+
 
 def getElementTypeSize(*args, **kwargs):
     """Wrapper to prevent loading qtgui when this module is imported"""
-    import taurus.qt.qtgui.resource
-    return taurus.qt.qtgui.resource.getElementTypeSize(*args, **kwargs)
+    from taurus.qt.qtgui.icon import getElementTypeSize
+    return getElementTypeSize(*args, **kwargs)
+
 
-def getSWDevHealthIcon(*args, **kwargs):
+def getDevStateIcon(*args, **kwargs):
     """Wrapper to prevent loading qtgui when this module is imported"""
-    import taurus.qt.qtgui.resource
-    return taurus.qt.qtgui.resource.getSWDevHealthIcon(*args, **kwargs)
+    from taurus.qt.qtgui.icon import getDevStateIcon
+    return getDevStateIcon(*args, **kwargs)
 
-def getSWDevHealthToolTip(*args, **kwargs):
+
+def getDevStateToolTip(*args, **kwargs):
     """Wrapper to prevent loading qtgui when this module is imported"""
-    import taurus.qt.qtgui.resource
-    return taurus.qt.qtgui.resource.getSWDevHealthToolTip(*args, **kwargs)
+    from taurus.qt.qtgui.icon import getDevStateToolTip
+    return getDevStateToolTip(*args, **kwargs)
 
 
 class TaurusTreeDbBaseItem(TaurusBaseTreeItem):
-    DisplayFunc = TaurusInfo.name
+    DisplayFunc = TangoInfo.name
 
 
 class TaurusTreeDevicePartItem(TaurusTreeDbBaseItem):
@@ -83,7 +88,8 @@ class TaurusTreeDevicePartItem(TaurusTreeDbBaseItem):
 
     def data(self, index):
         column = index.column()
-        if column > 0: return
+        if column > 0:
+            return
 
         model = index.model()
         role = model.role(column, self.depth())
@@ -144,7 +150,7 @@ class TaurusTreeSimpleDeviceItem(TaurusTreeDbBaseItem):
         elif role == ElemType.DeviceClass:
             return obj.klass().name()
         elif role == ElemType.Exported:
-            return obj.health()
+            return obj.state()
         elif role == ElemType.Host:
             return obj.host()
         elif role == ElemType.Domain:
@@ -164,9 +170,6 @@ class TaurusTreeSimpleDeviceItem(TaurusTreeDbBaseItem):
 class TaurusTreeDeviceItem(TaurusTreeDbBaseItem):
     """A node designed to represent a device"""
 
-    SearchForAttributeHealth = DevHealth.Exported, DevHealth.ExportedAlive, \
-                               DevHealth.NotExportedAlive
-
     def child(self, row):
         self.updateChilds()
         return super(TaurusTreeDeviceItem, self).child(row)
@@ -177,7 +180,7 @@ class TaurusTreeDeviceItem(TaurusTreeDbBaseItem):
         if nb > 0:
             return True
         data = self.itemData()
-        if not data.health() in self.SearchForAttributeHealth:
+        if data.state() != TaurusDevState.Ready:
             return False
         return True
 
@@ -186,7 +189,7 @@ class TaurusTreeDeviceItem(TaurusTreeDbBaseItem):
         if nb > 0:
             return nb
         data = self.itemData()
-        if not data.health() in self.SearchForAttributeHealth:
+        if data.state() != TaurusDevState.Ready:
             return 0
         self.updateChilds()
         return super(TaurusTreeDeviceItem, self).childCount()
@@ -212,7 +215,7 @@ class TaurusTreeDeviceItem(TaurusTreeDbBaseItem):
         elif role == ElemType.DeviceClass:
             return obj.klass().name()
         elif role == ElemType.Exported:
-            return obj.health()
+            return obj.state()
         elif role == ElemType.Host:
             return obj.host()
         elif role == ElemType.Domain:
@@ -252,15 +255,17 @@ class TaurusTreeAttributeItem(TaurusTreeDbBaseItem):
             return data.name()
         ret = '<TABLE border="0" cellpadding="1" cellspacing="0">'
         items = dict(
-            name = "'" + di.label + "' (" + data.name() + ")",
-            description = di.description.replace("<","<").replace(">",">"),
-            unit = di.unit,
-            limits = "[%s, %s]" % (di.min_value, di.max_value),
-            alarms = "[%s, %s]" % (di.alarms.min_alarm, di.alarms.max_alarm),
-            warnings = "[%s, %s]" % (di.alarms.min_warning, di.alarms.max_warning),)
+            name="'" + di.label + "' (" + data.name() + ")",
+            description=di.description.replace(
+                "<", "<").replace(">", ">"),
+            unit=di.unit,
+            limits="[%s, %s]" % (di.min_value, di.max_value),
+            alarms="[%s, %s]" % (di.alarms.min_alarm, di.alarms.max_alarm),
+            warnings="[%s, %s]" % (di.alarms.min_warning, di.alarms.max_warning),)
 
         for id, value in items.items():
-            ret += '<TR><TD WIDTH="80" ALIGN="RIGHT" VALIGN="MIDDLE"><B>%s:</B></TD><TD>%s</TD></TR>' % (id.capitalize(), value)
+            ret += '<TR><TD WIDTH="80" ALIGN="RIGHT" VALIGN="MIDDLE"><B>%s:</B></TD><TD>%s</TD></TR>' % (
+                id.capitalize(), value)
         ret += '</TABLE>'
         return ret
 
@@ -301,7 +306,7 @@ class TaurusTreeServerItem(TaurusTreeDbBaseItem):
         elif role == ElemType.ServerInstance:
             return self._itemData.serverInstance()
         elif role == ElemType.Exported:
-            return self._itemData.health()
+            return self._itemData.state()
         elif role == ElemType.Host:
             return self._itemData.host()
 
@@ -326,7 +331,7 @@ class TaurusTreeFullServerItem(TaurusTreeDbBaseItem):
         elif role == ElemType.ServerInstance:
             return self._itemData.fullName()
         elif role == ElemType.Exported:
-            return self._itemData.health()
+            return self._itemData.state()
         elif role == ElemType.Host:
             return self._itemData.host()
 
@@ -360,7 +365,8 @@ class TaurusDbBaseModel(TaurusBaseModel):
     database."""
 
     ColumnNames = "Device", "Alias", "Server", "Class", "Alive", "Host"
-    ColumnRoles = (ElemType.Device, ElemType.Device), ElemType.DeviceAlias, ElemType.Server, ElemType.DeviceClass, ElemType.Exported, ElemType.Host
+    ColumnRoles = (
+        ElemType.Device, ElemType.Device), ElemType.DeviceAlias, ElemType.Server, ElemType.DeviceClass, ElemType.Exported, ElemType.Host
 
     def createNewRootItem(self):
         return TaurusTreeDbBaseItem(self, self.ColumnNames)
@@ -398,7 +404,8 @@ class TaurusDbBaseModel(TaurusBaseModel):
         ret = Qt.QMimeData()
         data = []
         for index in indexes:
-            if not index.isValid(): continue
+            if not index.isValid():
+                continue
             #item = index.internalPointer()
             #data = item.mimeData(index)
             #stream << item.mimeData(index)
@@ -407,10 +414,12 @@ class TaurusDbBaseModel(TaurusBaseModel):
             if mime_data_item is None:
                 continue
             data.append(mime_data_item)
-        ret.setData(taurus.qt.qtcore.mimetypes.TAURUS_MODEL_LIST_MIME_TYPE, "\r\n".join(data))
+        ret.setData(
+            taurus.qt.qtcore.mimetypes.TAURUS_MODEL_LIST_MIME_TYPE, "\r\n".join(data))
         ret.setText(", ".join(data))
-        if len(data)==1:
-            ret.setData(taurus.qt.qtcore.mimetypes.TAURUS_MODEL_MIME_TYPE, str(data[0]))
+        if len(data) == 1:
+            ret.setData(
+                taurus.qt.qtcore.mimetypes.TAURUS_MODEL_MIME_TYPE, str(data[0]))
         return ret
 
     def pyData(self, index, role):
@@ -429,18 +438,18 @@ class TaurusDbBaseModel(TaurusBaseModel):
             if column == 0:
                 ret = self.roleIcon(taurus_role)
             if taurus_role == ElemType.Exported:
-                health = item.data(index)
-                ret = getSWDevHealthIcon(health)
+                state = item.data(index)
+                ret = getDevStateIcon(state)
         elif role == Qt.Qt.ToolTipRole:
             ret = item.toolTip(index)
             if ret is None:
                 data = item.data(index)
                 if data is not None:
                     if taurus_role == ElemType.Exported:
-                        ret = getSWDevHealthToolTip(data)
+                        ret = getDevStateToolTip(data)
                     else:
                         ret = self.roleToolTip(taurus_role)
-        #elif role == Qt.Qt.SizeHintRole:
+        # elif role == Qt.Qt.SizeHintRole:
         #    ret = self.columnSize(column)
         elif role == Qt.Qt.FontRole:
             ret = self.DftFont
@@ -449,7 +458,7 @@ class TaurusDbBaseModel(TaurusBaseModel):
     def setupModelData(self, data):
         if data is None:
             return
-        if isinstance(data, TaurusDatabase):
+        if isinstance(data, TangoDatabase):
             data = data.cache()
         devices = data.devices()
 
@@ -478,7 +487,7 @@ class TaurusDbSimpleDeviceAliasModel(TaurusDbBaseModel):
     def setupModelData(self, data):
         if data is None:
             return
-        if isinstance(data, TaurusDatabase):
+        if isinstance(data, TangoDatabase):
             data = data.cache()
         devices = data.devices()
 
@@ -495,12 +504,13 @@ class TaurusDbPlainDeviceModel(TaurusDbBaseModel):
     nodes will have attribute child nodes if the device is running."""
 
     ColumnNames = "Device", "Alias", "Server", "Class", "Alive", "Host"
-    ColumnRoles = (ElemType.Device, ElemType.Device, ElemType.Attribute), ElemType.DeviceAlias, ElemType.Server, ElemType.DeviceClass, ElemType.Exported, ElemType.Host
+    ColumnRoles = (ElemType.Device, ElemType.Device,
+                   ElemType.Attribute), ElemType.DeviceAlias, ElemType.Server, ElemType.DeviceClass, ElemType.Exported, ElemType.Host
 
     def setupModelData(self, data):
         if data is None:
             return
-        if isinstance(data, TaurusDatabase):
+        if isinstance(data, TangoDatabase):
             data = data.cache()
         devices = data.devices()
 
@@ -518,24 +528,28 @@ class TaurusDbDeviceModel(TaurusDbBaseModel):
            - <domain>
            - <family>
            - <member>"""
-    ColumnRoles = (ElemType.Device, ElemType.Domain, ElemType.Family, ElemType.Member, ElemType.Attribute), ElemType.DeviceAlias, ElemType.Server, ElemType.DeviceClass, ElemType.Exported, ElemType.Host
+    ColumnRoles = (ElemType.Device, ElemType.Domain, ElemType.Family, ElemType.Member,
+                   ElemType.Attribute), ElemType.DeviceAlias, ElemType.Server, ElemType.DeviceClass, ElemType.Exported, ElemType.Host
 
     def setupModelData(self, data):
         if data is None:
             return
-        if isinstance(data, TaurusDatabase):
+        if isinstance(data, TangoDatabase):
             data = data.deviceTree()
 
         rootItem = self._rootItem
         for domain in data.keys():
             families = data[domain]
-            domainItem = TaurusTreeDeviceDomainItem(self, domain.upper(), rootItem)
+            domainItem = TaurusTreeDeviceDomainItem(
+                self, domain.upper(), rootItem)
             for family in families.keys():
                 members = families[family]
-                familyItem = TaurusTreeDeviceFamilyItem(self, family.upper(), domainItem)
+                familyItem = TaurusTreeDeviceFamilyItem(
+                    self, family.upper(), domainItem)
                 for member in members.keys():
                     dev = members[member]
-                    memberItem = TaurusTreeDeviceItem(self, dev, parent=familyItem)
+                    memberItem = TaurusTreeDeviceItem(
+                        self, dev, parent=familyItem)
                     familyItem.appendChild(memberItem)
                 domainItem.appendChild(familyItem)
             rootItem.appendChild(domainItem)
@@ -543,20 +557,22 @@ class TaurusDbDeviceModel(TaurusDbBaseModel):
 
 class TaurusDbPlainServerModel(TaurusDbBaseModel):
     ColumnNames = "Server", "Alive", "Host"
-    ColumnRoles = (ElemType.Server, ElemType.ServerInstance), ElemType.Exported, ElemType.Host
+    ColumnRoles = (ElemType.Server,
+                   ElemType.ServerInstance), ElemType.Exported, ElemType.Host
 
     def setupModelData(self, data):
         if data is None:
             return
 
-        if isinstance(data, TaurusDatabase):
+        if isinstance(data, TangoDatabase):
             data = data.cache()
 
         servers = data.servers()
         rootItem = self._rootItem
 
         for server_name, server in servers.items():
-            serverInstanceItem = TaurusTreeFullServerItem(self, server, rootItem)
+            serverInstanceItem = TaurusTreeFullServerItem(
+                self, server, rootItem)
             rootItem.appendChild(serverInstanceItem)
 
 
@@ -571,13 +587,14 @@ class TaurusDbServerModel(TaurusDbBaseModel):
         - <Attribute>"""
 
     ColumnNames = "Server", "Alive", "Host"
-    ColumnRoles = (ElemType.Server, ElemType.ServerName, ElemType.ServerInstance, ElemType.DeviceClass, ElemType.Device, ElemType.Attribute), ElemType.Exported, ElemType.Host
+    ColumnRoles = (ElemType.Server, ElemType.ServerName, ElemType.ServerInstance,
+                   ElemType.DeviceClass, ElemType.Device, ElemType.Attribute), ElemType.Exported, ElemType.Host
 
     def setupModelData(self, data):
         if data is None:
             return
 
-        if isinstance(data, TaurusDatabase):
+        if isinstance(data, TangoDatabase):
             data = data.cache()
 
         servers, klasses, devices = data.servers(), data.klasses(), data.devices()
@@ -594,16 +611,18 @@ class TaurusDbServerModel(TaurusDbBaseModel):
                 serverNameItem = TaurusTreeServerNameItem(self, name, rootItem)
                 rootItem.appendChild(serverNameItem)
                 server_dict[name] = serverNameItem
-                #rootItem.appendChild(serverNameItem)
+                # rootItem.appendChild(serverNameItem)
 
-            serverInstanceItem = TaurusTreeServerItem(self, server, serverNameItem)
+            serverInstanceItem = TaurusTreeServerItem(
+                self, server, serverNameItem)
             serverNameItem.appendChild(serverInstanceItem)
 
             klass_names = server.getClassNames()
             device_names = server.getDeviceNames()
             for klass_name in klass_names:
                 klass = klasses[klass_name]
-                klassItem = TaurusTreeDeviceClassItem(self, klass, serverInstanceItem)
+                klassItem = TaurusTreeDeviceClassItem(
+                    self, klass, serverInstanceItem)
                 serverInstanceItem.appendChild(klassItem)
                 for dev_name in device_names:
                     dev = devices[dev_name]
@@ -619,13 +638,14 @@ class TaurusDbDeviceClassModel(TaurusDbBaseModel):
            * <Device>
                * <Attribute>"""
     ColumnNames = "Class", "Alive", "Host"
-    ColumnRoles = (ElemType.DeviceClass, ElemType.DeviceClass, ElemType.Device, ElemType.Attribute), ElemType.Exported, ElemType.Host
+    ColumnRoles = (ElemType.DeviceClass, ElemType.DeviceClass,
+                   ElemType.Device, ElemType.Attribute), ElemType.Exported, ElemType.Host
 
     def setupModelData(self, data):
         if data is None:
             return
 
-        if isinstance(data, TaurusDatabase):
+        if isinstance(data, TangoDatabase):
             data = data.cache()
 
         rootItem = self._rootItem
@@ -635,7 +655,7 @@ class TaurusDbDeviceClassModel(TaurusDbBaseModel):
             klass = klasses[klass_name]
             klassItem = TaurusTreeDeviceClassItem(self, klass, rootItem)
             for dev_name in klass.getDeviceNames():
-                dev_nb+=1
+                dev_nb += 1
                 dev = devices[dev_name]
                 devItem = TaurusTreeDeviceItem(self, dev, klassItem)
                 klassItem.appendChild(devItem)
@@ -687,14 +707,14 @@ class TaurusDbDeviceProxyModel(TaurusDbBaseProxyModel):
 
     def deviceMatches(self, device, regexp):
         name = device.name()
-        
+
         # if Qt.QString(name).contains(regexp):
         if regexp.indexIn(name) != -1:
             return True
         name = device.alias()
         if name is None:
             return False
-        #return Qt.QString(name).contains(regexp)
+        # return Qt.QString(name).contains(regexp)
         return regexp.indexIn(name) != -1
 
 
@@ -712,13 +732,13 @@ class TaurusDbServerProxyModel(TaurusDbBaseProxyModel):
             serverName = treeItem.display()
             serverInstances = sourceModel.getServerNameInstances(serverName)
             for serverInstance in serverInstances:
-                #if Qt.QString(serverInstance.name()).contains(regexp):
+                # if Qt.QString(serverInstance.name()).contains(regexp):
                 if regexp.indexIn(serverInstance.name()) != -1:
                     return True
             return False
 
         if isinstance(treeItem, TaurusTreeServerItem):
-            #return treeItem.qdisplay().contains(regexp)
+            # return treeItem.qdisplay().contains(regexp)
             return regexp.indexIn(treeItem.qdisplay()) != -1
 
         return True
@@ -737,5 +757,5 @@ class TaurusDbDeviceClassProxyModel(TaurusDbBaseProxyModel):
 
         regexp = self.filterRegExp()
 
-        #return treeItem.qdisplay().contains(regexp)
+        # return treeItem.qdisplay().contains(regexp)
         return regexp.indexIn(treeItem.qdisplay()) != -1
diff --git a/lib/taurus/qt/qtcore/model/taurusmodel.py b/lib/taurus/qt/qtcore/model/taurusmodel.py
index 5e2efc8..5bd663d 100644
--- a/lib/taurus/qt/qtcore/model/taurusmodel.py
+++ b/lib/taurus/qt/qtcore/model/taurusmodel.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,85 +35,86 @@ from taurus.core.util.log import Logger
 
 QtQt = Qt.Qt
 
+
 class TaurusBaseTreeItem(object):
     """A generic node"""
-    
+
     DisplayFunc = str
 
-    def __init__(self, model, data, parent = None):
+    def __init__(self, model, data, parent=None):
         self._model = model
         self._itemData = data
         self._parentItem = parent
         self._childItems = []
         self._depth = self._calcDepth()
-        
+
     def itemData(self):
         """The internal itemData object
-        
+
         :return: (object) object holding the data of this item
         """
         return self._itemData
-        
+
     def depth(self):
         """Depth of the node in the hierarchy
-        
+
         :return: (int) the node depth
         """
         return self._depth
-    
+
     def appendChild(self, child):
         """Adds a new child node
-        
+
         :param child: (TaurusTreeBaseItem) child to be added
         """
         self._childItems.append(child)
-    
+
     def child(self, row):
         """Returns the child in the given row
-        
+
         :return: (TaurusTreeBaseItem) the child node for the given row"""
         return self._childItems[row]
-    
+
     def childCount(self):
         """Returns the number of childs for this node
-        
+
         :return: (int) number of childs for this node
         """
         return len(self._childItems)
-    
+
     def hasChildren(self):
         return len(self._childItems) > 0
-    
+
     def data(self, index):
         """Returns the data of this node for the given index
-        
+
         :return: (object) the data for the given index
         """
         return self._itemData[index.column()]
-    
+
     def icon(self, index):
         return None
-    
+
     def toolTip(self, index):
         return self.data(index)
-    
+
     def setData(self, index, data):
         """Sets the node data
-        
+
         :param data: (object) the data to be associated with this node
         """
         self._itemData = data
-    
+
     def parent(self):
         """Returns the parent node or None if no parent exists
-        
+
         :return: (TaurusTreeBaseItem) the parent node
         """
         return self._parentItem
-    
+
     def row(self):
         """Returns the row for this node
-        
+
         :return: (int) row number for this node
         """
         if self._parentItem is None:
@@ -127,10 +128,10 @@ class TaurusBaseTreeItem(object):
             n = n.parent()
             d += 1
         return d
-    
+
     def display(self):
         """Returns the display string for this node
-        
+
         :return: (str) the node's display string"""
         if not hasattr(self, "_display"):
             if self._itemData is None:
@@ -140,7 +141,7 @@ class TaurusBaseTreeItem(object):
 
     def qdisplay(self):
         """Returns the display QString for this node
-        
+
         :return: (Qt.QString) the node's display string"""
         if not hasattr(self, "_qdisplay"):
             d = self.display()
@@ -155,10 +156,10 @@ class TaurusBaseTreeItem(object):
     def role(self):
         """Returns the prefered role for the item.
         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.taurusbasetypes.TaurusElementType) the role in form of element type"""
         return TaurusElementType.Unknown
 
@@ -168,12 +169,12 @@ class TaurusBaseTreeItem(object):
 
 class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
     """The base class for all Taurus Qt models."""
-    
+
     ColumnNames = ()
     ColumnRoles = (),
-    
+
     DftFont = Qt.QFont("Mono", 8)
-    
+
     def __init__(self, parent=None, data=None):
         Qt.QAbstractItemModel.__init__(self, parent)
         Logger.__init__(self)
@@ -181,30 +182,30 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
         # case we set beginResetModel to be an empty function and endResetModel
         # to be reset.
         if not hasattr(Qt.QAbstractItemModel, "beginResetModel"):
-            self.beginResetModel = lambda : None
+            self.beginResetModel = lambda: None
             self.endResetModel = self.reset
         self._data_src = None
         self._rootItem = None
         self._filters = []
-        self._selectables = [ self.ColumnRoles[0][-1] ]
+        self._selectables = [self.ColumnRoles[0][-1]]
         self.setDataSource(data)
-    
+
     def __getattr__(self, name):
         return getattr(self.dataSource(), name)
-    
+
     def createNewRootItem(self):
         return TaurusBaseTreeItem(self, self.ColumnNames)
-    
+
     def refresh(self, refresh_source=False):
         self.beginResetModel()
         self._rootItem = self.createNewRootItem()
         self.setupModelData(self.dataSource())
         self.endResetModel()
-    
+
     def setupModelData(self, data):
         raise NotImplementedError("setupModelData must be implemented "
                                   "in %s" % self.__class__.__name__)
-    
+
     def roleIcon(self, role):
         raise NotImplementedError("roleIcon must be implemented "
                                   "in %s" % self.__class__.__name__)
@@ -212,21 +213,21 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
     def roleSize(self, role):
         raise NotImplementedError("roleSize must be implemented "
                                   "in %s" % self.__class__.__name__)
-    
+
     def roleToolTip(self, role):
         raise NotImplementedError("roleToolTip must be implemented "
                                   "in %s" % self.__class__.__name__)
-    
+
     def setDataSource(self, data_src):
         self._data_src = data_src
         self.refresh()
-    
+
     def dataSource(self):
         return self._data_src
-    
+
     def setSelectables(self, seq_elem_types):
         self._selectables = seq_elem_types
-    
+
     def selectables(self):
         return self._selectables
 
@@ -235,27 +236,27 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
         if column == 0:
             return cr[0][depth]
         return self.ColumnRoles[column]
-    
-    def columnCount(self, parent = Qt.QModelIndex()):
+
+    def columnCount(self, parent=Qt.QModelIndex()):
         return len(self.ColumnRoles)
-    
+
     def columnIcon(self, column):
         return self.roleIcon(self.role(column))
-    
+
     def columnToolTip(self, column):
         return self.roleToolTip(self.role(column))
-    
+
     def columnSize(self, column):
         role = self.role(column)
         s = self.roleSize(role)
         return s
-    
+
     def pyData(self, index, role=QtQt.DisplayRole):
         if not index.isValid():
             return None
-        
+
         item = index.internalPointer()
-        
+
         ret = None
         if role == QtQt.DisplayRole or role == QtQt.EditRole:
             ret = item.data(index)
@@ -270,14 +271,14 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
             ret = item.icon(index)
         elif role == QtQt.ToolTipRole:
             ret = item.toolTip(index)
-        #elif role == QtQt.SizeHintRole:
+        # elif role == QtQt.SizeHintRole:
         #    ret = self.columnSize(column)
         elif role == QtQt.FontRole:
             ret = self.DftFont
         elif role == QtQt.UserRole:
             ret = Qt.QVariant(item)
         return ret
-    
+
     def data(self, index, role=QtQt.DisplayRole):
         ret = self.pyData(index, role)
         if ret is None:
@@ -290,24 +291,25 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
         item = index.internalPointer()
         pyobj = Qt.from_qvariant(qvalue)
         if pyobj is NotImplemented:
-            self.warning("Failed attempt to convert a QValue. Maybe it is due to Qt<4.6")
+            self.warning(
+                "Failed attempt to convert a QValue. Maybe it is due to Qt<4.6")
         item.setData(index, pyobj)
         return True
 
     def flags(self, index):
         if not index.isValid():
             return 0
-        
+
         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 |= QtQt.ItemIsSelectable
         return ret
-    
+
     def headerData(self, section, orientation, role=QtQt.DisplayRole):
         ret = None
         if orientation == QtQt.Horizontal:
@@ -322,10 +324,10 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
                 ret = self.columnToolTip(section)
             elif role == QtQt.DecorationRole:
                 ret = self.columnIcon(section)
-                
+
         return Qt.QVariant(ret)
 
-    def index(self, row, column, parent = Qt.QModelIndex()):
+    def index(self, row, column, parent=Qt.QModelIndex()):
         if not self.hasIndex(row, column, parent):
             return Qt.QModelIndex()
         if not parent.isValid():
@@ -340,19 +342,19 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
     def parent(self, index):
         if not index.isValid():
             return Qt.QModelIndex()
-        
+
         childItem = index.internalPointer()
         parentItem = childItem.parent()
-        
+
         if parentItem is None or parentItem == self._rootItem:
             return Qt.QModelIndex()
-        
+
         return self.createIndex(parentItem.row(), 0, parentItem)
 
-    def rowCount(self, parent = Qt.QModelIndex()):
+    def rowCount(self, parent=Qt.QModelIndex()):
         if parent.column() > 0:
             return 0
-        
+
         if not parent.isValid():
             parentItem = self._rootItem
         else:
@@ -361,14 +363,14 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
             return 0
         return parentItem.childCount()
 
-    def hasChildren(self, parent = Qt.QModelIndex()):
+    def hasChildren(self, parent=Qt.QModelIndex()):
         if parent.column() > 0:
             return 0
         if not parent.isValid():
             parentItem = self._rootItem
         else:
             parentItem = parent.internalPointer()
-        
+
         if parentItem is None:
             return False
         return parentItem.hasChildren()
@@ -376,21 +378,21 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger):
 
 class TaurusBaseProxyModel(Qt.QSortFilterProxyModel):
     """A taurus base Qt filter & sort model"""
-     
+
     def __init__(self, parent=None):
         Qt.QSortFilterProxyModel.__init__(self, parent)
-        
+
         # filter configuration
         self.setFilterCaseSensitivity(QtQt.CaseInsensitive)
         self.setFilterKeyColumn(0)
         self.setFilterRole(QtQt.DisplayRole)
-        
+
         # sort configuration
         self.setSortCaseSensitivity(QtQt.CaseInsensitive)
         self.setSortRole(QtQt.DisplayRole)
-        
+
         # general configuration
         self.setDynamicSortFilter(True)
-        
+
     def __getattr__(self, name):
         return getattr(self.sourceModel(), name)
diff --git a/lib/taurus/qt/qtcore/tango/__init__.py b/lib/taurus/qt/qtcore/tango/__init__.py
index c4dcead..0e3edd5 100644
--- a/lib/taurus/qt/qtcore/tango/__init__.py
+++ b/lib/taurus/qt/qtcore/tango/__init__.py
@@ -2,27 +2,27 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """"""
 
-__docformat__ = 'restructuredtext'
\ No newline at end of file
+__docformat__ = 'restructuredtext'
diff --git a/lib/taurus/qt/qtcore/taurusqlistener.py b/lib/taurus/qt/qtcore/taurusqlistener.py
index a674286..c62542f 100644
--- a/lib/taurus/qt/qtcore/taurusqlistener.py
+++ b/lib/taurus/qt/qtcore/taurusqlistener.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -31,22 +31,29 @@ __all__ = ["QTaurusBaseListener", "QObjectTaurusListener"]
 
 __docformat__ = 'restructuredtext'
 
+from taurus.qt.qtcore.util.signal import baseSignal
+from taurus.core.util.log import deprecation_decorator
 from taurus.core.tauruslistener import TaurusListener
 from taurus.external.qt import Qt
 
 
 class QTaurusBaseListener(TaurusListener):
-    """Base class for QObjects listening to taurus events. It is not
-    instanciable! Use a class that inherits from Qt class and from this class
-    (example: :class:`QObjectTaurusListener`)"""
-    
+    """Base class for QObjects listening to taurus events.
+
+    .. note::
+           :meth:`getSignaller` is now unused and deprecated. This is because
+           `taurusEvent` is implemented using :func:`baseSignal`, that doesn't
+           require the class to inherit from QObject.
+    """
+
+    taurusEvent = baseSignal('taurusEvent', object, object, object)
+
     def __init__(self, name=None, parent=None):
         if name is None:
             name = self.__class__.__name__
         super(QTaurusBaseListener, self).__init__(name, parent=parent)
         self._eventFilters = []
-        Qt.QObject.connect(self.getSignaller(), Qt.SIGNAL('taurusEvent'),
-                           self.filterEvent)
+        self.taurusEvent.connect(self.filterEvent)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Event handling chain
@@ -75,7 +82,7 @@ class QTaurusBaseListener(TaurusListener):
         """
         self.fireEvent(evt_src, evt_type, evt_value)
 
-    def fireEvent(self, evt_src = None, evt_type = None, evt_value = None):
+    def fireEvent(self, evt_src=None, evt_type=None, evt_value=None):
         """Emits a "taurusEvent" signal.
         It is unlikely that you may need to reimplement this method in subclasses.
         Consider reimplementing :meth:`eventReceived` or :meth:`handleEvent`
@@ -87,8 +94,7 @@ class QTaurusBaseListener(TaurusListener):
         :param evt_value: (object or None) event value
         """
         try:
-            emmiter = self.getSignaller()
-            emmiter.emit(Qt.SIGNAL('taurusEvent'), evt_src, evt_type, evt_value)
+            self.taurusEvent.emit(evt_src, evt_type, evt_value)
         except:
             pass
 
@@ -102,7 +108,7 @@ class QTaurusBaseListener(TaurusListener):
         """
         r = evt_src, evt_type, evt_value
 
-        if r == (-1,-1,-1):
+        if r == (-1, -1, -1):
             # @todo In an ideal world the signature of this method should be
             # (evt_src, evt_type, evt_value). However there's a bug in PyQt:
             # If a signal is disconnected between the moment it is emitted and
@@ -114,7 +120,8 @@ class QTaurusBaseListener(TaurusListener):
 
         for f in self._eventFilters:
             r = f(*r)
-            if r is None: return
+            if r is None:
+                return
         self.handleEvent(*r)
 
     def handleEvent(self, evt_src, evt_type, evt_value):
@@ -127,7 +134,7 @@ class QTaurusBaseListener(TaurusListener):
         """
         pass
 
-    def setEventFilters(self, filters = None):
+    def setEventFilters(self, filters=None):
         """sets the taurus event filters list.
         The filters are run in order, using each output to feed the next filter.
         A filter must be a function that accepts 3 arguments ``(evt_src, evt_type, evt_value)``
@@ -141,7 +148,8 @@ class QTaurusBaseListener(TaurusListener):
 
         See also: insertEventFilter
         """
-        if filters is None: filters = []
+        if filters is None:
+            filters = []
         self._eventFilters = list(filters)
 
     def getEventFilters(self):
@@ -161,11 +169,8 @@ class QTaurusBaseListener(TaurusListener):
         """
         self._eventFilters.insert(index, filter)
 
+    @deprecation_decorator(rel='4.0')
     def getSignaller(self):
-        '''Reimplement this method if your derived class does not inherit from
-        QObject. The return value should be a permanent object capable of
-        emitting Qt signals. See :class:`TaurusImageItem` as an example
-        '''
         return self
 
 
@@ -179,21 +184,23 @@ 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.taurusbasetypes.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.taurusbasetypes.TaurusEventType[evt_type], evt_src)
+        self.info("New %s event from %s",
+                  taurus.core.taurusbasetypes.TaurusEventType[evt_type], evt_src)
 
 
 if __name__ == "__main__":
     import time
     import taurus
     qlistener = ListenerDemo(name="DemoObject")
-    
+
     attr = taurus.Attribute("sys/tg_test/1/double_scalar")
     attr.addListener(qlistener)
-    
+
     try:
         while True:
             time.sleep(1)
diff --git a/lib/taurus/qt/qtcore/util/__init__.py b/lib/taurus/qt/qtcore/util/__init__.py
index 09b8922..e029ac9 100644
--- a/lib/taurus/qt/qtcore/util/__init__.py
+++ b/lib/taurus/qt/qtcore/util/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py
index 8298a61..0212de1 100644
--- a/lib/taurus/qt/qtcore/util/emitter.py
+++ b/lib/taurus/qt/qtcore/util/emitter.py
@@ -2,63 +2,89 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://www.tango-controls.org/static/tau/latest/doc/html/index.html
+# http://www.tango-controls.org/static/tau/latest/doc/html/index.html
 ##
-## (copyleft) CELLS / ALBA Synchrotron, Bellaterra, Spain
+# (copyleft) CELLS / ALBA Synchrotron, Bellaterra, Spain
 ##
-## This is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 3 of the License, or
-## (at your option) any later version.
+# This is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 ##
-## This software 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 General Public License for more details.
+# This software 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 General Public License for more details.
 ##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, see <http://www.gnu.org/licenses/>.
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 ###########################################################################
 
 """
 emitter.py: This module provides a task scheduler used by TaurusGrid and TaurusDevTree widgets
 """
 
+import Queue
+import traceback
 from functools import partial
+from collections import Iterable
+
 import taurus
 from taurus.external.qt import Qt
 from taurus.core.util.log import Logger
 from taurus.core.util.singleton import Singleton
-import Queue,traceback
+
+
 
 ###############################################################################
 # Helping methods
 
+
 def isString(seq):
-    if isinstance(seq,basestring): return True # It matches most python str-like classes
-    if any(s in str(type(seq)).lower() for s in ('vector','array','list',)): return False
-    if 'qstring' == str(type(seq)).lower(): return True # It matches QString
+    if isinstance(seq, basestring):
+        return True  # It matches most python str-like classes
+    if any(s in str(type(seq)).lower() for s in ('vector', 'array', 'list',)):
+        return False
+    if 'qstring' == str(type(seq)).lower():
+        return True  # It matches QString
     return False
-    
-def modelSetter(obj,model):
+
+
+def modelSetter(obj, model):
     """
     This class is used for convenience as TaurusEmitterThread standard method
     """
-    #print 'In modelSetter(%s,%s)' % (str(obj),str(model))
-    if hasattr(obj,'setModel') and model is not None: obj.setModel(model)
+    # print 'In modelSetter(%s,%s)' % (str(obj),str(model))
+    if hasattr(obj, 'setModel') and model is not None:
+        obj.setModel(model)
     return
-    
+
+
 class MethodModel(object):
     """
     Class to emulate method execution as a setModel
     """
-    def __init__(self,method): self.method = method
-    def setModel(self,value): return self.method(value)
-    
+
+    def __init__(self, method):
+        self.method = method
+
+    def setModel(self, value):
+        return self.method(value)
+
+
+class QEmitter(Qt.QObject):
+    """Emitter class providing two signals."""
+
+    doSomething = Qt.pyqtSignal(Iterable)
+    somethingDone = Qt.pyqtSignal()
+    newQueue = Qt.pyqtSignal()
+
+
 ###############################################################################
 
+
 class TaurusEmitterThread(Qt.QThread):
     """
     The TaurusEmitterThread Class
@@ -66,7 +92,7 @@ class TaurusEmitterThread(Qt.QThread):
 
     This object get items from a python Queue and performs a thread safe operation on them.
     It is useful to serialize Qt tasks in a background thread.
-    
+
     :param parent: a Qt/Taurus object
     :param name: identifies object logs
     :param queue: if None parent.getQueue() is used, if not then the queue passed as argument is used
@@ -106,11 +132,11 @@ class TaurusEmitterThread(Qt.QThread):
         #Applying TaurusEmitterThread to an existing class:
         import Queue
         from functools import partial
-        
+
         def modelSetter(args):
             obj,model = args[0],args[1]
             obj.setModel(model)
-        
+
         klass TaurusGrid(Qt.QFrame, TaurusBaseWidget):
             ...
             def __init__(self, parent = None, designMode = False):
@@ -126,59 +152,66 @@ class TaurusEmitterThread(Qt.QThread):
                 ...
             def setModel(self,model):
                 ...
-                if hasattr(self,'modelsThread') and not self.modelsThread.isRunning(): 
+                if hasattr(self,'modelsThread') and not self.modelsThread.isRunning():
                     self.modelsThread.start()
                 elif self.modelsQueue.qsize():
                     self.modelsThread.next()
-                ...    
+                ...
 
     """
-    def __init__(self, parent=None,name='',queue=None,method=None,cursor=None,sleep=5000):
+
+    def __init__(self, parent=None, name='', queue=None, method=None, cursor=None, sleep=5000):
         """
         Parent most not be None and must be a TaurusGraphicsScene!
         """
         Qt.QThread.__init__(self, parent)
         self.name = name
-        self.log = Logger('TaurusEmitterThread(%s)'%self.name)
+        self.log = Logger('TaurusEmitterThread(%s)' % self.name)
         self.log.setLogLevel(self.log.Info)
         self.queue = queue or Queue.Queue()
         self.todo = Queue.Queue()
         self.method = method
-        self.cursor = Qt.QCursor(Qt.Qt.WaitCursor) if cursor is True else cursor
+        self.cursor = Qt.QCursor(
+            Qt.Qt.WaitCursor) if cursor is True else cursor
         self._cursor = False
         self.timewait = sleep
-        
-        self.emitter = Qt.QObject()
+
+        self.emitter = QEmitter()
         self.emitter.moveToThread(Qt.QApplication.instance().thread())
-        self.emitter.setParent(Qt.QApplication.instance()) #Mandatory!!! if parent is set before changing thread it could lead to segFaults!
+        # Mandatory!!! if parent is set before changing thread it could lead to
+        # segFaults!
+        self.emitter.setParent(Qt.QApplication.instance())
         self._done = 0
-        #Moved to the end to prevent segfaults ...
-        Qt.QObject.connect(self.emitter, Qt.SIGNAL("doSomething"), self._doSomething)
-        Qt.QObject.connect(self.emitter, Qt.SIGNAL("somethingDone"), self.next) 
-        
+        # Moved to the end to prevent segfaults ...
+        self.emitter.doSomething.connect(self._doSomething)
+        self.emitter.somethingDone.connect(self.next)
+
     def getQueue(self):
-        if self.queue: return self.queue
-        elif hasattr(self.parent(),'getQueue'): self.parent().getQueue()
-        else: return None
+        if self.queue:
+            return self.queue
+        elif hasattr(self.parent(), 'getQueue'):
+            self.parent().getQueue()
+        else:
+            return None
 
     def getDone(self):
         """ Returns % of done tasks in 0-1 range """
-        return self._done/(self._done+self.getQueue().qsize()) if self._done else 0.
-    
+        return self._done / (self._done + self.getQueue().qsize()) if self._done else 0.
+
     def clear(self):
         while not self.todo.empty():
             self.todo.get()
         while not self.getQueue().empty():
             self.getQueue().get()
-            self._done+=1
-            
+            self._done += 1
+
     def purge(obj):
         nqueue = Queue.Queue()
-        while not self.todo.empty(): 
+        while not self.todo.empty():
             i = self.todo.get()
             if obj not in i:
-                nqueue.put(i)        
-        while not self.queue.empty(): 
+                nqueue.put(i)
+        while not self.queue.empty():
             i = self.queue.get()
             if obj not in i:
                 nqueue.put(i)
@@ -186,47 +219,50 @@ class TaurusEmitterThread(Qt.QThread):
             self.queue.put(nqueue.get())
         self.next()
 
-    def _doSomething(self,params):
-        self.log.debug('At TaurusEmitterThread._doSomething(%s)'%str(params))
-        if not self.method: 
-            method,args = params[0],params[1:]
-        else: 
-            method,args = self.method,params
+    def _doSomething(self, params):
+        self.log.debug('At TaurusEmitterThread._doSomething(%s)' % str(params))
+        if not self.method:
+            method, args = params[0], params[1:]
+        else:
+            method, args = self.method, params
         if method:
             try:
                 method(*args)
             except:
-                self.log.error('At TaurusEmitterThread._doSomething(%s): \n%s' % (map(str,args),traceback.format_exc()))
-        self.emitter.emit(Qt.SIGNAL("somethingDone"))
+                self.log.error('At TaurusEmitterThread._doSomething(%s): \n%s' % (
+                    map(str, args), traceback.format_exc()))
+        self.emitter.somethingDone.emit()
         self._done += 1
         return
-                
+
     def next(self):
         queue = self.getQueue()
         msg = 'At TaurusEmitterThread.next(), %d items remaining.' % queue.qsize()
         (queue.empty() and self.log.info or self.log.debug)(msg)
         try:
-            if not queue.empty():            
-                if not self._cursor and self.cursor is not None: 
+            if not queue.empty():
+                if not self._cursor and self.cursor is not None:
                     Qt.QApplication.instance().setOverrideCursor(Qt.QCursor(self.cursor))
-                    self._cursor=True                
-                item = queue.get(False) #A blocking get here would hang the GUIs!!!
+                    self._cursor = True
+                # A blocking get here would hang the GUIs!!!
+                item = queue.get(False)
                 self.todo.put(item)
                 self.log.debug('Item added to todo queue: %s' % str(item))
-            elif self._cursor: 
+            elif self._cursor:
                 Qt.QApplication.instance().restoreOverrideCursor()
-                self._cursor = False        
-                
+                self._cursor = False
+
         except Queue.Empty:
             self.log.warning(traceback.format_exc())
             pass
-        except: 
+        except:
             self.log.warning(traceback.format_exc())
         return
-        
+
     def run(self):
-        Qt.QApplication.instance().thread().sleep(int(self.timewait/1000) if self.timewait>10 else int(self.timewait)) #wait(self.sleep)
-        self.log.info('#'*80)
+        Qt.QApplication.instance().thread().sleep(int(self.timewait / 1000)
+                                                  if self.timewait > 10 else int(self.timewait))  # wait(self.sleep)
+        self.log.info('#' * 80)
         self.log.info('At TaurusEmitterThread.run()')
         self.next()
         while True:
@@ -238,20 +274,22 @@ class TaurusEmitterThread(Qt.QThread):
                 else:
                     continue
             self.log.debug('Emitting doSomething signal ...')
-            self.emitter.emit(Qt.SIGNAL("doSomething"), item)
-            #End of while
-        self.log.info('#'*80+'\nOut of TaurusEmitterThread.run()'+'\n'+'#'*80)
-        #End of Thread 
-        
-class SingletonWorker():#Qt.QObject):
+            self.emitter.doSomething.emit(item)
+            # End of while
+        self.log.info(
+            '#' * 80 + '\nOut of TaurusEmitterThread.run()' + '\n' + '#' * 80)
+        # End of Thread
+
+
+class SingletonWorker():  # Qt.QObject):
     """
     The SingletonWorker works
     =========================
-    
+
     The SingletonWorker class is constructed using the same arguments than the TaurusTreadEmitter class ; but instead of creating a QThread for each instance of the class it creates a single QThread for all instances.
-    
+
     The Queue is still different for each of the instances; it is connected to the TaurusEmitterThread signals (*next()* and *somethingDone()*) and each Worker queue is used as a feed for the shared QThread.
-    
+
     This implementation reduced the cpu of vacca application in a 50% factor.
 
     :param parent: a Qt/Taurus object
@@ -262,89 +300,110 @@ class SingletonWorker():#Qt.QObject):
     This class is used to manage TaurusEmitterThread as Singleton objects:
     """
     _thread = None
-        
-    def __init__(self,parent=None,name='',queue=None,method=None,cursor=None,sleep=5000,log=Logger.Warning,start=True):
+
+    def __init__(self, parent=None, name='', queue=None, method=None, cursor=None, sleep=5000, log=Logger.Warning, start=True):
         self.name = name
-        self.log = Logger('SingletonWorker(%s)'%self.name)
+        self.log = Logger('SingletonWorker(%s)' % self.name)
         self.log.setLogLevel(log)
-        self.log.info('At SingletonWorker.__init__(%s)'%self.name)
+        self.log.info('At SingletonWorker.__init__(%s)' % self.name)
         self.parent = parent
         self.method = method
         self._running = False
         if SingletonWorker._thread is None:
-            SingletonWorker._thread = TaurusEmitterThread(parent,name='SingletonWorker',cursor=cursor,sleep=sleep)
+            SingletonWorker._thread = TaurusEmitterThread(
+                parent, name='SingletonWorker', cursor=cursor, sleep=sleep)
         self.thread = SingletonWorker._thread
         self.queue = queue or Queue.Queue()
-        if start: self.start()
-        
-    def put(self,item,block=True,timeout=None):
-        self.getQueue().put(item,block,timeout)
-        
+        if start:
+            self.start()
+
+    def put(self, item, block=True, timeout=None):
+        self.getQueue().put(item, block, timeout)
+
     def size(self):
         return self.getQueue().qsize()
-        
-    def next(self,item=None):
-        if item is not None: self.put(item)
-        elif self.queue.empty(): return
+
+    def next(self, item=None):
+        if item is not None:
+            self.put(item)
+        elif self.queue.empty():
+            return
         msg = 'At SingletonWorker.next(), %d items not passed yet to Emitter.' % self.queue.qsize()
         self.log.info(msg)
         #(queue.empty() and self.log.info or self.log.debug)(msg)
         try:
             i = 0
             while not self.queue.empty():
-                item = self.queue.get(False) #A blocking get here would hang the GUIs!!!
-                if self.method: 
-                    self.thread.getQueue().put([self.method]+list(item))
+                # A blocking get here would hang the GUIs!!!
+                item = self.queue.get(False)
+                if self.method:
+                    self.thread.getQueue().put([self.method] + list(item))
                 else:
                     self.thread.getQueue().put(item)
-                i+=1
+                i += 1
             self.log.info('%d Items added to emitter queue' % i)
-            self.thread.emitter.emit(Qt.SIGNAL("newQueue"))
+            self.thread.emitter.newQueue.emit()
         except Queue.Empty:
             self.log.warning(traceback.format_exc())
-        except: 
+        except:
             self.log.warning(traceback.format_exc())
         return
-    
-    def getQueue(self): return self.queue
-    def getDone(self): return self.thread.getDone()
-    
-    def start(self): 
-        Qt.QObject.connect(self.thread.emitter, Qt.SIGNAL("somethingDone"), self.next) 
-        Qt.QObject.connect(self.thread.emitter, Qt.SIGNAL("newQueue"), self.thread.next)
-        try: self.thread.start()
-        except: pass
+
+    def getQueue(self):
+        return self.queue
+
+    def getDone(self):
+        return self.thread.getDone()
+
+    def start(self):
+        self.thread.emitter.somethingDone.connect(self.next)
+        self.thread.emitter.newQueue.connect(self.thread.next)
+        try:
+            self.thread.start()
+        except:
+            pass
         self.next()
         self._running = True
         return
-    
-    def stop(self): 
-        Qt.QObject.disconnect(self.thread.emitter, Qt.SIGNAL("somethingDone"), self.next) 
-        Qt.QObject.disconnect(self.thread.emitter, Qt.SIGNAL("newQueue"), self.thread.next)
+
+    def stop(self):
+        self.thread.emitter.somethingDone.disconnect(self.next)
+        self.thread.emitter.newQueue.disconnect(self.thread.next)
         self._running = False
         return
-    
+
     def clear(self):
-        """ 
+        """
         This method will clear queue only if next() has not been called.
         If you call self.thread.clear() it will clear objects for all workers!, be careful
         """
-        while not self.queue.empty(): self.queue.get()
-        #self.thread.clear()
-        
+        while not self.queue.empty():
+            self.queue.get()
+        # self.thread.clear()
+
     def purge(obj):
         nqueue = Queue.Queue()
-        while not self.queue.empty(): 
+        while not self.queue.empty():
             i = self.queue.get()
             if obj not in i:
                 nqueue.put(i)
         while not nqueue.empty():
             self.queue.put(nqueue.get())
-        
-    def isRunning(self): return self._running
-    def isFinished(self): return self.thread.isFinished()
-    def finished(self): return self.thread.finished()
-    def started(self): return self._running
-    def terminated(self): return self.thread.terminated()
-    def sleep(self,s): return self.thread.sleep(s)
-    
+
+    def isRunning(self):
+        return self._running
+
+    def isFinished(self):
+        return self.thread.isFinished()
+
+    def finished(self):
+        return self.thread.finished()
+
+    def started(self):
+        return self._running
+
+    def terminated(self):
+        return self.thread.terminated()
+
+    def sleep(self, s):
+        return self.thread.sleep(s)
diff --git a/lib/taurus/qt/qtcore/util/properties.py b/lib/taurus/qt/qtcore/util/properties.py
index 843804b..44cd527 100644
--- a/lib/taurus/qt/qtcore/util/properties.py
+++ b/lib/taurus/qt/qtcore/util/properties.py
@@ -2,38 +2,38 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
 properties.py: Methods for adding QProperties to QObjects
 
-A call like 
+A call like
         set_property_methods(self,'Filters','QString',default='',
             set_callback=lambda s=self:s.loadTree(s.getFilters(),clear=True),
             reset_callback=lambda s=self:s.loadTree('',clear=True)
             )
-            
+
 Would replace all these lines:
-    
+
     def setFilters(self,filters):
         self._filters = filters
         self.loadTree(self._filters,clear=True)
@@ -46,64 +46,77 @@ Would replace all these lines:
         self.loadTree(self._filters)
 
     filters = QtCore.pyqtProperty("QString", getFilters, setFilters, resetFilters)
-    
+
 Not tested yet with the classical declaration:
-    
-    #model = QtCore.pyqtProperty("QString", TaurusBaseWidget.getModel, 
-                            #TaurusBaseWidget.setModel, 
+
+    #model = QtCore.pyqtProperty("QString", TaurusBaseWidget.getModel,
+                            #TaurusBaseWidget.setModel,
                             #TaurusBaseWidget.resetModel)
-    
+
 """
 
 from functools import partial
 from taurus.external.qt import Qt
 from taurus.core.tango.search import *
 
+
 def join(*seqs):
     """ It returns a list containing the objects of all given sequences. """
-    if len(seqs)==1 and isSequence(seqs[0]):
+    if len(seqs) == 1 and isSequence(seqs[0]):
         seqs = seqs[0]
     result = []
-    for seq in seqs: 
-        if isSequence(seq): result.extend(seq)
-        else: result.append(seq)
+    for seq in seqs:
+        if isSequence(seq):
+            result.extend(seq)
+        else:
+            result.append(seq)
     #    result += list(seq)
     return result
-        
-def djoin(a,b):
+
+
+def djoin(a, b):
     """ This method merges dictionaries and/or lists """
-    if not any(map(isDictionary,(a,b))): return join(a,b)
-    other,dct = sorted((a,b),key=isDictionary) 
-    if not isDictionary(other): 
-        other = dict.fromkeys(other if isSequence(other) else [other,])
-    for k,v in other.items():
-        dct[k] = v if not k in dct else djoin(dct[k],v)
+    if not any(map(isDictionary, (a, b))):
+        return join(a, b)
+    other, dct = sorted((a, b), key=isDictionary)
+    if not isDictionary(other):
+        other = dict.fromkeys(other if isSequence(other) else [other, ])
+    for k, v in other.items():
+        dct[k] = v if not k in dct else djoin(dct[k], v)
     return dct
 
+
 def get_property_attribute(name):
-    return '_'+str(name).lower()
-
-def get_property(obj,name,callback=None):
-    return (callback and callback()) or getattr(obj,get_property_attribute(name))
-    
-def set_property(obj,name,value,callback=None): 
-    #print 'set_property(%s,%s,%s,%s)'%(obj,name,value,callback)
-    setattr(obj,get_property_attribute(name),value)
-    try: callback and callback(value)
-    except: callback()
-
-def reset_property(obj,name,default=None,callback=None):
-    setattr(obj,get_property_attribute(name),default)
-    if callback: callback()
-    
+    return '_' + str(name).lower()
+
+
+def get_property(obj, name, callback=None):
+    return (callback and callback()) or getattr(obj, get_property_attribute(name))
+
+
+def set_property(obj, name, value, callback=None):
+    # print 'set_property(%s,%s,%s,%s)'%(obj,name,value,callback)
+    setattr(obj, get_property_attribute(name), value)
+    try:
+        callback and callback(value)
+    except:
+        callback()
+
+
+def reset_property(obj, name, default=None, callback=None):
+    setattr(obj, get_property_attribute(name), default)
+    if callback:
+        callback()
+
 COMMON_PROPERTIES = (
-        'ModelInConfig', #If True, it will automatically register Model
-        'modifiableByUser',
-        #'useParentModel', #Only for widgets, not for components
-        #'Model', #Controlled by ModelInConfig
-        )
-    
-def set_property_methods(obj,name,type_="QString",default=None,getter=None,setter=None,reset=None,get_callback=None,set_callback=None,reset_callback=None,qt=False,config=False):
+    'ModelInConfig',  # If True, it will automatically register Model
+    'modifiableByUser',
+    #'useParentModel', #Only for widgets, not for components
+    #'Model', #Controlled by ModelInConfig
+)
+
+
+def set_property_methods(obj, name, type_="QString", default=None, getter=None, setter=None, reset=None, get_callback=None, set_callback=None, reset_callback=None, qt=False, config=False):
     """
     This method allows to add QProperties dynamically with calls like:
     <pre>
@@ -112,18 +125,24 @@ def set_property_methods(obj,name,type_="QString",default=None,getter=None,sette
             reset_callback=lambda s=self:s.loadTree('',clear=True)
             )
     </pre>
-    
+
     @TODO: This method should be refactored using python descriptors/properties and types.MethodType
     """
     klass = obj.__class__
-    mname = '%s%s'%(name[0].upper(),name[1:])
-    lname = '%s%s'%(name[0].lower(),name[1:])
-    getter = getter or (lambda o=obj,n=name,c=get_callback: get_property(o,n,c)) #partial(get_property,name=name,callback=get_callback)
-    setter = setter or (lambda x,y=None,o=obj,d=default,n=name,c=set_callback: set_property(o,n,x if x is not obj else y,c)) #partial(set_property),name=name,callback=set_callback)
-    reset = reset or (lambda o=obj,n=name,d=default,c=reset_callback: reset_property(o,n,d,c)) #partial(reset_property,name=name,default=default,callback=reset_callback)
-    setattr(obj,'set%s'%mname,setter)
-    setattr(obj,'get%s'%mname,getter)
-    setattr(obj,'reset%s'%mname,reset)
-    if qt: setattr(klass,lname,Qt.pyqtProperty("QString", getter,setter,reset))
-    if config: obj.registerConfigProperty(getter,setter,name)
-    reset()
\ No newline at end of file
+    mname = '%s%s' % (name[0].upper(), name[1:])
+    lname = '%s%s' % (name[0].lower(), name[1:])
+    getter = getter or (lambda o=obj, n=name, c=get_callback: get_property(
+        o, n, c))  # partial(get_property,name=name,callback=get_callback)
+    setter = setter or (lambda x, y=None, o=obj, d=default, n=name, c=set_callback: set_property(
+        o, n, x if x is not obj else y, c))  # partial(set_property),name=name,callback=set_callback)
+    reset = reset or (lambda o=obj, n=name, d=default, c=reset_callback: reset_property(
+        o, n, d, c))  # partial(reset_property,name=name,default=default,callback=reset_callback)
+    setattr(obj, 'set%s' % mname, setter)
+    setattr(obj, 'get%s' % mname, getter)
+    setattr(obj, 'reset%s' % mname, reset)
+    if qt:
+        setattr(klass, lname, Qt.pyqtProperty(
+            "QString", getter, setter, reset))
+    if config:
+        obj.registerConfigProperty(getter, setter, name)
+    reset()
diff --git a/lib/taurus/qt/qtcore/util/signal.py b/lib/taurus/qt/qtcore/util/signal.py
new file mode 100644
index 0000000..e82d2e1
--- /dev/null
+++ b/lib/taurus/qt/qtcore/util/signal.py
@@ -0,0 +1,55 @@
+"""Provide a Signal class for non-QObject objects"""
+
+__all__ = ['baseSignal']
+
+from PyQt4 import Qt
+from threading import Lock
+from weakref import WeakKeyDictionary
+
+
+def baseSignal(name, *args):
+    """Signal class for non-Qobject objects.
+
+    :param name: signal name (unlike pyqtSignal, name has
+                 to be specified explicitely)
+    :param args: arguments passed to the pyqtSignal
+    """
+    main_lock = Lock()
+    lock_dict = WeakKeyDictionary()
+    classname = name.capitalize() + "Signaller"
+    attrs = {name: Qt.pyqtSignal(*args, name=name)}
+    signaller_type = type(classname, (Qt.QObject,), attrs)
+
+    def get_lock(self):
+        with main_lock:
+            if self not in lock_dict:
+                lock_dict[self] = Lock()
+        return lock_dict[self]
+
+    def get_signaller(self):
+        with get_lock(self):
+            if not hasattr(self, '_signallers'):
+                self._signallers = {}
+            if (name, args) not in self._signallers:
+                self._signallers[name, args] = signaller_type()
+        return self._signallers[name, args]
+
+    def get_signal(self):
+        return getattr(get_signaller(self), name)
+
+    doc = "Base signal {}".format(name)
+    return property(get_signal, doc=doc)
+
+if __name__ == '__main__':
+
+    class Base(object):
+        test = baseSignal('test', int)
+
+    def print_func(arg):
+        print(arg)
+
+    base1, base2 = Base(), Base()
+    base1.test.connect(print_func)
+    base2.test.connect(print_func)
+    base1.test.emit(1)
+    base2.test.emit(2)
diff --git a/lib/taurus/qt/qtcore/util/tauruslog.py b/lib/taurus/qt/qtcore/util/tauruslog.py
index 69cf441..393f2fa 100644
--- a/lib/taurus/qt/qtcore/util/tauruslog.py
+++ b/lib/taurus/qt/qtcore/util/tauruslog.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,27 +35,29 @@ from taurus import Logger
 qtLogger = None
 
 QT_LEVEL_MATCHER = {
-    Qt.QtDebugMsg    : Logger.debug,
-    Qt.QtWarningMsg  : Logger.warning,
-    Qt.QtCriticalMsg : Logger.error,
-    Qt.QtFatalMsg    : Logger.error,
-    Qt.QtSystemMsg   : 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 = Logger('QtLogger')
     return qtLogger
-    
+
+
 def qtTaurusMsgHandler(type, msg):
     global qtLogger
     if qtLogger is not None:
         caller = QT_LEVEL_MATCHER.get(type)
         caller(qtLogger, msg)
 
+
 def initTaurusQtLogger():
     global qtLogger
     if not qtLogger:
         Qt.qInstallMsgHandler(qtTaurusMsgHandler)
-    
\ No newline at end of file
diff --git a/lib/taurus/qt/qtdesigner/__init__.py b/lib/taurus/qt/qtdesigner/__init__.py
index fff6519..c1f43a9 100644
--- a/lib/taurus/qt/qtdesigner/__init__.py
+++ b/lib/taurus/qt/qtdesigner/__init__.py
@@ -2,28 +2,27 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """The taurus.qt.qtdesigner submodule. It contains qt-specific part of taurus"""
 
 __docformat__ = 'restructuredtext'
-
diff --git a/lib/taurus/qt/qtdesigner/containerplugin.py b/lib/taurus/qt/qtdesigner/containerplugin.py
index 2b75647..bc1ecf8 100644
--- a/lib/taurus/qt/qtdesigner/containerplugin.py
+++ b/lib/taurus/qt/qtdesigner/containerplugin.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,20 +29,20 @@
     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.external.qt import Qt
-from taurus.external.qt import QtDesigner
-
-from taurus.qt.qtgui.container.qcontainer import QGroupWidget
-
+"""
+
+from taurus.core.util.log import Logger
+from taurus.external.qt import Qt
+from taurus.external.qt import QtDesigner
+
+from taurus.qt.qtgui.container.qcontainer import QGroupWidget
+
 #import sip
 
 Q_TYPEID = {'QPyDesignerContainerExtension':     'com.trolltech.Qt.Designer.Container',
@@ -52,45 +52,47 @@ Q_TYPEID = {'QPyDesignerContainerExtension':     'com.trolltech.Qt.Designer.Cont
 
 
 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)
 
@@ -101,24 +103,24 @@ class QGroupWidgetExtensionFactory(QtDesigner.QExtensionFactory):
             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'])
+                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 e32da5d..318e2dd 100644
--- a/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py
+++ b/lib/taurus/qt/qtdesigner/extraguiqwtplugin.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,10 +30,10 @@ guiqwt widgets plugins for Qt Designer
 try:
     from guiqwt.qtdesigner import create_qtdesigner_plugin
     PlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "CurveWidget",
-                                      icon="curve.png")
+                                          icon="curve.png")
 
     ImagePlotPlugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "ImageWidget",
-                                      icon="image.png")
+                                               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
index 3e7f127..b559144 100644
--- a/lib/taurus/qt/qtdesigner/taurusdesigner.py
+++ b/lib/taurus/qt/qtdesigner/taurusdesigner.py
@@ -2,34 +2,35 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 optparse
 
 import taurus
 from taurus.external.qt import Qt
 
+
 def env_index(env, env_name):
     env_name = str(env_name)
     for i, e in enumerate(env):
@@ -38,9 +39,11 @@ def env_index(env, 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):
@@ -49,6 +52,7 @@ def get_env(env, 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:
@@ -57,20 +61,23 @@ def append_or_create_env(env, env_name, env_value, is_path_like=True):
         if is_path_like:
             e_n, e_v = env[i].split("=")
             paths = e_v.split(os.path.pathsep)
-            if not env_value in paths:
+            if env_value not 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")
+        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__))
@@ -78,6 +85,7 @@ def get_qtdesigner_bin():
     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
@@ -85,6 +93,7 @@ def get_taurus_designer_path():
     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
@@ -101,10 +110,11 @@ def qtdesigner_prepare_taurus(env=None, taurus_extra_path=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")
+    # 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()
@@ -117,11 +127,13 @@ def qtdesigner_start(args, env=None):
 
     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 = 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="",
@@ -133,11 +145,11 @@ def main(env=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)
+
+    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/__init__.py b/lib/taurus/qt/qtdesigner/taurusplugin/__init__.py
index 2121a3d..cf7aec6 100644
--- a/lib/taurus/qt/qtdesigner/taurusplugin/__init__.py
+++ b/lib/taurus/qt/qtdesigner/taurusplugin/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -28,4 +28,3 @@
 __docformat__ = 'restructuredtext'
 
 from .taurusplugin import *
-
diff --git a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
index 09d6d00..ba4f950 100644
--- a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
+++ b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,7 +29,7 @@
     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:
@@ -44,28 +44,30 @@ from taurus.external.qt import QtDesigner
 
 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 = Logger("PyQtDesigner")
 
+
 class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
     """TaurusWidgetPlugin"""
-    
-    def __init__(self, parent = None):
+
+    def __init__(self, parent=None):
         QtDesigner.QPyDesignerCustomWidgetPlugin.__init__(self)
         self._log = Logger(self._getWidgetClassName(), designer_logger)
         self.initialized = False
-    
+
     def initialize(self, formEditor):
         """ Overwrite if necessary. Don't forget to call this method in case you
-            want the generic taurus extensions in your widget.""" 
+            want the generic taurus extensions in your widget."""
         if self.isInitialized():
             return
-                
+
         self.initialized = True
-        
+
     def isInitialized(self):
         return self.initialized
 
@@ -103,33 +105,33 @@ class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
             w = klass(*args, **kwargs)
         except Exception, e:
             name = self._getWidgetClassName()
-            print 100*"="
+            print 100 * "="
             print "taurus designer plugin error creating %s: %s" % (name, str(e))
-            print 100*"-"
+            print 100 * "-"
             import traceback
             traceback.print_exc()
             w = None
         return w
-    
+
     def getWidgetInfo(self, key, dft=None):
         if not hasattr(self, '_widgetInfo'):
             self._widgetInfo = self.getWidgetClass().getQtDesignerPluginInfo()
         return self._widgetInfo.get(key, dft)
-    
+
     # This method returns the name of the custom widget class that is provided
     # by this plugin.
     def name(self):
         return self._getWidgetClassName()
-        
+
     def group(self):
-        """ Returns the name of the group in Qt Designer's widget box that this 
+        """ 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."""
         return self.getWidgetInfo('group', 'Taurus Widgets')
 
     def getIconName(self):
         return self.getWidgetInfo('icon')
-        
+
     def icon(self):
         icon = self.getWidgetInfo('icon')
         if icon is None:
@@ -137,11 +139,10 @@ class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
         elif isinstance(icon, Qt.QIcon):
             return icon
         else:
-            if not icon.startswith(":"):
-                icon = ':/designer/%s' % icon
-            import taurus.qt.qtgui.resource
-            return taurus.qt.qtgui.resource.getIcon(icon)
-    
+            if icon.find(":") == -1:
+                icon = 'designer:%s' % icon
+            return Qt.QIcon(icon)
+
     def domXml(self):
         name = str(self.name())
         lowerName = name[0].lower() + name[1:]
@@ -157,12 +158,12 @@ class TaurusWidgetPlugin(QtDesigner.QPyDesignerCustomWidgetPlugin):
         if tooltip is None:
             tooltip = "A %s" % self._getWidgetClassName()
         return tooltip
-        
+
     def whatsThis(self):
         whatsthis = self.getWidgetInfo('whatsthis')
         if whatsthis is None:
             whatsthis = "This is a %s widget" % self._getWidgetClassName()
         return whatsthis
-    
+
     def isContainer(self):
         return self.getWidgetInfo('container', False)
diff --git a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py
index 82c0928..f7d1cf4 100644
--- a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py
+++ b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-tauruspluginplugin.py: 
+tauruspluginplugin.py:
 """
 
 from taurus.external.qt import QtDesigner
@@ -32,10 +32,10 @@ from taurus.external.qt import QtDesigner
 
 def build_qtdesigner_widget_plugin(klass):
     import taurusplugin
-    
+
     class Plugin(taurusplugin.TaurusWidgetPlugin):
         WidgetClass = klass
-    
+
     Plugin.__name__ = klass.__name__ + "QtDesignerPlugin"
     return Plugin
 
@@ -43,16 +43,13 @@ _SKIP = ["QLogo", "QGroupWidget", "TaurusGroupWidget"]
 
 _plugins = {}
 
+
 def main():
-    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__)
-    
-    Manager().setOperationMode(OperationMode.OFFLINE)
-    
+
     try:
         wf = TaurusWidgetFactory()
         klasses = wf.getWidgetClasses()
@@ -66,7 +63,7 @@ def main():
                 continue
             # if getQtDesignerPluginInfo does not exist, returns None or raises
             # an exception: forget the widget
-            cont=False
+            cont = False
             try:
                 qt_info = widget_klass.getQtDesignerPluginInfo()
                 if qt_info is None:
@@ -77,47 +74,51 @@ def main():
                 #_log.debug("E2: Canceled %s (widget doesn't have getQtDesignerPluginInfo())" % name)
                 e2_nb += 1
                 cont = True
-            except Exception,e:
+            except Exception, e:
                 #_log.debug("E3: Canceled %s (%s)" % (name, str(e)))
                 e3_nb += 1
                 cont = True
-            
-            if cont: continue
+
+            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
-            if cont: continue
-            
+                    cont = True
+            if cont:
+                continue
+
             plugin_klass = build_qtdesigner_widget_plugin(widget_klass)
             plugin_klass_name = plugin_klass.__name__
             globals()[plugin_klass_name] = plugin_klass
             _plugins[plugin_klass_name] = plugin_klass
-            
+
             ok_nb += 1
             #_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("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)")
+        _log.info(
+            "E4: getQtDesignerPluginInfo() returns dictionary with missing key (probably 'module' key)")
     except Exception as e:
-        import traceback; traceback.print_exc()
-        #print e
+        import traceback
+        traceback.print_exc()
+        # print e
 
 
 class TaurusWidgets(QtDesigner.QPyDesignerCustomWidgetCollectionPlugin):
-    
+
     def __init__(self, parent=None):
         QtDesigner.QPyDesignerCustomWidgetCollectionPlugin.__init__(parent)
         self._widgets = None
-        
+
     def customWidgets(self):
         if self._widgets is None:
-            self._widgets = [ w(self) for w in _plugins.values() ]
+            self._widgets = [w(self) for w in _plugins.values()]
         return self._widgets
 
 if __name__ != "__main__":
     main()
-
diff --git a/lib/taurus/qt/qtgui/__init__.py b/lib/taurus/qt/qtgui/__init__.py
index e8a8ebc..a2e0cc2 100644
--- a/lib/taurus/qt/qtgui/__init__.py
+++ b/lib/taurus/qt/qtgui/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,3 +30,19 @@ abstract model data."""
 
 __docformat__ = 'restructuredtext'
 
+
+# register icon path files and icon theme on import of taurus.qt.qtgui
+import icon as __icon
+import os
+import glob
+from taurus import tauruscustomsettings as __S
+
+icon_dir = os.path.join(os.path.dirname(os.path.abspath(__icon.__file__)))
+# TODO: get .path file glob pattern from tauruscustomsettings
+__icon.registerPathFiles(glob.glob(os.path.join(icon_dir,'*.path')))
+# TODO: get theme name and path from tauruscustomsettings
+__icon.registerTheme(name=getattr(__S, 'QT_THEME_NAME', 'Tango'),
+                     path=getattr(__S, 'QT_THEME_DIR', ''),
+                     force=getattr(__S, 'QT_THEME_FORCE_ON_LINUX', False))
+
+del os, glob, __icon, icon_dir
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/application/__init__.py b/lib/taurus/qt/qtgui/application/__init__.py
index ad39dcd..7723914 100644
--- a/lib/taurus/qt/qtgui/application/__init__.py
+++ b/lib/taurus/qt/qtgui/application/__init__.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides the base :class:`taurus.qt.qtgui.application.TaurusApplication` 
+"""This module provides the base :class:`taurus.qt.qtgui.application.TaurusApplication`
 class."""
 
 __docformat__ = 'restructuredtext'
diff --git a/lib/taurus/qt/qtgui/application/taurusapplication.py b/lib/taurus/qt/qtgui/application/taurusapplication.py
index b123bd7..b3d9f8a 100644
--- a/lib/taurus/qt/qtgui/application/taurusapplication.py
+++ b/lib/taurus/qt/qtgui/application/taurusapplication.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -82,8 +82,8 @@ class STD(Logger):
             # while there is no new line, just accumulate the buffer
             msgl = len(msg)
             if msgl > 0 and \
-               (msg[-1] == '\n' or msg.index('\n') >= 0 or \
-                msgl >= self.FlushWaterMark):
+               (msg[-1] == '\n' or msg.index('\n') >= 0 or
+                    msgl >= self.FlushWaterMark):
                 self.flush()
         except ValueError:
             pass
@@ -100,8 +100,8 @@ class STD(Logger):
             buff = self.buffer
             if buff is None or len(buff) == 0:
                 return
-            #take the '\n' because the output is a list of strings, each to be
-            #interpreted as a separate line in the client
+            # take the '\n' because the output is a list of strings, each to be
+            # interpreted as a separate line in the client
             if buff[-1] == '\n':
                 buff = buff[:-1]
             if self.log_handlers:
@@ -229,7 +229,8 @@ class TaurusApplication(Qt.QApplication, Logger):
                 parser._add_version_option()
 
         p, opt, args = \
-            taurus.core.util.argparse.init_taurus_args(parser=parser, args=args[0][1:])
+            taurus.core.util.argparse.init_taurus_args(
+                parser=parser, args=args[0][1:])
 
         self._cmd_line_parser = p
         self._cmd_line_options = opt
@@ -327,7 +328,7 @@ class TaurusApplication(Qt.QApplication, Logger):
             if log_file_name is None:
                 log_file_name = self.__buildLogFileName()
             f_h = logging.handlers.RotatingFileHandler(log_file_name,
-                maxBytes=maxBytes, backupCount=backupCount)
+                                                       maxBytes=maxBytes, backupCount=backupCount)
             Logger.addRootLogHandler(f_h)
             if self._out is not None:
                 self._out.std = sys.__stdout__
@@ -341,3 +342,14 @@ class TaurusApplication(Qt.QApplication, Logger):
                          log_file_name)
             self.debug("Error description", exc_info=1)
 
+    @staticmethod
+    def exec_(*args, **kwargs):
+        # TODO: substitute this ugly hack by some more general mechanism
+        try:
+            ret = Qt.QApplication.exec_(*args, **kwargs)
+        except TypeError:
+            ret = Qt.QApplication.exec_(*args)
+        from taurus.core.util.log import _DEPRECATION_COUNT
+        from taurus import info
+        info('\n*********************\n%s', _DEPRECATION_COUNT.pretty())
+        return ret
diff --git a/lib/taurus/qt/qtgui/base/__init__.py b/lib/taurus/qt/qtgui/base/__init__.py
index 6caebb3..fbf5f86 100644
--- a/lib/taurus/qt/qtgui/base/__init__.py
+++ b/lib/taurus/qt/qtgui/base/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,4 +30,3 @@ __docformat__ = 'restructuredtext'
 
 from .taurusbase import *
 from .tauruscontroller import *
-from .taurusqattribute import *
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py
index 3ee23e5..0b76502 100644
--- a/lib/taurus/qt/qtgui/base/taurusbase.py
+++ b/lib/taurus/qt/qtgui/base/taurusbase.py
@@ -3,40 +3,40 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides the set of base classes from which the Qt taurus widgets
 should inherit to be considered valid taurus widgets."""
 
-__all__ = ["TaurusBaseComponent", "TaurusBaseWidget", "TaurusBaseWritableWidget"]
+__all__ = ["TaurusBaseComponent", "TaurusBaseWidget",
+           "TaurusBaseWritableWidget"]
 
 __docformat__ = 'restructuredtext'
 
 import sys
 import threading
 
-import PyTango
-
 from taurus.external.qt import Qt
+from taurus.external.enum import Enum
 
 import taurus
 from taurus.core.util import eventfilters
@@ -49,72 +49,47 @@ from taurus.core.taurusconfiguration import (TaurusConfiguration,
 from taurus.core.tauruslistener import TaurusListener, TaurusExceptionListener
 from taurus.core.taurusoperation import WriteAttrOperation
 from taurus.core.util.eventfilters import filterEvent
+from taurus.core.util.log import deprecation_decorator
+from taurus.qt.qtcore.util.signal import baseSignal
 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
 
 DefaultNoneValue = "-----"
 
-TTANGO_TO_TQT = {
-    str                        : 'QString',
-    int                        : 'int',
-    long                       : 'long',
-    float                      : 'float',
-    bool                       : 'bool',
-    list                       : 'QList',
-    tuple                      : 'QList',
-    dict                       : 'QMap',
-    PyTango.ArgType.DevDouble          : 'float',
-    PyTango.ArgType.DevFloat           : 'float',
-    PyTango.ArgType.DevLong            : 'int',
-    PyTango.ArgType.DevShort           : 'int',
-    PyTango.ArgType.DevBoolean         : 'bool',
-    PyTango.ArgType.DevUChar           : 'int',
-    PyTango.ArgType.DevState           : 'int',
-    PyTango.ArgType.DevString          : 'QString',
-    PyTango.ArgType.DevULong           : 'int',
-    PyTango.ArgType.DevLong64          : 'long',
-    PyTango.ArgType.DevULong64         : 'long',
-    PyTango.ArgType.DevUShort          : 'int',
-    PyTango.ArgType.DevVarBooleanArray : 'QList',
-    PyTango.ArgType.DevVarCharArray    : 'QList',
-    PyTango.ArgType.DevVarDoubleArray  : 'QList',
-    PyTango.ArgType.DevVarFloatArray   : 'QList',
-    PyTango.ArgType.DevVarLongArray    : 'QList',
-    PyTango.ArgType.DevVarLong64Array  : 'QList',
-    PyTango.ArgType.DevVarShortArray   : 'QList',
-    PyTango.ArgType.DevVarStringArray  : 'QList',
-    PyTango.ArgType.DevVarULongArray   : 'QList',
-    PyTango.ArgType.DevVarUShortArray  : 'QList',
-}
 
 class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
     """A generic Taurus component.
-       
-       .. note:: 
+
+       .. note::
            Any class which inherits from TaurusBaseComponent is expected to also
-           inherit from QObject (or from a QObject derived class) If this is not
-           fullfilled, at least the class should reimplement the :meth:`getSignaller`
-           method to return a QObject to be used for emitting and connecting
-           signals.
+           inherit from QObject (or from a QObject derived class).
+       .. note::
+           :meth:`getSignaller` is now unused and deprecated. This is because
+           `taurusEvent` is implemented using :func:`baseSignal`, that doesn't
+           require the class to inherit from QObject.
+
     """
     _modifiableByUser = False
     _showQuality = True
     _eventBufferPeriod = 0
-    
+
+    taurusEvent = baseSignal('taurusEvent', object, object, object)
+
     def __init__(self, name, parent=None, designMode=False):
         """Initialization of TaurusBaseComponent"""
         self.modelObj = None
         self.modelName = ''
+        self.modelFragmentName = None
         self.noneValue = DefaultNoneValue
         self._designMode = designMode
         self.call__init__(TaurusListener, name, parent)
-        
+
         BaseConfigurableClass.__init__(self)
-        
+
         self.taurusMenu = None
         self.taurusMenuData = ''
-        
+
         # attributes storing property values
         self._localModelName = ''
         self._useParentModel = False
@@ -129,27 +104,25 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
         self._operations = []
         self._modelInConfig = False
         self._autoProtectOperation = True
-        
+
         self._bufferedEvents = {}
         self._bufferedEventsTimer = None
         self.setEventBufferPeriod(self._eventBufferPeriod)
-        
-        if parent != None and hasattr(parent, "_exception_listener"):
+
+        if parent is not None and hasattr(parent, "_exception_listener"):
             self._exception_listener = parent._exception_listener
         else:
             self._exception_listener = set([TaurusExceptionListener()])
-        
-        #register configurable properties
-        self.registerConfigProperty(self.isModifiableByUser, self.setModifiableByUser, "modifiableByUser")
-        self.registerConfigProperty(self.getModelInConfig, self.setModelInConfig, "ModelInConfig")
+
+        # register configurable properties
+        self.registerConfigProperty(
+            self.isModifiableByUser, self.setModifiableByUser, "modifiableByUser")
+        self.registerConfigProperty(
+            self.getModelInConfig, self.setModelInConfig, "ModelInConfig")
         self.resetModelInConfig()
 
+    @deprecation_decorator(rel='4.0')
     def getSignaller(self):
-        '''
-        Reimplement this method if your derived class does not inherit from
-        QObject. The return value should be a permanent object capable of
-        emitting Qt signals. See :class:`TaurusImageItem` as an example
-        '''
         return self
 
     def deleteLater(self):
@@ -163,73 +136,81 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
     # Utility methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    
     def getTaurusManager(self):
-        """Returns the the taurus manager singleton. This is just a helper method.
+        """Returns the taurus manager singleton. This is just a helper method.
         It is the equivalent of doing::
-            
+
             import taurus
             manager = taurus.Manager()
-        
+
         :return: (taurus.core.taurusmanager.TaurusManager) the TaurusManager
         """
         return taurus.Manager()
-    
-    def getTaurusFactory(self, scheme=None):
-        """Returns the the taurus factory singleton for the given scheme.
+
+    def getTaurusFactory(self, scheme=''):
+        """Returns the taurus factory singleton for the given scheme.
         This is just a helper method. It is the equivalent of doing::
 
             import taurus
             factory = taurus.Factory(scheme)
-        
-        :param scheme: (str or None) the scheme. None defaults to 'tango'.
-        
+
+        :param scheme: (str or None) the scheme. If scheme is an empty string,
+                       or is not passed, the scheme will be obtained from the
+                       model name. For backwards compatibility (but deprecated),
+                       passing None is equivalent to 'tango'.
+
         :return: (taurus.core.taurusfactory.TaurusFactory) the TaurusFactory
         """
+        if scheme == '':
+            scheme = taurus.getSchemeFromName(self.getModelName() or '')
+        if scheme is None:
+            scheme = 'tango'
+
         return taurus.Factory(scheme)
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Popup menu behavior
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def contextMenuEvent(self, event):
         """Handle the popup menu event
-        
+
         :param event: the popup menu event
         """
         if self.taurusMenu is not None:
             self.taurusMenu.exec_(event.globalPos())
         else:
             event.ignore()
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Mandatory methods to be implemented in subclass implementation
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
 
     def updateStyle(self):
-        """Method called when the component detects an event that triggers a 
+        """Method called when the component detects an event that triggers a
         change in the style.
         Default implementation doesn't do anything. Overwrite when necessary
         """
         pass
 
     def getParentTaurusComponent(self):
-        """ Returns a parent Taurus component or None if no parent 
+        """ Returns a parent Taurus component or None if no parent
         :class:`taurus.qt.qtgui.base.TaurusBaseComponent` is found.
-        
+
         :raises: RuntimeError
         """
-        raise RuntimeError("Not allowed to call TaurusBaseComponent::getParentTaurusComponent()")
-    
+        raise RuntimeError(
+            "Not allowed to call TaurusBaseComponent::getParentTaurusComponent()")
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Event handling chain
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def setEventBufferPeriod(self, period):
         '''Set the period at wich :meth:`fireBufferedEvents` will be called.
-        If period is 0, the event buffering is disabled (i.e., events are fired 
-        as soon as they are received) 
-        
+        If period is 0, the event buffering is disabled (i.e., events are fired
+        as soon as they are received)
+
         :param period: (float) period in seconds for the automatic event firing.
                     period=0 will disable the event buffering.
         '''
@@ -238,95 +219,92 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
             if self._bufferedEventsTimer is not None:
                 self._bufferedEventsTimer.stop()
                 self._bufferedEventsTimer = None
-                self.fireBufferedEvents() #flush the buffer
+                self.fireBufferedEvents()  # flush the buffer
         else:
             self._eventsBufferLock = threading.RLock()
-            self._bufferedEventsTimer = Timer(period, self.fireBufferedEvents, 
+            self._bufferedEventsTimer = Timer(period, self.fireBufferedEvents,
                                               self)
             self._bufferedEventsTimer.start()
-            
+
     def getEventBufferPeriod(self):
-        '''Returns the event buffer period 
-        
+        '''Returns the event buffer period
+
         :return: (float) period (in s). 0 means event buffering is disabled.
-        ''' 
+        '''
         return self._eventBufferPeriod
 
     def eventReceived(self, evt_src, evt_type, evt_value):
         """The basic implementation of the event handling chain is as
         follows:
-               
+
             - eventReceived just calls :meth:`fireEvent` which emits a "taurusEvent"
               PyQt signal that is connected (by :meth:`preAttach`) to the
               :meth:`filterEvent` method.
             - After filtering, :meth:`handleEvent` is invoked with the resulting
               filtered event
-        
+
         .. note::
             in the earlier steps of the chain (i.e., in :meth:`eventReceived`/
-            :meth:`fireEvent`), the code is executed in a Python thread, while 
+            :meth:`fireEvent`), the code is executed in a Python thread, while
             from eventFilter ahead, the code is executed in a Qt thread.
             When writing widgets, one should normally work on the Qt thread
             (i.e. reimplementing :meth:`handleEvent`)
-            
+
         :param evt_src: (object) object that triggered the event
         :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType) type of event
         :param evt_value: (object) event value
         """
-        evt = filterEvent(evt_src, evt_type, evt_value, 
+        evt = filterEvent(evt_src, evt_type, evt_value,
                           filters=self._preFilters)
         if evt is not None:
             self.fireEvent(*evt)
-        
+
     def fireEvent(self, evt_src=None, evt_type=None, evt_value=None):
         """Emits a "taurusEvent" signal.
         It is unlikely that you need to reimplement this method in subclasses.
-        Consider reimplementing :meth:`eventReceived` or :meth:`handleEvent` 
-        instead depending on whether you need to execute code in the python 
+        Consider reimplementing :meth:`eventReceived` or :meth:`handleEvent`
+        instead depending on whether you need to execute code in the python
         or Qt threads, respectively
 
         :param evt_src: (object or None) object that triggered the event
-        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) 
+        :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None)
                          type of event
         :param evt_value: (object or None) event value
         """
         if self._eventBufferPeriod:
             # If we have an active event buffer delay, store the event...
             with self._eventsBufferLock:
-                self._bufferedEvents[(evt_src, evt_type)] =  (evt_src, evt_type, 
-                                                              evt_value) 
+                self._bufferedEvents[(evt_src, evt_type)] = (evt_src, evt_type,
+                                                             evt_value)
         else:
             # if we are not buffering, directly emit the signal
-            try: 
-                self.getSignaller().emit(Qt.SIGNAL('taurusEvent'), 
-                                         evt_src, evt_type, evt_value)
-            except: 
-                pass #self.error('%s.fireEvent(...) failed!'%type(self))
-            
+            try:
+                self.taurusEvent.emit(evt_src, evt_type, evt_value)
+            except:
+                pass  # self.error('%s.fireEvent(...) failed!'%type(self))
+
     def fireBufferedEvents(self):
         '''Fire all events currently buffered (and flush the buffer)
-        
+
         Note: this method is normally called from an event buffer timer thread
               but it can also be called any time the buffer needs to be flushed
         '''
-        signaller = self.getSignaller()
         with self._eventsBufferLock:
             for evt in self._bufferedEvents.values():
-                signaller.emit(Qt.SIGNAL('taurusEvent'), *evt)
+                self.taurusEvent.emit(*evt)
             self._bufferedEvents = {}
-        
-        
+
     def filterEvent(self, evt_src=-1, evt_type=-1, evt_value=-1):
         """The event is processed by each and all filters in strict order
         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.taurusbasetypes.TaurusEventType) type of event
         :param evt_value: (object) event value
         """
         evt = evt_src, evt_type, evt_value
-        
-        if evt == (-1,-1,-1):
+
+        if evt == (-1, -1, -1):
             # @todo In an ideal world the signature of this method should be
             # (evt_src, evt_type, evt_value). However there's a bug in PyQt:
             # If a signal is disconnected between the moment it is emitted and
@@ -335,7 +313,7 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
             # this is the case without printing an error message each time.
             # If this gets fixed, we should remove this line.
             return
-        
+
         evt = filterEvent(*evt, filters=self._eventFilters)
         if evt is not None:
             self.handleEvent(*evt)
@@ -343,13 +321,13 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
     def handleEvent(self, evt_src, evt_type, evt_value):
         """Event handling. Default implementation does nothing.
         Reimplement as necessary
-        
+
         :param evt_src: (object or None) object that triggered the event
         :param evt_type: (taurus.core.taurusbasetypes.TaurusEventType or None) type of event
         :param evt_value: (object or None) event value
         """
         pass
-        
+
     def setEventFilters(self, filters=None, preqt=False):
         """sets the taurus event filters list.
         The filters are run in order, using each output to feed the next filter.
@@ -357,105 +335,106 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
         If the event is to be ignored, the filter must return None.
         If the event is  not to be ignored, filter must return a
         ``(evt_src, evt_type, evt_value)`` tuple which may (or not) differ from the input.
-        
+
         For a library of common filters, see taurus/core/util/eventfilters.py
-        
+
         :param filters: (sequence) a sequence of filters
         :param preqt: (bool) If true, set the pre-filters (that are applied in
                       eventReceived, at the python thread),
                       otherwise, set the filters to be applied at the main
                       Qt thread (default)
-        
+
         *Note*: If you are setting a filter that applies a transformation on
         the parameters, you may want to generate a fake event to force the last
         value to be filtered as well. This can be done as in this example::
-        
+
             TaurusBaseComponent.fireEvent( TaurusBaseComponent.getModelObj(),
                                         taurus.core.taurusbasetypes.TaurusEventType.Periodic,
                                         TaurusBaseComponent.getModelObj().getValueObj())
-        
+
         See also: insertEventFilter
         """
-        if filters is None: 
+        if filters is None:
             filters = []
         if preqt:
             self._preFilters = list(filters)
         else:
             self._eventFilters = list(filters)
-        
+
     def getEventFilters(self, preqt=False):
         """Returns the list of event filters for this widget
-        
-        :param preqt: (bool) If true, return the pre-filters (that are applied 
+
+        :param preqt: (bool) If true, return the pre-filters (that are applied
                       in eventReceived, at the python thread),
                       otherwise, return the filters to be applied at the main
                       Qt thread (default)
-        
+
         :return: (sequence<callable>) the event filters
         """
         return (self._preFilters if preqt else self._eventFilters)
-    
+
     def insertEventFilter(self, filter, index=-1, preqt=False):
         """insert a filter in a given position
-        
+
         :param filter: (callable(evt_src, evt_type, evt_value)) a filter
         :param index: (int) index to place the filter (default = -1 meaning place at the end)
         :param preqt: (bool) If true, set the pre-filters (that are applied in
                       eventReceived, at the python thread),
                       otherwise, set the filters to be applied at the main
                       Qt thread (default)
-        
-        
+
+
         See also: setEventFilters
         """
         if preqt:
             self._preFilters.insert(index, filter)
         else:
             self._eventFilters.insert(index, filter)
-    
-    def setPaused(self, paused = True):
+
+    def setPaused(self, paused=True):
         """Toggles the pause mode.
-        
+
         :param paused: (bool) whether or not to pause (default = True)
         """
-        if paused == self._isPaused: return #nothing to do
-        if paused:  #pausing
+        if paused == self._isPaused:
+            return  # nothing to do
+        if paused:  # pausing
             self.insertEventFilter(eventfilters.IGNORE_ALL, 0)
             self.debug('paused')
-        else:   #unpausing
+        else:  # unpausing
             try:
                 self._eventFilters.remove(eventfilters.IGNORE_ALL)
-                self.debug('Unpaused')  
+                self.debug('Unpaused')
             except ValueError:
                 self.warning('Unpause failed')
         self._isPaused = paused
-        
+
     def isPaused(self):
         """Return the current pause state
-        
+
         :return: (bool) wheater or not the widget is paused
         """
         return self._isPaused
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Model class methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getModelClass(self):
         """Return the class object for the widget.
-        Default behavior is to do a 'best effort' to determine which model 
+        Default behavior is to do a 'best effort' to determine which model
         type corresponds to the current model name.
         Overwrite as necessary.
-        
-        :return: (class TaurusModel or None) The class object corresponding to the type 
+
+        :return: (class TaurusModel or None) The class object corresponding to the type
                  of Taurus model this widget handles or None if no valid class is found.
         """
         return self.findModelClass()
-    
+
     def findModelClass(self):
-        """Do a "best effort" to determine which model type corresponds to the 
+        """Do a "best effort" to determine which model type corresponds to the
         given model name.
-        
+
         :return: (class TaurusModel or None) The class object corresponding to the type
                  of Taurus model this widget handles or None if no valid class is found.
         """
@@ -463,22 +442,22 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
             return self._findRelativeModelClass(self.getModel())
         else:
             return self._findAbsoluteModelClass(self.getModel())
-        
+
     def _findAbsoluteModelClass(self, absolute_name):
         return taurus.Manager().findObjectClass(absolute_name)
-        
+
     def _findRelativeModelClass(self, relative_name):
         parent_widget = self.getParentTaurusComponent()
         if parent_widget is None:
             return None
-        
+
         parent_obj = parent_widget.getModelObj()
         if parent_obj is None:
             return None
-        
+
         if relative_name is None or len(relative_name) == 0:
             return parent_widget.getModelClass()
-        
+
         obj = parent_obj.getChildObj(relative_name)
         if obj is None:
             return None
@@ -490,37 +469,55 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Model related methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def setModelName(self, modelName, parent=None):
-        """This method will detach from the previous taurus model (if any), it 
-        will set the new model to the given modelName and it will attach 
+        """This method will detach from the previous taurus model (if any), it
+        will set the new model to the given modelName and it will attach
         this component to the new taurus model.
-        
+
         :param modelName: (str) the new taurus model name (according to the taurus convention)
-        :param parent: (TaurusBaseComponent) the parent or None (default) if this 
+        :param parent: (TaurusBaseComponent) the parent or None (default) if this
                        component does not have a parent Taurus component
         """
         modelName = str(modelName)
         if parent:
             modelClass = self.getModelClass()
-            if not modelClass is None:
+            if modelClass is not None:
                 parent_model = self.getParentModelObj()
                 modelName = modelClass.buildModelName(parent_model, modelName)
         self._detach()
         self.modelName = modelName
+        # update modelFragmentName
+        try:
+            scheme = self.getTaurusManager().getScheme(modelName)
+            factory = taurus.Factory(scheme)
+            v = factory.getAttributeNameValidator()
+            self.modelFragmentName = v.getUriGroups(self.modelName)['fragment']
+        except (AttributeError, TypeError):
+            self.modelFragmentName = None
         self._attach()
-    
+
     def getModelName(self):
         """Returns the current model name.
-            
+
         :return: (str) the model name
         """
         return self.modelName
 
+    def getFullModelName(self):
+        """Returns the full name of the current model object.
+
+        :return: (str) the model name
+        """
+        obj = self.getModelObj()
+        if obj is None:
+            return None
+        return obj.getFullName()
+
     def getParentModelName(self):
         """Returns the parent model name or an empty string if the component
         has no parent
-            
+
         :return: (str) the parent model name
         """
         try:
@@ -532,9 +529,9 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
         return p.getModelName()
 
     def getParentModelObj(self):
-        """Returns the parent model object or None if the component has no 
+        """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.TaurusModel or None) the parent taurus model object
         """
         try:
@@ -544,19 +541,19 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
         except:
             return None
         return p.getModelObj()
-    
+
     def getModelObj(self):
-        """Returns the taurus model obj associated with this component or None if 
+        """Returns the taurus model obj associated with this component or None if
         no taurus model is associated.
-            
+
         :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 
+        """Returns the taurus model type associated with this component or
         taurus.core.taurusbasetypes.TaurusElementType.Unknown if no taurus model is associated.
-            
+
         :return: (taurus.core.taurusbasetypes.TaurusElementType) the taurus model type
         """
         model_obj = self.getModelObj()
@@ -564,100 +561,129 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
             return TaurusElementType.Unknown
         return model_obj.getTaurusElementType()
 
-    def getModelValueObj(self,cache=True):
-        """Returns the tango obj value associated with this component or None 
+    def getModelValueObj(self, cache=True):
+        """Returns the tango obj value associated with this component or None
         if no taurus model is associated.
-            
-        :param cache: (bool) if set to True (default) use the cache value. If set to 
+
+        :param cache: (bool) if set to True (default) use the cache value. If set to
                       False will force a connection to the server.
-            
-        :return: (PyTango.DeviceAttribute) the tango value object.
+
+        :return: (TaurusAttrValue) the tango value object.
         """
         if self.modelObj is None:
             return None
         return self.modelObj.getValueObj(cache=cache)
-        
-    def getFormatedToolTip(self,cache=True):
+
+    def getModelFragmentObj(self, fragmentName=None):
+        """Returns a fragment object of the model. A fragment of a model is a
+        python attribute of the model object.
+
+        Fragment names including dots will be used to recursively get fragments
+        of fragments.
+
+        For a simple fragmentName (no dots), this is roughly equivalent to
+        getattr(self.getModelObj(), fragmentName)
+
+        If the model does not have that fragment, :class:`AttributeError` is
+        raised (other exceptions may be raised when accessing the fragment as
+        well)
+
+        :param fragmentName: (str or None) the returned value will correspond to
+                         the given fragmentName. If None passed,
+                         self.modelFragmentName will be used, and if None is
+                         set, the defaultFragmentName of the model will be used
+                         instead.
+
+        :return: (obj) the member of the modelObj referred by the fragment.
+        """
+        if fragmentName is None:  # no fragmentName passed in kwargs
+            fragmentName = self.modelFragmentName
+        return self.modelObj.getFragmentObj(fragmentName)
+
+    def getFormatedToolTip(self, cache=True):
         """Returns a string with contents to be displayed in a tooltip.
-            
-        :param cache: (bool) if set to True (default) use the cache value. If set to 
+
+        :param cache: (bool) if set to True (default) use the cache value. If set to
                       False will force a connection to the server.
-            
+
         :return: (str) a tooltip
         """
         if self.modelObj is None:
             return self.getNoneValue()
         obj = self.modelObj.getDisplayDescrObj()
         return self.toolTipObjToStr(obj)
-    
+
     def toolTipObjToStr(self, toolTipObj):
         """Converts a python dict to a tooltip string.
-        
+
         :param toolTipObj: (dict) a python object
-        
+
         :return: (str) a tooltip
         """
         if toolTipObj is None:
             return self.getNoneValue()
         ret = '<TABLE width="500" border="0" cellpadding="1" cellspacing="0">'
-        
-        for id,value in toolTipObj:
-            ret += '<TR><TD WIDTH="80" ALIGN="RIGHT" VALIGN="MIDDLE"><B>%s:</B></TD><TD>%s</TD></TR>' % (id.capitalize(), value)
+
+        for id, value in toolTipObj:
+            ret += '<TR><TD WIDTH="80" ALIGN="RIGHT" VALIGN="MIDDLE"><B>%s:</B></TD><TD>%s</TD></TR>' % (
+                id.capitalize(), value)
         ret += '</TABLE>'
         return ret
-    
+
     def displayValue(self, v):
         """Returns a string representation of the given value
-        
+
         :param v: (object) the value to be translated to string
-        
+
         :return: (str) a string representing the given value
         """
-        if self.modelObj is None:
-            return str(v)
-        ret = self.modelObj.displayValue(v)
-        if ret is None: ret = self.getNoneValue()
-        return ret
-        
-    def getDisplayValue(self, cache=True):
+        if isinstance(v, Enum):
+            return v.name
+        return str(v)
+
+    def getDisplayValue(self, cache=True, fragmentName=None):
         """Returns a string representation of the model value associated with
         this component.
-            
-        :param cache: (bool) if set to True (default) use the cache value. If set to 
-                      False will force a connection to the server.
+
+        :param cache: (bool) (ignored, just for bck-compat).
+        :param fragmentName: (str or None) the returned value will correspond to
+                         the given fragmentName. If None passed,
+                         self.modelFragmentName will be used, and if None is
+                         set, the defaultFragmentName of the model will be used
+                         instead.
 
         :return: (str) a string representation of the model value.
-        """        
+        """
         if self.modelObj is None:
             return self.getNoneValue()
-        
-        ret = self.modelObj.getDisplayValue(cache)
-        if ret is None:
+        try:
+            v = self.getModelFragmentObj(fragmentName=fragmentName)
+        except:
             return self.getNoneValue()
-        return ret
+        return self.displayValue(v)
 
     def setNoneValue(self, v):
         """Sets the new string representation when no model or no model value exists.
-            
+
         :param v: (str) the string representation for an invalid value
         """
         self.noneValue = v
-        
+
     def getNoneValue(self):
         """Returns the current string representation when no valid model or model value exists.
-            
+
         :return: (str) a string representation for an invalid value
         """
         return self.noneValue
-    
+
     def isChangeable(self):
-        """Tells if this component value can be changed by the user. Default implementation 
+        """Tells if this component value can be changed by the user. Default implementation
         will return True if and only if:
-        
+
             - this component is attached to a valid taurus model and
             - the taurus model is writable and
             - this component is not read-only
-            
+
         :return: (bool) True if this component value can be changed by the user or False otherwise
         """
         res = False
@@ -665,72 +691,78 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
             res = self.modelObj.isWritable()
         res = res and not self.isReadOnly()
         return res
-    
+
     def isReadOnly(self):
         """Determines if this component is read-only or not in the sense that the
         user can interact with it. Default implementation returns True.
-        
+
         Override when necessary.
-        
+
         :return: (bool) whether or not this component is read-only
         """
         return True
-    
+
     def isAttached(self):
         """Determines if this component is attached to the taurus model.
-           
+
         :return: (bool) True if the component is attached or False otherwise.
         """
         return self._attached
-    
+
     def preAttach(self):
         """Called inside self.attach() before actual attach is performed.
         Default implementation just emits a signal.
-           
+
         Override when necessary.
         """
-        try: Qt.QObject.connect(self.getSignaller(), Qt.SIGNAL('taurusEvent'), self.filterEvent)
-        except: pass #self.error("In %s.preAttach() ... failed!" % str(type(self)))
+        try:
+            self.taurusEvent.connect(self.filterEvent)
+        except:
+            # self.error("In %s.preAttach() ... failed!" % str(type(self)))
+            pass
 
     def postAttach(self):
         """Called inside self.attach() after actual attach is performed.
         Default implementation does not do anything.
-           
+
         Override when necessary.
         """
         pass
-    
+
     def preDetach(self):
         """Called inside self.detach() before actual deattach is performed.
         Default implementation just disconnects a signal.
-           
+
         Override when necessary.
         """
-        try: Qt.QObject.disconnect(self.getSignaller(), Qt.SIGNAL('taurusEvent'), self.filterEvent)
-        except: pass #self.error("In %s.preDetach() ... failed!" % str(type(self)))
+        try:
+            self.taurusEvent.disconnect(self.filterEvent)
+        except:
+            # self.error("In %s.preDetach() ... failed!" % str(type(self)))
+            pass
 
-        
     def postDetach(self):
         """Called inside self.detach() after actual deattach is performed.
         Default implementation does not do anything.
-        
+
         Override when necessary.
         """
         pass
-    
+
     def _attach(self):
         """Attaches the component to the taurus model.
-        In general it should not be necessary to overwrite this method in a subclass.
-        
+        In general it should not be necessary to overwrite this method in a
+        subclass.
+
         :return: (bool) True if success in attachment or False otherwise.
         """
         if self.isAttached():
             return self._attached
-        
+
         self.preAttach()
-        
+
         cls = self.getModelClass()
-        
+
         if cls is None:
             self._attached = False
             #self.trace("Failed to attach: Model class not found")
@@ -740,28 +772,29 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
         else:
             try:
                 self.modelObj = taurus.Manager().getObject(cls, self.modelName)
-                if not self.modelObj is None:
+                if self.modelObj is not None:
                     self.modelObj.addListener(self)
                     self._attached = True
                     self.changeLogName(self.log_name + "." + self.modelName)
             except Exception:
                 self.modelObj = None
                 self._attached = False
-                self.debug("Exception occured while trying to attach '%s'" % self.modelName)
+                self.debug(
+                    "Exception occured while trying to attach '%s'" % self.modelName)
                 self.traceback()
-                
+
         self.postAttach()
         return self._attached
-    
+
     def _detach(self):
         """Detaches the component from the taurus model"""
         self.preDetach()
-        
+
         if self.isAttached():
             m = self.getModelObj()
             if not m is None:
                 m.removeListener(self)
-            
+
             pos = self.log_name.find('.')
             if pos >= 0:
                 new_log_name = self.log_name[:self.log_name.rfind('.')]
@@ -776,33 +809,33 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
         '''
         Sets whether the model-related properties should be stored for this
         widget when creating the config dict with :meth:`createConfig` (and
-        restored when calling :meth:`applyConfig`). 
+        restored when calling :meth:`applyConfig`).
         By default this is not enabled.
         The following properties are affected by this:
         - "model"
-        
-        :param yesno: (bool) If True, the model-related properties will be 
+
+        :param yesno: (bool) If True, the model-related properties will be
                       registered as config properties. If False, they will be
                       unregistered.
-                      
+
         .. seealso:: :meth:`registerConfigProperty`, :meth:`createConfig`,
                      :meth:`applyConfig`
-        
-        ''' 
-        if yesno == self._modelInConfig: 
+
+        '''
+        if yesno == self._modelInConfig:
             return
         if yesno:
             self.registerConfigProperty(self.getModel, self.setModel, "model")
         else:
-            self.unregisterConfigurableItem("model",raiseOnError=False)
+            self.unregisterConfigurableItem("model", raiseOnError=False)
         self._modelInConfig = yesno
-    
+
     def getModelInConfig(self):
         return self._modelInConfig
-    
+
     def resetModelInConfig(self):
         return self.setModelInConfig(False)
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Pending operations related methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
@@ -811,8 +844,8 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
         """Applies operations without caring about danger messages.
         Use :meth:`TaurusBaseWidget.safeApplyOperation` if you want to warn the
         user before applying
-        
-        :param ops: (sequence<taurus.core.taurusoperation.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")
@@ -821,119 +854,117 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
 
         if self.isAutoProtectOperation():
             import taurus.qt.qtgui.dialog
+
             @taurus.qt.qtgui.dialog.protectTaurusMessageBox
             def go():
                 self.getTaurusManager().applyPendingOperations(ops)
             go()
         else:
             self.getTaurusManager().applyPendingOperations(ops)
-        
+
     def hasPendingOperations(self):
         """Returns if the component has pending operations
-        
+
         :return: (bool) True if there are pending operations or False otherwise
         """
         return len(self.getPendingOperations()) > 0
-   
+
     def getPendingOperations(self):
         """Returns the sequence of pending operations
-        
+
         :return:  (sequence<taurus.core.taurusoperation.TaurusOperation>) a list of pending operations
         """
         return self._operations
-    
+
     def resetPendingOperations(self):
         """Clears the list of pending operations"""
         self._operations = []
-    
+
     def setDangerMessage(self, dangerMessage=""):
-        """Sets the danger message when applying an operation. If dangerMessage is None, 
+        """Sets the danger message when applying an operation. If dangerMessage is None,
         the apply operation is considered safe
-        
+
         :param dangerMessage: (str or None) the danger message. If None is given (default)
                               the apply operation is considered safe
         """
         self._dangerMessage = dangerMessage
         self._isDangerous = len(dangerMessage) > 0
-    
+
     def getDangerMessage(self):
         """Returns the current apply danger message or None if the apply operation is safe
-        
+
         :return: (str or None) the apply danger message
         """
         return self._dangerMessage
-        
+
     def resetDangerMessage(self):
         """Clears the danger message. After this method is executed the apply operation
         for this component will be considered safe."""
         self.setDangerMessage(None)
-        
+
     def isDangerous(self):
         """Returns if the apply operation for this component is dangerous
-        
+
         :return: (bool) wheter or not the apply operation for this component is dangerous
         """
         return self._isDangerous
-        
+
     def setForceDangerousOperations(self, yesno):
         """Forces/clears the dangerous operations
-        
+
         :param yesno: (bool) force or not the dangerous operations"""
         self._forceDangerousOperations = yesno
-        
+
     def getForceDangerousOperations(self):
         """Returns if apply dangerous operations is forced
-        
+
         :return: (bool) wheter or not apply dangerous operations is forced
         """
         return self._forceDangerousOperations
-        
+
     def resetForceDangerousOperations(self):
         """Clears forcing apply dangerous operations"""
         self.setForceDangerousOperations(False)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Standard Qt properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getModel(self):
         """Returns the model name for this component.
-            
+
         :return: (str) the model name.
         """
         return self._localModelName
-    
-    def setModel(self,model):
+
+    def setModel(self, model):
         """Sets/unsets the model name for this component
-        
+
         :param model: (str) the new model name"""
         self.setModelCheck(model)
         self.updateStyle()
 
-    def setModelCheck(self,model,check=True):
+    def setModelCheck(self, model, check=True):
         """Sets the component taurus model. Setting the check argument to True
         (default) will check if the current model is equal to the given argument.
         If so then nothing is done. This should be the standard way to call this
         method since it will avoid recursion.
-        
+
         :param model: (str) the new model name
-        :param check: (bool) whether or not to check against the actual model name""" 
-        if model is None: model = ''
+        :param check: (bool) whether or not to check against the actual model name"""
+        if model is None:
+            model = ''
         model = str(model)
         if check == True and model == self._localModelName:
             return
-        
+
         self._localModelName = model
-        
-#        # if in offline mode don't bother trying to register
-#        opMode = taurus.core.taurusmanager.TaurusManager().getOperationMode()
-#        if opMode == taurus.core.taurusbasetypes.OperationMode.OFFLINE:
-#            return
 
         parent_widget = None
         try:
-            # if this widget has a buddy, check to see if it is a valid TaurusWidget
-            buddy_func = getattr(self,'buddy')
+            # if this widget has a buddy, check to see if it is a valid
+            # TaurusWidget
+            buddy_func = getattr(self, 'buddy')
             buddy_widget = buddy_func()
             if buddy_widget and isinstance(buddy_widget, TaurusBaseComponent):
                 parent_widget = buddy_widget
@@ -944,39 +975,39 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
                 parent_widget = self.getParentTaurusComponent()
         self.setModelName(model, parent_widget)
         #self.fireEvent(self.getModelObj(), taurus.core.taurusbasetypes.TaurusEventType.Change, self.getModelValueObj())
-    
+
     def resetModel(self):
         """Sets the model name to the empty string"""
         self.setModel('')
-    
+
     def getUseParentModel(self):
         """Returns whether this component is using the parent model
-        
+
         :return: (bool) True if using parent model or False otherwise
         """
         return getattr(self, '_useParentModel', False)
-    
-    @Qt.pyqtSignature("setUseParentModel(bool)")
+
+    @Qt.pyqtSlot(bool)
     def setUseParentModel(self, yesno):
         """Sets/unsets using the parent model
-        
+
         :param yesno: (bool) whether or not to use parent model
         """
         if yesno == self._useParentModel:
             return
         self._useParentModel = yesno
         # force a recalculation of the model
-        self.setModelCheck(self.getModel(),False)
+        self.setModelCheck(self.getModel(), False)
 
     def resetUseParentModel(self):
         """Resets the usage of parent model to False"""
         self.setUseParentModel(False)
         self.updateStyle()
 
-    @Qt.pyqtSignature("setShowQuality(bool)")
-    def setShowQuality(self,showQuality):
+    @Qt.pyqtSlot(bool)
+    def setShowQuality(self, showQuality):
         """Sets/unsets the show quality property
-        
+
         :param showQuality: (bool) whether or not to show the quality
         """
         if showQuality == self._showQuality:
@@ -986,7 +1017,7 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
 
     def getShowQuality(self):
         """Returns if showing the quality as a background color
-        
+
         :return: (bool) True if showing the quality or False otherwise
         """
         return self._showQuality
@@ -995,21 +1026,22 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
         """Resets the show quality to self.__class__._showQuality"""
         self.setShowQuality(self.__class__._showQuality)
 
-    @Qt.pyqtSignature("setShowText(bool)")
+    @Qt.pyqtSlot(bool)
     def setShowText(self, showText):
         """Sets/unsets showing the display value of the model
-        
+
         :param showText: (bool) whether or not to show the display value
         """
         if showText == self._showText:
             return
         self._showText = showText
-        self.fireEvent(self.getModelObj(), TaurusEventType.Change, self.getModelValueObj())
+        self.fireEvent(self.getModelObj(), TaurusEventType.Change,
+                       self.getModelValueObj())
         self.updateStyle()
 
     def getShowText(self):
         """Returns if showing the display value
-        
+
         :return: (bool) True if showing the display value or False otherwise
         """
         return self._showText
@@ -1017,58 +1049,58 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
     def resetShowText(self):
         """Resets the showing of the display value to True"""
         self.setShowText(True)
-        
+
     def setTaurusPopupMenu(self, menuData):
         """Sets/unsets the taurus popup menu
-        
+
         :param menuData: (str) an xml representing the popup menu"""
         self.taurusMenuData = str(menuData)
         factory = ActionFactory()
         self.taurusMenu = factory.getNewMenu(self, self.taurusMenuData)
-    
+
     def getTaurusPopupMenu(self):
         """Returns an xml string representing the current taurus popup menu
-        
+
         :return: (str) an xml string representing the current taurus popup menu
         """
         return self.taurusMenuData
-  
+
     def resetTaurusPopupMenu(self):
         """Resets the taurus popup menu to empty"""
         self.taurusMenuData = ''
-        
+
     def isModifiableByUser(self):
         '''whether the user can change the contents of the widget
-        
+
         :return: (bool) True if the user is allowed to modify the look&feel'''
         return self._modifiableByUser
-    
+
     def setModifiableByUser(self, modifiable):
         '''
         sets whether the user is allowed to modify the look&feel
-        
+
         :param modifiable: (bool)
         '''
         self._modifiableByUser = modifiable
-    
+
     def resetModifiableByUser(self):
         '''Equivalent to setModifiableByUser(self.__class__._modifiableByUser)'''
         self.setModifiableByUser(self.__class__._modifiableByUser)
-    
+
     def resetAutoProtectOperation(self):
         """Resets protecting operations"""
         self.setAutoProtectOperation(True)
-        
+
     def isAutoProtectOperation(self):
         """Tells if this widget's operations are protected against exceptions
-        
+
         :return: (bool) True if operations are protected against exceptions or
                  False otherwise"""
         return self._autoProtectOperation
-    
+
     def setAutoProtectOperation(self, protect):
         """Sets/unsets this widget's operations are protected against exceptions
-        
+
         :param protect: wheater or not to protect widget operations
         :type protect: bool"""
         self._autoProtectOperation = protect
@@ -1076,40 +1108,43 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass):
 
 class TaurusBaseWidget(TaurusBaseComponent):
     """The base class for all Qt Taurus widgets.
-    
+
     .. note::
-        Any class which inherits from TaurusBaseWidget is expected to also 
+        Any class which inherits from TaurusBaseWidget is expected to also
         inherit from QWidget (or from a QWidget derived class)"""
-    
-    ModelChangedSignal = 'modelChanged(const QString &)'
+
+    modelChanged = baseSignal('modelChanged', 'QString')
+    valueChangedSignal = baseSignal('valueChanged')
+
     _dragEnabled = False
-    
+
     def __init__(self, name, parent=None, designMode=False):
         self._disconnect_on_hide = False
         self._supportedMimeTypes = None
         self._autoTooltip = True
-        self.call__init__(TaurusBaseComponent, name, parent=parent, designMode=designMode)
+        self.call__init__(TaurusBaseComponent, name,
+                          parent=parent, designMode=designMode)
         self._setText = self._findSetTextMethod()
-    
-    ## It makes the GUI to hang... If this needs implementing, we should
-    ## reimplement it using the Qt parent class, not QWidget...
-    #def destroy(self):
+
+    # It makes the GUI to hang... If this needs implementing, we should
+    # reimplement it using the Qt parent class, not QWidget...
+    # def destroy(self):
     #    '''Reimplements the Qt.QWidget destroy method to ensure that this object
     #    stops listening its model.'''
     #    self.setUseParentModel(False)
     #    self.resetModel()
     #    Qt.QWidget.destroy(self)
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Helper methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getQtClass(self, bases=None):
         """Returns the parent Qt class for this widget
-        
+
         :param bases: (sequence<class> or None) the list of class objects. If None
                       is given (default) it uses the object base classes from __bases__
-        
+
         :return: (QWidget class) the QWidget class object
         """
         bases = bases or self.__class__.__bases__
@@ -1122,22 +1157,22 @@ class TaurusBaseWidget(TaurusBaseComponent):
             elif is_taurusbasewidget:
                 return self.getQtClass(klass.__bases__)
         return None
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Qt properties from TaurusBaseComponent that need to be overwritten
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     _UseParentMsg = False
-    
-    @Qt.pyqtSignature("setUseParentModel(bool)")
+
+    @Qt.pyqtSlot(bool)
     def setUseParentModel(self, yesno):
         """Sets/unsets using the parent model.
-        
+
         .. note:: in some cases you may need to call :meth:`recheckTaurusParent`
                   after reparenting of some of this widget's ancestors
-        
+
         :param yesno: (bool) whether or not to use parent model
-        
+
         .. seealso:: :meth:`recheckTaurusParent`
         """
         is_same = yesno == self._useParentModel
@@ -1146,63 +1181,61 @@ class TaurusBaseWidget(TaurusBaseComponent):
             if yesno and self._designMode and not TaurusBaseWidget._UseParentMsg:
                 TaurusBaseWidget._UseParentMsg = True
                 Qt.QMessageBox.information(self, "UseParentModel usage note",
-                                         "Using the UseParentModel feature may require you to call "+\
-                                         "recheckTaurusParent() manually for this widget after calling " +\
-                                         "setupUi in your code."+\
-                                         "See the documentation of TaurusBaseWidget.recheckTaurusParent()")
+                                           "Using the UseParentModel feature may require you to call " +
+                                           "recheckTaurusParent() manually for this widget after calling " +
+                                           "setupUi in your code." +
+                                           "See the documentation of TaurusBaseWidget.recheckTaurusParent()")
         TaurusBaseComponent.setUseParentModel(self, yesno)
 
     def _updateUseParentModel(self, yesno):
         parent_widget = self.getParentTaurusComponent()
         if parent_widget:
             if yesno:
-                self.connect(parent_widget, 
-                             Qt.SIGNAL(TaurusBaseWidget.ModelChangedSignal), 
-                             self.parentModelChanged)
+                parent_widget.modelChanged.connect(self.parentModelChanged)
             else:
-                self.disconnect(parent_widget,
-                                Qt.SIGNAL(TaurusBaseWidget.ModelChangedSignal), 
-                                self.parentModelChanged)
-    
+                parent_widget.modelChanged.disconnect(self.parentModelChanged)
+
     def recheckTaurusParent(self):
         '''
         Forces the widget to recheck its Taurus parent. Taurus Widgets will in most
         situations keep track of changes in their taurus parenting, but in some
         special cases (which unfortunately tend to occur when using Qt
         Designer) they may not update it correctly.
-        
+
         If this happens, you can manually call this method.
-        
+
         For more information, check the :download:`issue demo example
         </devel/examples/parentmodel_issue_demo.py>`
         '''
         self._updateUseParentModel(True)
-        
-    def setModelCheck(self,model,check=True):
+
+    def setModelCheck(self, model, check=True):
         """Sets the component taurus model. Setting the check argument to True
         (default) will check if the current model is equal to the given argument.
         If so then nothing is done. This should be the standard way to call this
         method since it will avoid recursion.
-        
+
         :param model: (str) the new model name
         :param check: (bool) whether or not to check against the actual model name
-        """ 
-        if model is None: model = ''
+        """
+        if model is None:
+            model = ''
         model = str(model)
         send_signal = (model != self._localModelName)
         TaurusBaseComponent.setModelCheck(self, model, check)
-        
+
         if send_signal:
-            # emit a signal informing the child widgets that the model has changed
-            self.emit(Qt.SIGNAL(TaurusBaseWidget.ModelChangedSignal), model)
+            # emit a signal informing the child widgets that the model has
+            # changed
+            self.modelChanged.emit(model)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Default Qt signal handlers. Overwrite them as necessary
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def changeEvent(self, evt):
-        """overwrites QWidget.changeEvent(self, evt) to handle the ParentChangeEvent 
-        in case this widget is using the parent model. Always calls the QWidget.changeEvent 
+        """overwrites QWidget.changeEvent(self, evt) to handle the ParentChangeEvent
+        in case this widget is using the parent model. Always calls the QWidget.changeEvent
         in order not to lose events
         """
         if self.getUseParentModel():
@@ -1210,16 +1243,15 @@ class TaurusBaseWidget(TaurusBaseComponent):
             if evt_type == Qt.QEvent.ParentChange:
                 # disconnect from old parent
                 if self._parentTaurusComponent:
-                    self.disconnect(self._parentTaurusComponent,
-                                    Qt.SIGNAL(TaurusBaseWidget.ModelChangedSignal),
-                                    self.parentModelChanged)
+                    self._parentTaurusComponent.modelChanged.disconnect(
+                        self.parentModelChanged)
                 self._updateUseParentModel(True)
                 self.setModelCheck(self.getModel(), False)
         self.getQtClass().changeEvent(self, evt)
-    
+
     def parentModelChanged(self, parentmodel_name):
         """Invoked when the Taurus parent model changes
-        
+
         :param parentmodel_name: (str) the new name of the parent model
         """
         self.debug("Parent model changed to '%s'" % parentmodel_name)
@@ -1227,68 +1259,70 @@ class TaurusBaseWidget(TaurusBaseComponent):
         if self.getUseParentModel():
             # force an update of the interpretation of the model property
             model = self.getModel()
-            self.setModelCheck(model,False)
-            self.emit(Qt.SIGNAL(TaurusBaseWidget.ModelChangedSignal), model)
+            self.setModelCheck(model, False)
+            self.modelChanged.emit(model)
         else:
-            self.debug("received event from parent although not using parent model")
+            self.debug(
+                "received event from parent although not using parent model")
 
     def handleEvent(self, evt_src, evt_type, evt_value):
         """very basic and generalistic handling of events.
-        
+
         Override when necessary.
-        
+
         :param evt_src: (object or None) object that triggered the 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
+        # Update the text shown by the widget
         if self._setText:
             text = ''
             if self.getShowText():
                 if isinstance(evt_src, TaurusAttribute):
                     if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
-                        text = self.displayValue(evt_value.value)
+                        text = self.displayValue(evt_value.rvalue)
                     elif evt_type == TaurusEventType.Error:
                         text = self.getNoneValue()
                     elif evt_type == TaurusEventType.Config:
-                        text = self.getDisplayValue() 
+                        text = self.getDisplayValue()
                 else:
                     text = self.getDisplayValue()
             self._setText(text)
-        
-        #update tooltip
+
+        # update tooltip
         if self._autoTooltip:
             self.setToolTip(self.getFormatedToolTip())
-        
-        #TODO: update whatsThis
-        
-        #update appearance
+
+        # TODO: update whatsThis
+
+        # update appearance
         self.updateStyle()
-    
+
     def setModelInConfig(self, yesno):
         '''
         extends :meth:`TaurusBaseComponent.setModelInConfig` to include also
         the "useParentModel" property
-                      
+
         .. seealso:: :meth:`TaurusBaseComponent.setModelInConfig`
-        ''' 
-        if yesno == self._modelInConfig: 
+        '''
+        if yesno == self._modelInConfig:
             return
         if yesno:
-            self.registerConfigProperty(self.getUseParentModel, self.setUseParentModel, "useParentModel")
+            self.registerConfigProperty(
+                self.getUseParentModel, self.setUseParentModel, "useParentModel")
         else:
-            self.unregisterConfigurableItem("useParentModel",raiseOnError=False)
-            
+            self.unregisterConfigurableItem(
+                "useParentModel", raiseOnError=False)
+
         TaurusBaseComponent.setModelInConfig(self, yesno)
-        
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Mandatory overwrite from TaurusBaseComponent
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def updateStyle(self):
         """Updates the widget style. Default implementation just calls QWidget.update()
-        
+
         Override when necessary.
         """
         self.update()
@@ -1296,7 +1330,7 @@ class TaurusBaseWidget(TaurusBaseComponent):
     def getParentTaurusComponent(self):
         """Returns the first taurus component in the widget hierarchy or None if no
         taurus component is found
-        
+
         :return: (TaurusBaseComponent or None) the parent taurus base component
         """
         p = self.parentWidget()
@@ -1310,14 +1344,15 @@ class TaurusBaseWidget(TaurusBaseComponent):
 
     def setDisconnectOnHide(self, disconnect):
         """Sets/unsets disconnection on hide event
-        
+
         :param disconnect: (bool) whether or not to disconnect on hide event
         """
         if not self.visible() and disconnect == False:
-            self.info("Ignoring setDisconnectOnHide to False because widget is not visible")
+            self.info(
+                "Ignoring setDisconnectOnHide to False because widget is not visible")
             return
         self._disconnect_on_hide = disconnect
-    
+
     def hideEvent(self, event):
         """Override of the QWidget.hideEvent()
         """
@@ -1349,7 +1384,7 @@ class TaurusBaseWidget(TaurusBaseComponent):
         except Exception:
             self.warning("Exception received while trying to close")
             self.traceback()
-            
+
     def handleException(self, e):
         for h in self._exception_listener:
             h.exceptionReceived(e)
@@ -1357,52 +1392,52 @@ class TaurusBaseWidget(TaurusBaseComponent):
     def _findSetTextMethod(self):
         """Determine if this widget is able to display the text value of the taurus
         model. It searches through the possible Qt methods to display text.
-           
+
         :return: (callable) a python method or None if no suitable method is found.
         """
         setMethod = None
         try:
-            setMethod = getattr(self,'setText')
+            setMethod = getattr(self, 'setText')
         except AttributeError:
             try:
-                setMethod = getattr(self,'setTitle')
+                setMethod = getattr(self, 'setTitle')
             except AttributeError:
                 try:
-                    setMethod = getattr(self,'display')
+                    setMethod = getattr(self, 'display')
                 except AttributeError:
                     # it seems the widget has no way to update a value
                     pass
-                
+
         return setMethod
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # Drag&Drop related methods: 
-    #    default implementation allows setting the model by dropping it on the 
+    # Drag&Drop related methods:
+    #    default implementation allows setting the model by dropping it on the
     #    widget (if the widget allows modifications by the user).
-    #    
+    #
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def setModifiableByUser(self, modifiable):
         '''Reimplemented to acept/reject drops based on whether the widget is modifiable by the user.
         See :meth:`TaurusBaseComponent.setModifiableByUser()`'''
         TaurusBaseComponent.setModifiableByUser(self, modifiable)
         self.setAcceptDrops(modifiable)
-        
+
     def getSupportedMimeTypes(self):
         '''
         returns a list of supported mimeTypes that this widget support (ordered
-        by priority). If none is set explicitely via :meth:`setSupportedMimeTypes`, 
+        by priority). If none is set explicitely via :meth:`setSupportedMimeTypes`,
         a best effort will be tried based on the model class
-        
+
         ..seealso: :meth:`setSupportedMimeTypes`
-        
+
         This provides only a very basic implementation. Reimplement in derived classes if needed
-        
+
         :return: (list<str>) list of MIME type names
         '''
         if self._supportedMimeTypes is not None:
             return self._supportedMimeTypes
-        #fallback guess based on modelclass
+        # fallback guess based on modelclass
         try:
             modelclass = self.getModelClass()
         except:
@@ -1413,15 +1448,15 @@ class TaurusBaseWidget(TaurusBaseComponent):
             return [TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE]
         else:
             return [TAURUS_MODEL_MIME_TYPE]
-    
+
     def setSupportedMimeTypes(self, mimetypes):
         '''
-        sets the mimeTypes that this widget support 
-        
+        sets the mimeTypes that this widget support
+
         :param mimetypes: (list<str>) list (ordered by priority) of MIME type names
         '''
         self._supportedMimeTypes = mimetypes
-    
+
     def dragEnterEvent(self, event):
         '''reimplemented to support drag&drop of models. See :class:`QWidget`'''
         if self.isModifiableByUser():
@@ -1430,34 +1465,35 @@ class TaurusBaseWidget(TaurusBaseComponent):
                 if f in supported:
                     event.acceptProposedAction()
                     return
-    
+
     def getDropEventCallback(self):
-        '''returns the method to be called when a dropping event occurs. 
-        The default implementation returns `self.setModel`. Reimplement 
+        '''returns the method to be called when a dropping event occurs.
+        The default implementation returns `self.setModel`. Reimplement
         it subclasses to call different methods.
-        
+
         :return: (callable)
         '''
         return self.setModel
-       
+
     def dropEvent(self, event):
         '''reimplemented to support drag&drop of models. See :class:`QWidget`'''
-        mtype = self.handleMimeData(event.mimeData(),self.getDropEventCallback())
+        mtype = self.handleMimeData(
+            event.mimeData(), self.getDropEventCallback())
         if mtype is None:
             self.info('Invalid model')
         else:
             event.acceptProposedAction()
-        
+
     def handleMimeData(self, mimeData, method):
         '''Selects the most appropriate data from the given mimeData object
-        (in the order returned by :meth:`getSupportedMimeTypes`) and passes 
+        (in the order returned by :meth:`getSupportedMimeTypes`) and passes
         it to the given method.
-        
+
         :param mimeData: (QMimeData) the MIME data object from which the model
                          is to be extracted
-        :param method: (callable<str>) a method that accepts a string as argument. 
+        :param method: (callable<str>) a method that accepts a string as argument.
                        This method will be called with the data from the mimeData object
-        
+
         :return: (str or None) returns the MimeType used if the model was
                  successfully set, or None if the model could not be set
         '''
@@ -1466,195 +1502,210 @@ class TaurusBaseWidget(TaurusBaseComponent):
         for mtype in supported:
             if mtype in formats:
                 d = str(mimeData.data(mtype))
-                if d is None: 
+                if d is None:
                     return None
                 try:
                     method(d)
                     return mtype
                 except:
-                    self.debug('Invalid data (%s) for MIMETYPE=%s'%(repr(d), repr(mtype)))
+                    self.debug('Invalid data (%s) for MIMETYPE=%s' %
+                               (repr(d), repr(mtype)))
                     self.traceback(taurus.Debug)
                     return None
-    
+
     def getModelMimeData(self):
-        '''Returns a MimeData object containing the model data. The default implementation 
+        '''Returns a MimeData object containing the model data. The default implementation
         fills the `TAURUS_MODEL_MIME_TYPE`. If the widget's Model class is
         Attribute or Device, it also fills `TAURUS_ATTR_MIME_TYPE` or
         `TAURUS_DEV_MIME_TYPE`, respectively
-        
+
         :return: (QMimeData)
-        ''' 
+        '''
         mimeData = Qt.QMimeData()
         modelname = self.getModelName()
         mimeData.setData(TAURUS_MODEL_MIME_TYPE, modelname)
         try:
             modelclass = self.getModelClass()
         except:
-            modelclass = None 
+            modelclass = None
         if issubclass(modelclass, TaurusDevice):
             mimeData.setData(TAURUS_DEV_MIME_TYPE, modelname)
         elif issubclass(modelclass, TaurusAttribute):
             mimeData.setData(TAURUS_ATTR_MIME_TYPE, modelname)
-        return mimeData        
-    
+        return mimeData
+
     def mousePressEvent(self, event):
         '''reimplemented to record the start position for drag events.
         See :class:`~PyQt4.QtGui.QWidget`'''
         if self._dragEnabled and event.button() == Qt.Qt.LeftButton:
-            self.dragStartPosition = Qt.QPoint(event.pos()) #I need to copy it explicetely to avoid a bug with PyQt4.4 
+            # I need to copy it explicetely to avoid a bug with PyQt4.4
+            self.dragStartPosition = Qt.QPoint(event.pos())
         self.getQtClass().mousePressEvent(self, event)
-        
+
     def mouseMoveEvent(self, event):
         '''reimplemented to provide drag events.
         See :class:`~PyQt4.QtGui.QWidget`'''
         if not self._dragEnabled or not event.buttons() & Qt.Qt.LeftButton:
             return self.getQtClass().mouseMoveEvent(self, event)
-        if (event.pos() - self.dragStartPosition).manhattanLength()  < Qt.QApplication.startDragDistance():
+        if (event.pos() - self.dragStartPosition).manhattanLength() < Qt.QApplication.startDragDistance():
             return self.getQtClass().mouseMoveEvent(self, event)
-        ret = self.getQtClass().mouseMoveEvent(self, event) #call the superclass
-        event.accept() #we make sure we accept after having called the superclass so that it is not propagated (many default implementations of mouseMoveEvent call event.ignore())
+        ret = self.getQtClass().mouseMoveEvent(self, event)  # call the superclass
+        event.accept()  # we make sure we accept after having called the superclass so that it is not propagated (many default implementations of mouseMoveEvent call event.ignore())
         drag = Qt.QDrag(self)
         drag.setMimeData(self.getModelMimeData())
         drag.exec_(Qt.Qt.CopyAction, Qt.Qt.CopyAction)
         return ret
-    
+
     def isDragEnabled(self):
         '''whether the user can drag data from this widget
-        
+
         :return: (bool) True if the user can drag data'''
         return self._dragEnabled
-    
+
     def setDragEnabled(self, enabled):
         '''
         sets whether the user is allowed to drag data from this widget
-        
+
         :param modifiable: (bool)
         '''
         self._dragEnabled = enabled
-    
+
     def resetDragEnabled(self):
         '''Equivalent to setDragEnabled(self.__class__._dragEnabled)'''
         self.setModifiableByUser(self.__class__._dragEnabled)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Pending operations related methods: default implementation
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-         
+
     def updatePendingOpsStyle(self):
         """This method should be reimplemented by derived classes that want to
         change their appearance depending whether there are pending operations or not"""
         pass
-        
+
     def emitValueChanged(self, *args):
         """Connect the specific XXXXChanged signals from derived classes to this
         method in order to have a unified signal which can be used by Taurus Widgets"""
-        self.emit(Qt.SIGNAL('valueChanged'))
-        self.updatePendingOpsStyle() #by default, update its own style
-    
-    def safeApplyOperations(self, ops = None):
+        self.valueChangedSignal.emit()
+        self.updatePendingOpsStyle()  # by default, update its own style
+
+    def safeApplyOperations(self, ops=None):
         """Applies the given operations (or the pending operations if None passed)
-        
-        :param ops: (sequence<taurus.core.taurusoperation.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
-                    
-        :return: (bool) False if the apply was aborted by the user. True otherwise.
-        """
-        
-        if ops is None: ops = self.getPendingOperations()
-        
-        #Check if we need to take care of dangerous operations
-        if self.getForceDangerousOperations(): dangerMsgs = []
-        else: dangerMsgs = [op.getDangerMessage() for op in ops if len(op.getDangerMessage()) > 0]
-        #warn the user if need be
-        if len(dangerMsgs)==1:
+
+        :return: (bool) False if the apply was aborted by the user or if the
+                 widget is in design mode. True otherwise.
+        """
+
+        if ops is None:
+            ops = self.getPendingOperations()
+
+        # Check if we need to take care of dangerous operations
+        if self.getForceDangerousOperations():
+            dangerMsgs = []
+        else:
+            dangerMsgs = [op.getDangerMessage()
+                          for op in ops if len(op.getDangerMessage()) > 0]
+        # warn the user if need be
+        if len(dangerMsgs) == 1:
             result = Qt.QMessageBox.warning(self, "Potentially dangerous action",
-                                                "%s\nProceed?"%dangerMsgs[0],
-                                                Qt.QMessageBox.Ok|Qt.QMessageBox.Cancel,
-                                                Qt.QMessageBox.Ok)
+                                            "%s\nProceed?" % dangerMsgs[0],
+                                            Qt.QMessageBox.Ok | Qt.QMessageBox.Cancel,
+                                            Qt.QMessageBox.Ok)
             if result != Qt.QMessageBox.Ok:
                 return False
-                
-        elif len(dangerMsgs)>1:
-            warningDlg = Qt.QMessageBox(Qt.QMessageBox.Warning, " %d potentially dangerous actions"%len(dangerMsgs),
-                                     "You are about to apply %d actions that may be potentially dangerous. Proceed?"%len(dangerMsgs),
-                                     Qt.QMessageBox.Ok|Qt.QMessageBox.Cancel,
-                                     self)
+
+        elif len(dangerMsgs) > 1:
+            warningDlg = Qt.QMessageBox(Qt.QMessageBox.Warning, " %d potentially dangerous actions" % len(dangerMsgs),
+                                        "You are about to apply %d actions that may be potentially dangerous. Proceed?" % len(
+                                            dangerMsgs),
+                                        Qt.QMessageBox.Ok | Qt.QMessageBox.Cancel,
+                                        self)
             details = "\n".join(dangerMsgs)
             warningDlg.setDetailedText(details)
             result = warningDlg.exec_()
             if result != Qt.QMessageBox.Ok:
                 return False
+
+        if self._designMode:
+            self.info('Refusing to apply operation while in design mode')
+            return False
+
         self.applyPendingOperations(ops)
         return True
 
     def setAutoTooltip(self, yesno):
         """Determines if the widget should automatically generate a tooltip
         based on the current widget model.
-        
+
         :param yesno: (bool) True to automatically generate tooltip or False otherwise
         """
         self._autoTooltip = yesno
-        
+
     def getAutoTooltip(self):
         """Returns if the widget is automatically generating a tooltip based
         on the current widget model.
-        
+
         :return: (bool)  True if automatically generating tooltip or False otherwise
         """
         return self._autoTooltip
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         """Returns pertinent information in order to be able to build a valid
         QtDesigner widget plugin.
-        
-        The dictionary returned by this method should contain *at least* the 
+
+        The dictionary returned by this method should contain *at least* the
         following keys and values:
         - 'module' : a string representing the full python module name (ex.: 'taurus.qt.qtgui.base')
-        - 'icon' : a string representing valid resource icon (ex.: ':/designer/combobox.png')
+        - 'icon' : a string representing valid resource icon (ex.: 'designer:combobox.png')
         - 'container' : a bool telling if this widget is a container widget or not.
-        
+
         This default implementation returns the following dictionary::
-        
+
             { 'group'     : 'Taurus [Unclassified]',
-              'icon'      : ':/designer/taurus.png',
+              'icon'      : 'logos:taurus.png',
               'container' : False }
-        
+
         :return: (dict) a map with pertinent designer information"""
-        return { 
-            'group'     : 'Taurus [Unclassified]',
-            'icon'      : ':/designer/taurus.png',
-            'container' : False }
+        return {
+            'group': 'Taurus [Unclassified]',
+            'icon': 'logos:taurus.png',
+            'container': False}
 
 
 class TaurusBaseWritableWidget(TaurusBaseWidget):
     """The base class for all taurus input widgets
-    
+
     it emits the applied signal when the value has been applied.
     """
-    
-    appliedSignalSignature = 'applied'
-    
-    def __init__(self, name, taurus_parent=None, designMode = False):
-        self.call__init__(TaurusBaseWidget, name, parent=taurus_parent, designMode=designMode)
-        
+
+    applied = baseSignal('applied')
+
+    def __init__(self, name, taurus_parent=None, designMode=False):
+        self.call__init__(TaurusBaseWidget, name,
+                          parent=taurus_parent, designMode=designMode)
+
         self._lastValue = None
-        
+
         # Overwrite not to show quality by default
         self._showQuality = False
-        
+
         # Don't do auto-apply by default
         self._autoApply = False
-        
-        # Don't force a writing to attribute when there are not pending operations
+
+        # Don't force a writing to attribute when there are not pending
+        # operations
         self._forcedApply = False
-        
-        self.connect(self, Qt.SIGNAL('valueChanged'), self.updatePendingOperations)
-        
+
+        self.valueChangedSignal.connect(self.updatePendingOperations)
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getModelClass(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         return TaurusAttribute
@@ -1662,57 +1713,61 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
     def isReadOnly(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         return False
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def setAutoApply(self, auto):
         '''
         Sets autoApply mode. In autoApply mode, the widget writes the value
-        automatically whenever it is changed by the user (e.g., when 
-        :meth:`valueChanged` is called). If False, a value changed just 
-        flags a "pending operation" which needs to be applied manually by 
+        automatically whenever it is changed by the user (e.g., when
+        :meth:`notifyValueChanged` is called). If False, a value changed just
+        flags a "pending operation" which needs to be applied manually by
         the user before the value gets written.
-        
+
         :param auto: (bool) True for setting autoApply mode. False for disabling
         '''
         self._autoApply = auto
-        
+
     def getAutoApply(self):
         '''whether autoApply mode is enabled or not.
-        
-        :return: (bool) 
+
+        :return: (bool)
         '''
         return self._autoApply
 
     def resetAutoApply(self):
         '''resets the autoApply mode (i.e.: sets it to False)'''
         self.setAutoApply(False)
-        
+
     def setForcedApply(self, forced):
-        '''Sets the forcedApply mode. In forcedApply mode, values are written even 
-        if there are not pending operations (e.g. even if the displayed value is 
+        '''Sets the forcedApply mode. In forcedApply mode, values are written even
+        if there are not pending operations (e.g. even if the displayed value is
         the same as the currently applied one).
-        
+
         .. seealso: :meth:`forceApply` and :meth:`writeValue`
-        
+
         :param forced: (bool) True for setting forcedApply mode. False for disabling
         '''
         self._forcedApply = forced
-        
+
     def getForcedApply(self):
         '''whether forcedApply mode is enabled or not.
-        
-        :return: (bool) 
+
+        :return: (bool)
         '''
         return self._forcedApply
 
     def resetForcedApply(self):
         '''resets the forcedApply mode (i.e.: sets it to False)'''
         self.setForcedApply(False)
-        
+
+    @deprecation_decorator(rel='4.0', alt='notifyValueChanged')
     def valueChanged(self, *args):
+        return self.notifyValueChanged(*args)
+
+    def notifyValueChanged(self, *args):
         '''Subclasses should connect some particular signal to this method for
         indicating that something has changed.
         e.g., a QLineEdit should connect its "textChanged" signal...
@@ -1725,73 +1780,72 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
         '''Writes the value to the attribute, either by applying pending
         operations or (if the ForcedApply flag is True), it writes directly when
         no operations are pending
-        
+
         It emits the applied signal if apply is not aborted.
 
-        :param forceApply: (bool) If True, it behaves as in forceApply mode 
-                           (even if the forceApply mode is disabled by 
+        :param forceApply: (bool) If True, it behaves as in forceApply mode
+                           (even if the forceApply mode is disabled by
                            :meth:`setForceApply`)
         '''
-        
         if self.hasPendingOperations():
             applied = self.safeApplyOperations()
-            if applied: 
-                self.emit(Qt.SIGNAL(self.appliedSignalSignature))
+            if applied:
+                self.applied.emit()
             return
-        
-        #maybe we want to force an apply even if there are no pending ops...
+
+        # maybe we want to force an apply even if there are no pending ops...
         kmods = Qt.QCoreApplication.instance().keyboardModifiers()
-        controlpressed = bool(kmods&Qt.Qt.ControlModifier)
+        controlpressed = bool(kmods & Qt.Qt.ControlModifier)
         if self.getForcedApply() or forceApply or controlpressed:
             self.forceApply()
-            
+
     def forceApply(self):
         '''It (re)applies the value regardless of pending operations.
         WARNING: USE WITH CARE. In most cases what you need is to make sure
         that pending operations are properly created, not calling this method
-        
+
         It emits the applied signal if apply is not aborted.
 
         .. seealso: :meth:`setForceApply` and :meth:`writeValue`
-        
+
         '''
         try:
             v = self.getValue()
-            op = WriteAttrOperation(self.getModelObj(), v, 
+            op = WriteAttrOperation(self.getModelObj(), v,
                                     self.getOperationCallbacks())
             op.setDangerMessage(self.getDangerMessage())
             applied = self.safeApplyOperations([op])
             if applied:
-                self.emit(Qt.SIGNAL(self.appliedSignalSignature))
-            self.info('Force-Applied value = %s'%str(v))
+                self.applied.emit()
+            self.info('Force-Applied value = %s' % str(v))
         except:
             self.error('Unexpected exception in forceApply')
             self.traceback()
-        
+
     def handleEvent(self, src, evt_type, evt_value):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
             self.emitValueChanged()
-    
+
     def postAttach(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         TaurusBaseWidget.postAttach(self)
         if self.isAttached():
             try:
-                v = self.getModelValueObj().w_value
+                v = self.getModelValueObj().wvalue
             except:
                 v = None
             self.setValue(v)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Pending operations related methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def resetPendingOperations(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         if self.isAttached():
             try:
-                v = self.getModelValueObj().w_value
+                v = self.getModelValueObj().wvalue
             except:
                 v = None
             self.setValue(v)
@@ -1802,46 +1856,48 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         model = self.getModelObj()
         try:
-            model_value = model.getValueObj().w_value
+            model_value = model.getValueObj().wvalue
             wigdet_value = self.getValue()
             if model.areStrValuesEqual(model_value, wigdet_value):
                 self._operations = []
             else:
-                operation = WriteAttrOperation(model, wigdet_value, 
+                operation = WriteAttrOperation(model, wigdet_value,
                                                self.getOperationCallbacks())
                 operation.setDangerMessage(self.getDangerMessage())
                 self._operations = [operation]
         except:
             self._operations = []
         self.updateStyle()
-        
+
     def getOperationCallbacks(self):
         '''returns the operation callbacks (i.e., a sequence of methods that will be called after an operation is executed
            (this default implementation it returns an empty list).
-           
-        :return: (sequence<callable>)   
+
+        :return: (sequence<callable>)
         '''
         return []
 
     def getValue(self):
         '''
-        This method must be implemented in derived classes to return 
-        the value to be written. Note that this may differ 
-        from the displayed value (e.g. for a numeric value being 
-        edited by a QLineEdit-based widget, the displayed value will 
+        This method must be implemented in derived classes to return
+        the value to be written. Note that this may differ
+        from the displayed value (e.g. for a numeric value being
+        edited by a QLineEdit-based widget, the displayed value will
         be a string while getValue will return a number)
         '''
-        raise NotImplementedError("Not allowed to call TaurusBaseWritableWidget.getValue()")
+        raise NotImplementedError(
+            "Not allowed to call TaurusBaseWritableWidget.getValue()")
 
     def setValue(self, v):
         '''
-        This method must be implemented in derived classes to provide 
-        a (widget-specific) way of updating the displayed value based 
+        This method must be implemented in derived classes to provide
+        a (widget-specific) way of updating the displayed value based
         on a given attribute value
-        
-        :param v: The attribute value 
+
+        :param v: The attribute value
         '''
-        raise NotImplementedError("Not allowed to call TaurusBaseWritableWidget.setValue()")
+        raise NotImplementedError(
+            "Not allowed to call TaurusBaseWritableWidget.setValue()")
 
     def updateStyle(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
@@ -1849,30 +1905,37 @@ class TaurusBaseWritableWidget(TaurusBaseWidget):
             toolTip = self.getFormatedToolTip()
             if self.hasPendingOperations():
                 v_str = str(self.getValue())
-                model_v_str = getattr(self.getModelValueObj(),'w_value', '-----')
-                toolTip += '<hr/>Displayed value (%s) differs from applied value (%s)' % (v_str, model_v_str)
+                model_v_str = getattr(
+                    self.getModelValueObj(), 'wvalue', '-----')
+                toolTip += '<hr/>Displayed value (%s) differs from applied value (%s)' % (
+                    v_str, model_v_str)
             self.setToolTip(toolTip)
 
-    def _updateValidator(self, evt_value):
-        #re-set the validator ranges if applicable
-        if evt_value is None: return
+    def _updateValidator(self, evt_value):  # TODO: Remove this method
+        # re-set the validator ranges if applicable
+        if evt_value is None:
+            return
         v = self.validator()
         if isinstance(v, Qt.QIntValidator):
             bottom = evt_value.min_value
             top = evt_value.max_value
-            bottom = int(bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxint
-            top = int(top) if top != 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))
+            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 != TaurusConfiguration.no_min_value else -float("inf") 
-            top = float(top) if top != 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))
-    
+            self.debug("Validator range set to %f-%f" % (bottom, top))
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         '''reimplemented from :class:`TaurusBaseWidget`'''
diff --git a/lib/taurus/qt/qtgui/base/tauruscontroller.py b/lib/taurus/qt/qtgui/base/tauruscontroller.py
index e0342aa..f8e8a71 100644
--- a/lib/taurus/qt/qtgui/base/tauruscontroller.py
+++ b/lib/taurus/qt/qtgui/base/tauruscontroller.py
@@ -3,24 +3,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -42,9 +42,10 @@ 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
 
+
 class TaurusBaseController(object):
     """Base class for all taurus controllers"""
-    
+
     def __init__(self, widget, updateAsPalette=True):
         self._widget = weakref.ref(widget)
         self._updateAsPalette = updateAsPalette
@@ -53,24 +54,21 @@ class TaurusBaseController(object):
         self._last_config_value = None
         self._last_error_value = None
         self._setStyle()
-    
+
     def _setStyle(self):
         pass
-    
+
     def usePalette(self):
         return self._updateAsPalette
-    
+
     def widget(self):
         return self._widget()
 
-    def stateObj(self):
-        return self._stateObj
-    
     def modelObj(self):
         return self.widget().getModelObj()
-    
+
     attrObj = configObj = deviceObj = modelObj
-    
+
     def valueObj(self):
         value = self._last_value
         if value is None:
@@ -79,58 +77,52 @@ class TaurusBaseController(object):
                 return None
             value = modelObj.getValueObj()
         return value
-    
-    def stateValueObj(self):
-        stateObj = self.stateObj()
-        if stateObj is None: return None
-        return stateObj.getValueObj()
-    
+
     def value(self):
         valueObj = self.valueObj()
         return getattr(valueObj, "value", None)
 
-    def w_value(self):
+    def w_value(self):  # TODO: adapt to tep14
         valueObj = self.valueObj()
         return getattr(valueObj, "w_value", None)
-    
+
     def quality(self):
         valueObj = self.valueObj()
         return getattr(valueObj, "quality", None)
 
     def state(self):
-        stateValueObj = self.stateValueObj()
-        return getattr(stateValueObj, "value", None)
-    
+        return self._stateObj.state
+
     def getDisplayValue(self, write=False):
         return self.widget().getDisplayValue()
-    
+
     def handleEvent(self, evt_src, evt_type, evt_value):
-        if evt_src == self.modelObj(): #update the "_last" values only if the event source is the model (it could be the background...) 
+        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:
+            elif evt_type == TaurusEventType.Config:  # TODO: adapt to tep14
                 self._last_config_value = evt_value
             else:
                 self._last_error_value = evt_value
-                #In case of error, modify the last_value as well
+                # In case of error, modify the last_value as well
                 try:
                     self._last_value = self.modelObj().getValueObj()
                 except:
-                    pass
+                    self._last_value = None
         self.update()
 
     def eventReceived(self, evt_src, evt_type, evt_value):
         # should handle the state event here. Because this is invoked by a random
         # thread, we pass it to the widget, which will forward to the proper
         # thread
-        
-        #@todo: sometimes we get this method called but self.widget() is None. Check why. 
+
+        #@todo: sometimes we get this method called but self.widget() is None. Check why.
         #       For the moment I just protect it by substituting the following line by the ones after it
         #self.widget().eventReceived(evt_src, evt_type, evt_value)
         w = self.widget()
-        if w is not None:            
+        if w is not None:
             w.eventReceived(evt_src, evt_type, evt_value)
-    
+
     def update(self):
         widget = self.widget()
         self._updateConnections(widget)
@@ -140,17 +132,11 @@ class TaurusBaseController(object):
 
     def _needsStateConnection(self):
         return False
-    
-    def _findStateObj(self):
-        devObj = self.deviceObj()
-        if devObj is None:
-            return None
-        return devObj.getStateObj()
-    
+
     def _updateConnections(self, widget):
-        stateObj, newStateObj = self.stateObj(), None
+        stateObj, newStateObj = self._stateObj, None
         if self._needsStateConnection():
-            newStateObj = self._findStateObj()
+            newStateObj = self.deviceObj()
             if stateObj != newStateObj:
                 if stateObj is not None:
                     stateObj.removeListener(self)
@@ -160,63 +146,63 @@ class TaurusBaseController(object):
             if stateObj is not None:
                 stateObj.removeListener(self)
         self._stateObj = newStateObj
-    
+
     def _updateForeground(self, widget):
         pass
 
     def _updateBackground(self, widget):
         pass
-        
+
     def _updateToolTip(self, widget):
         if widget.getAutoTooltip():
             widget.setToolTip(widget.getFormatedToolTip())
 
 
 class TaurusAttributeControllerHelper(object):
-    
+
     def configObj(self):
-        attrObj = self.attrObj()
-        if attrObj is None: return None
-        return attrObj.getConfig()
-    
+        return self.attrObj()  # they are the same object since tep14
+        # attrObj = self.attrObj()
+        # if attrObj is None: return None
+        # return attrObj.getConfig()
+
     def deviceObj(self):
         attrObj = self.attrObj()
-        if attrObj is None: return None
+        if attrObj is None:
+            return None
         return attrObj.getParentObj()
 
 
 class TaurusScalarAttributeControllerHelper(TaurusAttributeControllerHelper):
-    
+
     def getDisplayValue(self, write=False):
         valueObj = self.valueObj()
         widget = self.widget()
-        if valueObj is None or valueObj.value is None:
+        if valueObj is None or valueObj.rvalue is None:
             return widget.getDisplayValue()
 
-        format, value = valueObj.data_format, valueObj.value
+        format = self.attrObj().data_format
         if format == DataFormat._0D:
             return self._getDisplayValue(widget, valueObj, None, write)
-        
+
         idx = widget.getModelIndexValue()
         return self._getDisplayValue(widget, valueObj, idx, write)
-        
+
     def _getDisplayValue(self, widget, valueObj, idx, write):
         try:
-            if write: value = valueObj.w_value
-            else: value = valueObj.value
+            if write:
+                value = valueObj.wvalue
+            else:
+                value = valueObj.rvalue
             if idx is not None and len(idx):
-                for i in idx: value = value[i]
-            
+                for i in idx:
+                    value = value[i]
             if self._last_config_value is None or value is None:
-                return self.modelObj().displayValue(value)
-            else:
-                #TODO: last_config_value object to format the value
-                return self.modelObj().displayValue(value)
-                
+                return widget.displayValue(value)
         except Exception, e:
             return widget.getNoneValue()
 
-    def displayValue(self,value):
+    def displayValue(self, value):
         if value is None:
             return None
         ret = None
@@ -233,36 +219,32 @@ class TaurusScalarAttributeControllerHelper(TaurusAttributeControllerHelper):
             else:
                 ret = str(value)
         except:
-            # if cannot calculate value based on the format just return the value
+            # if cannot calculate value based on the format just return the
+            # value
             raise
             ret = str(value)
         return ret
-    
+
+
 class TaurusConfigurationControllerHelper(object):
+    #TODO: Check if this is  used. If so, rename to avoid "Configuration"
 
     def __init__(self):
         self._configParam = None
 
     def attrObj(self):
-        configObj = self.configObj()
-        if configObj is None: return None
-        return configObj.getParentObj()
-        
+        return self.configObj()  # they are the same object since tep14
+
     def deviceObj(self):
         attrObj = self.attrObj()
-        if attrObj is None: return None
+        if attrObj is None:
+            return None
         return attrObj.getParentObj()
-            
+
     @property
     def configParam(self):
         if self._configParam is None:
-            model = self.widget().model
-            try:
-                #@todo: This works for tango, eval and epics configuration names but is not general.
-                #@todo: This should be done calling to the ConfigurationNameValidator
-                self._configParam = model[model.rfind('?configuration=')+15:]
-            except:
-                self._configParam = ''
+            self._configParam = self.widget().getModelFragmentName() or ''
         return self._configParam
 
     def getDisplayValue(self, write=False):
@@ -272,9 +254,9 @@ class TaurusConfigurationControllerHelper(object):
             return widget.getNoneValue()
         param = self.configParam
         try:
-            val = getattr(model, param)
+            val = widget.getModelFragmentObj()
             try:
-                no_val = getattr(model, "no_" + param)
+                no_val = getattr(model, "no_" + param)  # TODO: Tango-centric
                 if val.lower() == no_val.lower():
                     val = widget.getNoneValue()
             except:
@@ -284,45 +266,51 @@ class TaurusConfigurationControllerHelper(object):
                 val = str(param)
                 attr = self.attrObj()
                 if attr is not None:
-                    val = val.replace('<label>', attr.label or '---')      
-                    val = val.replace('<attr_name>',attr.name or '---')
-                    val = val.replace('<attr_fullname>',attr.getFullName() or '---')
-                    val = val.replace('<dev_alias>',attr.dev_alias or '---')
-                    val = val.replace('<dev_name>',attr.dev_name or '---')
-                dev = self.deviceObj()   
-                if dev is not None:     
-                    val = val.replace('<dev_fullname>',dev.getFullName() or '---')
+                    val = val.replace('<label>', attr.label or '---')
+                    val = val.replace('<attr_name>', attr.name or '---')
+                    val = val.replace('<attr_fullname>', attr.getFullName() or
+                                      '---')
+                dev = self.deviceObj()
+                if dev is not None:
+                    val = val.replace('<dev_fullname>', dev.getFullName() or
+                                      '---')
+                    val = val.replace('<dev_alias>', dev.getSimpleName() or
+                                      '---')
+                    val = val.replace('<dev_name>', dev.getNormalName() or
+                                      '---')
             else:
                 val = widget.getNoneValue()
-        except:    
+        except:
             widget.debug("Invalid configuration parameter '%s'" % param)
             val = widget.getNoneValue()
         if val is None:
             val = widget.getNoneValue()
         return val
- 
- 
+
+
 StyleSheetTemplate = """border-style: outset; border-width: 2px; border-color: {0}; {1}"""
 
+
 def _updatePaletteColors(widget, bgBrush, fgBrush, frameBrush):
     qt_palette = widget.palette()
     qt_palette.setBrush(Qt.QPalette.Window, bgBrush)
     qt_palette.setBrush(Qt.QPalette.Base, bgBrush)
-    qt_palette.setBrush(Qt.QPalette.WindowText,fgBrush)
+    qt_palette.setBrush(Qt.QPalette.WindowText, fgBrush)
     qt_palette.setBrush(Qt.QPalette.Light, frameBrush)
     qt_palette.setBrush(Qt.QPalette.Dark, frameBrush)
     widget.setPalette(qt_palette)
-    
+
+
 def updateLabelBackground(ctrl, widget):
     """Helper method to setup background of taurus labels and lcds"""
     bgRole = widget.bgRole
-    
+
     if ctrl.usePalette():
         widget.setAutoFillBackground(True)
         if bgRole in ('', 'none'):
             transparentBrush = Qt.QBrush(Qt.Qt.transparent)
             frameBrush = transparentBrush
-            bgBrush, fgBrush = transparentBrush, Qt.QBrush(Qt.Qt.black) 
+            bgBrush, fgBrush = transparentBrush, Qt.QBrush(Qt.Qt.black)
         else:
             frameBrush = Qt.QBrush(Qt.QColor(255, 255, 255, 128))
             bgItem, palette = None, QT_DEVICE_STATE_PALETTE
@@ -350,4 +338,4 @@ def updateLabelBackground(ctrl, widget):
             color_ss = palette.qtStyleSheet(bgItem)
             ss = StyleSheetTemplate.format("rgba(255,255,255,128)",  color_ss)
         widget.setStyleSheet(ss)
-    widget.update() # necessary in pyqt <= 4.4
+    widget.update()  # necessary in pyqt <= 4.4
diff --git a/lib/taurus/qt/qtgui/base/taurusqattribute.py b/lib/taurus/qt/qtgui/base/taurusqattribute.py
deleted file mode 100644
index 382adde..0000000
--- a/lib/taurus/qt/qtgui/base/taurusqattribute.py
+++ /dev/null
@@ -1,193 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-Provides a QtObject for taurus attributes 
-"""
-import weakref
-import re
-import PyTango
-
-from taurus.core.taurusvalidator import AttributeNameValidator
-from taurus.external.qt import Qt
-from taurus.qt.qtgui.base import TaurusBaseComponent
-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 
-    TaurusQAttributes is created for a given extended model.
-    IMPORTANT: This API is for testing purposes.It is likely to change.  Don't rely on it'''
-    def __init__(self):
-        self._qAttrsByExtModel = weakref.WeakValueDictionary()
-        self._count = 0
-        
-    def getQAttr(self, xmodel=None, id=None, autoIdformat=r'_QAttr%i_'):
-        #check if the qAttr is known to this factory
-        if xmodel is not None and xmodel in self._qAttrsByExtModel:
-            c = self._qAttrsByExtModel[xmodel]
-        #create a new qAttr
-        else:
-            if id is None: 
-                id = autoIdformat%self._count
-                self._count += 1
-            c = TaurusQAttribute(xmodel=xmodel, id=id)
-        self._qAttrsByExtModel[xmodel] = c
-        return c
-    
-    
-taurusQAttributeFactory = TaurusQAttributeFactory()
-ATTRNAMEVALIDATOR = AttributeNameValidator()
-
-class TaurusQAttribute(Qt.QObject, TaurusBaseComponent):
-    '''A listener for taurus attributes.
-    It stores the value in a numpy array and emits a 
-    dataChanged signal when the data has changed.
-    '''
-    pyVar_RegExp = re.compile("[a-zA-Z_][a-zA-Z0-9_]*") #regexp for a variable/method name (symbol)
-    cref_RegExp = re.compile("\$\{(.+?)\}") #regexp for references to qAttrs in extended models
-    def __init__(self, xmodel = None, id=None):
-        Qt.QObject.__init__(self)
-        TaurusBaseComponent.__init__(self, self.__class__.__name__)
-        self._attrnamevalidator = ATTRNAMEVALIDATOR
-        self.id = id
-        self.sev = SafeEvaluator()
-        self._referencedQAttrs = []
-        self.value = None
-        self._setExtendedModel(xmodel)
-        
-    def _setExtendedModel(self, xmodel):
-        self._xmodel = xmodel
-        if xmodel is None:
-            self.value = None
-            self._transformationString = None
-            self.setModel('')
-            return
-        xmodel = str(xmodel)
-        #for formulas
-        if xmodel.startswith('='):
-            trstring, ok = self.preProcessTransformation(xmodel[1:])
-            if ok:
-                self._transformationString = trstring
-                self.applyTransformation()
-            else:
-                print "!!!!!!!!!!!!!", self._transformationString
-                return
-        #for tango attributes
-        elif self._attrnamevalidator.isValid(xmodel):
-            self.setModel(xmodel)
-            self.fireEvent(None, None, None) #fake event to force a reading
-        else:
-            self.warning('Unsupported extended model "%s". Skipping',xmodel)
-#        #for nexus files
-#        m = re.match(NEXUS_src,model)
-#        if m is not None:
-#            host,path,nxpath,slice = m.group(4,5,9,10) 
-#            #@todo:open file and check the data is accessible
-#            return model, nxpath, getThemeIcon('x-office-spreadsheet'), True
-#        #for ascii files
-#        m = re.match(ASCII_src,model)
-#        if m is not None:
-#            host,path, = m.group(4,5)
-#        #@todo: open and check the file
-#        #If nothing matches...
-#        return model, model, getThemeIcon('dialog-warning'), False
-        
-    
-    def preProcessTransformation(self, trstring):
-        """
-        parses the transformation string and creates the necessary symbols for
-        the evaluator. It also connects any referenced qAttrs so that the
-        transformation gets re-evaluated if they change.
-        :param trstring: (str) a string to be pre-processed
-        
-        :return: (tuple<str,bool>) a tuple containing the processed string 
-                 and a boolean indicating if the preprocessing was successful.
-                 if ok==True, the string is ready to be evaluated
-        """
-        #disconnect previously referenced qAttrs and clean the list
-        for c in self._referencedQAttrs:
-            self.disconnect(c, Qt.SIGNAL("dataChanged"), self.applyTransformation)
-        self._referencedQAttrs=[]  
-        
-        #reset symbols      
-        self.sev.resetSafe()
-        
-        #Find references in the string, create qAttrs if needed, connect to them and change the string to use the qAttr id
-        trstring = re.sub(self.cref_RegExp, self.__Match2Id, trstring)
-        
-        safesymbols = self.sev.getSafe().keys()
-        #validate the expression (look for missing symbols) 
-        for s in set(re.findall(self.pyVar_RegExp, trstring)):
-            if s not in safesymbols:
-                self.warning('Missing symbol "%s"'%s)
-                return trstring, False
-        return trstring,True
-            
-    def __Match2Id(self, match):
-        """
-        receives a re.match object for cref_RegExp. Returns the id of an
-        existing qAttr corresponding to the match. The qAttr is created
-        if it didn't previously exist.
-        """
-        return self.__createReference(match.groups()[0]).id
-        
-    def __createReference(self, ref):
-        '''creates a (or gets an existing)qAttr and connects to it and adds
-        its id to the safe evaluation symbols. It returns the qAttr.
-        '''
-        c = taurusQAttributeFactory.getQAttr(ref)
-        self.connect(c, Qt.SIGNAL("dataChanged"), self.applyTransformation)
-        self.sev.addSafe({c.id:c.value})
-        self._referencedQAttrs.append(c)
-        return c        
-        
-    def applyTransformation(self):
-        try:
-            sender = self.sender()
-            if isinstance(sender, TaurusQAttribute):
-                self.sev.addSafe({sender.id:sender.value})
-            self.value = self.sev.eval(self._transformationString)
-            self.emit(Qt.SIGNAL("dataChanged"))
-        except Exception, e:
-            self.warning("the function '%s' could not be evaluated. Reason: %s"%(self._transformationString, repr(e))) 
-        
-    def handleEvent(self, src, evt_type, val):
-        '''Handles Taurus Events for this curve
-
-        See: :meth:`TaurusBaseQAttr.handleEvent`
-        '''
-        model = src if src is not None else self.getModelObj()
-        if model is None:
-            self._values = None
-            self.emit(Qt.SIGNAL('dataChanged'))
-            return
-        value = val if isinstance(val, PyTango.DeviceAttribute) else self.getModelValueObj()
-        if not isinstance(value, PyTango.DeviceAttribute):
-            self.debug("Could not get DeviceAttribute value for this event. Dropping")
-            return
-        self.value = value.value
-        self.emit(Qt.SIGNAL('dataChanged'))
-        
-
diff --git a/lib/taurus/qt/qtgui/base/test/__init__.py b/lib/taurus/qt/qtgui/base/test/__init__.py
new file mode 100644
index 0000000..f0491da
--- /dev/null
+++ b/lib/taurus/qt/qtgui/base/test/__init__.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Tests for taurus.qt.qtgui.base"""
diff --git a/lib/taurus/qt/qtgui/base/test/test_taurusbase.py b/lib/taurus/qt/qtgui/base/test/test_taurusbase.py
new file mode 100644
index 0000000..3c6c915
--- /dev/null
+++ b/lib/taurus/qt/qtgui/base/test/test_taurusbase.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""Unit tests for taurusbase"""
+
+
+from taurus.external import unittest
+from taurus.test import insertTest
+from taurus.qt.qtgui.test import BaseWidgetTestCase
+from taurus.core.tango.test import TangoSchemeTestLauncher
+from taurus.qt.qtgui.container import TaurusWidget
+
+DEV_NAME = TangoSchemeTestLauncher.DEV_NAME
+
+
+ at insertTest(helper_name='getDisplayValue',
+            model='eval:1+2#',
+            expected='-----')
+ at insertTest(helper_name='getDisplayValue',
+            model='eval:1+2#label',
+            expected='1+2')
+ at insertTest(helper_name='getDisplayValue',
+            model='eval:1+2',
+            expected='3 ')  # @TODO: change to '3' if/when pint supports it
+# This checks if the pre-tep3 behavior is kept (and it fails)
+# ...but I think it should *not* be kept
+ at insertTest(helper_name='getDisplayValue',
+            model='tango://' + DEV_NAME + '/double_scalar?configuration',
+            expected='double_scalar?configuration',
+            test_skip="old behaviour which we probably don't want")
+ at insertTest(helper_name='getDisplayValue',
+            model='tango://' + DEV_NAME + '/float_scalar?configuration=label',
+            expected='float_scalar')
+ at insertTest(helper_name='getDisplayValue',
+            model='tango:' + DEV_NAME + '/double_scalar#rvalue.magnitude',
+            expected='1.23')
+ at insertTest(helper_name='getDisplayValue',
+            model='tango:' + DEV_NAME + '/float_scalar#label',
+            expected='float_scalar')
+ at insertTest(helper_name='getDisplayValue',
+            model='tango:' + DEV_NAME + '/float_scalar#',
+            expected='-----')
+ at insertTest(helper_name='getDisplayValue',
+            model='tango:' + DEV_NAME + '/state',
+            expected='ON')
+# This fails due to encode/decode rounding errors for float<-->numpy.float32
+ at insertTest(helper_name='getDisplayValue',
+            model='tango:' + DEV_NAME + '/float_scalar',
+            expected='1.23 mm',
+            test_skip='enc/decode rounding errors for float<-->numpy.float32')
+ at insertTest(helper_name='getDisplayValue',
+            model='tango:' + DEV_NAME + '/double_scalar',
+            expected='1.23 mm')
+ at insertTest(helper_name='getDisplayValue',
+            model='tango:' + DEV_NAME + '/short_scalar',
+            expected='123 mm')
+ at insertTest(helper_name='getDisplayValue',
+            model='tango:' + DEV_NAME + '/boolean_scalar',
+            expected='True')
+class GetDisplayValueTestCase(TangoSchemeTestLauncher, BaseWidgetTestCase,
+                              unittest.TestCase):
+    """Check TaurusBaseComponent.getDisplayValue
+    """
+    _klass = TaurusWidget
+
+    def setUp(self):
+        BaseWidgetTestCase.setUp(self)
+
+    # def tearDown(self):
+    #     BaseWidgetTestCase.tearDown(self)
+
+    def getDisplayValue(self, model=None, expected=None):
+        '''Check if setModel works when using parent model'''
+        self._widget.setModel(model)
+        got = self._widget.getDisplayValue()
+        msg = ('getDisplayValue for "%s" should be %r (got %r)' %
+               (model, expected, got))
+        self.assertEqual(expected, got, msg)
+        self.assertMaxDeprecations(0)
diff --git a/lib/taurus/qt/qtgui/button/__init__.py b/lib/taurus/qt/qtgui/button/__init__.py
index 69bbade..abd69f8 100644
--- a/lib/taurus/qt/qtgui/button/__init__.py
+++ b/lib/taurus/qt/qtgui/button/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/button/qbuttonbox.py b/lib/taurus/qt/qtgui/button/qbuttonbox.py
index 7a89fcb..96c665d 100644
--- a/lib/taurus/qt/qtgui/button/qbuttonbox.py
+++ b/lib/taurus/qt/qtgui/button/qbuttonbox.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-qbuttonbox.py: 
+qbuttonbox.py:
 """
 
 __all__ = ["QButtonBox"]
@@ -33,67 +33,92 @@ __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 
+
 class QButtonBox(Qt.QDialogButtonBox):
-    __pyqtSignals__ = ("okClicked()","openClicked()", "saveClicked()", "cancelClicked()",
-                       "closeClicked()", "discardClicked()", "applyClicked()", "resetClicked()",
-                       "restoreDefaultsClicked()","helpClicked()","resetClicked()","saveAllClicked()",
-                       "yesClicked()","yesToAllClicked()","noClicked()","abortClicked()",
-                       "retryClicked()","ignoreClicked()")
-    
-    def __init__(self, parent = None, designMode = False, buttons = None,
-                 orientation = Qt.Qt.Horizontal):
-        
+
+    # PyQt Signals
+
+    okClicked = Qt.pyqtSignal()
+    openClicked = Qt.pyqtSignal()
+    saveClicked = Qt.pyqtSignal()
+    cancelClicked = Qt.pyqtSignal()
+    closeClicked = Qt.pyqtSignal()
+    discardClicked = Qt.pyqtSignal()
+    applyClicked = Qt.pyqtSignal()
+    resetClicked = Qt.pyqtSignal()
+    restoreDefaultsClicked = Qt.pyqtSignal()
+    helpClicked = Qt.pyqtSignal()
+    resetClicked = Qt.pyqtSignal()
+    saveAllClicked = Qt.pyqtSignal()
+    yesClicked = Qt.pyqtSignal()
+    yesToAllClicked = Qt.pyqtSignal()
+    noClicked = Qt.pyqtSignal()
+    abortClicked = Qt.pyqtSignal()
+    retryClicked = Qt.pyqtSignal()
+    ignoreClicked = Qt.pyqtSignal()
+
+    def __init__(self, parent=None, designMode=False, buttons=None,
+                 orientation=Qt.Qt.Horizontal):
+
         if buttons is None:
             buttons = Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel
-    
+
         Qt.QDialogButtonBox.__init__(self, buttons, orientation, parent)
-        
-        Qt.QObject.connect(self, Qt.SIGNAL("clicked(QAbstractButton *)"), self.onClicked)
-        
+
+        self.clicked.connect(self.onClicked)
+
     def onClicked(self, button):
         if self.standardButton(button) == Qt.QDialogButtonBox.Ok:
-            self.emit(Qt.SIGNAL("okClicked()"))
+            self.okClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Open:
-            self.emit(Qt.SIGNAL("openClicked()"))
+            self.openClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Save:
-            self.emit(Qt.SIGNAL("saveClicked()"))
+            self.saveClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Cancel:
-            self.emit(Qt.SIGNAL("cancelClicked()"))
+            self.cancelClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Close:
-            self.emit(Qt.SIGNAL("closeClicked()"))
+            self.closeClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Discard:
-            self.emit(Qt.SIGNAL("discardClicked()"))
+            self.discardClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Apply:
-            self.emit(Qt.SIGNAL("applyClicked()"))
+            self.applyClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Reset:
-            self.emit(Qt.SIGNAL("resetClicked()"))
+            self.resetClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.RestoreDefaults:
-            self.emit(Qt.SIGNAL("restoreDefaultsClicked()"))
+            self.restoreDefaultsClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Help:
-            self.emit(Qt.SIGNAL("helpClicked()"))
+            self.helpClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.SaveAll:
-            self.emit(Qt.SIGNAL("saveAllClicked()"))
+            self.saveAllClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Yes:
-            self.emit(Qt.SIGNAL("yesClicked()"))
+            self.yesClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.YesToAll:
-            self.emit(Qt.SIGNAL("yesToAllClicked()"))
+            self.yesToAllClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.No:
-            self.emit(Qt.SIGNAL("noClicked()"))
+            self.noClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.NoToAll:
-            self.emit(Qt.SIGNAL("noToAllClicked()"))
+            self.noToAllClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Abort:
-            self.emit(Qt.SIGNAL("abortClicked()"))
+            self.abortClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Retry:
-            self.emit(Qt.SIGNAL("retryClicked()"))
+            self.retryClicked.emit()
         elif self.standardButton(button) == Qt.QDialogButtonBox.Ignore:
-            self.emit(Qt.SIGNAL("ignoreClicked()"))
+            self.ignoreClicked.emit()
 
 
 if __name__ == "__main__":
     import sys
-    
+
+    def on_ok():
+        print('OK!')
+
+    def on_cancel():
+        print('Cancel!')
+
     app = Qt.QApplication(sys.argv)
-    bb = TaurusButtonBox()
+    bb = QButtonBox()
+    bb.okClicked.connect(on_ok)
+    bb.cancelClicked.connect(on_cancel)
     bb.show()
 
-    sys.exit(app.exec_())
\ No newline at end of file
+    sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/button/taurusbutton.py b/lib/taurus/qt/qtgui/button/taurusbutton.py
index 9e049d1..8d83d23 100644
--- a/lib/taurus/qt/qtgui/button/taurusbutton.py
+++ b/lib/taurus/qt/qtgui/button/taurusbutton.py
@@ -3,24 +3,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -37,18 +37,19 @@ 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.qt.qtgui.resource import getIcon
 from taurus.qt.qtgui.dialog import ProtectTaurusMessageBox
 
+
 class _ButtonDialog(Qt.QDialog):
     _widget = None
     deleteWidgetOnClose = False
+
     def __init__(self, parent=None):
         Qt.QDialog.__init__(self, parent, Qt.Qt.WindowTitleHint)
         l = Qt.QVBoxLayout()
         self.setLayout(l)
         self.previousWidgetConfig = None
-        
+
     def setWidget(self, widget):
         oldWidget = self.widget()
         if oldWidget is not None:
@@ -62,10 +63,10 @@ class _ButtonDialog(Qt.QDialog):
         if widget is not None:
             self.layout().addWidget(widget)
         self._widget = widget
-    
+
     def widget(self):
         return self._widget
-        
+
     def closeEvent(self, event):
         if self.deleteWidgetOnClose:
             try:
@@ -75,39 +76,40 @@ class _ButtonDialog(Qt.QDialog):
             self.setWidget(None)
         Qt.QDialog.closeEvent(self, event)
 
+
 class TaurusLauncherButton(Qt.QPushButton, TaurusBaseWidget):
     '''This class provides a button that launches a modeless dialog containing
     a specified Taurus widget which gets the same model as the button.
     The button does not use the model directly. Instead it passes it to the
     associated widget.
-    
+
     Code examples::
-        
+
         # a button that launches a TaurusAttrForm when clicked
         button =  TaurusLauncherButton(widget = TaurusAttrForm())
-        button.setModel('a/b/c') #a device name, which will be given to the TaurusAttrForm when clicking
-        
-        # a button that launches a taurusValueLabel (whose model is an attribute: 'a/b/c/attrname')
-        button =  TaurusLauncherButton(widget = TaurusValueLabel())
-        button.setModel('a/b/c/attrname') #a device name, which will be given to the TaurusValueLabel when clicking
-        
+        button.setModel('a/b/c') #a device name, which will be set at the TaurusAttrForm when clicking
+
+        # a button that launches a taurusLabel (whose model is an attribute: 'a/b/c/attrname')
+        button =  TaurusLauncherButton(widget = TaurusLabel())
+        button.setModel('a/b/c/attrname') # attr name, which will be set at the TaurusLabel when clicking
+
         #same as the previous one, but using the parent model and putting a custom text and icon:
-        button =  TaurusLauncherButton(widget = TaurusValueLabel(), text='click me', icon=':/taurus.png')
+        button =  TaurusLauncherButton(widget = TaurusLabel(), text='click me', icon='logos:taurus.png')
         button.setUseParentModel(True)  #let's assume that the button's parent has a model of type "/a/b/c"
         button.setModel('/attrname')
-    
+
     '''
-    
+
     _widgetClassName = ''
     _args = []
     _kwargs = {}
     _deleteWidgetOnClose = True
     _icon = None
     _text = None
-    
-    def __init__(self, parent = None, designMode = False, widget=None, icon=None, text = None):
+
+    def __init__(self, parent=None, designMode=False, widget=None, icon=None, text=None):
         '''Constructor
-        
+
         :param parent: (Qt.QWidget or None) parent of this widget
         :param designMode: (bool) flag for Qt designer
         :param widget: (Qt.QWidget) a QWidget that will be shown when clicking
@@ -119,26 +121,26 @@ class TaurusLauncherButton(Qt.QPushButton, TaurusBaseWidget):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QPushButton, parent)
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
+        self._dialog = _ButtonDialog(self)
         if icon is None and self._icon is not None:
-            icon = getIcon(self._icon)
-        if icon is not None: 
+            icon = Qt.QIcon(self._icon)
+        if icon is not None:
             self.setIcon(Qt.QIcon(icon))
-        if text is None: text = self._text
-        self._text = text
-        self.setText(self.getDisplayValue())
-        self._dialog = _ButtonDialog(self)
-        if widget is None:
-            pass
-        elif isinstance(widget, Qt.QWidget):
-            self._deleteWidgetOnClose = False # we cannot be sure on recreating the same widget again
+        if text is not None:
+            self._text = text
+        if isinstance(widget, Qt.QWidget):
+            # we cannot be sure on recreating the same widget again
+            self._deleteWidgetOnClose = False
             self.setWidget(widget)
-        else:
-            self.setWidgetClassName(widget)
-        self.connect(self, Qt.SIGNAL('clicked()'), self.onClicked)
+        elif widget is not None:
+            self._widgetClassName = widget
+        self.clicked.connect(self.onClicked)
         self.setDefault(False)
         self.setAutoDefault(False)
-        self.insertEventFilter(eventfilters.IGNORE_CHANGE_AND_PERIODIC) #no need to listen to change events!
-        
+        # no need to listen to change events!
+        self.insertEventFilter(eventfilters.IGNORE_CHANGE_AND_PERIODIC)
+        self._updateText()
+
     def getModelClass(self):
         '''see :meth:`TaurusBaseComponent.getModelClass`. Note that in the case of
         :class:`TaurusLauncherButton`, the class is completely dependent on the
@@ -146,25 +148,31 @@ class TaurusLauncherButton(Qt.QPushButton, TaurusBaseWidget):
         try:
             return self.widget().getModelClass()
         except:
-            #return None  #@TODO: Uncommenting this avoids the exception when TaurusBaseWidget.getModelClass chokes with relative classes. But the thing should be solved at TaurusBaseWidget.getModelClass level
+            # return None  #@TODO: Uncommenting this avoids the exception when
+            # TaurusBaseWidget.getModelClass chokes with relative classes. But
+            # the thing should be solved at TaurusBaseWidget.getModelClass
+            # level
             return TaurusBaseWidget.getModelClass(self)
-    
+
     def setText(self, text):
         '''Sets the text of the button. see :meth:`Qt.QPushButton.setText`'''
         self._text = text
         Qt.QPushButton.setText(self, text)
-    
+
     def getWidgetClassName(self):
         return self._widgetClassName
-        
+
     def setWidgetClassName(self, className, args=None, kwargs=None):
         self._widgetClassName = str(className)
-        if args is not None: self._args = args
-        if kwargs is not None: self._kwargs = kwargs
-        
+        if args is not None:
+            self._args = args
+        if kwargs is not None:
+            self._kwargs = kwargs
+        self._updateText()
+
     def resetWidgetClassName(self, className, args=None, kwargs=None):
         self.setWidgetClassName(self.__class__._widgetClassName)
-    
+
     def createWidget(self):
         from taurus.qt.qtgui.util import TaurusWidgetFactory
         klass = TaurusWidgetFactory().getWidgetClass(self._widgetClassName)
@@ -173,41 +181,38 @@ class TaurusLauncherButton(Qt.QPushButton, TaurusBaseWidget):
         if self._dialog.previousWidgetConfig is not None:
             try:
                 widget.applyConfig(self._dialog.previousWidgetConfig)
-            except Exception,e:
-                self.warning('Cannot apply previous configuration to widget. Reason: %s',repr(e))
-    
+            except Exception, e:
+                self.warning(
+                    'Cannot apply previous configuration to widget. Reason: %s', repr(e))
+
     def widget(self):
         return self._dialog.widget()
-    
+
     def setWidget(self, widget):
         '''sets the widget that will be shown when clicking the button
-        
+
         :param widget: (Qt.QWidget)
         '''
         self._dialog.setWidget(widget)
-        if self._text is None and self.widget() is not None:
-            self._text = self.widget().__class__.__name__
-        
-    def displayValue(self,v):
+        self._updateText()
+
+    def displayValue(self, v):
         '''see :meth:`TaurusBaseComponent.displayValue`'''
-        if self._text is not None: return self._text #make sure the text is not changed once set
-        TaurusBaseWidget.displayValue(self,v)
-        
+        if self._text is not None:
+            return self._text  # make sure the text is not changed once set
+        TaurusBaseWidget.displayValue(self, v)
+
     def getDisplayValue(self):
         '''see :meth:`TaurusBaseComponent.getDisplayValue`'''
-        if self._text is not None: return self._text
-        modelobj = self.getModelObj()
-        if modelobj is None:
-            return '---'
-        config = modelobj.getConfig()
-        if config.isSpectrum():
-            return 'Spect[%i]' % modelobj.read().value.shape[0]
-        elif config.isImage():
-            return 'Imag[%ix%i]'%(modelobj.read().value.shape)
-        else:
-            self.debug('Unknown model type for TaurusLauncherButton')
-            return '---'
-        
+        if self._text is not None:
+            return self._text
+        if self.widget() is not None:
+            return self.widget().__class__.__name__
+        return self._widgetClassName or '---'
+
+    def _updateText(self):
+        Qt.QPushButton.setText(self, self.getDisplayValue())
+
     def onClicked(self):
         '''
         Slot called when the button is clicked.
@@ -217,49 +222,53 @@ class TaurusLauncherButton(Qt.QPushButton, TaurusBaseWidget):
             self.createWidget()
         self.widget().setModel(self.getModelName())
         self._dialog.deleteWidgetOnClose = self._deleteWidgetOnClose
-        #dialog.resize(400,300)
+        # dialog.resize(400,300)
 
-        # It's always necessary to set the title since the model could have changed
+        # It's always necessary to set the title since the model could have
+        # changed
         self._dialog.setWindowTitle(str(self.getModelName()))
-        
+
         self._dialog.show()
         self._dialog.raise_()
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        return { 
-            'group'     : 'Taurus Buttons',
-            'icon'      : ':/designer/pushbutton.png',
-            'module'    : 'taurus.qt.qtgui.button',
-            'container' : False }
-            
+        return {
+            'group': 'Taurus Buttons',
+            'icon': 'designer:pushbutton.png',
+            'module': 'taurus.qt.qtgui.button',
+            'container': False}
+
     ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
     #                      Qt Properties                        #
     ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
-    Model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, TaurusBaseWidget.setModel, TaurusBaseWidget.resetModel)    
-    UseParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel, TaurusBaseWidget.setUseParentModel, TaurusBaseWidget.resetUseParentModel)
-    widgetClassName = Qt.pyqtProperty("QString", getWidgetClassName, setWidgetClassName, resetWidgetClassName)
+    Model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
+                            TaurusBaseWidget.setModel, TaurusBaseWidget.resetModel)
+    UseParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
+                                     TaurusBaseWidget.setUseParentModel, TaurusBaseWidget.resetUseParentModel)
+    widgetClassName = Qt.pyqtProperty(
+        "QString", getWidgetClassName, setWidgetClassName, resetWidgetClassName)
 
 
 class TaurusCommandButton(Qt.QPushButton, TaurusBaseWidget):
     '''This class provides a button that executes a tango command on its device.
-    
+
     Code examples::
-        
+
         # a button that executes the "status" command for the 'a/b/c' device server
-        button =  TaurusCommandButton(command = 'Status', icon=':/taurus.png')
+        button =  TaurusCommandButton(command = 'Status', icon='logos:taurus.png')
         button.setModel('a/b/c')
-        
+
         #  a button that executes the "exec" command for the 'a/b/c' device server with one parameter
-        button =  TaurusCommandButton(command = 'Status', parameters=['2+2'],icon=':/taurus.png')
+        button =  TaurusCommandButton(command = 'Status', parameters=['2+2'],icon='logos:taurus.png')
         button.setModel('a/b/c')
-        
+
     .. seealso:: :class:`TaurusCommandsForm` provides a good example of use of
                  TaurusCommandButton (including managing the return value) '''
 
-    __pyqtSignals__ = ("commandExecuted",)
-    
-    def __init__(self, parent=None, designMode=False, command=None, 
+    commandExecuted = Qt.pyqtSignal(object)
+
+    def __init__(self, parent=None, designMode=False, command=None,
                  parameters=None, icon=None, text=None,
                  timeout=None):
         '''Constructor
@@ -267,26 +276,29 @@ class TaurusCommandButton(Qt.QPushButton, TaurusBaseWidget):
         :param parent: (Qt.QWidget or None) parent of this widget
         :param designMode: (bool) flag for Qt designer
         :param command: (str) the name of the command to be executed
-        :param parameters: (sequence<str>) the list of parameteres. Default value is None meaning no parameters 
+        :param parameters: (sequence<str>) the list of parameteres. Default value is None meaning no parameters
         :param icon: (Qt.QIcon) icon for the button
         :param text: (str) the button text (if None passed, `command` is used)
         :param timeout: (float) the command timeout (in seconds)
         '''
         name = self.__class__.__name__
-        if command is None: command = ""
-        if parameters is None: parameters = []
+        if command is None:
+            command = ""
+        if parameters is None:
+            parameters = []
         self._command = command
         self._parameters = parameters
         self._timeout = timeout
         self._customText = text
         self.call__init__wo_kw(Qt.QPushButton, parent)
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-        if icon is not None: self.setIcon(Qt.QIcon(icon))
+        if icon is not None:
+            self.setIcon(Qt.QIcon(icon))
         self.setCustomText(text)
         self.setDefault(False)
         self.setAutoDefault(False)
-        self.connect(self, Qt.SIGNAL('clicked()'), self.onClicked)
-        
+        self.clicked.connect(self.onClicked)
+
     def getDisplayValue(self):
         '''see :meth:`TaurusBaseComponent.displayValue`'''
         if self._customText is not None:
@@ -297,9 +309,9 @@ class TaurusCommandButton(Qt.QPushButton, TaurusBaseWidget):
         if modelobj is None or not hasattr(modelobj, self._command):
             return '---'
         return self._command
-    
+
     @ProtectTaurusMessageBox(title="Unexpected error when executing command")
-    def onClicked(self):
+    def onClicked(self, value=0):
         return self._onClicked()
 
     def _onClicked(self):
@@ -307,82 +319,97 @@ class TaurusCommandButton(Qt.QPushButton, TaurusBaseWidget):
         parameters. It may issue a warning if the command is flagged as
         dangerous. On successful execution, it returns the command result and it
         emits a "commandExecuted" signal with the result as well.
-        
+
         :return: The result of the command. The type depends on the command. It
                  may be None.
-        
+
         .. seealso:: :meth:`setCommand`, :meth:`setParameters`, :meth:`TaurusBaseComponent.isDangerous`
         '''
-        
-        self.debug("launch command %s"%str(self._command))
+
+        self.debug("launch command %s" % str(self._command))
         if len(self._command) == 0:
             return
         modelobj = self.getModelObj()
         if modelobj is None or not hasattr(modelobj, self._command):
-            self.warning('Device %s does not implement command %s'%(modelobj, self._command))
+            self.warning('Device %s does not implement command %s' %
+                         (modelobj, self._command))
             return
-        
+
         if self.isDangerous() and not self.getForceDangerousOperations():
             result = Qt.QMessageBox.question(self, "Potentially dangerous action",
-                                         "%s\nProceed?"%self.getDangerMessage(),
-                                         Qt.QMessageBox.Ok|Qt.QMessageBox.Cancel,
-                                         Qt.QMessageBox.Ok)
+                                             "%s\nProceed?" % self.getDangerMessage(),
+                                             Qt.QMessageBox.Ok | Qt.QMessageBox.Cancel,
+                                             Qt.QMessageBox.Ok)
             if result != Qt.QMessageBox.Ok:
                 return
-        #After all the checks, we can finally do the action
+        # After all the checks, we can finally do the action
         orig_timeout = modelobj.get_timeout_millis()
         try:
             if self._timeout is not None:
-                modelobj.set_timeout_millis(int(self._timeout*1000))
-            result = modelobj.command_inout(self._command, self._castParameters(self._parameters, self._command, modelobj))
+                modelobj.set_timeout_millis(int(self._timeout * 1000))
+            result = modelobj.command_inout(self._command, self._castParameters(
+                self._parameters, self._command, modelobj))
         except Exception, e:
-            self.error('Unexpected error when executing command %s of %s: %s'%(self._command, modelobj.getNormalName(), str(e)))
+            self.error('Unexpected error when executing command %s of %s: %s' % (
+                self._command, modelobj.getNormalName(), str(e)))
             raise
         finally:
             modelobj.set_timeout_millis(orig_timeout)
-            
-        self.emit(Qt.SIGNAL('commandExecuted'), result)
+
+        self.commandExecuted.emit(result)
         return result
-    
+
     def _castParameters(self, parameters=None, command=None, dev=None):
         '''Internal method used to cast the command paramters to the appropriate
         type required for the given command
-        
+
         :param parameters: (sequence) a sequence of parameters. If None is
                            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.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)
         '''
-        if parameters is None: parameters = self._parameters
-        if command is None: command = self._command
-        if dev is None: dev = self.getModelObj()
-        
+        if parameters is None:
+            parameters = self._parameters
+        if command is None:
+            command = self._command
+        if dev is None:
+            dev = self.getModelObj()
+
         try:
             param_type = dev.command_query(command).in_type
         except Exception, e:
-            self.warning('Cannot get parameters info for command %s:%s'%(command, str(e)))
+            self.warning(
+                'Cannot get parameters info for command %s:%s' % (command, str(e)))
             return parameters
-        if param_type == PyTango.CmdArgType.DevVoid: return None
-        if PyTango.is_int_type(param_type, True): cast_type = int
-        elif PyTango.is_float_type(param_type, True): cast_type = float
-        elif param_type == PyTango.CmdArgType.DevVarStringArray or param_type == PyTango.CmdArgType.DevString:cast_type = str 
-        elif param_type == PyTango.CmdArgType.DevVarBooleanArray or param_type == PyTango.CmdArgType.DevBoolean:cast_type = bool
+        if param_type == PyTango.CmdArgType.DevVoid:
+            return None
+        if PyTango.is_int_type(param_type, True):
+            cast_type = int
+        elif PyTango.is_float_type(param_type, True):
+            cast_type = float
+        elif param_type == PyTango.CmdArgType.DevVarStringArray or param_type == PyTango.CmdArgType.DevString:
+            cast_type = str
+        elif param_type == PyTango.CmdArgType.DevVarBooleanArray or param_type == PyTango.CmdArgType.DevBoolean:
+            cast_type = bool
         else:
-            self.info('Unsupported parameters type (%s). Casting to "str"'%str(param_type))
+            self.info(
+                'Unsupported parameters type (%s). Casting to "str"' % str(param_type))
             cast_type = str
         if PyTango.is_scalar_type(param_type):
-            if parameters: return cast_type(parameters[0])
-            else: return parameters
+            if parameters:
+                return cast_type(parameters[0])
+            else:
+                return parameters
         else:
-            return map(cast_type,parameters)
-        
+            return map(cast_type, parameters)
+
     def setCommand(self, commandName):
         '''sets the command to be executed when the button is clicked
-        
+
         :param commandName: (str or None) the command name
         '''
         if commandName is None:
@@ -390,22 +417,22 @@ class TaurusCommandButton(Qt.QPushButton, TaurusBaseWidget):
         else:
             self._command = str(commandName)
         self._setText(self.getDisplayValue())
-    
+
     def getCommand(self):
         '''returns the command name to be executed when the button is clicked
-        
+
         :return: (str or None) the command name
         '''
         return self._command
-    
+
     def resetCommand(self):
         '''equivalent to self.setCommand(None)'''
         self.setCommand("")
-    
+
     def setParameters(self, parameters):
         '''
         Sets the parameters to be used on command execution.
-        
+
         :param parameters: (sequence) a sequence of parameters. If the
                            elements of the sequence are not of the right type
                            required for the parameter, an automatic conversion
@@ -417,149 +444,154 @@ class TaurusCommandButton(Qt.QPushButton, TaurusBaseWidget):
                            quotes will be removed and the quoted text will not
                            be splitted.
         '''
-        if isinstance(parameters,(basestring, Qt.QString)): 
+        if isinstance(parameters, (basestring, Qt.QString)):
             parameters = str(parameters).strip()
-            if parameters[0] in ('"',"'") and parameters[0] == parameters[-1]:
+            if parameters[0] in ('"', "'") and parameters[0] == parameters[-1]:
                 parameters = [parameters[1:-1]]
             else:
                 parameters = parameters.split()
         self._parameters = parameters
-    
+
     def getParameters(self):
         '''returns the parameters to be used on command execution
-        
+
         :param parameters: (sequence)
         '''
         return self._parameters
-    
+
     def resetParameters(self):
         '''Equivalent to setParameters([])
         '''
         self.setParameters([])
-        
+
     def setCustomText(self, customText=None):
         '''Sets a custom text for the button (by default it is the command name)
-        
+
         :param customText: (str or None) the custom text. If None passed, it
                            will use the command name
         '''
         self._customText = customText
         self._setText(self.getDisplayValue())
-    
+
     def getCustomText(self):
         '''Returns the custom text of the buttom, or None if no custom text is
         used
         '''
         return self._customText
-    
+
     def resetCustomText(self):
         '''Equivalent to setCustomText(None)'''
         self.setCustomText(None)
-        
-    @Qt.pyqtSlot(float)    
+
+    @Qt.pyqtSlot(float)
     @Qt.pyqtSlot(int)
     def setTimeout(self, timeout):
         '''Sets the number of seconds to wait for the result of the command.
-        
+
         .. seealso:: :meth:`PyTango.DeviceProxy.command_inout`
-        
-        :param timeout: (float) the command timeout in seconds 
+
+        :param timeout: (float) the command timeout in seconds
                         (timeout <0 or timeout=None disables the timeout)
         '''
         if timeout < 0:
-            timeout = None 
-        self._timeout = timeout 
-           
+            timeout = None
+        self._timeout = timeout
+
     def getTimeout(self):
         '''
         Returns the number of seconds to wait for the result of the command
-        (or -1 if timeout is disabled) 
+        (or -1 if timeout is disabled)
         '''
         ret = self._timeout
         if ret is None or ret < 0:
             ret = -1
-        return ret 
-                    
+        return ret
+
     def resetTimeout(self):
         '''Equivalent to setTimeout(None)'''
         self.setTimeout(None)
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        return { 
-            'group'     : 'Taurus Buttons',
-            'icon'      : ':/designer/pushbutton.png',
-            'module'    : 'taurus.qt.qtgui.button',
-            'container' : False }
-        
+        return {
+            'group': 'Taurus Buttons',
+            'icon': 'designer:pushbutton.png',
+            'module': 'taurus.qt.qtgui.button',
+            'container': False}
+
     ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
     #                      Qt Properties                        #
     ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
-    
-    Model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, TaurusBaseWidget.setModel, TaurusBaseWidget.resetModel)
-    
-    UseParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel, TaurusBaseWidget.setUseParentModel, TaurusBaseWidget.resetUseParentModel)
-    
+
+    Model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
+                            TaurusBaseWidget.setModel, TaurusBaseWidget.resetModel)
+
+    UseParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
+                                     TaurusBaseWidget.setUseParentModel, TaurusBaseWidget.resetUseParentModel)
+
     Command = Qt.pyqtProperty("QString", getCommand, setCommand, resetCommand)
-    
-    Parameters = Qt.pyqtProperty("QStringList", getParameters, setParameters, resetParameters)  
-    
-    DangerMessage = Qt.pyqtProperty("QString", TaurusBaseWidget.getDangerMessage, TaurusBaseWidget.setDangerMessage, TaurusBaseWidget.resetDangerMessage)
-    
-    CustomText = Qt.pyqtProperty("QString", getCustomText, setCustomText, resetCustomText)
-    
+
+    Parameters = Qt.pyqtProperty(
+        "QStringList", getParameters, setParameters, resetParameters)
+
+    DangerMessage = Qt.pyqtProperty("QString", TaurusBaseWidget.getDangerMessage,
+                                    TaurusBaseWidget.setDangerMessage, TaurusBaseWidget.resetDangerMessage)
+
+    CustomText = Qt.pyqtProperty(
+        "QString", getCustomText, setCustomText, resetCustomText)
+
     Timeout = Qt.pyqtProperty("double", getTimeout, setTimeout, resetTimeout)
 
 
 class TaurusLockButton(Qt.QPushButton, TaurusBaseWidget):
 
-    _LOCK_MAP = { LockStatus.Unlocked : ":/lock_unlocked.svg",
-                  LockStatus.Locked   : ":/lock_locked_unpreviledged.svg",
-                  LockStatus.LockedMaster : ":/lock_locked.svg",
-                  LockStatus.Unknown: ":/lock_unknown.svg" }
+    _LOCK_MAP = {LockStatus.Unlocked: "extra_icon:lock_unlocked.svg",
+                 LockStatus.Locked: "extra_icon:lock_locked_unpreviledged.svg",
+                 LockStatus.LockedMaster: "extra_icon:lock_locked.svg",
+                 LockStatus.Unknown: "extra_icon:lock_unknown.svg"}
 
-    def __init__(self, parent = None, designMode = False):
+    def __init__(self, parent=None, designMode=False):
         self._lock_info = TaurusLockInfo()
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QPushButton, parent)
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-        self.connect(self, Qt.SIGNAL("toggled(bool)"), self.on_toggle)
+        self.toggled.connect(self.on_toggle)
         self.setCheckable(True)
         self.setAutoTooltip(False)
         self.insertEventFilter(eventfilters.IGNORE_ALL)
         self.update_button()
-        
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        return { 
-            'group'     : 'Taurus Buttons',
-            'icon'      : ':/designer/pushbutton.png',
-            'module'    : 'taurus.qt.qtgui.button',
-            'container' : False }
+        return {
+            'group': 'Taurus Buttons',
+            'icon': 'designer:pushbutton.png',
+            'module': 'taurus.qt.qtgui.button',
+            'container': False}
 
     def getModelClass(self):
         return TaurusDevice
-    
+
     def setModel(self, model):
         TaurusBaseWidget.setModel(self, model)
         self.update_button()
-        
+
     def get_lock_info(self, cache=False):
         dev = self.getModelObj()
         if dev is not None:
             self._lock_info = dev.getLockInfo(cache=cache)
         return self._lock_info
-    
+
     def update_button(self, lock_info=None):
         if lock_info is None:
             lock_info = self.get_lock_info()
         status = lock_info.status
-        self.setIcon(getIcon(self._LOCK_MAP[status]))
+        self.setIcon(Qt.QIcon(self._LOCK_MAP[status]))
         self.setDown(status in (LockStatus.Locked, LockStatus.LockedMaster))
         self.setToolTip(lock_info.status_msg)
         self.update()
         return lock_info
-    
+
     def _on_toggle(self, down):
         dev = self.getModelObj()
         if down:
@@ -567,7 +599,7 @@ class TaurusLockButton(Qt.QPushButton, TaurusBaseWidget):
         else:
             dev.unlock()
         self.update_button()
-        
+
     def on_toggle(self, down):
         try:
             self._on_toggle(down)
@@ -579,7 +611,7 @@ class TaurusLockButton(Qt.QPushButton, TaurusBaseWidget):
             if self.update_button().status == LockStatus.Locked:
                 msgbox.setText(self._lock_info.status_msg)
             msgbox.exec_()
-        
+
     model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, setModel,
                             TaurusBaseWidget.resetModel)
 
@@ -588,18 +620,18 @@ def lockButtonMain():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         import taurus.core.util.argparse
         parser = taurus.core.util.argparse.get_taurus_parser()
         parser.usage = "%prog [options] <full_attribute_name(s)>"
-        app = Application(sys.argv, cmd_line_parser=parser, 
+        app = Application(sys.argv, cmd_line_parser=parser,
                           app_name="Taurus lock button demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
-        
+
     args = app.get_command_line_args()
 
     if len(args) == 0:
@@ -615,7 +647,7 @@ def lockButtonMain():
             lock_button.model = model
             layout.addWidget(lock_button)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
@@ -625,13 +657,17 @@ def lockButtonMain():
 def commandButtonMain():
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
-    
+
     app = TaurusApplication()
-    form = TaurusCommandButton(parent=None, designMode=False, command = 'DevBoolean', parameters=[123], icon=':/taurus.png', text = 'launch: DevBoolean 123')
+    form = TaurusCommandButton(parent=None, designMode=False, command='DevBoolean', parameters=[
+                               123], icon='logos:taurus.png', text='launch: DevBoolean 123')
     form.setModel('sys/tg_test/1')
-    form.setDangerMessage('Booo scary command!!\n Maybe you should think twice!')
-    def f(*a):print a
-    form.connect(form, Qt.SIGNAL('commandExecuted'),f)
+    form.setDangerMessage(
+        'Booo scary command!!\n Maybe you should think twice!')
+
+    def f(*a):
+        print a
+    form.commandExecuted.connect(f)
     form.show()
     sys.exit(app.exec_())
 
@@ -639,24 +675,28 @@ def commandButtonMain():
 def launcherButtonMain():
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
-    
+
     app = TaurusApplication()
-    
-    #Creating button giving the widget
-#    from taurus.qt.qtgui.plot import TaurusPlot
-#    w=TaurusPlot()
-#    form = TaurusLauncherButton(parent=None, designMode=False, widget = w, icon=':/taurus.png', text = 'show')
-#    
-    #Creating button giving the widget class name
-#    form = TaurusLauncherButton(parent=None, designMode=False, widget = 'TaurusPlot', icon=':/taurus.png', text = 'show')
-    
-    #Creating button using a derived class with the name widget class hardcoded
+
+    # Creating button giving the widget
+    # from taurus.qt.qtgui.plot import TaurusPlot
+    # w = TaurusPlot()
+    # form = TaurusLauncherButton(parent=None, designMode=False, widget=w,
+    #                             icon='logos:taurus.png'), text='show')
+
+    # Creating button giving the widget class name
+    # form = TaurusLauncherButton(parent=None, designMode=False,
+    #                             widget='TaurusPlot', icon='logos:taurus.png',
+    #                             text='show')
+
+    # Creating button using a derived class with the name widget class
+    # hardcoded
     class MyButton(TaurusLauncherButton):
-        _widgetClassName = 'TaurusPlot'   
-        _icon = ':/taurus.png'
+        _widgetClassName = 'TaurusPlot'
+        _icon = 'logos:taurus.png'
         _text = 'show'
     form = MyButton()
-    
+
     form.setModel('sys/tg_test/1/wave')
     form.show()
     sys.exit(app.exec_())
@@ -664,8 +704,8 @@ def launcherButtonMain():
 
 def main():
     lockButtonMain()
-    
-    
+
+
 def demo():
     '''Lock button'''
     lock_button = TaurusLockButton()
@@ -674,6 +714,6 @@ def demo():
 
 
 if __name__ == '__main__':
-    #lockButtonMain()
+    # lockButtonMain()
     launcherButtonMain()
-    #commandButtonMain()
+    # commandButtonMain()
diff --git a/lib/taurus/qt/qtgui/button/test/__init__.py b/lib/taurus/qt/qtgui/button/test/__init__.py
index e097032..b8bbb65 100644
--- a/lib/taurus/qt/qtgui/button/test/__init__.py
+++ b/lib/taurus/qt/qtgui/button/test/__init__.py
@@ -1,22 +1,22 @@
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
diff --git a/lib/taurus/qt/qtgui/button/test/res/Timeout b/lib/taurus/qt/qtgui/button/test/res/Timeout
index ac71f62..a4a421c 100755
--- a/lib/taurus/qt/qtgui/button/test/res/Timeout
+++ b/lib/taurus/qt/qtgui/button/test/res/Timeout
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus, a Tango User Interface Library
+# This file is part of Taurus, a Tango User Interface Library
 ##
-## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+# http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
 ##
-## Copyright 2014 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2014 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -27,7 +27,7 @@
 This module contains classes necessary by a simple python Tango Device Server.
 
 TimeoutDs is used to provoke timeout exceptions on requests.
-It comprises one device class: Timeout. 
+It comprises one device class: Timeout.
 This class implements one attribute: Timeout_attr and one command: TimoutCmd.
 
 Timeout_attr is read/write of type float and its dimension is scalar.
@@ -37,32 +37,34 @@ TimeoutCmd expects as an argument a float scalar.
 The argument value is the time that will take to execute the command.
 
 #@TODO: create .bat file to allow starting on windows
-    
+
 """
 
 import PyTango
 import sys
 import time
 
+
 class TimeoutClass(PyTango.DeviceClass):
 
-    cmd_list = { 'TimeoutCmd' : 
-         [[ PyTango.ArgType.DevFloat, "Time the command execution will take" ],
-          [ PyTango.ArgType.DevVoid, "" ]]                               
-    }
+    cmd_list = {'TimeoutCmd':
+                [[PyTango.ArgType.DevFloat, "Time the command execution will take"],
+                 [PyTango.ArgType.DevVoid, ""]]
+                }
+
+    attr_list = {'Timeout_attr': [[PyTango.ArgType.DevFloat,
+                                   PyTango.AttrDataFormat.SCALAR,
+                                   PyTango.AttrWriteType.READ_WRITE]]
+                 }
 
-    attr_list = { 'Timeout_attr' : [[PyTango.ArgType.DevFloat ,
-                                     PyTango.AttrDataFormat.SCALAR ,
-                                     PyTango.AttrWriteType.READ_WRITE]]
-    }
-    
     def __init__(self, name):
         PyTango.DeviceClass.__init__(self, name)
         self.set_type("TestDevice")
-        
+
+
 class Timeout(PyTango.Device_4Impl):
 
-    def __init__(self,cl,name):
+    def __init__(self, cl, name):
         PyTango.Device_4Impl.__init__(self, cl, name)
         self.info_stream('In Timeout.__init__')
         Timeout.init_device(self)
@@ -93,7 +95,7 @@ class Timeout(PyTango.Device_4Impl):
         self.info_stream('TimeoutCmd' + str(in_data))
         self.cmd_duration = in_data
         time.sleep(self.cmd_duration)
-    
+
     #------------------------------------------------------------------
     # ATTRIBUTES
     #------------------------------------------------------------------
@@ -104,13 +106,13 @@ class Timeout(PyTango.Device_4Impl):
 
     @PyTango.DebugIt()
     def read_Timeout_attr(self, the_att):
-        self.info_stream("read_Long_attr")
+        self.info_stream("read_Timeout_attr")
         time.sleep(self.attr_duration)
         the_att.set_value(self.attr_duration)
-    
+
     @PyTango.DebugIt()
     def write_Timeout_attr(self, the_att):
-        self.info_stream("write_Short_attr_rw")
+        self.info_stream("write_Timeout_attr")
         self.attr_duration = the_att.get_write_value()
         time.sleep(self.attr_duration)
 
diff --git a/lib/taurus/qt/qtgui/button/test/res/__init__.py b/lib/taurus/qt/qtgui/button/test/res/__init__.py
index 9503bca..b5a5672 100644
--- a/lib/taurus/qt/qtgui/button/test/res/__init__.py
+++ b/lib/taurus/qt/qtgui/button/test/res/__init__.py
@@ -2,23 +2,23 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
diff --git a/lib/taurus/qt/qtgui/button/test/test_taurusbutton.py b/lib/taurus/qt/qtgui/button/test/test_taurusbutton.py
index b40e5d0..8fb95c0 100644
--- a/lib/taurus/qt/qtgui/button/test/test_taurusbutton.py
+++ b/lib/taurus/qt/qtgui/button/test/test_taurusbutton.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -55,34 +55,34 @@ class TaurusCommandButtonTest2(BaseWidgetTestCase, unittest.TestCase):
          - instantiate the widget
          - make sure that the the timeout server is ready
         '''
-        #Call base class setup (instantiate the widget,...)
+        # Call base class setup (instantiate the widget,...)
         BaseWidgetTestCase.setUp(self)
-        #get path to DS and executable
+        # get path to DS and executable
         timeoutExec = getResourcePath('taurus.qt.qtgui.button.test.res',
                                       'Timeout')
-        #create starter for the Timeout server
+        # create starter for the Timeout server
         self._starter = ProcessStarter(timeoutExec, 'Timeout/unittest')
-        #register timeoutserver  #TODO: guarantee that devname is not in use
+        # register timeoutserver  #TODO: guarantee that devname is not in use
         devname = 'unittests/timeout/temp-1'
         self._starter.addNewDevice(devname, klass='Timeout')
-        #start Timeout server
+        # start Timeout server
         self._starter.startDs()
 
-        #Configure the widget
+        # Configure the widget
         self._widget.setModel(devname)
 
     def tearDown(self):
         '''Stop the timeout server and undo changes to the database'''
 
         self._widget.setModel(None)
-        #remove timeoutserver
+        # remove timeoutserver
         self._starter.cleanDb(force=True)
 
     def testTimeOutError(self):
         '''Check that the timeout property works'''
-        #lets use commands that take at least 200ms in returning
+        # lets use commands that take at least 200ms in returning
         self._widget.setParameters([.2])
-        #With a long timeout it should work...
+        # With a long timeout it should work...
         self._widget.setTimeout(10)
         ret = self._widget._onClicked()
         msg = 'expected return None when timeout >> command response time'
diff --git a/lib/taurus/qt/qtgui/compact/__init__.py b/lib/taurus/qt/qtgui/compact/__init__.py
index 3e453f4..e5b5da3 100644
--- a/lib/taurus/qt/qtgui/compact/__init__.py
+++ b/lib/taurus/qt/qtgui/compact/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## Copyright 2013 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/>.
+# http://taurus-scada.org
+##
+# Copyright 2013 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/compact/abstractswitcher.py b/lib/taurus/qt/qtgui/compact/abstractswitcher.py
index 2a890af..b8fa8de 100644
--- a/lib/taurus/qt/qtgui/compact/abstractswitcher.py
+++ b/lib/taurus/qt/qtgui/compact/abstractswitcher.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## Copyright 2013 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/>.
+# http://taurus-scada.org
+##
+# Copyright 2013 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 provides base classes from which the compact widgets should inherit 
+"""This module provides base classes from which the compact widgets should inherit
 """
 
 __all__ = ["TaurusReadWriteSwitcher"]
@@ -34,86 +34,87 @@ from taurus.external.qt import Qt
 from taurus.qt.qtgui.container import TaurusWidget
 from taurus.qt.qtgui.base import TaurusBaseWritableWidget
 
+
 class TaurusReadWriteSwitcher(TaurusWidget):
     '''
-    This is a base class for creating widgets that can switch 
+    This is a base class for creating widgets that can switch
     beetween read and write mode by combining a Taurus widget for reading
     and a Taurus Widget for writing.
-    
-    For example, if you want to combine a TaurusLabel with a 
+
+    For example, if you want to combine a TaurusLabel with a
     TaurusValueLineEdit, you can implement it as follows::
-    
+
         class MyRWSwitcher(TaurusReadWriteSwitcher):
             readWClass = TaurusLabel
-            writeWClass = TaurusValueLineEdit 
-            
-    Alternatively, you can instantiate the TaurusReadWriteSwitcher class 
+            writeWClass = TaurusValueLineEdit
+
+    Alternatively, you can instantiate the TaurusReadWriteSwitcher class
     directly and pass the read and write classes to the constructor::
-    
-        w = TaurusReadWriteSwitcher(readWClass=TaurusLabel, 
+
+        w = TaurusReadWriteSwitcher(readWClass=TaurusLabel,
                                     writeWClass=TaurusValueLineEdit)
-    
-    Or you can even set the read and write widgets (instead of classes) 
+
+    Or you can even set the read and write widgets (instead of classes)
     after instantiation::
-    
+
         w = TaurusReadWriteSwitcher()
         a = TaurusLabel()
         b = TaurusValueLineEdit()
         w.setReadWidget(a)
         w.setWriteWidget(b)
-    
+
     TaurusReadWriteSwitcher will normally show the read widget by default,
-    but it will allow to switch to "edit mode" (where the write widget 
+    but it will allow to switch to "edit mode" (where the write widget
     is shown instead). Enetering and exiting the edit mode is controlled
     by "triggers". Triggers can be key presses, QEvents or signals.
-    
-    The default implementation sets pressing F2 or doubleclicking the read 
+
+    The default implementation sets pressing F2 or doubleclicking the read
     widget as the triggers for entering edit mode, and pressing Escape,
-    losing the focus or applying the value on the write widget as the 
-    triggers for leaving the edit mode. This can be customized by changing 
-    `enterEditTriggers` and `exitEditTriggers` class members or by passing 
+    losing the focus or applying the value on the write widget as the
+    triggers for leaving the edit mode. This can be customized by changing
+    `enterEditTriggers` and `exitEditTriggers` class members or by passing
     `enterEditTriggers` and `exitEditTriggers` keyword parameters to the
     constructor of TaurusReadWriteSwitcher:
-    
+
         - `enterEditTriggers` is a tuple containing one or more of the following:
-        
+
             - key shortcut (either a Qt.Qt.Key or a QKeySequence)
             - event type on the read widget (a Qt.QEvent.Type)
             - signal from the read widget (a str representing a Signal signature)
-        
+
         - `exitEditTriggers` is a tuple containing one or more of the following:
-        
+
             - key shortcut (either a Qt.Qt.Key or a QKeySequence)
             - event type on the write widget (a Qt.QEvent.Type)
             - signal from the write widget (a str representing a Signal signature)
 
     #@todo: check integration with designer
-    
-    '''    
+
+    '''
     readWClass = None
     writeWClass = None
-    
+
     enterEditTriggers = (Qt.Qt.Key_F2, Qt.QEvent.MouseButtonDblClick)
-    exitEditTriggers = (Qt.Qt.Key_Escape, Qt.QEvent.FocusOut, TaurusBaseWritableWidget.appliedSignalSignature)
+    exitEditTriggers = (Qt.Qt.Key_Escape, Qt.QEvent.FocusOut, 'applied')
 
-    def __init__(self, parent=None, designMode = False, 
-                 readWClass=None, writeWClass=None, 
+    def __init__(self, parent=None, designMode=False,
+                 readWClass=None, writeWClass=None,
                  enterEditTriggers=None, exitEditTriggers=None):
-        
+
         TaurusWidget.__init__(self, parent=parent, designMode=designMode)
-        
+
         self.setFocusPolicy(Qt.Qt.StrongFocus)
         self.setLayout(Qt.QStackedLayout())
         self.readWidget = None
         self.writeWidget = None
-        
-        #Use parameters from constructor args or defaults from class
+
+        # Use parameters from constructor args or defaults from class
         self.readWClass = readWClass or self.readWClass
         self.writeWClass = writeWClass or self.writeWClass
         self.enterEditTriggers = enterEditTriggers or self.enterEditTriggers
         self.exitEditTriggers = exitEditTriggers or self.exitEditTriggers
-                
-        #classify the triggers
+
+        # classify the triggers
         sc, et, sig = self._classifyTriggers(self.enterEditTriggers)
         self.enterEditShortCuts = sc
         self.enterEditEventTypes = et
@@ -122,28 +123,30 @@ class TaurusReadWriteSwitcher(TaurusWidget):
         self.exitEditShortCuts = sc
         self.exitEditEventTypes = et
         self.exitEditSignals = sig
-                
-        #Actions for entering and exiting the edit
+
+        # Actions for entering and exiting the edit
         self.enterEditAction = Qt.QAction("Start Editing", self)
         self.enterEditAction.setShortcuts(self.enterEditShortCuts)
-        self.enterEditAction.setShortcutContext(Qt.Qt.WidgetWithChildrenShortcut)
+        self.enterEditAction.setShortcutContext(
+            Qt.Qt.WidgetWithChildrenShortcut)
         self.addAction(self.enterEditAction)
         self.exitEditAction = Qt.QAction("Abort Editing", self)
         self.exitEditAction.setShortcuts(self.exitEditShortCuts)
-        self.exitEditAction.setShortcutContext(Qt.Qt.WidgetWithChildrenShortcut)
+        self.exitEditAction.setShortcutContext(
+            Qt.Qt.WidgetWithChildrenShortcut)
         self.addAction(self.exitEditAction)
-        self.connect(self.enterEditAction, Qt.SIGNAL("triggered()"), self._onEnterEditActionTriggered)
-        self.connect(self.exitEditAction, Qt.SIGNAL("triggered()"), self._onExitEditActionTriggered)
-        
-        #add read and write widgets        
+        self.enterEditAction.triggered[()].connect(self._onEnterEditActionTriggered)
+        self.exitEditAction.triggered[()].connect(self._onExitEditActionTriggered)
+
+        # add read and write widgets
         if self.readWClass is not None:
             self.setReadWidget(self.readWClass())
         if self.writeWClass is not None:
             self.setWriteWidget(self.writeWClass())
-    
+
     def _classifyTriggers(self, triggers):
         '''classifies the diferent types of triggers
-        
+
         :return: (tuple) a tuple of 3 lists: shortcuts,enventypes,signals
         '''
         shortcuts = []
@@ -155,85 +158,105 @@ class TaurusReadWriteSwitcher(TaurusWidget):
             elif isinstance(e, Qt.QEvent.Type):
                 eventTypes.append(e)
             elif isinstance(e, (basestring, Qt.QString)):
-                signals.append(Qt.SIGNAL(e))
+                signals.append(e)
             else:
-                raise TypeError('Unsupported trigger type: %s'%repr(type(e)))
+                raise TypeError('Unsupported trigger type: %s' % repr(type(e)))
         return shortcuts, eventTypes, signals
-            
+
     def eventFilter(self, obj, event):
-        '''reimplemented to intercept events from the read and write widgets''' 
+        '''reimplemented to intercept events from the read and write widgets'''
         if obj is self.readWidget and event.type() in self.enterEditEventTypes:
             self.enterEdit()
-            return True # Note that we do not let it propagate further!
+            return True  # Note that we do not let it propagate further!
         if obj is self.writeWidget and event.type() in self.exitEditEventTypes:
             self.exitEdit()
-            return True # Note that we do not let it propagate further!
-        #default fallback
+            return True  # Note that we do not let it propagate further!
+        # default fallback
         return obj.eventFilter(obj, event)
-        
+
     def setReadWidget(self, widget):
-        '''set the read Widget to be used. You can reimplement this 
-        method to tweak the read widget. 
-        
+        '''set the read Widget to be used. You can reimplement this
+        method to tweak the read widget.
+
         :param widget: (QWidget) This should be Taurus widget
         '''
         if self.readWidget is not None:
-            raise RuntimeError('ReadWidget already set') #@todo: relax this limitation
+            # @todo: relax this limitation
+            raise RuntimeError('ReadWidget already set')
         self.readWidget = widget
         self.layout().insertWidget(0, self.readWidget)
         self.readWidget.setCursor(Qt.Qt.IBeamCursor)
         self.readWidget.setModel(self.getModelName())
-        #setup EnterEdit triggers
+        # setup EnterEdit triggers
         if self.enterEditEventTypes:
             self.readWidget.installEventFilter(self)
         for sig in self.enterEditSignals:
-            self.connect(self.readWidget, sig, self.enterEdit)
-        #update size policy
+            try:
+                getattr(self.readWidget, sig).connect(self.enterEdit)
+            except Exception, e:
+                self.debug('Cannot connect signal. Reason: %s', e)
+        # update size policy
         self._updateSizePolicy()
-        #register configuration (we use the class name to avoid mixing configs in the future)
-        self.registerConfigDelegate(self.readWidget, name='_R_'+self.readWidget.__class__.__name__)
-    
+        # register configuration (we use the class name to avoid mixing configs
+        # in the future)
+        self.registerConfigDelegate(
+            self.readWidget, name='_R_' + self.readWidget.__class__.__name__)
+
     def setWriteWidget(self, widget):
-        '''set the write Widget to be used You can reimplement this 
+        '''set the write Widget to be used You can reimplement this
         method to tweak the write widget.
-        
+
         :param widget: (Qt.QWidget) This should be Taurus widget
                        (typically a TaurusBaseWritableWidget)
         '''
         if self.writeWidget is not None:
-            raise RuntimeError('WriteWidget already set') #@todo: relax this limitation
+            # @todo: relax this limitation
+            raise RuntimeError('WriteWidget already set')
         self.writeWidget = widget
         self.layout().insertWidget(1, self.writeWidget)
         self.writeWidget.setModel(self.getModelName())
         if self.exitEditEventTypes:
             self.writeWidget.installEventFilter(self)
         for sig in self.exitEditSignals:
-            self.connect(self.writeWidget, sig, self.exitEdit)
-        #update size policy
+            try:
+                getattr(self.writeWidget, sig).connect(self.exitEdit)
+            except Exception, e:
+                if isinstance(e, AttributeError) and hasattr(Qt, "SIGNAL"):
+                    # Support old-style signal
+                    self.connect(self.writeWidget, Qt.SIGNAL(sig),
+                                 self.exitEdit)
+                    self.debug('Cannot connect %s using new style signal.' +
+                               'Falling back to old style', sig)
+                else:
+                    self.debug('Cannot connect signal. Reason: %s', e)
+
+        # update size policy
         self._updateSizePolicy()
-        #register configuration (we use the class name to avoid mixing configs in the future)
-        self.registerConfigDelegate(self.readWidget, name='_W_'+self.writeWidget.__class__.__name__)
-        
+        # register configuration (we use the class name to avoid mixing configs
+        # in the future)
+        self.registerConfigDelegate(
+            self.readWidget, name='_W_' + self.writeWidget.__class__.__name__)
+
     def enterEdit(self, *args, **kwargs):
         '''Slot for entering Edit mode
-        
+
         .. note:: args and kwargs are ignored
-        ''' 
+        '''
         self.enterEditAction.trigger()
-    
+
     def exitEdit(self, *args, **kwargs):
         '''Slot for entering Edit mode
-        
+
         .. note:: args and kwargs are ignored
         '''
         self.exitEditAction.trigger()
-    
+
     def _onEnterEditActionTriggered(self):
         self.layout().setCurrentIndex(1)
-    
+
     def _onExitEditActionTriggered(self):
         self.layout().setCurrentIndex(0)
-        
+
     def _updateSizePolicy(self):
         '''Update the size policy of the switcher widget to the most restrictive
         combination of the policies of the read and write widgets'''
@@ -246,7 +269,7 @@ class TaurusReadWriteSwitcher(TaurusWidget):
                 else:
                     h = policy.horizontalPolicy() & p.horizontalPolicy()
                     v = policy.verticalPolicy() & p.verticalPolicy()
-                    policy = Qt.QSizePolicy(Qt.QSizePolicy.Policy(h), 
+                    policy = Qt.QSizePolicy(Qt.QSizePolicy.Policy(h),
                                             Qt.QSizePolicy.Policy(v))
         if policy is not None:
             self.setSizePolicy(policy)
@@ -260,17 +283,18 @@ class TaurusReadWriteSwitcher(TaurusWidget):
         if self.writeWidget is not None:
             self.writeWidget.setModel(model)
         TaurusWidget.setModel(self, model)
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         ret = TaurusWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.compact'
         ret['group'] = 'Taurus R+W'
-        ret['icon'] = ":/designer/frame.png"
+        ret['icon'] = "designer:frame.png"
         if (cls.readWClass or cls.readWClass) is None:
-            ret['container'] = True #for base classes
+            ret['container'] = True  # for base classes
         else:
-            ret['container'] = False #for classes which already define the subwidgets
+            # for classes which already define the subwidgets
+            ret['container'] = False
         return ret
 
     model = Qt.pyqtProperty("QString", TaurusWidget.getModel,
@@ -278,10 +302,10 @@ class TaurusReadWriteSwitcher(TaurusWidget):
                             TaurusWidget.resetModel)
 
 ######################################
-## This block (and something more would be needed if we decide  
-## to implement TaurusReadWriteSwitcher as a TaurusBaseWritableWidget
+# This block (and something more would be needed if we decide
+# to implement TaurusReadWriteSwitcher as a TaurusBaseWritableWidget
 ######################################
-#        
+#
 #    def setDangerMessage(self, dangerMessage=None):
 #        '''propagate to writeWidget'''
 #        TaurusWidget.setDangerMessage(self, dangerMessage)
@@ -289,7 +313,7 @@ class TaurusReadWriteSwitcher(TaurusWidget):
 #            return self.writeWidget.setDangerMessage(dangerMessage)
 #        except AttributeError:
 #            pass
-#    
+#
 #    def setForceDangerousOperations(self, yesno):
 #        '''propagate to writeWidget'''
 #        TaurusWidget.setForceDangerousOperations(self, yesno)
@@ -297,27 +321,27 @@ class TaurusReadWriteSwitcher(TaurusWidget):
 #            return self.writeWidget.setForceDangerousOperations(yesno)
 #        except AttributeError:
 #            pass
-#  
-#                
+#
+#
 #######################################
-    
 
-        
+
 def demo1():
     '''Simple demo'''
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.qt.qtgui.display import TaurusLabel
     from taurus.qt.qtgui.input import TaurusValueLineEdit
-    
+
     app = TaurusApplication()
-        
-    w = TaurusReadWriteSwitcher(readWClass=TaurusLabel, 
+
+    w = TaurusReadWriteSwitcher(readWClass=TaurusLabel,
                                 writeWClass=TaurusValueLineEdit)
     w.model = "sys/tg_test/1/long_scalar"
-    
+
     w.show()
-    sys.exit(app.exec_()) 
+    sys.exit(app.exec_())
+
 
 def demo2():
     '''demo of integrability in a form'''
@@ -326,55 +350,53 @@ def demo2():
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.qt.qtgui.display import TaurusLabel
     from taurus.qt.qtgui.input import TaurusValueLineEdit
-    
+
     class DemoSwitcher(TaurusReadWriteSwitcher):
-            readWClass = TaurusLabel
-            writeWClass = TaurusValueLineEdit 
-            exitEditTriggers = ('editingFinished()',Qt.Qt.Key_Escape)
+        readWClass = TaurusLabel
+        writeWClass = TaurusValueLineEdit
+        exitEditTriggers = ('editingFinished()', Qt.Qt.Key_Escape)
 
-    
     app = TaurusApplication()
-    
+
     f = TaurusForm()
     f.model = ['sys/tg_test/1/long_scalar', 'sys/tg_test/1/long_scalar']
-    
+
     f[0].setReadWidgetClass(DemoSwitcher)
     f[0].setWriteWidgetClass(None)
-    
+
     f.show()
     sys.exit(app.exec_())
-    
+
+
 def demo3():
     '''simple demo including more than one widget'''
-    
+
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
-    from taurus.qt.qtgui.display import TaurusLabel, TaurusBoolLed
+    from taurus.qt.qtgui.display import TaurusLabel, TaurusLed
     from taurus.qt.qtgui.input import TaurusValueLineEdit, TaurusValueCheckBox
-    
+
     app = TaurusApplication()
-        
-    w1 = TaurusReadWriteSwitcher(readWClass=TaurusLabel, 
-                                writeWClass=TaurusValueLineEdit)
+
+    w1 = TaurusReadWriteSwitcher(readWClass=TaurusLabel,
+                                 writeWClass=TaurusValueLineEdit)
     w1.model = "sys/tg_test/1/long_scalar"
-    
-    w2 = TaurusReadWriteSwitcher(readWClass=TaurusBoolLed, 
-                                writeWClass=TaurusValueCheckBox)
+
+    w2 = TaurusReadWriteSwitcher(readWClass=TaurusLed,
+                                 writeWClass=TaurusValueCheckBox)
     w2.model = "sys/tg_test/1/boolean_scalar"
-    
-    
+
     f = Qt.QWidget()
     f.setLayout(Qt.QVBoxLayout())
     f.layout().addWidget(w1)
     f.layout().addWidget(w2)
-    f.layout().addWidget(TaurusReadWriteSwitcher()) #add non-initialized switcher
+    f.layout().addWidget(TaurusReadWriteSwitcher())  # add non-initialized switcher
     f.show()
-    
-    sys.exit(app.exec_()) 
+
+    sys.exit(app.exec_())
 
 
 if __name__ == "__main__":
-    #demo1()
-    #demo2()
+    # demo1()
+    # demo2()
     demo3()
-    
diff --git a/lib/taurus/qt/qtgui/compact/basicswitcher.py b/lib/taurus/qt/qtgui/compact/basicswitcher.py
index 2753541..9a908dc 100644
--- a/lib/taurus/qt/qtgui/compact/basicswitcher.py
+++ b/lib/taurus/qt/qtgui/compact/basicswitcher.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## Copyright 2013 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/>.
+# http://taurus-scada.org
+##
+# Copyright 2013 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/>.
 ##
 #############################################################################
 
@@ -31,46 +31,47 @@ __all__ = ["TaurusLabelEditRW", "TaurusLabelEditRW"]
 __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.display import TaurusLabel, TaurusBoolLed
+from taurus.qt.qtgui.display import TaurusLabel, TaurusLed
 from taurus.qt.qtgui.input import TaurusValueLineEdit, TaurusValueCheckBox
 from abstractswitcher import TaurusReadWriteSwitcher
 
+
 class TaurusLabelEditRW(TaurusReadWriteSwitcher):
-    '''A Switcher combining a TaurusLabel and a TaurusValueLineEdit''' 
+    '''A Switcher combining a TaurusLabel and a TaurusValueLineEdit'''
     readWClass = TaurusLabel
-    writeWClass = TaurusValueLineEdit 
-        
+    writeWClass = TaurusValueLineEdit
+
+
 class TaurusBoolRW(TaurusReadWriteSwitcher):
-    '''A Switcher combining a TaurusBoolLed and a TaurusValueCheckBox'''
-    readWClass = TaurusBoolLed
+    '''A Switcher combining a TaurusLed and a TaurusValueCheckBox'''
+    readWClass = TaurusLed
     writeWClass = TaurusValueCheckBox
-    
+
     def setWriteWidget(self, widget):
         widget.setShowText(False)
         TaurusReadWriteSwitcher.setWriteWidget(self, widget)
-        
+
+
 def _demo():
     '''demo of integrability in a form'''
     import sys
     from taurus.qt.qtgui.panel import TaurusForm
     from taurus.qt.qtgui.application import TaurusApplication
-    
+
     app = TaurusApplication()
-    
+
     f = TaurusForm()
     f.model = ['sys/tg_test/1/long_scalar', 'sys/tg_test/1/long_scalar',
                'sys/tg_test/1/boolean_scalar', 'sys/tg_test/1/boolean_scalar']
-    
+
     f[0].setReadWidgetClass(TaurusLabelEditRW)
     f[0].setWriteWidgetClass(None)
     f[2].setReadWidgetClass(TaurusBoolRW)
     f[2].setWriteWidgetClass(None)
-    
-    
+
     f.show()
     sys.exit(app.exec_())
 
 
 if __name__ == "__main__":
     _demo()
-    
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/console/__init__.py b/lib/taurus/qt/qtgui/console/__init__.py
index dd60b84..bfe8798 100644
--- a/lib/taurus/qt/qtgui/console/__init__.py
+++ b/lib/taurus/qt/qtgui/console/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,9 +29,8 @@ __docformat__ = 'restructuredtext'
 
 try:
     from .taurusconsole import TaurusConsole
-except Exception,e:
+except Exception, e:
     from taurus.qt.qtgui.display import TaurusFallBackWidget
 
     class TaurusConsole(TaurusFallBackWidget):
         pass
-
diff --git a/lib/taurus/qt/qtgui/console/taurusconsole.py b/lib/taurus/qt/qtgui/console/taurusconsole.py
index f87cb37..cd4478e 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsole.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsole.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -38,7 +38,7 @@ from taurusconsolefactory import TaurusConsoleFactory
 
 
 class TaurusConsole(Qt.QWidget):
-    
+
     def __init__(self, parent=None, kernels=None):
         super(TaurusConsole, self).__init__(parent)
         l = Qt.QVBoxLayout(self)
@@ -52,14 +52,14 @@ class TaurusConsole(Qt.QWidget):
 
     def __getattr__(self, name):
         return getattr(self.window(), name)
-    
+
 
 def main(argv=None):
     import taurus.core.util.argparse
     import taurus.qt.qtgui.application
-    
+
     targp = taurus.core.util.argparse
-    
+
     if argv is None:
         import sys
         argv = sys.argv
@@ -77,4 +77,4 @@ def main(argv=None):
 
 
 if __name__ == '__main__':
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/console/taurusconsoleapplication.py b/lib/taurus/qt/qtgui/console/taurusconsoleapplication.py
index f69e02a..0375d99 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsoleapplication.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsoleapplication.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -38,13 +38,13 @@ from taurus.external.qt import Qt
 
 try:
     from IPython.qt.console.qtconsoleapp import IPythonQtConsoleApp
-except ImportError: #for IPython v<1.x
+except ImportError:  # for IPython v<1.x
     from IPython.frontend.qt.console.qtconsoleapp import IPythonQtConsoleApp
-     
+
 
 class TaurusConsoleApplication(IPythonQtConsoleApp):
 
-    name='taurusconsole'
+    name = 'taurusconsole'
 
     def init_qt_elements(self):
         self.app = Qt.QApplication.instance()
@@ -54,9 +54,5 @@ class TaurusConsoleApplication(IPythonQtConsoleApp):
         pass
 
     def init_kernel_manager(self):
-        # avoid starting a default kernel 
+        # avoid starting a default kernel
         self.kernel_manager = None
-
-    
-
-
diff --git a/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py b/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
index cdbe0f1..833f6dc 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsoleextensions.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -30,7 +30,7 @@ __docformat__ = 'restructuredtext'
 import weakref
 
 from taurus import Device
-from taurus.core.util.enumeration import Enumeration 
+from taurus.core.util.enumeration import Enumeration
 from taurus.external.qt import Qt
 
 from IPython.config.loader import Config
@@ -40,18 +40,18 @@ EnvironmentMode = Enumeration("EnvironmentMode", ("Overwrite", "Merge"))
 
 
 class BaseConsoleExtension(object):
-    
+
     Name = 'ipython'
     Label = 'IPython'
-    
+
     def __init__(self, console_factory, profile='default', config=None,
                  mode=EnvironmentMode.Merge):
         self.console_factory = console_factory
         self.profile = profile
-        self.profile_arg = '--profile=' + profile 
+        self.profile_arg = '--profile=' + profile
         self.config = config or Config()
         self.mode = mode
-        
+
     def __enter__(self):
         app = self.console_factory.get_ipython_application()
         self.orig_config = app.config
@@ -65,14 +65,14 @@ class BaseConsoleExtension(object):
         if not has_profile:
             argv.append(self.profile_arg)
         app.kernel_argv = argv
-        
+
         config = self.config
         if self.mode == EnvironmentMode.Merge:
             config = config.copy()
             config.update(app.config)
         app.config = config
-    
-    def __exit__(self,exc_type, exc_value, traceback):
+
+    def __exit__(self, exc_type, exc_value, traceback):
         app = self.console_factory.get_ipython_application()
         app.config = self.orig_config
         app.kernel_argv = self.orig_kernel_argv
@@ -83,10 +83,10 @@ class BaseConsoleExtension(object):
 
 
 class TangoConsoleExtension(BaseConsoleExtension):
-    
+
     Name = 'tango'
     Label = 'Tango'
-    
+
     def __init__(self, console_factory, config=None):
         if config is None:
             config = Config()
@@ -95,13 +95,13 @@ class TangoConsoleExtension(BaseConsoleExtension):
         super(TangoConsoleExtension, self).__init__(console_factory,
                                                     profile='tango',
                                                     config=config)
-    
+
     @classmethod
     def is_enabled(cls):
         try:
             import PyTango
             v = list(PyTango.__version_info__[:2])
-            return v >= [7,2]
+            return v >= [7, 2]
         except:
             return False
 
@@ -109,6 +109,7 @@ class TangoConsoleExtension(BaseConsoleExtension):
 from IPython.core.profiledir import ProfileDir, ProfileDirError
 from IPython.utils.path import get_ipython_dir
 
+
 def create_sardana_profile(profile, door_name):
 
     ipython_dir = get_ipython_dir()
@@ -118,6 +119,7 @@ def create_sardana_profile(profile, door_name):
         from sardana.spock.genutils import create_spock_profile
         create_spock_profile(ipython_dir, "spock", profile, door_name)
 
+
 def get_profile_from_args(args):
     for arg in args:
         if arg.startswith("--profile="):
@@ -125,7 +127,7 @@ def get_profile_from_args(args):
             return True, profile
     return False, "spockdoor"
 
-                
+
 class SDMDoorReader(Qt.QObject):
 
     def __init__(self, console, sdm=None, parent=None):
@@ -136,22 +138,22 @@ class SDMDoorReader(Qt.QObject):
                 raise Exception("Cannot connect to shared data manager")
             sdm = Qt.qApp.SDM
         sdm.connectReader("doorName", self.onDoorChanged)
-        
+
     @property
     def console(self):
         return self._console()
-    
+
     def onDoorChanged(self, door_name):
         door = Device(door_name)
         dalias, dname = door.getSimpleName(), door.getNormalName()
         create_sardana_profile(dalias, dname)
 
-    
+
 class SardanaConsoleExtension(BaseConsoleExtension):
-    
+
     Name = 'spock'
     Label = 'Spock'
-    
+
     def fill_sardana_config(self, config):
         import sardana.spock
         profile = 'spockdoor'
@@ -167,7 +169,7 @@ class SardanaConsoleExtension(BaseConsoleExtension):
                     config.Spock.door_name = dname
         sardana.spock.load_config(config)
         return profile
-    
+
     def __init__(self, console_factory, config=None):
         if config is None:
             config = Config()
@@ -175,12 +177,12 @@ class SardanaConsoleExtension(BaseConsoleExtension):
         super(SardanaConsoleExtension, self).__init__(console_factory,
                                                       profile=profile,
                                                       config=config)
-    
+
     @classmethod
     def is_enabled(cls):
         try:
             import sardana
             v = list(sardana.Release.version_info[:2])
-            return v >= [1,2]
+            return v >= [1, 2]
         except:
             return False
diff --git a/lib/taurus/qt/qtgui/console/taurusconsolefactory.py b/lib/taurus/qt/qtgui/console/taurusconsolefactory.py
index 6ca57cd..e130208 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsolefactory.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsolefactory.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -52,11 +52,11 @@ class TaurusConsoleFactory(Singleton):
     ipython_application_class = TaurusConsoleApplication
     widget_factory_class = TaurusConsoleWidget
     kernel_manager_class = QtKernelManager
-    
+
     def init(self, *args, **kwargs):
         self.ipython_application = None
         self.ipython_args = kwargs.pop('ipython_args', [])
-    
+
     def get_ipython_application(self):
         app = self.ipython_application
         if app is None:
@@ -77,9 +77,9 @@ class TaurusConsoleFactory(Singleton):
             if inspect.isclass(obj):
                 if issubclass(obj, taurusconsoleextensions.BaseConsoleExtension):
                     if obj.is_enabled():
-                        ret[obj.Name] = obj 
+                        ret[obj.Name] = obj
         return ret
-    
+
     def get_extension(self, name):
         import inspect
         ret = {}
@@ -92,19 +92,19 @@ class TaurusConsoleFactory(Singleton):
                     if obj.is_enabled():
                         if obj.Name == name:
                             return obj
-                        ret[obj.Name] = obj 
-    
+                        ret[obj.Name] = obj
+
     def new_kernel_manager(self, **kwargs):
         return self.kernel_manager_class(**kwargs)
-    
+
     def new_frontend_widget(self, *args, **kwargs):
         return self.widget_factory_class(*args, **kwargs)
-    
+
     def new_frontend_slave(self, widget):
         app = self.get_ipython_application()
         new_widget = app.new_frontend_slave(widget)
         return new_widget
-    
+
     def new_frontend_master(self, name="ipython"):
         app = self.get_ipython_application()
         extension = self.get_extension(name)
@@ -114,8 +114,8 @@ class TaurusConsoleFactory(Singleton):
     def new_window(self, kernels=None):
         qtapp = Qt.QApplication.instance()
         window = TaurusConsoleWindow(qtapp,
-            new_frontend_factory=self.new_frontend_master, 
-            slave_frontend_factory=self.new_frontend_slave)
+                                     new_frontend_factory=self.new_frontend_master,
+                                     slave_frontend_factory=self.new_frontend_slave)
         extensions = self.get_extensions()
         for extension in extensions.values():
             window.register_kernel_extension(extension)
@@ -128,12 +128,13 @@ class TaurusConsoleFactory(Singleton):
                 window.create_tab_with_new_frontend(name=name, label=label)
         return window
 
+
 def main(argv=None):
     import taurus.core.util.argparse
     import taurus.qt.qtgui.application
-    
+
     targp = taurus.core.util.argparse
-    
+
     if argv is None:
         import sys
         argv = sys.argv
@@ -152,4 +153,4 @@ def main(argv=None):
 
 
 if __name__ == '__main__':
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/console/taurusconsolewidget.py b/lib/taurus/qt/qtgui/console/taurusconsolewidget.py
index 1276aa4..62fbee4 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsolewidget.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsolewidget.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -34,7 +34,7 @@ try:
     from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
 except ImportError:
     from IPython.frontend.qt.console.rich_ipython_widget \
-         import RichIPythonWidget
+        import RichIPythonWidget
 
 default_gui_banner = """\
 Taurus console -- An enhanced IPython console for taurus.
diff --git a/lib/taurus/qt/qtgui/console/taurusconsolewindow.py b/lib/taurus/qt/qtgui/console/taurusconsolewindow.py
index aa14233..5d0e2b3 100644
--- a/lib/taurus/qt/qtgui/console/taurusconsolewindow.py
+++ b/lib/taurus/qt/qtgui/console/taurusconsolewindow.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -43,55 +43,57 @@ except ImportError:
 
 
 class TaurusConsoleWindow(MainWindow):
-    
+
     def __init__(self, *args, **kwargs):
         self._pending_kernel_actions = []
         self.new_kernel_menu = None
         MainWindow.__init__(self, *args, **kwargs)
-    
+
     def add_tab_with_frontend(self, frontend, name=None):
         init_menu = self.tab_widget.count() == 0
-        super(TaurusConsoleWindow, self).add_tab_with_frontend(frontend, name=name)
+        super(TaurusConsoleWindow, self).add_tab_with_frontend(
+            frontend, name=name)
         if init_menu:
             self.init_menu_bar()
-    
+
     def remove_menu_action(self, menu, action):
         menu.removeAction(action)
         self.removeAction(action)
-    
+
     def add_new_kernel_action(self, action):
-        self.add_menu_action(self.new_kernel_menu, action) 
-    
+        self.add_menu_action(self.new_kernel_menu, action)
+
     def init_file_menu(self):
         super(TaurusConsoleWindow, self).init_file_menu()
         file_menu = self.file_menu
         self.remove_menu_action(file_menu, self.new_kernel_tab_act)
-        
-        self.new_kernel_menu = new_kernel_menu = Qt.QMenu(self.new_kernel_tab_act.text())
+
+        self.new_kernel_menu = new_kernel_menu = Qt.QMenu(
+            self.new_kernel_tab_act.text())
         file_menu.insertMenu(self.slave_kernel_tab_act, new_kernel_menu)
-        
-        #self.new_kernel_tab_act.setText("IPython")
+
+        # self.new_kernel_tab_act.setText("IPython")
         #self.add_menu_action(new_kernel_menu, self.new_kernel_tab_act)
-        
+
         for kernel_action in self._pending_kernel_actions:
             self.add_new_kernel_action(kernel_action)
-        
+
     def add_new_tango_action(self):
         tango_action = Qt.QAction("Tango", self,
-            triggered=self.create_tab_with_new_tango_frontend)
+                                  triggered=self.create_tab_with_new_tango_frontend)
         self.add_new_kernel_action(tango_action)
 
     def create_tab_with_new_frontend(self, name='ipython', label=None):
         widget = self.new_frontend_factory(name=name)
         self.add_tab_with_frontend(widget, name=label)
-    
+
     def register_kernel_extension(self, extension):
         f = functools.partial(self.create_tab_with_new_frontend,
                               name=extension.Name,
                               label=extension.Label)
         action = Qt.QAction(extension.Label, self, triggered=f)
-        
+
         if self.new_kernel_menu is None:
             self._pending_kernel_actions.append(action)
         else:
-            self.add_new_kernel_action(action)
\ No newline at end of file
+            self.add_new_kernel_action(action)
diff --git a/lib/taurus/qt/qtgui/container/__init__.py b/lib/taurus/qt/qtgui/container/__init__.py
index bf7bad0..7c439b0 100644
--- a/lib/taurus/qt/qtgui/container/__init__.py
+++ b/lib/taurus/qt/qtgui/container/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/container/qcontainer.py b/lib/taurus/qt/qtgui/container/qcontainer.py
index 7c3faf8..8172994 100644
--- a/lib/taurus/qt/qtgui/container/qcontainer.py
+++ b/lib/taurus/qt/qtgui/container/qcontainer.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -33,7 +33,7 @@ import sys
 import json
 
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.resource import getThemePixmap, getThemeIcon, getStandardIcon
+from taurus.qt.qtgui.icon import getStandardIcon
 
 _TitleBarStyleExpanded = """.QFrame {{
 border-width: 0px;
@@ -96,26 +96,29 @@ 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"""
-    
+
     DefaultTitleBarVisible = True
     DefaultTitleBarHeight = 16
     DefaultTitleBarStyle = {
-        'start_color'  : 'rgb(60, 150, 255)',
-        'stop_color'   : 'rgb(0, 65, 200)',
-        'font_color'   : 'white',
+        'start_color': 'rgb(60, 150, 255)',
+        'stop_color': 'rgb(0, 65, 200)',
+        'font_color': 'white',
         'border_radius': '5px',
     }
 
     DefaultContentVisible = True
     DefaultContentStyle = {
-        'start_color' : 'rgb(224, 224, 224)',
-        'stop_color'  : 'rgb(255, 255, 255)',
-        'border_color' : 'rgb(0, 85, 227)',
+        'start_color': 'rgb(224, 224, 224)',
+        'stop_color': 'rgb(255, 255, 255)',
+        'border_color': 'rgb(0, 85, 227)',
         'border_radius': '5px',
     }
 
@@ -130,42 +133,43 @@ class QGroupWidget(Qt.QWidget):
         self.resetContentVisible()
         self.resetTitleHeight()
         self.resetTitleVisible()
-    
+
     def __init(self):
         panelLayout = Qt.QVBoxLayout()
         panelLayout.setSpacing(0)
         panelLayout.setMargin(0)
         self.setLayout(panelLayout)
-        
+
         self._titleBar = titleBar = Qt.QFrame()
         panelLayout.addWidget(titleBar, 0)
-        
+
         l = Qt.QHBoxLayout()
         l.setMargin(2)
         l.setSpacing(2)
         self._titleBar.setLayout(l)
-        
+
         self._titleButton = Qt.QToolButton()
         self._titleButton.setStyleSheet("border: 0px")
         styleOption = Qt.QStyleOption()
         styleOption.initFrom(self._titleButton)
         style = Qt.QApplication.style()
-        icon = style.standardIcon(Qt.QStyle.SP_DesktopIcon, styleOption, self._titleButton)
+        icon = style.standardIcon(
+            Qt.QStyle.SP_DesktopIcon, styleOption, self._titleButton)
         self._titleButton.setIcon(icon)
         self._titleLabel = Qt.QLabel()
         self._upDownButton = Qt.QToolButton()
         self._upDownButton.setStyleSheet("border: 0px")
-        Qt.QObject.connect(self._upDownButton, Qt.SIGNAL("clicked()"), self.switchContentVisible)
+        self._upDownButton.clicked.connect(self.switchContentVisible)
         l.addWidget(self._titleButton, 0)
         l.addWidget(self._titleLabel, 1)
         l.addWidget(self._upDownButton, 0)
-        
+
         self._content = content = ContentFrame()
         l = Qt.QHBoxLayout()
         l.setContentsMargins(0, 0, 0, 0)
         content.setLayout(l)
         panelLayout.addWidget(content, 1)
-    
+
     def _updateStyle(self):
         """Internal method that updates the style """
         if self.contentVisible:
@@ -178,7 +182,7 @@ class QGroupWidget(Qt.QWidget):
             contentStyleTemplate = _ContentBarStyleWithTitle
         else:
             contentStyleTemplate = _ContentBarStyleWithoutTitle
-        
+
         contentStyle = self._contentStyle.copy()
         contentStyle['border_color'] = self._titleBarStyle['stop_color']
         fullContentStyle = contentStyleTemplate.format(**contentStyle)
@@ -188,131 +192,133 @@ class QGroupWidget(Qt.QWidget):
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        return { 'module'    : 'taurus.qt.qtgui.container',
-                 'group'     : 'Taurus Containers',
-                 'icon'      : ":/designer/groupwidget.png",
-                 'container' : True }
-        
+        return {'module': 'taurus.qt.qtgui.container',
+                'group': 'Taurus Containers',
+                'icon': "designer:groupwidget.png",
+                'container': True}
+
     def content(self):
         """Returns the contents widget
-        
+
         :return: (Qt.QFrame) the content widget"""
         return self._content
-    
+
     def titleBar(self):
         """Returns the title bar widget
-        
+
         :return: (Qt.QFrame) the title bar widget"""
         return self._titleBar
 
     def titleButton(self):
         """Returns the title button widget
-        
+
         :return: (Qt.QToolButton) the title button widget"""
         return self._titleButton
 
     def collapseButton(self):
         """Returns the collapse button widget
-        
+
         :return: (Qt.QToolButton) the collapse button widget"""
         return self._upDownButton
 
     def setTitle(self, title):
         """Sets this widget's title
-        
+
         :param title: (str) the new widget title"""
         self._titleLabel.setText(title)
-        
+
     def getTitle(self):
         """Returns this widget's title
-        
+
         :return: (str) this widget's title"""
         return self._titleLabel.text()
 
     def setTitleIcon(self, icon):
         """Sets this widget's title icon
-        
+
         :param icon: (Qt.QIcon) the new widget title icon"""
         self._titleButton.setIcon(icon)
-        
+
     def getTitleIcon(self):
         """Returns this widget's title icon
-        
+
         :return: (Qt.QIcon) this widget's title icon"""
         return self._titleButton.icon()
 
     def switchContentVisible(self):
         """Switches this widget's contents visibility"""
         self.setContentVisible(not self.isContentVisible())
-        
+
     def isContentVisible(self):
         """Returns this widget's contents visibility
-        
+
         :return: (bool) this widget's contents visibility"""
         return self._contentVisible
-    
+
     def resetContentVisible(self):
         """Resets this widget's contents visibility"""
         self.setContentVisible(self.DefaultContentVisible)
-        
+
     def setContentVisible(self, show):
         """Sets this widget's contents visibility
-        
+
         :param show: (bool) the new widget contents visibility"""
         self._contentVisible = show
         self._updateStyle()
-        
+
         #if show: icon_name = "go-previous"
-        #else: icon_name = "go-down"
-        #icon = getThemeIcon(icon_name)
-        
-        if show: icon_name = Qt.QStyle.SP_TitleBarShadeButton
-        else: icon_name = Qt.QStyle.SP_TitleBarUnshadeButton
+        # else: icon_name = "go-down"
+        #icon = Qt.QIcon.fromTheme(icon_name)
+
+        if show:
+            icon_name = Qt.QStyle.SP_TitleBarShadeButton
+        else:
+            icon_name = Qt.QStyle.SP_TitleBarUnshadeButton
         icon = getStandardIcon(icon_name, self._upDownButton)
-        
+
         self._upDownButton.setIcon(icon)
         self._content.setVisible(show)
         self.adjustSize()
-    
+
     def isTitleVisible(self):
         """Returns this widget's title visibility
-        
+
         :return: (bool) this widget's title visibility"""
         return self._titleVisible
-    
+
     def resetTitleVisible(self):
         """Resets this widget's title visibility"""
         self.setTitleVisible(self.DefaultTitleBarVisible)
 
     def setTitleVisible(self, show):
         """Sets this widget's title visibility
-        
+
         :param icon: (bool) the new widget title visibility"""
         self._titleVisible = show
         self._titleBar.setVisible(show)
         self._updateStyle()
-    
+
     def getTitleHeight(self):
         """Returns this widget's title height
-        
+
         :return: (bool) this widget's title height"""
         return self.titleButton().iconSize().height()
-    
+
     def setTitleHeight(self, h):
         """Sets this widget's title height
-        
+
         :param icon: (bool) the new widget title height"""
         s = Qt.QSize(h, h)
         self.titleButton().setIconSize(s)
         self.collapseButton().setIconSize(s)
-    
+
     def resetTitleHeight(self):
         """Resets this widget's title height"""
         self.setTitleHeight(self.DefaultTitleBarHeight)
 
     def getTitleStyle(self):
         """Returns this widget's title style
-        
+
         :return: (dict) this widget's title style"""
         return self._titleBarStyle
 
@@ -323,7 +329,7 @@ class QGroupWidget(Qt.QWidget):
         - '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 = self.DefaultTitleBarStyle.copy()
         style.update(style_map)
@@ -336,7 +342,7 @@ class QGroupWidget(Qt.QWidget):
 
     def getTitleStyleStr(self):
         """Returns this widget's title style
-        
+
         :return: (dict) this widget's title style"""
         return json.dumps(self._titleBarStyle)
 
@@ -347,7 +353,7 @@ class QGroupWidget(Qt.QWidget):
         - '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)
@@ -358,7 +364,7 @@ class QGroupWidget(Qt.QWidget):
 
     def getContentStyle(self):
         """Returns this widget's content style
-        
+
         :return: (dict) this widget's content style"""
         return self._contentStyle
 
@@ -367,20 +373,20 @@ class QGroupWidget(Qt.QWidget):
         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 = self.DefaultContentStyle.copy()
         style.update(style_map)
         self._contentStyle = style
         self._updateStyle()
-    
+
     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)
 
@@ -389,16 +395,15 @@ class QGroupWidget(Qt.QWidget):
         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
     #:
     #: **Access functions:**
@@ -422,7 +427,8 @@ class QGroupWidget(Qt.QWidget):
     #:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.getTitleHeight`
     #:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.setTitleHeight`
     #:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetTitleHeight`
-    titleHeight = Qt.pyqtProperty("int", getTitleHeight, setTitleHeight, resetTitleHeight)
+    titleHeight = Qt.pyqtProperty(
+        "int", getTitleHeight, setTitleHeight, resetTitleHeight)
 
     #: This property contains the widget's title visibility
     #:
@@ -439,51 +445,53 @@ class QGroupWidget(Qt.QWidget):
     #:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.isContentVisible`
     #:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.setContentVisible`
     #:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetContentVisible`
-    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.getContentStyleStr`
-    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.setContentStyleStr`
-    ##:     * :meth:`taurus.qt.qtgui.container.QGroupWidget.resetContentStyleStr`
+    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.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`
+    # : 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"
     w = Qt.QWidget()
     l = Qt.QVBoxLayout()
     w.setLayout(l)
-    
+
     panel = QGroupWidget()
     panel.title = "Database"
     contentLayout = Qt.QFormLayout()
     panel.content().setLayout(contentLayout)
     contentLayout.addRow("&Host", Qt.QLineEdit())
     contentLayout.addRow("&Port", Qt.QLineEdit())
-    l.addWidget(panel,0)
+    l.addWidget(panel, 0)
 
     panel = QGroupWidget()
     panel.title = "Hello world"
-    panel.titleIcon = getThemeIcon("video-x-generic")
+    panel.titleIcon = Qt.QIcon.fromTheme("video-x-generic")
     panel.setTitleStyle({
-        'start_color' : 'rgb(255, 60, 60)',
-        'stop_color'  : 'rgb(200, 0, 0)',
-        'font_color'  : 'rgb(140, 0, 0)',
+        'start_color': 'rgb(255, 60, 60)',
+        'stop_color': 'rgb(200, 0, 0)',
+        'font_color': 'rgb(140, 0, 0)',
         'border_radius': '10px',
     })
     panel.setContentStyle({
@@ -497,55 +505,56 @@ def demo():
     contentLayout.addRow("Build", Qt.QCheckBox())
     contentLayout.addRow("Upper limit", Qt.QSpinBox())
     contentLayout.addRow("Lower limit", Qt.QSpinBox())
-    l.addWidget(panel,0)
+    l.addWidget(panel, 0)
 
     panel = QGroupWidget()
     panel.title = "Hello world 2"
-    panel.titleIcon = getThemeIcon("network-server")
+    panel.titleIcon = Qt.QIcon.fromTheme("network-server")
     panel.titleVisible = False
     contentLayout = Qt.QFormLayout()
     panel.content().setLayout(contentLayout)
     contentLayout.addRow("Something", Qt.QLineEdit())
     contentLayout.addRow("More", Qt.QLineEdit())
-    l.addWidget(panel,0)
+    l.addWidget(panel, 0)
 
     panel = QGroupWidget()
     panel.title = "5"
-    panel.titleIcon = getThemeIcon("folder")
+    panel.titleIcon = Qt.QIcon.fromTheme("folder")
     contentLayout = Qt.QVBoxLayout()
     panel.content().setLayout(contentLayout)
     panel2 = QGroupWidget()
     panel2.title = "5.1"
-    panel2.titleIcon = getThemeIcon("folder")
+    panel2.titleIcon = Qt.QIcon.fromTheme("folder")
     panel2.titleHeight = 48
     contentLayout2 = Qt.QFormLayout()
     panel2.content().setLayout(contentLayout2)
     contentLayout2.addRow("Something", Qt.QLineEdit())
     contentLayout2.addRow("More", Qt.QLineEdit())
     contentLayout.addWidget(panel2, 0)
-    l.addWidget(panel,0)
+    l.addWidget(panel, 0)
 
     l.addStretch(1)
-    
+
     w.show()
     w.adjustSize()
     return w
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         app = Application(app_name="Group widget demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
-        
+
     w = demo()
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
@@ -553,4 +562,3 @@ def main():
 
 if __name__ == '__main__':
     main()
-
diff --git a/lib/taurus/qt/qtgui/container/taurusbasecontainer.py b/lib/taurus/qt/qtgui/container/taurusbasecontainer.py
index 7f73194..7f30188 100644
--- a/lib/taurus/qt/qtgui/container/taurusbasecontainer.py
+++ b/lib/taurus/qt/qtgui/container/taurusbasecontainer.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -33,20 +33,21 @@ from taurus.external.qt import Qt
 
 from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget
 
+
 class TaurusBaseContainer(TaurusBaseWidget):
     """Base class for the Taurus container widgets.
     This type of taurus container classes are specially useful if you define
     a parent taurus model to them and set all contained taurus widgets to use parent
     model. Example::
-        
+
         from taurus.qt.qtgui.container import *
         from taurus.qt.qtgui.display import *
-        
+
         widget = TaurusWidget()
-        layout = Qt.QBoxLayout()
+        layout = Qt.QVBoxLayout()
         widget.setLayout(layout)
         widget.model = 'sys/database/2'
-        stateWidget = TaurusValueLabel()
+        stateWidget = TaurusLabel()
         layout.addWidget(stateWidget)
         stateWidget.useParentModel = True
         stateWidget.model = '/state'
@@ -54,71 +55,75 @@ class TaurusBaseContainer(TaurusBaseWidget):
 
     def __init__(self, name, parent=None, designMode=False):
         name = name or self.__class__.__name__
-        
-        self.call__init__(TaurusBaseWidget, name, parent, designMode=designMode)
+
+        self.call__init__(TaurusBaseWidget, name,
+                          parent, designMode=designMode)
 
         self.defineStyle()
         self.designMode = designMode
-    
+
     def taurusChildren(self, objs=None):
         '''
         returns a list of all taurus children of this taurus container (recurses down
         skipping non-taurus widgets)
-        
+
         :param objs: (list<objects>) if given, the search starts at the objects
                      passed in this list
-                     
+
         :return: (list<TaurusBaseWidget>)
         '''
-        if objs is None: objs=self.children()
+        if objs is None:
+            objs = self.children()
         result = []
         for o in objs:
-            if isinstance(o, TaurusBaseWidget): result.append(o)
-            else: result+=self.taurusChildren(o.children())
+            if isinstance(o, TaurusBaseWidget):
+                result.append(o)
+            else:
+                result += self.taurusChildren(o.children())
         return result
-        
+
     def defineStyle(self):
         self.updateStyle()
-        
+
     def sizeHint(self):
-#        if self.designMode:
-#            return Qt.QSize(150, 150)
+        #        if self.designMode:
+        #            return Qt.QSize(150, 150)
         return Qt.QWidget.sizeHint(self)
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget over writing
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def isReadOnly(self):
         return True
-    
+
     def updateStyle(self):
         if self.getShowQuality():
             self.setAutoFillBackground(True)
-            #TODO: get quality/state from model and update accordingly
+            # TODO: get quality/state from model and update accordingly
         else:
             self.setAutoFillBackground(False)
-            #TODO: restore colors
+            # TODO: restore colors
         TaurusBaseWidget.updateStyle(self)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Pending operations related methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getPendingOperations(self):
         pending_ops = []
-        
+
         for child in Qt.QObject.children(self):
             if isinstance(child, TaurusBaseComponent):
                 pending_ops += child.getPendingOperations()
         return pending_ops
-    
+
     def resetPendingOperations(self):
         self.debug("Reset changes")
         for child in Qt.QObject.children(self):
             if isinstance(child, TaurusBaseComponent):
                 child.resetPendingOperations()
-    
+
     def hasPendingOperations(self):
         ret = False
         for child in Qt.QObject.children(self):
@@ -126,10 +131,6 @@ class TaurusBaseContainer(TaurusBaseWidget):
                 ret |= child.hasPendingOperations()
         return ret
 
-    @Qt.pyqtSignature("setModel(QString)")
-    def setModel(self,model):
-        TaurusBaseWidget.setModel(self,model)
-    
     def handleEvent(self, evt_src, evt_type, evt_value):
         if not self._setText or not self.getShowText():
             return
@@ -144,22 +145,22 @@ class TaurusBaseContainer(TaurusBaseWidget):
 #    def getQtDesignerPluginInfo(cls):
 #        """Returns pertinent information in order to be able to build a valid
 #        QtDesigner widget plugin
-#        
-#        The dictionary returned by this method should contain *at least* the 
+#
+#        The dictionary returned by this method should contain *at least* the
 #        following keys and values:
 #        - 'module' : a string representing the full python module name (ex.: 'taurus.qt.qtgui.base')
-#        - 'icon' : a string representing valid resource icon (ex.: ':/designer/combobox.png')
+#        - 'icon' : a string representing valid resource icon (ex.: 'designer:combobox.png')
 #        - 'container' : a bool telling if this widget is a container widget or not.
-#        
+#
 #        This default implementation returns the following dictionary:
 #            { 'group'     : 'Taurus Containers',
-#              'icon'      : ':/designer/widget.png',
+#              'icon'      : 'designer:widget.png',
 #              'container' : True }
-#        
+#
 #        :return: (dict) a map with pertinent designer information"""
 #        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
 #        ret['module'] = 'taurus.qt.qtgui.container'
 #        ret['group'] = 'Taurus Containers'
-#        ret['icon'] = ":/designer/widget.png"
+#        ret['icon'] = "designer:widget.png"
 #        ret['container'] = True
-#        return ret
\ No newline at end of file
+#        return ret
diff --git a/lib/taurus/qt/qtgui/container/taurusframe.py b/lib/taurus/qt/qtgui/container/taurusframe.py
index cb76e79..eac1ca3 100644
--- a/lib/taurus/qt/qtgui/container/taurusframe.py
+++ b/lib/taurus/qt/qtgui/container/taurusframe.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -39,35 +39,35 @@ class TaurusFrame(Qt.QFrame, TaurusBaseContainer):
     This type of taurus container classes are specially useful if you define
     a parent taurus model to them and set all contained taurus widgets to use parent
     model. Example::
-    
+
         from taurus.qt.qtgui.container import *
         from taurus.qt.qtgui.display import *
-        
+
         widget = TaurusFrame()
-        layout = Qt.QBoxLayout()
+        layout = Qt.QVBoxLayout()
         widget.setLayout(layout)
         widget.model = 'sys/database/2'
-        stateWidget = TaurusValueLabel()
+        stateWidget = TaurusLabel()
         layout.addWidget(stateWidget)
         stateWidget.useParentModel = True
         stateWidget.model = '/state'"""
-        
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-        
+
+    modelChanged = Qt.pyqtSignal('const QString &')
+
     def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QFrame, parent)
         self.call__init__(TaurusBaseContainer, name, designMode=designMode)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Public slots for apply/restore changes
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    @Qt.pyqtSignature("applyPendingChanges()")
+    @Qt.pyqtSlot()
     def applyPendingChanges(self):
         self.applyPendingOperations()
-    
-    @Qt.pyqtSignature("resetPendingChanges()")
+
+    @Qt.pyqtSlot()
     def resetPendingChanges(self):
         self.resetPendingOperations()
 
@@ -77,33 +77,34 @@ class TaurusFrame(Qt.QFrame, TaurusBaseContainer):
         if cls is TaurusFrame:
             ret['module'] = 'taurus.qt.qtgui.container'
             ret['group'] = 'Taurus Containers'
-            ret['icon'] = ":/designer/frame.png"
+            ret['icon'] = "designer:frame.png"
             ret['container'] = True
         return ret
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
+
     model = Qt.pyqtProperty("QString", TaurusBaseContainer.getModel,
                             TaurusBaseContainer.setModel,
                             TaurusBaseContainer.resetModel)
-    
+
     useParentModel = Qt.pyqtProperty("bool",
                                      TaurusBaseContainer.getUseParentModel,
                                      TaurusBaseContainer.setUseParentModel,
                                      TaurusBaseContainer.resetUseParentModel)
-    
+
     showQuality = Qt.pyqtProperty("bool", TaurusBaseContainer.getShowQuality,
                                   TaurusBaseContainer.setShowQuality,
                                   TaurusBaseContainer.resetShowQuality)
 
+
 def demo():
     "Frame"
     w = Qt.QWidget()
     w.setWindowTitle(Qt.QApplication.instance().applicationName())
     layout = Qt.QGridLayout()
-    layout.setContentsMargins(0,0,0,0)
+    layout.setContentsMargins(0, 0, 0, 0)
     w.setLayout(layout)
     frame = TaurusFrame()
     frame.model = "sys/tg_test/1"
@@ -126,22 +127,23 @@ def demo():
     w.show()
     return w
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         import taurus.core.util.argparse
         parser = taurus.core.util.argparse.get_taurus_parser()
         parser.usage = "%prog [options] <full_device_name(s)>"
-        app = Application(sys.argv, cmd_line_parser=parser, 
+        app = Application(sys.argv, cmd_line_parser=parser,
                           app_name="Taurus frame demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
-        
+
     args = app.get_command_line_args()
 
     if len(args) == 0:
@@ -158,11 +160,11 @@ def main():
             frame.model = model
             layout.addWidget(frame)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
         return w
 
 if __name__ == '__main__':
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/container/taurusgroupbox.py b/lib/taurus/qt/qtgui/container/taurusgroupbox.py
index d8ce215..584c9d8 100644
--- a/lib/taurus/qt/qtgui/container/taurusgroupbox.py
+++ b/lib/taurus/qt/qtgui/container/taurusgroupbox.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -38,75 +38,77 @@ class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer):
     This type of taurus container classes are specially useful if you define
     a parent taurus model to them and set all contained taurus widgets to use parent
     model. Example::
-    
+
         from taurus.qt.qtgui.container import *
         from taurus.qt.qtgui.display import *
-        
+
         widget = TaurusGroupBox("Example")
-        layout = Qt.QBoxLayout()
+        layout = Qt.QVBoxLayout()
         widget.setLayout(layout)
         widget.model = 'sys/database/2'
-        stateWidget = TaurusValueLabel()
+        stateWidget = TaurusLabel()
         layout.addWidget(stateWidget)
         stateWidget.useParentModel = True
         stateWidget.model = '/state'"""
-        
-    __pyqtSignals__ = ("modelChanged(const QString &)", "pendingOperationsChanged(bool)",)
-        
+    modelChanged = Qt.pyqtSignal('const QString &')
+    pendingOperationsChanged = Qt.pyqtSignal(bool)
+
     def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self._prefix = ''
         self._suffix = ''
-        
+
         self.call__init__wo_kw(Qt.QGroupBox, parent)
         self.call__init__(TaurusBaseContainer, name, designMode=designMode)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Public slots for apply/restore changes
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    @Qt.pyqtSignature("pendingOperationsChanged(bool)")
+
+    @Qt.pyqtSlot(bool)
     def pendingOperationsChanged(self, yesno):
         self.debug("emiting pendingOperationsChanged(%s)" % str(yesno))
-        self.emit(Qt.SIGNAL('pendingOperationsChanged(bool)'), yesno)
+        self.pendingOperationsChanged.emit(yesno)
 
-    @Qt.pyqtSignature("applyPendingChanges()")
+    @Qt.pyqtSlot()
     def applyPendingChanges(self):
         self.applyPendingOperations()
-    
-    @Qt.pyqtSignature("resetPendingChanges()")
+
+    @Qt.pyqtSlot()
     def resetPendingChanges(self):
         self.resetPendingOperations()
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget over writing
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-                    
+
     def getDisplayValue(self):
         v = TaurusBaseContainer.getDisplayValue(self)
         return "%s%s%s" % ((self._prefix or ''), v, (self._suffix or ''))
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getPrefixText(self):
         return self._prefix
-    
-    @Qt.pyqtSignature("setPrefixText(QString)")
-    def setPrefixText(self,prefix):
+
+    @Qt.pyqtSlot('QString')
+    def setPrefixText(self, prefix):
         self._prefix = prefix
         import taurus.core
-        self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
+        self.fireEvent(
+            evt_type=taurus.core.taurusbasetypes.TaurusEventType.Change)
 
     def getSuffixText(self):
         return self._suffix
-    
-    @Qt.pyqtSignature("setSuffixText(QString)")
-    def setSuffixText(self,suffix):
+
+    @Qt.pyqtSlot('QString')
+    def setSuffixText(self, suffix):
         self._suffix = suffix
         import taurus.core
-        self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
+        self.fireEvent(
+            evt_type=taurus.core.taurusbasetypes.TaurusEventType.Change)
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
@@ -114,39 +116,40 @@ class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer):
         if cls is TaurusGroupBox:
             ret['module'] = 'taurus.qt.qtgui.container'
             ret['group'] = 'Taurus Containers'
-            ret['icon'] = ":/designer/groupbox.png"
+            ret['icon'] = "designer:groupbox.png"
             ret['container'] = True
         return ret
 
-    model = Qt.pyqtProperty("QString", TaurusBaseContainer.getModel, 
-                                TaurusBaseContainer.setModel, 
-                                TaurusBaseContainer.resetModel)
-    
-    useParentModel = Qt.pyqtProperty("bool", 
-                                         TaurusBaseContainer.getUseParentModel,
-                                         TaurusBaseContainer.setUseParentModel,
-                                         TaurusBaseContainer.resetUseParentModel)
-    
+    model = Qt.pyqtProperty("QString", TaurusBaseContainer.getModel,
+                            TaurusBaseContainer.setModel,
+                            TaurusBaseContainer.resetModel)
+
+    useParentModel = Qt.pyqtProperty("bool",
+                                     TaurusBaseContainer.getUseParentModel,
+                                     TaurusBaseContainer.setUseParentModel,
+                                     TaurusBaseContainer.resetUseParentModel)
+
     showQuality = Qt.pyqtProperty("bool", TaurusBaseContainer.getShowQuality,
-                                      TaurusBaseContainer.setShowQuality,
-                                      TaurusBaseContainer.resetShowQuality)
+                                  TaurusBaseContainer.setShowQuality,
+                                  TaurusBaseContainer.resetShowQuality)
 
     showText = Qt.pyqtProperty("bool", TaurusBaseContainer.getShowText,
-                                   TaurusBaseContainer.setShowText,
-                                   TaurusBaseContainer.resetShowText)
-    
+                               TaurusBaseContainer.setShowText,
+                               TaurusBaseContainer.resetShowText)
+
     prefixText = Qt.pyqtProperty("QString", getPrefixText, setPrefixText,
-                                     doc="prefix text (optional)")
-    
+                                 doc="prefix text (optional)")
+
     suffixText = Qt.pyqtProperty("QString", getSuffixText, setSuffixText,
-                                    doc="suffix text (optional)")
+                                 doc="suffix text (optional)")
+
 
 def demo():
     "Group box"
     w = Qt.QWidget()
     w.setWindowTitle(Qt.QApplication.instance().applicationName())
     layout = Qt.QGridLayout()
-    layout.setContentsMargins(0,0,0,0)
+    layout.setContentsMargins(0, 0, 0, 0)
     w.setLayout(layout)
     groupbox = TaurusGroupBox()
     groupbox.model = "sys/tg_test/1"
@@ -169,22 +172,23 @@ def demo():
     w.show()
     return w
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         import taurus.core.util.argparse
         parser = taurus.core.util.argparse.get_taurus_parser()
         parser.usage = "%prog [options] <full_device_name(s)>"
-        app = Application(sys.argv, cmd_line_parser=parser, 
+        app = Application(sys.argv, cmd_line_parser=parser,
                           app_name="Taurus frame demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
-        
+
     args = app.get_command_line_args()
 
     if len(args) == 0:
@@ -201,11 +205,11 @@ def main():
             groupbox.model = model
             layout.addWidget(groupbox)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
         return w
 
 if __name__ == '__main__':
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py
index ef9bcde..bb1bd6c 100644
--- a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py
+++ b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -40,35 +40,35 @@ class TaurusGroupWidget(QGroupWidget, TaurusBaseContainer):
     This type of taurus container classes are specially useful if you define
     a parent taurus model to them and set all contained taurus widgets to use parent
     model. Example::
-    
+
         from taurus.qt.qtgui.container import *
         from taurus.qt.qtgui.display import *
-        
+
         widget = QGroupWidget(title="Example")
-        layout = Qt.QBoxLayout()
+        layout = Qt.QVBoxLayout()
         widget.setLayout(layout)
         widget.model = 'sys/database/2'
-        stateWidget = TaurusValueLabel()
+        stateWidget = TaurusLabel()
         layout.addWidget(stateWidget)
         stateWidget.useParentModel = True
         stateWidget.model = '/state'"""
-        
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-        
+
+    modelChanged = Qt.pyqtSignal('const QString &')
+
     def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__(QGroupWidget, parent=parent, designMode=designMode)
         self.call__init__(TaurusBaseContainer, name, designMode=designMode)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Public slots for apply/restore changes
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    @Qt.pyqtSignature("applyPendingChanges()")
+    @Qt.pyqtSlot()
     def applyPendingChanges(self):
         self.applyPendingOperations()
-    
-    @Qt.pyqtSignature("resetPendingChanges()")
+
+    @Qt.pyqtSlot()
     def resetPendingChanges(self):
         self.resetPendingOperations()
 
@@ -78,45 +78,45 @@ class TaurusGroupWidget(QGroupWidget, TaurusBaseContainer):
         if cls is TaurusGroupWidget:
             ret['module'] = 'taurus.qt.qtgui.container'
             ret['group'] = 'Taurus Containers'
-            ret['icon'] = ":/designer/groupwidget.png"
+            ret['icon'] = "designer:groupwidget.png"
             ret['container'] = True
         return ret
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
+
     model = Qt.pyqtProperty("QString", TaurusBaseContainer.getModel,
-                            TaurusBaseContainer.setModel, 
+                            TaurusBaseContainer.setModel,
                             TaurusBaseContainer.resetModel)
-    
+
     useParentModel = Qt.pyqtProperty("bool", TaurusBaseContainer.getUseParentModel,
                                      TaurusBaseContainer.setUseParentModel,
                                      TaurusBaseContainer.resetUseParentModel)
-    
+
     showQuality = Qt.pyqtProperty("bool", TaurusBaseContainer.getShowQuality,
                                   TaurusBaseContainer.setShowQuality,
                                   TaurusBaseContainer.resetShowQuality)
 
+
 def demo():
     """Group widget"""
-    
+
     import taurus.qt.qtgui.display
-    import taurus.qt.qtgui.resource
     w = Qt.QWidget()
     w.setWindowTitle(Qt.QApplication.instance().applicationName())
     layout = Qt.QGridLayout()
     w.setLayout(layout)
-    
+
     groupwidget = TaurusGroupWidget()
     groupwidget.model = "sys/tg_test/1"
-    groupwidget.titleIcon = taurus.qt.qtgui.resource.getThemeIcon("video-x-generic")
+    groupwidget.titleIcon = Qt.QIcon.fromTheme("video-x-generic")
 
     layout.addWidget(groupwidget, 0, 0)
     layout1 = Qt.QFormLayout()
     content = groupwidget.content()
     content.setLayout(layout1)
-    
+
     state_led = taurus.qt.qtgui.display.TaurusLed()
     state_led.useParentModel = True
     state_led.model = "/state"
@@ -133,9 +133,9 @@ def demo():
     groupwidget = TaurusGroupWidget()
     groupwidget.model = "sys/tg_test/1"
     groupwidget.setTitleStyle({
-        'start_color' : 'rgb(255, 60, 60)',
-        'stop_color'  : 'rgb(200, 0, 0)',
-        'font_color'  : 'rgb(140, 0, 0)',
+        'start_color': 'rgb(255, 60, 60)',
+        'stop_color': 'rgb(200, 0, 0)',
+        'font_color': 'rgb(140, 0, 0)',
         'border_radius': '10px',
     })
     groupwidget.setContentStyle({
@@ -168,26 +168,27 @@ def demo():
     layout1.addRow("short scalar:", short_scalar_label)
 
     layout.addWidget(Qt.QWidget(), 3, 0)
-    layout.setRowStretch(3,1)
+    layout.setRowStretch(3, 1)
     w.show()
     return w
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         import taurus.core.util.argparse
         parser = taurus.core.util.argparse.get_taurus_parser()
         parser.usage = "%prog [options] <full_device_name(s)>"
-        app = Application(sys.argv, cmd_line_parser=parser, 
+        app = Application(sys.argv, cmd_line_parser=parser,
                           app_name="Taurus frame demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
-        
+
     args = app.get_command_line_args()
 
     if len(args) == 0:
@@ -204,11 +205,11 @@ def main():
             groupwidget.model = model
             layout.addWidget(groupwidget)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
         return w
 
 if __name__ == '__main__':
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py
index 4ae2103..d456f87 100644
--- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py
+++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,24 +34,25 @@ __docformat__ = 'restructuredtext'
 import os
 import sys
 
+from taurus import tauruscustomsettings
 from taurus.external.qt import Qt
 from taurusbasecontainer import TaurusBaseContainer
 
 from taurus.qt.qtcore.configuration import BaseConfigurableClass
 from taurus.qt.qtgui.util import ExternalAppAction
-from taurus.qt.qtgui.resource import getIcon, getThemeIcon
 from taurus.qt.qtgui.dialog import protectTaurusMessageBox
 
 
 class CommandArgsLineEdit(Qt.QLineEdit):
     ''' An specialized QLineEdit that can transform its text from/to command argument lists'''
+
     def __init__(self, extapp, *args):
         Qt.QLineEdit.__init__(self, *args)
         self._extapp = extapp
-        self.connect(self, Qt.SIGNAL("textEdited(QString)"), self.setCmdText)
+        self.textEdited.connect(self.setCmdText)
 
     def setCmdText(self, cmdargs):
-        if not isinstance(cmdargs, (basestring, Qt.QString)): 
+        if not isinstance(cmdargs, (basestring, Qt.QString)):
             cmdargs = " ".join(cmdargs)
         self.setText(cmdargs)
         self._extapp.setCmdArgs(self.getCmdArgs(), False)
@@ -59,10 +60,11 @@ class CommandArgsLineEdit(Qt.QLineEdit):
     def getCmdArgs(self):
         import shlex
         return shlex.split(str(self.text()))
-        
+
 
 class ConfigurationDialog(Qt.QDialog, BaseConfigurableClass):
     ''' A Configuration Dialog'''
+
     def __init__(self, parent):
         Qt.QDialog.__init__(self, parent)
         BaseConfigurableClass.__init__(self)
@@ -70,33 +72,33 @@ class ConfigurationDialog(Qt.QDialog, BaseConfigurableClass):
         self.setModal(True)
         self.externalAppsPage = None
         self.setLayout(Qt.QVBoxLayout())
-        self.layout().addWidget(self._tabwidget) 
-            
-    
+        self.layout().addWidget(self._tabwidget)
+
     def addExternalAppConfig(self, extapp):
         '''
-        Creates an entry in the "External Apps" tab of the configuration dialog 
-        
+        Creates an entry in the "External Apps" tab of the configuration dialog
+
         :param extapp: (ExternalAppAction) the external application that is to
                        be included in the configuration menu.
         '''
         if self.externalAppsPage is None:
             self.externalAppsPage = Qt.QScrollArea()
             w = Qt.QWidget()
-            w.setLayout(Qt.QFormLayout()) 
+            w.setLayout(Qt.QFormLayout())
             self.externalAppsPage.setWidget(w)
             self.externalAppsPage.setWidgetResizable(True)
-            self._tabwidget.addTab(self.externalAppsPage, "External Application Paths")
-        label = "Command line for %s"%unicode(extapp.text())
+            self._tabwidget.addTab(self.externalAppsPage,
+                                   "External Application Paths")
+        label = "Command line for %s" % unicode(extapp.text())
         editWidget = CommandArgsLineEdit(extapp, " ".join(extapp.cmdArgs()))
         #editWidget = Qt.QLineEdit(" ".join(extapp.cmdArgs()))
         self.externalAppsPage.widget().layout().addRow(label, editWidget)
-        self.connect(extapp, Qt.SIGNAL("cmdArgsChanged"), editWidget.setCmdText)
+        extapp.cmdArgsChanged.connect(editWidget.setCmdText)
 
     def deleteExternalAppConfig(self, extapp):
         '''Remove the given external application configuration from
         the "External Apps" tab of the configuration dialog
-        
+
         :param extapp: (ExternalAppAction) the external application that is to
                        be included in the configuration menu.
         '''
@@ -105,9 +107,10 @@ class ConfigurationDialog(Qt.QDialog, BaseConfigurableClass):
         for cnt in reversed(range(layout.count())):
             widget = layout.itemAt(cnt).widget()
             if widget is not None:
-                text = str(widget.text()) # command1
+                text = str(widget.text())  # command1
                 if isinstance(widget, Qt.QLabel):
-                    dialog_text = "Command line for %s" % unicode(extapp.text())
+                    dialog_text = "Command line for %s" % unicode(
+                        extapp.text())
                     if text == dialog_text:
                         layout.removeWidget(widget)
                         widget.close()
@@ -116,21 +119,22 @@ class ConfigurationDialog(Qt.QDialog, BaseConfigurableClass):
                     if text == cmdargs:
                         layout.removeWidget(widget)
                         widget.close()
-        
+
     def show(self):
         ''' calls :meth:`Qt.QDialog.show` only if there is something to configure'''
         if self._tabwidget.count():
-                Qt.QDialog.show(self)
+            Qt.QDialog.show(self)
+
 
 class Rpdb2Thread(Qt.QThread):
-    
+
     def run(self):
         dialog = Rpdb2WaitDialog(parent=self.parent())
         dialog.exec_()
 
 
 class Rpdb2WaitDialog(Qt.QMessageBox):
-    
+
     def __init__(self, title=None, text=None, parent=None):
         if text is None:
             text = "Waitting for a debugger console to attach..."
@@ -141,22 +145,22 @@ class Rpdb2WaitDialog(Qt.QMessageBox):
         self.setWindowTitle(title)
         self.setText(text)
         self.button(Qt.QMessageBox.Ok).setEnabled(False)
-        
-        self.connect(parent, Qt.SIGNAL("rpdb2Started"), self.onStarted)
-    
+
+        parent.rpdb2Started.connect(self.onStarted)
+
     def onStarted(self):
         self.setWindowTitle("Rpdb2 running!")
         self.setText("A rpdb2 debugger was started successfully!")
         self.button(Qt.QMessageBox.Ok).setEnabled(True)
-        
+
 
 class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
     '''
     A Taurus-aware QMainWindow with several customizations:
-    
+
         - It takes care of (re)storing its geometry and state (see :meth:`loadSettings`)
-        - Supports perspectives (programmatic access and, optionally, 
-          accessible by user), and allows defining a set of "factory settings" 
+        - Supports perspectives (programmatic access and, optionally,
+          accessible by user), and allows defining a set of "factory settings"
         - It provides a customizable splashScreen (optional)
         - Supports spawning remote consoles and remote debugging
         - Supports full-screen mode toggling
@@ -168,87 +172,95 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
             - Taurus (accessible by derived classes  as `self.taurusMenu`)
             - Tools (accessible by derived classes  as `self.toolsMenu`)
             - Help (accessible by derived classes  as `self.helpMenu`)
-                
+
     '''
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-    
-    #customization options:
-    _heartbeat = 1500 #blinking semi-period in ms. Set to None for not showing the Heart beat LED 
+    modelChanged = Qt.pyqtSignal('const QString &')
+    perspectiveChanged = Qt.pyqtSignal(str)
+
+    # customization options:
+    # blinking semi-period in ms. Set to None for not showing the Heart beat
+    # LED
+    _heartbeat = 1500
     _showFileMenu = True
     _showViewMenu = True
     _showTaurusMenu = True
     _showToolsMenu = True
     _showHelpMenu = True
-    _supportUserPerspectives = True #Allows the user to change/create/delete perspectives
+    # Allows the user to change/create/delete perspectives
+    _supportUserPerspectives = True
     _showLogger = True
-    _splashLogo = ":/TaurusSplash.png" #set to None for disabling splash screen
+    _splashLogo = ":/TaurusSplash.png"  # set to None for disabling splash screen
     _splashMessage = "Initializing Main window..."
-    
-    def __init__(self, parent = None, designMode = False, splash=None):
+
+    def __init__(self, parent=None, designMode=False, splash=None):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QMainWindow, parent)
         self.call__init__(TaurusBaseContainer, name, designMode=designMode)
-        if splash is None:  
+        if splash is None:
             splash = bool(self._splashLogo)
-        
+
         self.__splashScreen = None
         if splash and not designMode:
-            self.__splashScreen = Qt.QSplashScreen(Qt.QPixmap(self._splashLogo))
+            self.__splashScreen = Qt.QSplashScreen(
+                Qt.QPixmap(self._splashLogo))
             self.__splashScreen.show()
             self.__splashScreen.showMessage(self._splashMessage)
-        
+
         self.__tangoHost = ""
         self.__settings = None
-        
+
         self.extAppsBar = None
-        
+
         self.helpManualDW = None
         self.helpManualBrowser = None
         self.resetHelpManualURI()
-        
-        #Heartbeat
+
+        # Heartbeat
         if self._heartbeat is not None:
             from taurus.qt.qtgui.display import QLed
             self.heartbeatLed = QLed()
-            self.heartbeatLed.setToolTip('Heartbeat: if it does not blink, the application is hung')
+            self.heartbeatLed.setToolTip(
+                'Heartbeat: if it does not blink, the application is hung')
             self.statusBar().addPermanentWidget(self.heartbeatLed)
             self.resetHeartbeat()
-        
-        #The configuration Dialog (which is launched with the configurationAction)
+
+        # The configuration Dialog (which is launched with the
+        # configurationAction)
         self.configurationDialog = ConfigurationDialog(self)
-        
-        #create a few common Application-wide actions
+
+        # create a few common Application-wide actions
         #Qt.QTimer.singleShot(0, self.__createActions())
         self.__createActions()
-        
-        #logger dock widget
+
+        # logger dock widget
         if self._showLogger:
             self.addLoggerWidget()
-        
-        #Create Menus
-        if self._showFileMenu:#File menu
+
+        # Create Menus
+        if self._showFileMenu:  # File menu
             self.createFileMenu()
-        if self._showViewMenu:#View menu
+        if self._showViewMenu:  # View menu
             self.createViewMenu()
-        if self._showTaurusMenu:#Taurus Menu
+        if self._showTaurusMenu:  # Taurus Menu
             self.createTaurusMenu()
-        if self._showToolsMenu:#Tools Menu
+        if self._showToolsMenu:  # Tools Menu
             self.createToolsMenu()
-        if self._showHelpMenu:#Help Menu
+        if self._showHelpMenu:  # Help Menu
             self.createHelpMenu()
-        
-        #View Toolbar
+
+        # View Toolbar
         self.viewToolBar = self.addToolBar("View")
         self.viewToolBar.setObjectName("viewToolBar")
         self.viewToolBar.addAction(self.toggleFullScreenAction)
-        
-        #Perspectives Toolbar
+
+        # Perspectives Toolbar
         if self._supportUserPerspectives:
             self.createPerspectivesToolBar()
-        
-        #disable the configuration action if there is nothing to configure
-        self.configurationAction.setEnabled(self.configurationDialog._tabwidget.count())
-                
+
+        # disable the configuration action if there is nothing to configure
+        self.configurationAction.setEnabled(
+            self.configurationDialog._tabwidget.count())
+
     def addLoggerWidget(self, hidden=True):
         '''adds a QLoggingWidget as a dockwidget of the main window (and hides it by default)'''
         from taurus.qt.qtgui.table import QLoggingWidget
@@ -259,17 +271,17 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
         self.addDockWidget(Qt.Qt.BottomDockWidgetArea, self.__loggerDW)
         if hidden:
             self.__loggerDW.hide()
-    
+
     def createFileMenu(self):
         '''adds a "File" Menu'''
         self.fileMenu = self.menuBar().addMenu("File")
         if self._supportUserPerspectives:
             self.fileMenu.addAction(self.importSettingsFileAction)
             self.fileMenu.addAction(self.exportSettingsFileAction)
-            #self.fileMenu.addAction(self.resetSettingsAction)
+            # self.fileMenu.addAction(self.resetSettingsAction)
             self.fileMenu.addSeparator()
         self.fileMenu.addAction(self.quitApplicationAction)
-        
+
     def createViewMenu(self):
         '''adds a "View" Menu'''
         self.viewMenu = self.menuBar().addMenu("View")
@@ -284,32 +296,34 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
             self.viewMenu.addMenu(self.perspectivesMenu)
             self.viewMenu.addAction(self.savePerspectiveAction)
             self.viewMenu.addAction(self.deletePerspectiveAction)
-    
+
     def createTaurusMenu(self):
         '''adds a "Taurus" Menu'''
         self.taurusMenu = self.menuBar().addMenu("Taurus")
         self.taurusMenu.addAction(self.changeTangoHostAction)
-        
+
     def createToolsMenu(self):
         '''adds a "Tools" Menu'''
         self.toolsMenu = self.menuBar().addMenu("Tools")
         self.externalAppsMenu = self.toolsMenu.addMenu("External Applications")
         self.toolsMenu.addAction(self.configurationAction)
-        
+
     def createHelpMenu(self):
         '''adds a "Help" Menu'''
         self.helpMenu = self.menuBar().addMenu("Help")
         self.helpMenu.addAction("About ...", self.showHelpAbout)
-        self.helpMenu.addAction(getThemeIcon("help-browser"),"Manual", self.onShowManual)
-        
+        self.helpMenu.addAction(Qt.QIcon.fromTheme(
+            "help-browser"), "Manual", self.onShowManual)
+
     def createPerspectivesToolBar(self):
         '''adds a Perspectives ToolBar'''
         self.perspectivesToolBar = self.addToolBar("Perspectives")
         self.perspectivesToolBar.setObjectName("perspectivesToolBar")
         pbutton = Qt.QToolButton()
-        if not hasattr(self, 'perspectivesMenu'): #it may have been created earlier (for the view menu)
+        # it may have been created earlier (for the view menu)
+        if not hasattr(self, 'perspectivesMenu'):
             self.perspectivesMenu = Qt.QMenu("Load Perspectives", self)
-        self.perspectivesMenu.setIcon(getThemeIcon("document-open"))
+        self.perspectivesMenu.setIcon(Qt.QIcon.fromTheme("document-open"))
         pbutton.setToolTip("Load Perspectives")
         pbutton.setText("Load Perspectives")
         pbutton.setPopupMode(Qt.QToolButton.InstantPopup)
@@ -317,106 +331,121 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
         self.perspectivesToolBar.addWidget(pbutton)
         self.perspectivesToolBar.addAction(self.savePerspectiveAction)
         if self._showViewMenu:
-            self.viewToolBarsMenu.addAction(self.perspectivesToolBar.toggleViewAction())
-        
+            self.viewToolBarsMenu.addAction(
+                self.perspectivesToolBar.toggleViewAction())
+
     def updatePerspectivesMenu(self):
         '''re-checks the perspectives available to update self.perspectivesMenu
-        
+
         .. note:: This method may need be called by derived classes at the end
                   of their initialization.
-        
+
         :return: (QMenu) the updated perspectives menu (or None if self._supportUserPerspectives is False)
         '''
         if not self._supportUserPerspectives:
             return None
         self.perspectivesMenu.clear()
         for pname in self.getPerspectivesList():
-            self.perspectivesMenu.addAction(pname, self.__onPerspectiveSelected)
+            self.perspectivesMenu.addAction(
+                pname, self.__onPerspectiveSelected)
         return self.perspectivesMenu
-    
+
     def __onPerspectiveSelected(self):
         '''slot to be called by the actions in the perspectivesMenu'''
         pname = self.sender().text()
         self.loadPerspective(name=pname)
-        
+
     def splashScreen(self):
         '''returns a the splashScreen
-        
+
         :return: (QSplashScreen)
         '''
         return self.__splashScreen
-        
+
     def basicTaurusToolbar(self):
         '''returns a QToolBar with few basic buttons (most important, the logo)
-        
+
         :return: (QToolBar)
         '''
         tb = Qt.QToolBar('Taurus Toolbar')
         tb.setObjectName('Taurus Toolbar')
 #        tb.addAction(self.changeTangoHostAction)
 #        tb.addWidget(self.taurusLogo)
-        tb.addAction(getIcon(":/logo.png"),Qt.qApp.organizationName())
-        tb.setIconSize(Qt.QSize(50,50))
+        logo = getattr(tauruscustomsettings, 'ORGANIZATION_LOGO',
+                       "logos:taurus.png")
+        tb.addAction(Qt.QIcon(logo), Qt.qApp.organizationName())
+        tb.setIconSize(Qt.QSize(50, 50))
         return tb
 
     def __createActions(self):
         '''initializes the application-wide actions'''
-        self.quitApplicationAction =  Qt.QAction(getThemeIcon("process-stop"),'Exit Application', self)
-        self.connect(self.quitApplicationAction, Qt.SIGNAL("triggered()"), self.close)
-        self.changeTangoHostAction =  Qt.QAction(getThemeIcon("network-server"),'Change Tango Host ...', self)
+        self.quitApplicationAction = Qt.QAction(
+            Qt.QIcon.fromTheme("process-stop"), 'Exit Application', self)
+        self.quitApplicationAction.triggered[()].connect(self.close)
+        self.changeTangoHostAction = Qt.QAction(Qt.QIcon.fromTheme(
+            "network-server"), 'Change Tango Host ...', self)
         self.changeTangoHostAction.setShortcut(Qt.QKeySequence("Ctrl+P"))
-        self.connect(self.changeTangoHostAction, Qt.SIGNAL("triggered()"), self._onChangeTangoHostAction)
-        
-        self.loadPerspectiveAction = Qt.QAction(getThemeIcon("document-open"), 'Load Perspective ...', self)
-        self.connect(self.loadPerspectiveAction, Qt.SIGNAL("triggered()"), self.loadPerspective)
-        
-        self.savePerspectiveAction = Qt.QAction(getThemeIcon("document-save"),'Save Perspective ...', self)
-        self.connect(self.savePerspectiveAction, Qt.SIGNAL("triggered()"), self.savePerspective)
-        
-        self.deletePerspectiveAction = Qt.QAction(getIcon(":/actions/edit-delete.svg"),'Delete Perspective ...', self)
-        self.connect(self.deletePerspectiveAction, Qt.SIGNAL("triggered()"), self.removePerspective)
-        
-        self.exportSettingsFileAction = Qt.QAction(getThemeIcon("document-save"),'Export Settings ...', self)
-        self.connect(self.exportSettingsFileAction, Qt.SIGNAL("triggered()"), self.exportSettingsFile)
-        
-        self.importSettingsFileAction = Qt.QAction(getThemeIcon("document-open"),'Import Settings ...', self)
-        self.connect(self.importSettingsFileAction, Qt.SIGNAL("triggered()"), self.importSettingsFile)
-        
-        #self.resetSettingsAction = Qt.QAction(getThemeIcon("edit-undo"),'Reset Settings', self)
+        self.changeTangoHostAction.triggered[()].connect(self._onChangeTangoHostAction)
+
+        self.loadPerspectiveAction = Qt.QAction(Qt.QIcon.fromTheme(
+            "document-open"), 'Load Perspective ...', self)
+        self.loadPerspectiveAction.triggered[()].connect(self.loadPerspective)
+
+        self.savePerspectiveAction = Qt.QAction(Qt.QIcon.fromTheme(
+            "document-save"), 'Save Perspective ...', self)
+        self.savePerspectiveAction.triggered[()].connect(self.savePerspective)
+
+        self.deletePerspectiveAction = Qt.QAction(
+            Qt.QIcon("actions:edit-delete.svg"), 'Delete Perspective ...', self)
+        self.deletePerspectiveAction.triggered[()].connect(self.removePerspective)
+
+        self.exportSettingsFileAction = Qt.QAction(
+            Qt.QIcon.fromTheme("document-save"), 'Export Settings ...', self)
+        self.exportSettingsFileAction.triggered[()].connect(self.exportSettingsFile)
+
+        self.importSettingsFileAction = Qt.QAction(
+            Qt.QIcon.fromTheme("document-open"), 'Import Settings ...', self)
+        self.importSettingsFileAction.triggered[()].connect(self.importSettingsFile)
+
+        #self.resetSettingsAction = Qt.QAction(Qt.QIcon.fromTheme("edit-undo"),'Reset Settings', self)
         #self.connect(self.resetSettingsAction, Qt.SIGNAL("triggered()"), self.resetSettings)
-        
-        self.configurationAction = Qt.QAction(getThemeIcon("preferences-system"), 'Configurations ...', self)
-        self.connect(self.configurationAction, Qt.SIGNAL("triggered()"), self.configurationDialog.show)
-        
+
+        self.configurationAction = Qt.QAction(Qt.QIcon.fromTheme(
+            "preferences-system"), 'Configurations ...', self)
+        self.configurationAction.triggered[()].connect(self.configurationDialog.show)
+
         #self.rpdb2Action = Qt.QAction("Spawn rpdb2", self)
         self.spawnRpdb2Shortcut = Qt.QShortcut(self)
         self.spawnRpdb2Shortcut.setKey(Qt.QKeySequence(Qt.Qt.Key_F9))
-        self.connect(self.spawnRpdb2Shortcut, Qt.SIGNAL("activated()"), self._onSpawnRpdb2)
+        self.spawnRpdb2Shortcut.activated.connect(self._onSpawnRpdb2)
 
         #self.rpdb2Action = Qt.QAction("Spawn rpdb2", self)
         self.spawnRpdb2Shortcut = Qt.QShortcut(self)
-        rpdb2key = Qt.QKeySequence(Qt.Qt.CTRL + Qt.Qt.ALT + Qt.Qt.Key_0, Qt.Qt.Key_1)
+        rpdb2key = Qt.QKeySequence(
+            Qt.Qt.CTRL + Qt.Qt.ALT + Qt.Qt.Key_0, Qt.Qt.Key_1)
         self.spawnRpdb2Shortcut.setKey(rpdb2key)
-        self.connect(self.spawnRpdb2Shortcut, Qt.SIGNAL("activated()"), self._onSpawnRpdb2)
-        
+        self.spawnRpdb2Shortcut.activated.connect(self._onSpawnRpdb2)
+
         self.spawnRConsoleShortcut = Qt.QShortcut(self)
-        rconsolekey = Qt.QKeySequence(Qt.Qt.CTRL + Qt.Qt.ALT + Qt.Qt.Key_0, Qt.Qt.Key_2)
+        rconsolekey = Qt.QKeySequence(
+            Qt.Qt.CTRL + Qt.Qt.ALT + Qt.Qt.Key_0, Qt.Qt.Key_2)
         self.spawnRConsoleShortcut.setKey(rconsolekey)
-        self.connect(self.spawnRConsoleShortcut, Qt.SIGNAL("activated()"), self._onSpawnRConsole)
-        
-        self.toggleFullScreenAction = Qt.QAction(getIcon(":/actions/view-fullscreen.svg"), 'Show FullScreen', self)
+        self.spawnRConsoleShortcut.activated.connect(self._onSpawnRConsole)
+
+        self.toggleFullScreenAction = Qt.QAction(
+            Qt.QIcon("actions:view-fullscreen.svg"), 'Show FullScreen', self)
         self.toggleFullScreenAction.setCheckable(True)
-        self.connect(self.toggleFullScreenAction, Qt.SIGNAL("toggled(bool)"), self._onToggleFullScreen)
+        self.toggleFullScreenAction.toggled.connect(self._onToggleFullScreen)
 
         # In Qt <= 4.4 setting the QAction shortcut at the application level
         # doesn't work when trying to get out of fullscreen so we create a
-        # QShortcut manually to solve the problem. 
-        #self.toggleFullScreenAction.setShortcut(Qt.QKeySequence(Qt.Qt.Key_F11))
-        #self.toggleFullScreenAction.setShortcutContext(Qt.Qt.ApplicationShortcut)
+        # QShortcut manually to solve the problem.
+        # self.toggleFullScreenAction.setShortcut(Qt.QKeySequence(Qt.Qt.Key_F11))
+        # self.toggleFullScreenAction.setShortcutContext(Qt.Qt.ApplicationShortcut)
         self.fullScreenShortcut = Qt.QShortcut(self)
         self.fullScreenShortcut.setKey(Qt.QKeySequence(Qt.Qt.Key_F11))
-        self.connect(self.fullScreenShortcut, Qt.SIGNAL("activated()"), self._onToggleFullScreen)
-    
+        self.fullScreenShortcut.activated.connect(self._onToggleFullScreen)
+
     @protectTaurusMessageBox
     def _onSpawnRpdb2(self):
         try:
@@ -430,21 +459,21 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
             Qt.QMessageBox.information(self, "Rpdb2 running",
                                        "A rpdb2 debugger is already started")
             return
-        
+
         pwd, ok = Qt.QInputDialog.getText(self, "Rpdb2 password", "Password:",
                                           Qt.QLineEdit.Password)
         if not ok:
             return
-        
+
         Qt.QMessageBox.warning(self, "Rpdb2 freeze",
                                "The application will freeze until a "
                                "debugger attaches.")
-        
+
         self._rpdb2 = rpdb2.start_embedded_debugger(str(pwd))
-        
+
         Qt.QMessageBox.information(self, "Rpdb2 running",
                                    "rpdb2 debugger started successfully!")
-    
+
     @protectTaurusMessageBox
     def _onSpawnRConsole(self):
         try:
@@ -454,19 +483,19 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
                                    "Cannot spawn debugger: rfoo is not "
                                    "installed on your system.")
             return
-        
+
         if hasattr(self, "_rconsole_port"):
             Qt.QMessageBox.information(self, "rconsole running",
                                        "A rconsole is already running on "
                                        "port %d" % self._rconsole_port)
             return
-        
+
         port, ok = Qt.QInputDialog.getInteger(self, "rconsole port", "Port:",
                                               rfoo.utils.rconsole.PORT,
                                               0, 65535)
         if not ok:
             return
-        
+
         rfoo.utils.rconsole.spawn_server(port=port)
         self._rconsole_port = port
         Qt.QMessageBox.information(self, "Rpdb2 running",
@@ -474,9 +503,9 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
                                    "Type:<p>"
                                    "<b>rconsole -p %d</b></p>"
                                    "to connect to it" % port)
-    
+
     # I put the yesno=None keyword arg so it may be called by both toggled(bool)
-    # activated() Qt signals. There is no problem as long as we don't use the 
+    # activated() Qt signals. There is no problem as long as we don't use the
     # parameter internally in the method
     def _onToggleFullScreen(self, yesno=None):
         if self.isFullScreen():
@@ -485,71 +514,73 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
         else:
             self._toggleToolBarsAndMenu(False)
             self.showFullScreen()
-    
+
     def _toggleToolBarsAndMenu(self, visible, toolBarAreas=Qt.Qt.TopToolBarArea):
         for toolbar in self.findChildren(Qt.QToolBar):
             if bool(self.toolBarArea(toolbar) & toolBarAreas):
                 toolbar.setVisible(visible)
-    
+
     def setQSettings(self, settings):
         '''sets the main window settings object
-        
+
         :param settings: (QSettings or None)
-        
+
         .. seealso:: :meth:`getQSettings`
         '''
         self.__settings = settings
-        
+
     def resetQSettings(self):
         '''equivalent to setQSettings(None) '''
         self.setQSettings(None)
-        
+
     def getQSettings(self):
         '''Returns the main window settings object.
         If it was not previously set, it will create a new QSettings object
         following the Taurus convention i.e., it using Ini format and userScope)
-        
+
         :return: (QSettings) the main window QSettings object
         '''
         if self.__settings is None:
             self.__settings = self.newQSettings()
-        return self.__settings 
-    
+        return self.__settings
+
     def newQSettings(self):
         '''Returns a settings taurus-specific QSettings object.
         The returned QSettings object will comply with the Taurus defaults for
         storing application settings (i.e., it uses Ini format and userScope)
-        
+
         :return: (QSettings) a taurus-specific QSettings object
         '''
-        #using the ALBA-Controls Coding Convention on how to store application settings
-        format=Qt.QSettings.IniFormat
+        # using the ALBA-Controls Coding Convention on how to store application
+        # settings
+        format = Qt.QSettings.IniFormat
         scope = Qt.QSettings.UserScope
         appname = Qt.QApplication.applicationName()
         orgname = Qt.QApplication.organizationName()
         return Qt.QSettings(format, scope, orgname, appname)
-        ##Note: for Qt v>=4.4, the five previous lines could have been substituted by the following two: 
-        #self.__settings = Qt.QSettings() #this uses QCoreApplication.applicationName() and QCoreApplication.organizationName()
-        #self.__settings.setDefaultFormat(Qt.QSettings.IniFormat)
-            
+        # Note: for Qt v>=4.4, the five previous lines could have been substituted by the following two:
+        # self.__settings = Qt.QSettings() #this uses QCoreApplication.applicationName() and QCoreApplication.organizationName()
+        # self.__settings.setDefaultFormat(Qt.QSettings.IniFormat)
+
     def getFactorySettingsFileName(self):
         '''returns the file name of the "factory settings" (the ini file with default settings).
         The default implementation returns "<path>/<appname>.ini", where <path>
         is the path of the module where the main window class is defined and
         <appname> is the application name (as obtained from QApplication).
-        
+
         :return: (str) the absolute file name.
         '''
-        root,tail = os.path.split(os.path.abspath(sys.modules[self.__module__].__file__))
-        basename = "%s.ini"%str(Qt.qApp.applicationName())
-        return os.path.join(root,basename)
-    
+        root, tail = os.path.split(os.path.abspath(
+            sys.modules[self.__module__].__file__))
+        basename = "%s.ini" % str(Qt.qApp.applicationName())
+        return os.path.join(root, basename)
+
     def loadSettings(self, settings=None, group=None, ignoreGeometry=False, factorySettingsFileName=None):
         '''restores the application settings previously saved with :meth:`saveSettings`.
-        
+
         .. note:: This method should be called explicitly from derived classes after all
                   initialization is done
-        
+
         :param settings: (QSettings or None) a QSettings object. If None given,
                          the default one returned by :meth:`getQSettings` will
                          be used
@@ -563,241 +594,261 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
                                         (e.g., the first time the application is
                                         launched after installation)
         '''
-        if settings is None: 
+        if settings is None:
             settings = self.getQSettings()
             if len(settings.allKeys()) == 0:
                 fname = factorySettingsFileName or self.getFactorySettingsFileName()
                 if os.path.exists(fname):
-                    self.info('Importing factory settings from "%s"'%fname)
+                    self.info('Importing factory settings from "%s"' % fname)
                     self.importSettingsFile(fname)
                 return
-                
-        if group is not None: 
+
+        if group is not None:
             settings.beginGroup(group)
-        if not ignoreGeometry: 
-            ba = Qt.from_qvariant(settings.value("MainWindow/Geometry"), 'toByteArray') or Qt.QByteArray() #With API2, from_qvariant is returning None instead
-                                                                                                           # of an empty QByTeArray
-                                                                                                           # and this caused an exception later on. Hence the "or"
-            self.restoreGeometry(ba) 
-        #restore the Taurus config
+        if not ignoreGeometry:
+            # With API2, from_qvariant is returning None instead
+            ba = Qt.from_qvariant(settings.value(
+                "MainWindow/Geometry"), 'toByteArray') or Qt.QByteArray()
+            # of an empty QByTeArray
+            # and this caused an exception later on. Hence the "or"
+            self.restoreGeometry(ba)
+        # restore the Taurus config
         try:
-            ba = Qt.from_qvariant(settings.value("TaurusConfig"), 'toByteArray') or Qt.QByteArray()
+            ba = Qt.from_qvariant(settings.value(
+                "TaurusConfig"), 'toByteArray') or Qt.QByteArray()
             self.applyQConfig(ba)
-        except Exception,e:
-            msg = 'Problem loading configuration from "%s". Some settings may not be restored.\n Details: %s'%(unicode(settings.fileName()), repr(e))
+        except Exception, e:
+            msg = 'Problem loading configuration from "%s". Some settings may not be restored.\n Details: %s' % (
+                unicode(settings.fileName()), repr(e))
             self.error(msg)
-            Qt.QMessageBox.warning(self,'Error Loading settings', msg, Qt.QMessageBox.Ok)
-        ba = Qt.from_qvariant(settings.value("MainWindow/State"), 'toByteArray') or Qt.QByteArray()
-        self.restoreState(ba) 
-        #hide all dockwidgets (so that they are shown only if they were present in the settings)
-        dockwidgets = [c for c in self.children() if isinstance(c, Qt.QDockWidget)]
+            Qt.QMessageBox.warning(
+                self, 'Error Loading settings', msg, Qt.QMessageBox.Ok)
+        ba = Qt.from_qvariant(settings.value(
+            "MainWindow/State"), 'toByteArray') or Qt.QByteArray()
+        self.restoreState(ba)
+        # hide all dockwidgets (so that they are shown only if they were
+        # present in the settings)
+        dockwidgets = [c for c in self.children(
+        ) if isinstance(c, Qt.QDockWidget)]
         for d in dockwidgets:
             r = self.restoreDockWidget(d)
             d.hide()
-        ba = Qt.from_qvariant(settings.value("MainWindow/State"), 'toByteArray') or Qt.QByteArray()
-        self.restoreState(ba) 
-        
-        if group is not None: 
+        ba = Qt.from_qvariant(settings.value(
+            "MainWindow/State"), 'toByteArray') or Qt.QByteArray()
+        self.restoreState(ba)
+
+        if group is not None:
             settings.endGroup()
         self.updatePerspectivesMenu()
         self.info('MainWindow settings restored')
-        
+
     def saveSettings(self, group=None):
         '''saves the application settings (so that they can be restored with :meth:`loadSettings`)
-        
+
         .. note:: this method is automatically called by default when closing the
-                  window, so in general there is no need to call it from derived classes 
-        
+                  window, so in general there is no need to call it from derived classes
+
         :param group: (str) a prefix that will be added to the keys to be
                        saved (no prefix by default)
         '''
         settings = self.getQSettings()
-        if group is not None: 
+        if group is not None:
             settings.beginGroup(group)
-        #main window geometry
-        settings.setValue("MainWindow/State",Qt.QVariant(self.saveState()))
-        settings.setValue("MainWindow/Geometry", Qt.QVariant(self.saveGeometry()))
-        
-        #store the config dict
+        # main window geometry
+        settings.setValue("MainWindow/State", Qt.QVariant(self.saveState()))
+        settings.setValue("MainWindow/Geometry",
+                          Qt.QVariant(self.saveGeometry()))
+
+        # store the config dict
         settings.setValue("TaurusConfig", Qt.QVariant(self.createQConfig()))
-        if group is not None: 
+        if group is not None:
             settings.endGroup()
-        self.info('MainWindow settings saved in "%s"'%settings.fileName())
-        
+        self.info('MainWindow settings saved in "%s"' % settings.fileName())
+
     def savePerspective(self, name=None):
         '''Stores current state of the application as a perspective with the given name
-        
+
         :param name: (str) name of the perspective
         '''
         perspectives = self.getPerspectivesList()
         if name is None:
-            name,ok = Qt.QInputDialog.getItem(self, "Save Perspective", "Store current settings as the following perspective:",
-                                              perspectives, 0, True) 
-            if not ok: 
+            name, ok = Qt.QInputDialog.getItem(self, "Save Perspective", "Store current settings as the following perspective:",
+                                               perspectives, 0, True)
+            if not ok:
                 return
         if name in perspectives:
-            ans= Qt.QMessageBox.question(self, "Overwrite perspective?", "overwrite existing perspective %s?"%unicode(name),
-                                         Qt.QMessageBox.Yes, Qt.QMessageBox.No)
-            if ans != Qt.QMessageBox.Yes: 
+            ans = Qt.QMessageBox.question(self, "Overwrite perspective?", "overwrite existing perspective %s?" % unicode(name),
+                                          Qt.QMessageBox.Yes, Qt.QMessageBox.No)
+            if ans != Qt.QMessageBox.Yes:
                 return
-        self.saveSettings(group="Perspectives/%s"%name)
+        self.saveSettings(group="Perspectives/%s" % name)
         self.updatePerspectivesMenu()
-        
+
     def loadPerspective(self, name=None, settings=None):
         '''Loads the settings saved for the given perspective.
         It emits a 'perspectiveChanged' signal with name as its parameter
-                
-        :param name: (str) name of the perspective            
+
+        :param name: (str) name of the perspective
         :param settings: (QSettings or None) a QSettings object. If None given,
                          the default one returned by :meth:`getQSettings` will
                          be used
         '''
         if name is None:
             perspectives = self.getPerspectivesList()
-            if len(perspectives) == 0: return
-            name,ok = Qt.QInputDialog.getItem(self, "Load Perspective", "Change perspective to:",
-                                              perspectives, 0, False) 
-            if not ok: return
-        self.loadSettings(settings=settings, group="Perspectives/%s"%name, ignoreGeometry=True)
-        self.emit(Qt.SIGNAL('perspectiveChanged'), name)
-    
+            if len(perspectives) == 0:
+                return
+            name, ok = Qt.QInputDialog.getItem(self, "Load Perspective", "Change perspective to:",
+                                               perspectives, 0, False)
+            if not ok:
+                return
+        self.loadSettings(settings=settings,
+                          group="Perspectives/%s" % name, ignoreGeometry=True)
+        self.perspectiveChanged.emit(name)
+
     def getPerspectivesList(self, settings=None):
-        '''Returns the list of saved perspectives 
-        
+        '''Returns the list of saved perspectives
+
         :param settings: (QSettings or None) a QSettings object. If None given,
                          the default one returned by :meth:`getQSettings` will
                          be used
-        
+
         :return: (QStringList) the list of the names of the currently saved
                  perspectives
         '''
-        if settings is None: settings = self.getQSettings()
+        if settings is None:
+            settings = self.getQSettings()
         settings.beginGroup("Perspectives")
         names = settings.childGroups()
         settings.endGroup()
         return names
-    
+
     def removePerspective(self, name=None, settings=None):
         '''removes the given perspective from the settings
-                
-        :param name: (str) name of the perspective            
+
+        :param name: (str) name of the perspective
         :param settings: (QSettings or None) a QSettings object. If None given,
                          the default one returned by :meth:`getQSettings` will
                          be used
         '''
-        if settings is None: settings = self.getQSettings()
+        if settings is None:
+            settings = self.getQSettings()
         if name is None:
             perspectives = self.getPerspectivesList()
-            if len(perspectives) == 0: return
-            name,ok = Qt.QInputDialog.getItem(self, "Delete Perspective", "Choose perspective to be deleted:",
-                                              perspectives, 0, False) 
-            if not ok: return
+            if len(perspectives) == 0:
+                return
+            name, ok = Qt.QInputDialog.getItem(self, "Delete Perspective", "Choose perspective to be deleted:",
+                                               perspectives, 0, False)
+            if not ok:
+                return
         if name not in perspectives:
-            self.warning("Cannot remove perspective %s (not found)"%str(name))
+            self.warning(
+                "Cannot remove perspective %s (not found)" % str(name))
             return
         settings.beginGroup("Perspectives")
         settings.remove(name)
         settings.endGroup()
         self.updatePerspectivesMenu()
-    
+
     def exportSettingsFile(self, fname=None):
         '''copies the current settings file into the given file name.
-        
+
         :param fname: (str) name of output file. If None given, a file dialog will be shown.
         '''
         if fname is None:
-            fname = unicode(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', 
-                                                   '', "Ini files (*.ini);;All files (*)"))
+            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)
         if ok:
-            self.info('MainWindow settings saved in "%s"'%unicode(fname))
+            self.info('MainWindow settings saved in "%s"' % unicode(fname))
         else:
-            msg = 'Settings could not be exported to %s'%unicode(fname)
+            msg = 'Settings could not be exported to %s' % unicode(fname)
             Qt.QMessageBox.warning(self, 'Export error', msg)
-    
+
     def importSettingsFile(self, fname=None):
         '''
         loads settings (including importing all perspectives) from a given ini
         file. It warns before overwriting an existing perspective.
-        
+
         :param fname: (str) name of ini file. If None given, a file dialog will be shown.
         '''
         if fname is None:
             fname = unicode(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file',
-                                                   '', "Ini files (*.ini);;All files (*)"))
+                                                           '', "Ini files (*.ini);;All files (*)"))
             if not fname:
                 return
         s = Qt.QSettings(fname, Qt.QSettings.IniFormat)
-        #clone the perspectives found in the "factory" settings
+        # clone the perspectives found in the "factory" settings
         for p in self.getPerspectivesList(settings=s):
             self.loadPerspective(name=p, settings=s)
             self.savePerspective(name=p)
-        #finally load the settings
+        # finally load the settings
         self.loadSettings(settings=s)
-        
+
 #    def resetSettings(self):
 #        '''deletes current settings file and clears all settings'''
 #        self.__settings = self.newQSettings()
 #        self.saveSettings()
 
-    def showEvent(self,event):
+    def showEvent(self, event):
         '''This event handler receives widget show events'''
         if self.__splashScreen is not None and not event.spontaneous():
             self.__splashScreen.finish(self)
 
-    def closeEvent(self,event):
+    def closeEvent(self, event):
         '''This event handler receives widget close events'''
-        self.saveSettings() #save current window state before closing
-        if hasattr(self,"socketServer"):
+        self.saveSettings()  # save current window state before closing
+        if hasattr(self, "socketServer"):
             self.socketServer.close()
         Qt.QMainWindow.closeEvent(self, event)
         TaurusBaseContainer.closeEvent(self, event)
 
-        #print "\n\n------ MAIN WINDOW CLOSED ------ \n\n"
-    
+        # print "\n\n------ MAIN WINDOW CLOSED ------ \n\n"
+
     def addExternalAppLauncher(self, extapp, toToolBar=True, toMenu=True):
         '''
         Adds launchers for an external application to the Tools Menu
         and/or to the Tools ToolBar.
-        
+
         :param extapp: (ExternalAppAction or list<str>) the external application
                        to be launched passed as a :class:`ExternalAppAction`
                        (recommended because it allows to specify custom text and
                        icon) or, alternatively, as a list of strings (sys.argv-
                        like) that will be passed to :meth:`subprocess.Popen`.
-        :param toToolBar: (bool) If True (default) a button will be added in the 
+        :param toToolBar: (bool) If True (default) a button will be added in the
                           Tools toolBar
-        :param toMenu: (bool) If True (default) an entry will be added in the 
+        :param toMenu: (bool) If True (default) an entry will be added in the
                           Tools Menu, under the "External Applications" submenu
-                          
+
         .. seealso:: :class:`ExternalAppAction`
         '''
         if not isinstance(extapp, ExternalAppAction):
-            extapp = ExternalAppAction(extapp, parent = self)
+            extapp = ExternalAppAction(extapp, parent=self)
         if extapp.parentWidget() is None:
             extapp.setParent(self)
-        
+
         self.configurationDialog.addExternalAppConfig(extapp)
         self.configurationAction.setEnabled(True)
-        
+
         if toToolBar:
             if self.extAppsBar is None:
                 self.extAppsBar = self.addToolBar("External Applications")
                 self.extAppsBar.setObjectName("External Applications")
-                self.extAppsBar.setToolButtonStyle(Qt.Qt.ToolButtonTextBesideIcon)
+                self.extAppsBar.setToolButtonStyle(
+                    Qt.Qt.ToolButtonTextBesideIcon)
                 if self._showViewMenu:
-                    self.viewToolBarsMenu.addAction(self.extAppsBar.toggleViewAction())
+                    self.viewToolBarsMenu.addAction(
+                        self.extAppsBar.toggleViewAction())
             self.extAppsBar.addAction(extapp)
-            
+
         if toMenu and self._showToolsMenu:
             if self.toolsMenu is None:
                 self.createToolsMenu()
             self.externalAppsMenu.addAction(extapp)
-        #register this action for config
-        self.registerConfigDelegate(extapp, "_extApp[%s]"%str(extapp.text()))
+        # register this action for config
+        self.registerConfigDelegate(extapp, "_extApp[%s]" % str(extapp.text()))
 
     def deleteExternalAppLauncher(self, action):
         '''
@@ -820,7 +871,7 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
             self.externalAppsMenu.update
         except:
             pass
-        #unregister this action for config
+        # unregister this action for config
         self.unregisterConfigurableItem("_extApp[%s]" % str(action.text()),
                                         raiseOnError=False)
 
@@ -829,27 +880,28 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
         slot called when the Change Tango Host is triggered. It prompts for a
         Tango host name and calls :meth:`setTangoHost`
         '''
-        host, valid = Qt.QInputDialog.getText  ( self, 'Change Tango Host', 'New Tango Host', Qt.QLineEdit.Normal,  str(self.getTangoHost()))
+        host, valid = Qt.QInputDialog.getText(
+            self, 'Change Tango Host', 'New Tango Host', Qt.QLineEdit.Normal,  str(self.getTangoHost()))
         if valid:
             self.setTangoHost(str(host))
-            
+
     def setTangoHost(self, host):
         self.__tangoHost = host
-        
+
     def getTangoHost(self):
         return self.__tangoHost
-    
+
     def resetTangoHost(self):
         self.setTangoHost(None)
-        
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         # Current versions of designer don't work with MainWindow as custom
         # widgets. Therefore until this is solved, the widget will not appear
         # in the designer
         return None
-    
-    def setHelpManualURI(self,uri):
+
+    def setHelpManualURI(self, uri):
         self.__helpManualURI = uri
         if self.helpManualBrowser is None:
             try:
@@ -857,28 +909,33 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
                 self.helpManualBrowser = QWebView()
             except:
                 self.helpManualBrowser = Qt.QLabel('QWebkit is not available')
-                def dummyload(*args):pass
+
+                def dummyload(*args):
+                    pass
                 self.helpManualBrowser.load = dummyload
                 return
-        try: url = Qt.QUrl.fromUserInput(uri) 
-        except: url = Qt.QUrl(uri) #fallback for Qt<4.6
+        try:
+            url = Qt.QUrl.fromUserInput(uri)
+        except:
+            url = Qt.QUrl(uri)  # fallback for Qt<4.6
         self.helpManualBrowser.load(url)
-        
+
     def getHelpManualURI(self):
         return self.__helpManualURI
-    
+
     def resetHelpManualURI(self):
         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)
+        abouttext = "%s %s\n\nUsing %s %s" % (
+            appname, appversion, release.name, release.version)
         Qt.QMessageBox.about(self, 'About', abouttext)
-            
+
     def onShowManual(self, anchor=None):
         '''Shows the User Manual in a dockwidget'''
         if self.helpManualDW is None:
@@ -888,7 +945,7 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
             self.addDockWidget(Qt.Qt.BottomDockWidgetArea, self.helpManualDW)
         else:
             self.helpManualDW.show()
-            
+
     def checkSingleInstance(self, key=None):
         '''
         Tries to connect via a QLocalSocket to an existing application with the
@@ -899,9 +956,9 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
             from taurus.core.util.user import getSystemUserName
             username = getSystemUserName()
             appname = unicode(Qt.QApplication.applicationName())
-            key = "__socket_%s-%s__"%(username,appname)
+            key = "__socket_%s-%s__" % (username, appname)
         from taurus.external.qt import QtNetwork
-        socket = QtNetwork.QLocalSocket(self) 
+        socket = QtNetwork.QLocalSocket(self)
         socket.connectToServer(key)
         alive = socket.waitForConnected(3000)
         if alive:
@@ -909,26 +966,30 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
             return False
         else:
             self.socketServer = QtNetwork.QLocalServer(self)
-            self.connect(self.socketServer, Qt.SIGNAL("newConnection()"), self.onIncommingSocketConnection)
+            self.socketServer.newConnection.connect(self.onIncommingSocketConnection)
             ok = self.socketServer.listen(key)
             if not ok:
                 AddressInUseError = QtNetwork.QAbstractSocket.AddressInUseError
                 if self.socketServer.serverError() == AddressInUseError:
-                    self.info('Resetting unresponsive socket with key "%s"',key)
-                    if hasattr(self.socketServer, 'removeServer'): #removeServer() was added in Qt4.5. (In Qt4.4 a call to listen() removes a previous server)  
+                    self.info(
+                        'Resetting unresponsive socket with key "%s"', key)
+                    # removeServer() was added in Qt4.5. (In Qt4.4 a call to
+                    # listen() removes a previous server)
+                    if hasattr(self.socketServer, 'removeServer'):
                         self.socketServer.removeServer(key)
                     ok = self.socketServer.listen(key)
                 if not ok:
-                    self.warning('Cannot start local socket with key "%s". Reason: %s ', key, self.socketServer.errorString())
+                    self.warning('Cannot start local socket with key "%s". Reason: %s ',
+                                 key, self.socketServer.errorString())
                     return False
-            self.info('Registering as single instance with key "%s"',key)
+            self.info('Registering as single instance with key "%s"', key)
             return True
-    
+
     def onIncommingSocketConnection(self):
         '''
         Slot to be called when another application/instance with the same key
-        checks if this application exists. 
-        
+        checks if this application exists.
+
         .. note:: This is a dummy implementation which
                   just logs the connection and discards the associated socket
                   You may want to reimplement this if you want to act on such
@@ -941,64 +1002,63 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer):
         self.activateWindow()
 
     def setHeartbeat(self, interval):
-        '''sets the interval of the heartbeat LED for the window. 
-        The heartbeat is displayed by a Led in the status bar unless 
+        '''sets the interval of the heartbeat LED for the window.
+        The heartbeat is displayed by a Led in the status bar unless
         it is disabled by setting the interval to 0
-        
+
         :param interval: (int) heart beat interval in millisecs. Set to 0 to disable
         '''
         self.heartbeatLed.setBlinkingInterval(interval)
-        self.heartbeatLed.setVisible(interval>0)
-        
+        self.heartbeatLed.setVisible(interval > 0)
+
     def getHeartbeat(self):
         '''returns the heart beat interval'''
         return self.heartbeatLed.getBlinkingInterval()
-        
+
     def resetHeartbeat(self):
         '''resets the heartbeat interval'''
         self.setHeartbeat(self.__class__._heartbeat)
-            
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Public slots for apply/restore changes
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    @Qt.pyqtSignature("applyPendingChanges()")
+    @Qt.pyqtSlot()
     def applyPendingChanges(self):
         self.applyPendingOperations()
-    
-    @Qt.pyqtSignature("resetPendingChanges()")
+
+    @Qt.pyqtSlot()
     def resetPendingChanges(self):
         self.resetPendingOperations()
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
-    model = Qt.pyqtProperty("QString", TaurusBaseContainer.getModel, 
-                                TaurusBaseContainer.setModel, 
-                                TaurusBaseContainer.resetModel)
-    
-    useParentModel = Qt.pyqtProperty("bool", 
-                                         TaurusBaseContainer.getUseParentModel, 
-                                         TaurusBaseContainer.setUseParentModel,
-                                         TaurusBaseContainer.resetUseParentModel)
-    
-    showQuality = Qt.pyqtProperty("bool", TaurusBaseContainer.getShowQuality, 
-                                      TaurusBaseContainer.setShowQuality, 
-                                      TaurusBaseContainer.resetShowQuality)
-    
-    tangoHost = Qt.pyqtProperty("QString", getTangoHost, 
-                                        setTangoHost, 
-                                        resetTangoHost)
-    
-    helpManualURI = Qt.pyqtProperty("QString", getHelpManualURI, 
-                                        setHelpManualURI, 
-                                        resetHelpManualURI)
-    
-    heartbeat = Qt.pyqtProperty("int", getHeartbeat, 
-                                      setHeartbeat, 
-                                      resetHeartbeat)
+
+    model = Qt.pyqtProperty("QString", TaurusBaseContainer.getModel,
+                            TaurusBaseContainer.setModel,
+                            TaurusBaseContainer.resetModel)
+
+    useParentModel = Qt.pyqtProperty("bool",
+                                     TaurusBaseContainer.getUseParentModel,
+                                     TaurusBaseContainer.setUseParentModel,
+                                     TaurusBaseContainer.resetUseParentModel)
+
+    showQuality = Qt.pyqtProperty("bool", TaurusBaseContainer.getShowQuality,
+                                  TaurusBaseContainer.setShowQuality,
+                                  TaurusBaseContainer.resetShowQuality)
+
+    tangoHost = Qt.pyqtProperty("QString", getTangoHost,
+                                setTangoHost,
+                                resetTangoHost)
+
+    helpManualURI = Qt.pyqtProperty("QString", getHelpManualURI,
+                                    setHelpManualURI,
+                                    resetHelpManualURI)
+
+    heartbeat = Qt.pyqtProperty("int", getHeartbeat,
+                                setHeartbeat,
+                                resetHeartbeat)
 
 #---------
 
@@ -1009,47 +1069,46 @@ if __name__ == "__main__":
     app.setApplicationName('TaurusMainWindow-test')
     app.setOrganizationName('ALBA')
     app.basicConfig()
-        
+
     class MyMainWindow(TaurusMainWindow):
-        _heartbeat = 300 #blinking semi-period in ms. Set to None for not showing the Heart beat LED 
+        _heartbeat = 300  # blinking semi-period in ms. Set to None for not showing the Heart beat LED
         _showFileMenu = True
         _showViewMenu = True
         _showTaurusMenu = False
         _showToolsMenu = True
         _showHelpMenu = True
-        _supportUserPerspectives = True #Allows the user to change/create/delete perspectives
+        # Allows the user to change/create/delete perspectives
+        _supportUserPerspectives = True
         _showLogger = True
-        _splashLogo = ":/TaurusSplash.png" #set to None for disabling splash screen
+        _splashLogo = ":/TaurusSplash.png"  # set to None for disabling splash screen
         _splashMessage = "Initializing Main window..."
+
         def __init__(self):
-            TaurusMainWindow.__init__(self, parent=None, designMode=False, splash=None)
-            #simulating a lengthy initialization
+            TaurusMainWindow.__init__(
+                self, parent=None, designMode=False, splash=None)
+            # simulating a lengthy initialization
             import time
             for i in range(5):
                 time.sleep(0.5)
-                self.splashScreen().showMessage("starting: step %i/5"%(i+1))
-            
-            
-    
-    
+                self.splashScreen().showMessage("starting: step %i/5" % (i + 1))
+
     #MainWindowKlass = TaurusMainWindow
-        
+
     form = MyMainWindow()
-    
-    #ensure only a single instance of this application is running
+
+    # ensure only a single instance of this application is running
     single = form.checkSingleInstance()
     if not single:
         sys.exit(1)
-    
-    #form.setHelpManualURI('http://google.com')
+
+    # form.setHelpManualURI('http://google.com')
 
     form.loadSettings()
-    
-    #form.setCentralWidget(Qt.QMdiArea()) #just for testing
-    
-    #form.addExternalAppLauncher('pwd')
-    
+
+    # form.setCentralWidget(Qt.QMdiArea()) #just for testing
+
+    # form.addExternalAppLauncher('pwd')
+
     form.show()
-    
+
     sys.exit(app.exec_())
-    
diff --git a/lib/taurus/qt/qtgui/container/taurusscrollarea.py b/lib/taurus/qt/qtgui/container/taurusscrollarea.py
index 37b3470..124b5d1 100644
--- a/lib/taurus/qt/qtgui/container/taurusscrollarea.py
+++ b/lib/taurus/qt/qtgui/container/taurusscrollarea.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -40,57 +40,57 @@ class TaurusScrollArea(Qt.QScrollArea, TaurusBaseContainer):
     This type of taurus container classes are specially useful if you define
     a parent taurus model to them and set all contained taurus widgets to use parent
     model. Example::
-    
+
         from taurus.qt.qtgui.container import *
         from taurus.qt.qtgui.display import *
-        
+
         widget = TaurusScrollArea()
-        layout = Qt.QBoxLayout()
+        layout = Qt.QVBoxLayout()
         widget.setLayout(layout)
         widget.model = 'sys/database/2'
-        stateWidget = TaurusValueLabel()
+        stateWidget = TaurusLabel()
         layout.addWidget(stateWidget)
         stateWidget.useParentModel = True
         stateWidget.model = '/state'"""
-        
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-        
+
+    modelChanged = Qt.pyqtSignal('const QString &')
+
     def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QScrollArea, parent)
         self.call__init__(TaurusBaseContainer, name, designMode=designMode)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Pending operations related methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getPendingOperations(self):
         widget = self.widget()
         if isinstance(widget, TaurusBaseComponent):
             return widget.getPendingOperations()
         return []
-    
+
     def resetPendingOperations(self):
         self.debug("Reset changes")
         widget = self.widget()
         if isinstance(widget, TaurusBaseComponent):
             widget.resetPendingOperations()
-    
+
     def hasPendingOperations(self):
         widget = self.widget()
         if isinstance(widget, TaurusBaseComponent):
             return widget.hasPendingOperations()
         return False
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Public slots for apply/restore changes
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    @Qt.pyqtSignature("applyPendingChanges()")
+    @Qt.pyqtSlot()
     def applyPendingChanges(self):
         self.applyPendingOperations()
-    
-    @Qt.pyqtSignature("resetPendingChanges()")
+
+    @Qt.pyqtSlot()
     def resetPendingChanges(self):
         self.resetPendingOperations()
 
@@ -100,33 +100,34 @@ class TaurusScrollArea(Qt.QScrollArea, TaurusBaseContainer):
         if cls is TaurusScrollArea:
             ret['module'] = 'taurus.qt.qtgui.container'
             ret['group'] = 'Taurus Containers'
-            ret['icon'] = ":/designer/scrollarea.png"
+            ret['icon'] = "designer:scrollarea.png"
             ret['container'] = True
         return ret
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
-    model = Qt.pyqtProperty("QString", TaurusBaseContainer.getModel, 
-                                TaurusBaseContainer.setModel, 
-                                TaurusBaseContainer.resetModel)
-    
-    useParentModel = Qt.pyqtProperty("bool", 
-                                         TaurusBaseContainer.getUseParentModel,
-                                         TaurusBaseContainer.setUseParentModel,
-                                         TaurusBaseContainer.resetUseParentModel)
-    
+
+    model = Qt.pyqtProperty("QString", TaurusBaseContainer.getModel,
+                            TaurusBaseContainer.setModel,
+                            TaurusBaseContainer.resetModel)
+
+    useParentModel = Qt.pyqtProperty("bool",
+                                     TaurusBaseContainer.getUseParentModel,
+                                     TaurusBaseContainer.setUseParentModel,
+                                     TaurusBaseContainer.resetUseParentModel)
+
     showQuality = Qt.pyqtProperty("bool", TaurusBaseContainer.getShowQuality,
-                                      TaurusBaseContainer.setShowQuality,
-                                      TaurusBaseContainer.resetShowQuality)
+                                  TaurusBaseContainer.setShowQuality,
+                                  TaurusBaseContainer.resetShowQuality)
+
 
 def demo():
     "Scroll area"
     w = Qt.QWidget()
     w.setWindowTitle(Qt.QApplication.instance().applicationName())
     layout = Qt.QGridLayout()
-    layout.setContentsMargins(0,0,0,0)
+    layout.setContentsMargins(0, 0, 0, 0)
     w.setLayout(layout)
     groupbox = TaurusScrollArea()
     groupbox.model = "sys/tg_test/1"
@@ -149,22 +150,23 @@ def demo():
     w.show()
     return w
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         import taurus.core.util.argparse
         parser = taurus.core.util.argparse.get_taurus_parser()
         parser.usage = "%prog [options] <full_device_name(s)>"
-        app = Application(sys.argv, cmd_line_parser=parser, 
+        app = Application(sys.argv, cmd_line_parser=parser,
                           app_name="Taurus frame demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
-        
+
     args = app.get_command_line_args()
 
     if len(args) == 0:
@@ -181,11 +183,11 @@ def main():
             groupbox.model = model
             layout.addWidget(groupbox)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
         return w
 
 if __name__ == '__main__':
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/container/tauruswidget.py b/lib/taurus/qt/qtgui/container/tauruswidget.py
index 4d182e6..f6edfe1 100644
--- a/lib/taurus/qt/qtgui/container/tauruswidget.py
+++ b/lib/taurus/qt/qtgui/container/tauruswidget.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -38,63 +38,61 @@ class TaurusWidget(Qt.QWidget, TaurusBaseContainer):
     This type of taurus container classes are specially useful if you define
     a parent taurus model to them and set all contained taurus widgets to use parent
     model. Example::
-    
+
         from taurus.qt.qtgui.container import *
         from taurus.qt.qtgui.display import *
-        
+
         widget = TaurusWidget()
-        layout = Qt.QBoxLayout()
+        layout = Qt.QVBoxLayout()
         widget.setLayout(layout)
         widget.model = 'sys/database/2'
-        stateWidget = TaurusValueLabel()
+        stateWidget = TaurusLabel()
         layout.addWidget(stateWidget)
         stateWidget.useParentModel = True
         stateWidget.model = '/state'"""
-    
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-    
-    def __init__(self, parent = None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QWidget, parent)
         self.call__init__(TaurusBaseContainer, name, designMode=designMode)
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         ret = TaurusBaseContainer.getQtDesignerPluginInfo()
         if cls is TaurusWidget:
             ret['module'] = 'taurus.qt.qtgui.container'
             ret['group'] = 'Taurus Containers'
-            ret['icon'] = ":/designer/frame.png"
+            ret['icon'] = "designer:frame.png"
             ret['container'] = True
         return ret
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Public slots for apply/restore changes
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    @Qt.pyqtSignature("applyPendingChanges()")
+    @Qt.pyqtSlot()
     def applyPendingChanges(self):
         self.applyPendingOperations()
-    
-    @Qt.pyqtSignature("resetPendingChanges()")
+
+    @Qt.pyqtSlot()
     def resetPendingChanges(self):
         self.resetPendingOperations()
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
+
     model = Qt.pyqtProperty("QString", TaurusBaseContainer.getModel,
                             TaurusBaseContainer.setModel,
                             TaurusBaseContainer.resetModel)
-    
+
     useParentModel = Qt.pyqtProperty("bool", TaurusBaseContainer.getUseParentModel,
                                      TaurusBaseContainer.setUseParentModel,
                                      TaurusBaseContainer.resetUseParentModel)
-    
+
     showQuality = Qt.pyqtProperty("bool", TaurusBaseContainer.getShowQuality,
                                   TaurusBaseContainer.setShowQuality,
                                   TaurusBaseContainer.resetShowQuality)
-    
+
     modifiableByUser = Qt.pyqtProperty("bool", TaurusBaseContainer.isModifiableByUser,
-                                  TaurusBaseContainer.setModifiableByUser,
-                                  TaurusBaseContainer.resetModifiableByUser)
\ No newline at end of file
+                                       TaurusBaseContainer.setModifiableByUser,
+                                       TaurusBaseContainer.resetModifiableByUser)
diff --git a/lib/taurus/qt/qtgui/dialog/__init__.py b/lib/taurus/qt/qtgui/dialog/__init__.py
index 39f0961..2cd3382 100644
--- a/lib/taurus/qt/qtgui/dialog/__init__.py
+++ b/lib/taurus/qt/qtgui/dialog/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/dialog/taurusconfigurationdialog.py b/lib/taurus/qt/qtgui/dialog/taurusconfigurationdialog.py
index e339e00..1c6904a 100644
--- a/lib/taurus/qt/qtgui/dialog/taurusconfigurationdialog.py
+++ b/lib/taurus/qt/qtgui/dialog/taurusconfigurationdialog.py
@@ -1,25 +1,25 @@
-##!/usr/bin/env python
+# !/usr/bin/env python
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,7 +34,7 @@ from taurus.qt.qtgui.panel.taurusconfigurationpanel import TaurusConfigurationPa
 
 
 class TaurusConfigurationDialog(Qt.QDialog):
-  
+
     def __init__(self, parent=None, designMode=False):
         Qt.QDialog.__init__(self, parent)
         self.setWindowTitle('TaurusConfigurationDialog')
@@ -45,22 +45,23 @@ class TaurusConfigurationDialog(Qt.QDialog):
         layout.setContentsMargins(0, 0, 0, 0)
         layout.addWidget(self._panel)
         self._panel._ui.pushButtonOk.setVisible(True)
-        self._panel._ui.pushButtonCancel.setVisible(True)        
-        self.connect(self._panel._ui.pushButtonOk, Qt.SIGNAL("clicked()"), self._onOk)
-        self.connect(self._panel._ui.pushButtonCancel, Qt.SIGNAL("clicked()"), self._onCancel)
+        self._panel._ui.pushButtonCancel.setVisible(True)
+        self._panel._ui.pushButtonOk.clicked.connect(self._onOk)
+        self._panel._ui.pushButtonCancel.clicked.connect(self._onCancel)
         self.adjustSize()
         self.show()
 
     def _onOk(self):
         self._panel._onOk()
         self._onCancel()
-          
+
     def _onCancel(self):
-        self.close()      
-            
+        self.close()
+
     def setModel(self, model):
-        self._panel.setModel(model)  
-             
+        self._panel.setModel(model)
+
+
 def main():
     import sys
     attr_name = sys.argv[1]
@@ -71,4 +72,4 @@ def main():
 
 if __name__ == "__main__":
     import sys
-    sys.exit(main())
\ No newline at end of file
+    sys.exit(main())
diff --git a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
index 001a486..f965aa9 100644
--- a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
+++ b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -31,15 +31,16 @@ __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 
+
 def get_input(input_data, parent=None, input_panel_klass=None):
     """Static convenience function to get an input from the user using a
     dialog. The dialog will be modal.
-    
+
     The input_data is a dictionary which contains information on how to build
     the input dialog. It **must** contains the following keys:
-    
+
         - *prompt* <str>: message to be displayed
-        
+
     The following are optional keys (and their corresponding default values):
 
         - *title* <str> (doesn't have default value)
@@ -48,7 +49,7 @@ def get_input(input_data, parent=None, input_panel_klass=None):
         - *unit* <str> (doesn't have default value):
           a label to be presented right to the input box representing the units
         - *data_type* <str or sequence> ('String'):
-          type of data to be requested. Standard 
+          type of data to be requested. Standard
           accepted data types are 'String', 'Integer', 'Float', 'Boolean',
           'Text'. A list of elements will be interpreted as a selection.
           Default TaurusInputPanel class will interpret any custom data types as
@@ -57,14 +58,14 @@ def get_input(input_data, parent=None, input_panel_klass=None):
           input_panel_klass.
         - *minimum* <int/float> (-sys.maxint):
           minimum value (makes sence when data_type is 'Integer' or 'Float')
-        - *maximum* <int/float> (sys.maxint): 
+        - *maximum* <int/float> (sys.maxint):
           maximum value (makes sence when data_type is 'Integer' or 'Float')
-        - *step* <int/float> (1): 
+        - *step* <int/float> (1):
           step size value (makes sence when data_type is 'Integer' or 'Float')
-        - *decimals* <int> (1): 
+        - *decimals* <int> (1):
           number of decimal places to show (makes sence when data_type is
           'Float')
-        - *default_value* <obj> (doesn't have default value): 
+        - *default_value* <obj> (doesn't have default value):
           default value
         - *allow_multiple* <bool> (False):
           allow more than one value to be selected (makes sence when data_type
@@ -76,23 +77,23 @@ def get_input(input_data, parent=None, input_panel_klass=None):
     :type parent: PyQt4.QtGui.QWidget
     :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
              user accepted the dialog (pressed Ok) or false otherwise
     :rtype: tuple< obj, bool >
 
     Examples::
-        
+
         d1 = dict(prompt="What's your name?", data_type="String")
         d2 = dict(prompt="What's your age?", data_type="Integer",
                   default_value=4, maximum=100, key="Age", unit="years")
-        d3 = dict(prompt="What's your favourite number?", data_type="Float", 
+        d3 = dict(prompt="What's your favourite number?", data_type="Float",
                   default_value=0.1, maximum=88.8, key="Number")
         d4 = dict(prompt="What's your favourite car brand?",
-                  data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"], 
+                  data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"],
                   default_value="Mercedes")
         d5 = dict(prompt="Select some car brands", allow_multiple=True,
-                  data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"], 
+                  data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"],
                   default_value=["Mercedes", "Citroen"])
         d6 = dict(prompt="What's your favourite color?", key="Color",
                   data_type=["blue", "red", "green"], default_value="red")
@@ -102,9 +103,9 @@ def get_input(input_data, parent=None, input_panel_klass=None):
                   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'])
-           
+
     """
-            
+
     if input_panel_klass is None:
         from taurus.qt.qtgui.panel import TaurusInputPanel
         input_panel_klass = TaurusInputPanel
@@ -112,13 +113,13 @@ def get_input(input_data, parent=None, input_panel_klass=None):
                                input_panel_klass=input_panel_klass)
     dialog.exec_()
     return dialog.value(), dialog.result()
-    
+
 
 class TaurusInputDialog(Qt.QDialog):
     """The TaurusInputDialog class provides a simple convenience dialog to get
     a single value from the user.
     """
-    
+
     def __init__(self, input_data=None, parent=None,
                  input_panel_klass=None, designMode=False):
         if input_panel_klass is None:
@@ -134,30 +135,31 @@ class TaurusInputDialog(Qt.QDialog):
         self._panel = panel = input_panel_klass(input_data, self)
         layout.setContentsMargins(0, 0, 0, 0)
         layout.addWidget(self._panel)
-        self.connect(panel.buttonBox(), Qt.SIGNAL("accepted()"), self.accept)
-        self.connect(panel.buttonBox(), Qt.SIGNAL("rejected()"), self.reject)
+        panel.buttonBox().accepted.connect(self.accept)
+        panel.buttonBox().rejected.connect(self.reject)
         self._panel.setInputFocus()
 
     def panel(self):
         """Returns the :class:`taurus.qt.qtgui.panel.TaurusInputPanel`.
-        
+
         :return: the internal panel
         :rtype: taurus.qt.qtgui.panel.TaurusInputPanel"""
         return self._panel
 
     def value(self):
         """Returns the value selected by the user.
-        
+
         :return: the value selected by the user"""
         return self.panel().value()
-        
+
 
 def demo():
     """Input Dialog"""
-   
+
     input_data = dict(prompt="What's your favourite car brand?",
-        data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"], 
-        default_value="Mercedes")
+                      data_type=["Mazda", "Skoda", "Citroen",
+                                 "Mercedes", "Audi", "Ferrari"],
+                      default_value="Mercedes")
     w = TaurusInputDialog(input_data=input_data)
     w.show()
     return w
@@ -167,10 +169,10 @@ def main():
     import taurus.qt.qtgui.application
 
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         app = Qt.QApplication([])
         app.setApplicationName("Taurus input dialog demo")
@@ -179,13 +181,15 @@ def main():
     d1 = dict(prompt="What's your name?", data_type="String")
     d2 = dict(prompt="What's your age?", data_type="Integer",
               default_value=4, maximum=100, key="Age", unit="years")
-    d3 = dict(prompt="What's your favourite number?", data_type="Float", 
+    d3 = dict(prompt="What's your favourite number?", data_type="Float",
               default_value=0.1, maximum=88.8, key="Number")
     d4 = dict(prompt="What's your favourite car brand?",
-              data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"], 
+              data_type=["Mazda", "Skoda", "Citroen",
+                         "Mercedes", "Audi", "Ferrari"],
               default_value="Mercedes")
     d5 = dict(prompt="Select some car brands", allow_multiple=True,
-              data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"], 
+              data_type=["Mazda", "Skoda", "Citroen",
+                         "Mercedes", "Audi", "Ferrari"],
               default_value=["Mercedes", "Citroen"])
     d6 = dict(prompt="What's your favourite color?", key="Color",
               data_type=["blue", "red", "green"], default_value="red")
@@ -195,8 +199,7 @@ def main():
               data_type='Text', key="Memo", default_value="By default a memo is\na long thing")
 
     for d in [d1, d2, d3, d4, d5, d6, d7, d8]:
-        print get_input(input_data=d, title=d['prompt'])    
-        
+        print get_input(input_data=d, title=d['prompt'])
+
 if __name__ == "__main__":
     main()
-    
diff --git a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
index 08f3e3d..f0a227e 100644
--- a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
+++ b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -42,7 +42,7 @@ from taurus.core.util.wrap import wraps
 class TaurusMessageBox(Qt.QDialog):
     """A panel intended to display a taurus error.
     Example::
-    
+
         dev = taurus.Device("sys/tg_test/1")
         try:
             print dev.read_attribute("throw_exception")
@@ -53,18 +53,18 @@ class TaurusMessageBox(Qt.QDialog):
     You can show the error outside the exception handling code. If you do this,
     you should keep a record of the exception information as given by
     :func:`sys.exc_info`::
-    
+
         dev = taurus.Device("sys/tg_test/1")
         exc_info = None
         try:
             print dev.read_attribute("throw_exception")
         except PyTango.DevFailed, df:
             exc_info = sys.exc_info()
-        
+
         if exc_info:
             msgbox = TaurusMessageBox(*exc_info)
             msgbox.show()"""
-    
+
     def __init__(self, err_type=None, err_value=None, err_traceback=None,
                  parent=None, designMode=False):
         Qt.QDialog.__init__(self, parent)
@@ -76,62 +76,60 @@ class TaurusMessageBox(Qt.QDialog):
                                self, designMode)
         layout.setContentsMargins(0, 0, 0, 0)
         layout.addWidget(self._panel)
-        self.connect(self.panel().buttonBox(), Qt.SIGNAL("accepted()"),
-                     self.accept)
-        self.connect(self._panel, Qt.SIGNAL("toggledDetails(bool)"),
-                     self._onShowDetails)
-    
+        self.panel().buttonBox().accepted.connect(self.accept)
+        self._panel.toggledDetails.connect(self._onShowDetails)
+
     def _onShowDetails(self, show):
         self.adjustSize()
-    
+
     def panel(self):
         """Returns the :class:`taurus.qt.qtgui.panel.TaurusMessagePanel`.
-        
+
         :return: the internal panel
         :rtype: taurus.qt.qtgui.panel.TaurusMessagePanel"""
         return self._panel
-    
+
     def addButton(self, button, role=Qt.QDialogButtonBox.ActionRole):
         """Adds the given button with the given to the button box
-        
+
         :param button: the button to be added
         :type button: PyQt4.QtGui.QPushButton
         :param role: button role
         :type role: PyQt4.Qt.QDialogButtonBox.ButtonRole"""
         self.panel().addButton(button, role)
-    
+
     def setIconPixmap(self, pixmap):
         """Sets the icon to the dialog
-        
+
         :param pixmap: the icon pixmap
         :type pixmap: PyQt4.Qt.QPixmap"""
         self._panel.setIconPixmap(pixmap)
-    
+
     def setText(self, text):
         """Sets the text of the dialog
-        
+
         :param text: the new text
         :type text: str"""
         self._panel.setText(text)
-    
+
     def getText(self):
         """Returns the current text of this panel
-        
+
         :return: the text for this panel
         :rtype: str"""
         return self._panel.getText()
-    
+
     def setDetailedText(self, text):
         """Sets the detailed text of the dialog
-        
+
         :param text: the new text
         :type text: str"""
         self._panel.setDetailedText(text)
-    
+
     def setError(self, err_type=None, err_value=None, err_traceback=None):
         """Sets the exception object.
         Example usage::
-        
+
             dev = taurus.Device("sys/tg_test/1")
             exc_info = None
             msgbox = TaurusMessageBox()
@@ -139,11 +137,11 @@ class TaurusMessageBox(Qt.QDialog):
                 print dev.read_attribute("throw_exception")
             except PyTango.DevFailed, df:
                 exc_info = sys.exc_info()
-            
+
             if exc_info:
                 msgbox.setError(*exc_info)
                 msgbox.show()
-        
+
         :param err_type: the exception type of the exception being handled
                          (a class object)
         :type error: class object
@@ -152,19 +150,20 @@ class TaurusMessageBox(Qt.QDialog):
         :param err_traceback: a traceback object which encapsulates the call
                               stack at the point where the exception originally
                               occurred
-        :type err_traceback: traceback"""
+        :type err_traceback: TracebackType"""
         self._panel.setError(err_type, err_value, err_traceback)
 
 
 _PROTECT_MESSAGE_BOX = None
 
+
 def _ProtectMessageBox(err_type=None, err_value=None, err_traceback=None,
                        parent=None):
     global _PROTECT_MESSAGE_BOX
     box = _PROTECT_MESSAGE_BOX
     if box is None:
         _PROTECT_MESSAGE_BOX = box = TaurusMessageBox(err_type=err_type,
-            err_value=err_value, err_traceback=err_traceback, parent=parent)
+                                                      err_value=err_value, err_traceback=err_traceback, parent=parent)
         box.panel().setCheckBoxVisible(True)
     else:
         box.setError(err_type=err_type, err_value=err_value,
@@ -179,41 +178,43 @@ def protectTaurusMessageBox(fn):
     you which to protect against exceptions. The handle of the exception is to
     display a :class:`TaurusMessageBox` with the exception information.
     Example::
-    
+
         @protectTaurusMessgeBox
         def turnBeamOn(device_name):
             d = taurus.Device(device_name)
             d.TurnOn()
     """
-       
+
     @wraps(fn)
     def wrapped(*args, **kwargs):
         try:
             return fn(*args, **kwargs)
         except:
             msgbox = _ProtectMessageBox(*sys.exc_info())
-            if msgbox is None: return
+            if msgbox is None:
+                return
             msgbox.exec_()
     return wrapped
 
+
 class ProtectTaurusMessageBox(object):
-    """The idea of this class is to be used as a decorator on any method 
+    """The idea of this class is to be used as a decorator on any method
     you which to protect against exceptions. The handle of the exception is to
     display a :class:`TaurusMessageBox` with the exception information. The
     optional parameter title gives the window bar a customized title. The
     optional parameter msg allows you to give a customized message in the
     dialog. Example::
-    
+
         @ProtectTaurusMessgeBox(title="Error trying to turn the beam on")
         def turnBeamOn(device_name):
             d = taurus.Device(device_name)
             d.TurnOn()
     """
-    
+
     def __init__(self, title=None, msg=None):
         self._title = title
         self._msg = msg
-    
+
     def __call__(self, fn):
         @wraps(fn)
         def wrapped(*args, **kwargs):
@@ -221,28 +222,29 @@ class ProtectTaurusMessageBox(object):
                 return fn(*args, **kwargs)
             except:
                 msgbox = _ProtectMessageBox(*sys.exc_info())
-                if msgbox is None: return
+                if msgbox is None:
+                    return
                 if self._title is not None:
                     msgbox.setWindowTitle(self._title)
                 if self._msg is not None:
                     msgbox.setText(self._msg)
                 msgbox.exec_()
         return wrapped
-    
+
 
 class TaurusExceptHookMessageBox(BaseExceptHook):
     """A callable class that acts as an excepthook that displays an unhandled
     exception in a :class:`~taurus.qt.qtgui.dialog.TaurusMessageBox`.
-    
+
     :param hook_to: callable excepthook that will be called at the end of
                     this hook handling [default: None]
     :type hook_to: callable
     :param title: message box title [default: None meaning use exception value]
     :type name: str
     :param msg: message box text [default: None meaning use exception]"""
-    
+
     MSG_BOX = None
-    
+
     def __init__(self, hook_to=None, title=None, msg=None):
         BaseExceptHook.__init__(self, hook_to=hook_to)
         self._title = title
@@ -251,10 +253,10 @@ class TaurusExceptHookMessageBox(BaseExceptHook):
     def _getMessageBox(self, err_type=None, err_value=None, err_traceback=None,
                        parent=None):
         box = self.__class__.MSG_BOX
-        
+
         if box is None:
             self.__class__.MSG_BOX = box = TaurusMessageBox(err_type=err_type,
-                err_value=err_value, err_traceback=err_traceback, parent=parent)
+                                                            err_value=err_value, err_traceback=err_traceback, parent=parent)
             box.panel().setCheckBoxVisible(True)
         else:
             box.setError(err_type=err_type, err_value=err_value,
@@ -278,18 +280,23 @@ class TaurusExceptHookMessageBox(BaseExceptHook):
             msgbox.setText(self._msg)
         msgbox.exec_()
 
+
 class DemoException(Exception):
     pass
 
+
 def s1():
     return s2()
 
+
 def s2():
     return s3()
 
+
 def s3():
     raise DemoException("A demo exception occurred")
 
+
 def py_exc():
     try:
         s1()
@@ -297,6 +304,7 @@ def py_exc():
         msgbox = TaurusMessageBox(*sys.exc_info())
         msgbox.exec_()
 
+
 def tg_exc():
     import PyTango
     try:
@@ -306,6 +314,7 @@ def tg_exc():
         msgbox = TaurusMessageBox(*sys.exc_info())
         msgbox.exec_()
 
+
 def tg_serv_exc():
     import PyTango
     import taurus
@@ -319,6 +328,7 @@ def tg_serv_exc():
         msgbox = TaurusMessageBox(*sys.exc_info())
         msgbox.exec_()
 
+
 def py_tg_serv_exc():
     import PyTango
     try:
@@ -326,7 +336,8 @@ def py_tg_serv_exc():
                                        'A simple tango exception', 'right here')
     except PyTango.DevFailed, df1:
         try:
-            import traceback, StringIO
+            import traceback
+            import StringIO
             origin = StringIO.StringIO()
             traceback.print_stack(file=origin)
             origin.seek(0)
@@ -338,46 +349,48 @@ def py_tg_serv_exc():
             msgbox = TaurusMessageBox(*sys.exc_info())
             msgbox.exec_()
 
+
 def demo():
     """Message dialog"""
     panel = Qt.QWidget()
     layout = Qt.QVBoxLayout()
     panel.setLayout(layout)
-    
+
     m1 = Qt.QPushButton("Python exception")
     layout.addWidget(m1)
-    Qt.QObject.connect(m1, Qt.SIGNAL("clicked()"), py_exc)
+    m1.clicked.connect(py_exc)
     m2 = Qt.QPushButton("Tango exception")
     layout.addWidget(m2)
-    Qt.QObject.connect(m2, Qt.SIGNAL("clicked()"), tg_exc)
+    m2.clicked.connect(tg_exc)
     layout.addWidget(m2)
     m3 = Qt.QPushButton("Tango server exception")
     layout.addWidget(m3)
-    Qt.QObject.connect(m3, Qt.SIGNAL("clicked()"), tg_serv_exc)
+    m3.clicked.connect(tg_serv_exc)
     layout.addWidget(m3)
     m4 = Qt.QPushButton("Python tango server exception")
     layout.addWidget(m4)
-    Qt.QObject.connect(m4, Qt.SIGNAL("clicked()"), py_tg_serv_exc)
+    m4.clicked.connect(py_tg_serv_exc)
     layout.addWidget(m4)
 
     panel.show()
     return panel
-    
+
+
 def main():
     import taurus.qt.qtgui.application
 
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         app = Qt.QApplication([])
         app.setApplicationName("Taurus message demo")
         app.setApplicationVersion("1.0")
 
     w = demo()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
@@ -385,4 +398,3 @@ def main():
 
 if __name__ == "__main__":
     main()
-    
diff --git a/lib/taurus/qt/qtgui/display/__init__.py b/lib/taurus/qt/qtgui/display/__init__.py
index b796efd..edf636d 100644
--- a/lib/taurus/qt/qtgui/display/__init__.py
+++ b/lib/taurus/qt/qtgui/display/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,10 +35,5 @@ from .qled import *
 from .qlogo import *
 from .qsevensegment import *
 from .tauruslabel import *
-from .taurusvaluelabel import * # deprecated
-from .taurusconfiglabel import * # deprecated
 from .taurusled import *
-from .taurusboolled import * # deprecated
-from .taurusstateled import * # deprecated
 from .tauruslcd import *
-from .tauruslcdvalue import * # deprecated
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/display/demo/__init__.py b/lib/taurus/qt/qtgui/display/demo/__init__.py
index c0f5fce..bf29532 100644
--- a/lib/taurus/qt/qtgui/display/demo/__init__.py
+++ b/lib/taurus/qt/qtgui/display/demo/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py b/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py
index 463c3cf..1ec7c3b 100644
--- a/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py
+++ b/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -37,9 +37,7 @@ def demo():
     import sys
     import taurus.qt.qtgui.application
     import taurus.qt.qtgui.display
-    import taurus.qt.qtgui.resource
-
-    getPixmap = taurus.qt.qtgui.resource.getPixmap
+    from taurus.qt.qtgui.icon import getCachedPixmap
     Application = taurus.qt.qtgui.application.TaurusApplication
     QPixmapWidget = taurus.qt.qtgui.display.QPixmapWidget
 
@@ -87,7 +85,8 @@ def demo():
             panel_l.addWidget(display_panel, 1)
             panel_l.addWidget(control_panel, 0)
 
-            aspect_ratio_widget.addItems(["Ignore", "Keep", "Keep by expanding"])
+            aspect_ratio_widget.addItems(
+                ["Ignore", "Keep", "Keep by expanding"])
             transformation_widget.addItems(["Fast", "Smooth"])
             halign_widget.addItem("Left", Qt.QVariant(Qt.Qt.AlignLeft))
             halign_widget.addItem("Center", Qt.QVariant(Qt.Qt.AlignHCenter))
@@ -96,11 +95,11 @@ def demo():
             valign_widget.addItem("Center", Qt.QVariant(Qt.Qt.AlignVCenter))
             valign_widget.addItem("Bottom", Qt.QVariant(Qt.Qt.AlignBottom))
 
-            Qt.QObject.connect(pixmap_widget, Qt.SIGNAL("textChanged(const QString &)"), self.changePixmap)
-            Qt.QObject.connect(aspect_ratio_widget, Qt.SIGNAL("currentIndexChanged(int)"), self.changeAspectRatio)
-            Qt.QObject.connect(transformation_widget, Qt.SIGNAL("currentIndexChanged(int)"), self.changeTransformationMode)
-            Qt.QObject.connect(halign_widget, Qt.SIGNAL("currentIndexChanged(int)"), self.changeAlignment)
-            Qt.QObject.connect(valign_widget, Qt.SIGNAL("currentIndexChanged(int)"), self.changeAlignment)
+            pixmap_widget.textChanged.connect(self.changePixmap)
+            aspect_ratio_widget.currentIndexChanged.connect(self.changeAspectRatio)
+            transformation_widget.currentIndexChanged.connect(self.changeTransformationMode)
+            halign_widget.currentIndexChanged.connect(self.changeAlignment)
+            valign_widget.currentIndexChanged.connect(self.changeAlignment)
 
             self.w = w
             self.w_pixmap = pixmap_widget
@@ -109,14 +108,15 @@ def demo():
             self.w_halign = halign_widget
             self.w_valign = valign_widget
 
-            pixmap_widget.setText(":leds/images256/led_red_on.png")
+            name = "leds_images256:led_red_on.png"
+            pixmap_widget.setText(name)
             aspect_ratio_widget.setCurrentIndex(1)
             transformation_widget.setCurrentIndex(1)
             halign_widget.setCurrentIndex(0)
             valign_widget.setCurrentIndex(1)
 
         def changePixmap(self, name):
-            self.w.pixmap = getPixmap(name)
+            self.w.pixmap = getCachedPixmap(name)
 
         def changeAspectRatio(self, i):
             v = Qt.Qt.IgnoreAspectRatio
@@ -140,7 +140,7 @@ def demo():
             self.w.alignment = halign | valign
 
     panel = Qt.QWidget()
-    layout=Qt.QGridLayout()
+    layout = Qt.QGridLayout()
     panel.setLayout(layout)
     layout.setContentsMargins(M, M, M, M)
     layout.setSpacing(M)
@@ -152,6 +152,7 @@ def demo():
     else:
         return panel
 
+
 def main():
     return demo()
 
diff --git a/lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py b/lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py
index 02b67c9..a9ce1d7 100644
--- a/lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py
+++ b/lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -32,6 +32,7 @@ __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 
+
 def demo():
     import sys
     import taurus.qt.qtgui.application
@@ -39,17 +40,17 @@ def demo():
 
     Application = taurus.qt.qtgui.application.TaurusApplication
     TaurusLabel = taurus.qt.qtgui.display.TaurusLabel
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         app = Application()
 
     M = 2
 
     class TaurusLabelTestPanel(Qt.QWidget):
-        
+
         def __init__(self, parent=None):
             Qt.QWidget.__init__(self, parent)
             panel_l = Qt.QVBoxLayout()
@@ -63,7 +64,7 @@ def demo():
             display_l.setContentsMargins(M, M, M, M)
             display_l.setSpacing(M)
             display_panel.setLayout(display_l)
-            #display_l.addStretch(1)
+            # display_l.addStretch(1)
             display_l.addWidget(w)
 
             control_panel = Qt.QGroupBox("Control Panel")
@@ -87,20 +88,23 @@ def demo():
             panel_l.addWidget(display_panel)
             panel_l.addWidget(control_panel)
 
-            fg_widget.addItems(["value", "w_value", "state", "quality", "none"])
+            fg_widget.addItems(["", "rvalue", "rvalue.magnitude",
+                                "rvalue.units", "wvalue", "wvalue.magnitude",
+                                "wvalue.units", "state", "quality", "none"])
             bg_widget.addItems(["quality", "state", "none"])
-            
-            Qt.QObject.connect(model_widget, Qt.SIGNAL("textChanged(const QString &)"), w.setModel)
-            Qt.QObject.connect(fg_widget, Qt.SIGNAL("currentIndexChanged(const QString &)"), w.setFgRole)
-            Qt.QObject.connect(bg_widget, Qt.SIGNAL("currentIndexChanged(const QString &)"), w.setBgRole)
-            Qt.QObject.connect(prefix_widget, Qt.SIGNAL("textChanged(const QString &)"), w.setPrefixText)
-            Qt.QObject.connect(suffix_widget, Qt.SIGNAL("textChanged(const QString &)"), w.setSuffixText)
-            Qt.QObject.connect(model_index_widget, Qt.SIGNAL("textChanged(const QString &)"), w.setModelIndex)
-            
+
+            model_widget.textChanged.connect(w.setModel)
+            fg_widget.currentIndexChanged[str].connect(w.setFgRole)
+            bg_widget.currentIndexChanged[str].connect(w.setBgRole)
+            prefix_widget.textChanged.connect(w.setPrefixText)
+            suffix_widget.textChanged.connect(w.setSuffixText)
+            model_index_widget.textChanged.connect(w.setModelIndex)
+
             model_widget.setText("sys/tg_test/1/double_scalar")
             fg_widget.setCurrentIndex(0)
+            fg_widget.setEditable(True)
             bg_widget.setCurrentIndex(0)
-            
+
             self.w_label = w
             self.w_model = model_widget
             self.w_model_index = model_index_widget
@@ -108,30 +112,31 @@ def demo():
             self.w_bg = bg_widget
             self.w_prefix = prefix_widget
             self.w_suffix = suffix_widget
-    
+
     panel = Qt.QWidget()
     panel.setWindowTitle(app.applicationName())
-    layout=Qt.QGridLayout()
+    layout = Qt.QGridLayout()
     panel.setLayout(layout)
     layout.setContentsMargins(M, M, M, M)
     layout.setSpacing(M)
     p1 = TaurusLabelTestPanel()
     p1.w_model.setText("sys/tg_test/1/double_scalar")
     p2 = TaurusLabelTestPanel()
-    p2.w_model.setText("sys/tg_test/1/double_scalar?configuration=label")
+    p2.w_model.setText("sys/tg_test/1/double_scalar#label")
     p2.w_bg.setCurrentIndex(2)
     layout.addWidget(p1, 0, 0)
     layout.addWidget(p2, 0, 1)
-    layout.addItem(Qt.QSpacerItem(10,10), 1, 0, 1, 2)
+    layout.addItem(Qt.QSpacerItem(10, 10), 1, 0, 1, 2)
     layout.setRowStretch(1, 1)
     panel.show()
     if owns_app:
         sys.exit(app.exec_())
     else:
         return panel
-    
+
+
 def main():
     return demo()
 
 if __name__ == "__main__":
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py b/lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py
index fe23097..e55ea38 100644
--- a/lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py
+++ b/lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -32,6 +32,7 @@ __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 
+
 def demo():
     import sys
     import taurus.qt.qtgui.application
@@ -39,17 +40,17 @@ def demo():
 
     Application = taurus.qt.qtgui.application.TaurusApplication
     TaurusLCD = taurus.qt.qtgui.display.TaurusLCD
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         app = Application()
 
     M = 2
 
     class TaurusLCDTestPanel(Qt.QWidget):
-        
+
         def __init__(self, parent=None):
             Qt.QWidget.__init__(self, parent)
             panel_l = Qt.QVBoxLayout()
@@ -84,31 +85,31 @@ def demo():
 
             fg_widget.addItems(["value", "w_value", "none"])
             bg_widget.addItems(["quality", "state", "none"])
-            
-            Qt.QObject.connect(model_widget, Qt.SIGNAL("textChanged(const QString &)"), w.setModel)
-            Qt.QObject.connect(model_index_widget, Qt.SIGNAL("textChanged(const QString &)"), w.setModelIndex)
-            Qt.QObject.connect(fg_widget, Qt.SIGNAL("currentIndexChanged(const QString &)"), w.setFgRole)
-            Qt.QObject.connect(bg_widget, Qt.SIGNAL("currentIndexChanged(const QString &)"), w.setBgRole)
-            
+
+            model_widget.textChanged.connect(w.setModel)
+            model_index_widget.textChanged.connect(w.setModelIndex)
+            fg_widget.currentIndexChanged[str].connect(w.setFgRole)
+            bg_widget.currentIndexChanged[str].connect(w.setBgRole)
+
             model_widget.setText("sys/tg_test/1/double_scalar")
             fg_widget.setCurrentIndex(0)
             bg_widget.setCurrentIndex(0)
-            
+
             self.w_label = w
             self.w_model = model_widget
             self.w_model_index = model_index_widget
             self.w_fg = fg_widget
             self.w_bg = bg_widget
-    
+
     panel = Qt.QWidget()
-    layout=Qt.QGridLayout()
+    layout = Qt.QGridLayout()
     panel.setLayout(layout)
     layout.setContentsMargins(M, M, M, M)
     layout.setSpacing(M)
     p1 = TaurusLCDTestPanel()
     p1.w_model.setText("sys/tg_test/1/double_scalar")
     p2 = TaurusLCDTestPanel()
-    p2.w_model.setText("sys/tg_test/1/double_scalar?configuration=min_value")
+    p2.w_model.setText("sys/tg_test/1/double_scalar#min_value")
     p2.w_bg.setCurrentIndex(2)
     layout.addWidget(p1, 0, 0)
     layout.addWidget(p2, 0, 1)
@@ -120,9 +121,10 @@ def demo():
         sys.exit(app.exec_())
     else:
         return panel
-    
+
+
 def main():
     return demo()
 
 if __name__ == "__main__":
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/display/demo/taurusleddemo.py b/lib/taurus/qt/qtgui/display/demo/taurusleddemo.py
index 6af4e66..0df9382 100644
--- a/lib/taurus/qt/qtgui/display/demo/taurusleddemo.py
+++ b/lib/taurus/qt/qtgui/display/demo/taurusleddemo.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -32,6 +32,7 @@ __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 
+
 def demo():
     import sys
     import taurus.qt.qtgui.application
@@ -39,17 +40,17 @@ def demo():
 
     Application = taurus.qt.qtgui.application.TaurusApplication
     TaurusLed = taurus.qt.qtgui.display.TaurusLed
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         app = Application()
 
     M = 2
 
     class TaurusLedTestPanel(Qt.QWidget):
-        
+
         def __init__(self, parent=None):
             Qt.QWidget.__init__(self, parent)
             panel_l = Qt.QVBoxLayout()
@@ -84,34 +85,35 @@ def demo():
             control_l.addRow("OFF color:", off_color_widget)
             panel_l.addWidget(display_panel, 1)
             panel_l.addWidget(control_panel, 0)
-            
-            fg_widget.addItems(["value", "w_value", "quality"])
-            colors = ["green", "blue", "orange", "red", "yellow", "magenta", "grenoble", "black"]
+
+            fg_widget.addItems(["rvalue", "wvalue", "quality"])
+            colors = ["green", "blue", "orange", "red",
+                      "yellow", "magenta", "grenoble", "black"]
             on_color_widget.addItems(colors)
             off_color_widget.addItems(colors)
-            
-            Qt.QObject.connect(inverted_widget, Qt.SIGNAL("toggled(bool)"), w.setLedInverted)
-            Qt.QObject.connect(model_widget, Qt.SIGNAL("textChanged(const QString &)"), w.setModel)
-            Qt.QObject.connect(fg_widget, Qt.SIGNAL("currentIndexChanged(const QString &)"), w.setFgRole)
-            Qt.QObject.connect(model_index_widget, Qt.SIGNAL("textChanged(const QString &)"), w.setModelIndex)
-            Qt.QObject.connect(on_color_widget, Qt.SIGNAL("currentIndexChanged(const QString &)"), w.setOnColor)
-            Qt.QObject.connect(off_color_widget, Qt.SIGNAL("currentIndexChanged(const QString &)"), w.setOffColor)
-            
+
+            inverted_widget.toggled.connect(w.setLedInverted)
+            model_widget.textChanged.connect(w.setModel)
+            fg_widget.currentIndexChanged[str].connect(w.setFgRole)
+            model_index_widget.textChanged.connect(w.setModelIndex)
+            on_color_widget.currentIndexChanged[str].connect(w.setOnColor)
+            off_color_widget.currentIndexChanged[str].connect(w.setOffColor)
+
             inverted_widget.setChecked(False)
             model_widget.setText("sys/tg_test/1/state")
             fg_widget.setCurrentIndex(0)
             on_color_widget.setCurrentIndex(0)
             off_color_widget.setCurrentIndex(7)
-            
+
             self.w_led = w
             self.w_model = model_widget
             self.w_fg = fg_widget
             self.w_model_index = model_index_widget
             self.w_on_color = on_color_widget
             self.w_off_color = off_color_widget
-            
+
     panel = Qt.QWidget()
-    layout=Qt.QGridLayout()
+    layout = Qt.QGridLayout()
     panel.setLayout(layout)
     layout.setContentsMargins(M, M, M, M)
     layout.setSpacing(M)
@@ -131,9 +133,10 @@ def demo():
         sys.exit(app.exec_())
     else:
         return panel
-    
+
+
 def main():
     return demo()
 
 if __name__ == "__main__":
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/display/qfallback.py b/lib/taurus/qt/qtgui/display/qfallback.py
index 103eea9..ec8e8aa 100644
--- a/lib/taurus/qt/qtgui/display/qfallback.py
+++ b/lib/taurus/qt/qtgui/display/qfallback.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -36,18 +36,21 @@ import functools
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseWidget
 
+
 def create_fallback(widget_klass_name):
     return functools.partial(QFallBackWidget, replaces=widget_klass_name,
                              exc_info=sys.exc_info())
 
+
 def create_taurus_fallback(widget_klass_name):
     return functools.partial(TaurusFallBackWidget, replaces=widget_klass_name,
                              exc_info=sys.exc_info())
-                          
+
+
 class QFallBackWidget(Qt.QWidget):
     """A FallBack widget to be used when a real widget cannot be loaded for any
     reason (example: a dependency library is not installed)"""
-    
+
     def __init__(self, replaces=None, parent=None, *args, **kwargs):
         Qt.QWidget.__init__(self, parent)
         if replaces is None:
@@ -64,10 +67,9 @@ class QFallBackWidget(Qt.QWidget):
         if exc_info is not None and exc_info[0] is not None:
             self.details_button = Qt.QPushButton("Details...", self)
             layout.addWidget(self.details_button, 0, Qt.Qt.AlignTop)
-            Qt.QObject.connect(self.details_button, Qt.SIGNAL("clicked()"),
-                               self.onShowDetails)
+            self.details_button.clicked.connect(self.onShowDetails)
         layout.addStretch(1)
-        
+
     def onShowDetails(self):
         import taurus.qt.qtgui.dialog
         msgbox = taurus.qt.qtgui.dialog.TaurusMessageBox(*self.exc_info,
@@ -78,11 +80,9 @@ class QFallBackWidget(Qt.QWidget):
 
 
 class TaurusFallBackWidget(QFallBackWidget, TaurusBaseWidget):
-    
+
     def __init__(self, replaces=None, parent=None, *args, **kwargs):
         self.call__init__(QFallBackWidget, replaces=replaces,
                           parent=parent, *args, **kwargs)
         designMode = kwargs.get("designMode", False)
         self.call__init__(TaurusBaseWidget, replaces, designMode=designMode)
-
-
diff --git a/lib/taurus/qt/qtgui/display/qled.py b/lib/taurus/qt/qtgui/display/qled.py
index 1066147..1822dee 100644
--- a/lib/taurus/qt/qtgui/display/qled.py
+++ b/lib/taurus/qt/qtgui/display/qled.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -33,24 +33,24 @@ import sys
 
 from taurus.external.qt import Qt
 from taurus.core.util.enumeration import Enumeration
-from taurus.qt.qtgui.resource import getPixmap
+from taurus.qt.qtgui.icon import getCachedPixmap
 from taurus.qt.qtgui.display.qpixmapwidget import QPixmapWidget
 
-LedColor  = Enumeration("LedColor",  ["BLUE", "GREEN", "RED", "YELLOW", "ORANGE", "MAGENTA", "GRENOBLE", "BLACK", "WHITE"])
+LedColor = Enumeration("LedColor",  [
+                       "BLUE", "GREEN", "RED", "YELLOW", "ORANGE", "MAGENTA", "GRENOBLE", "BLACK", "WHITE"])
 LedStatus = Enumeration("LedStatus", ["ON", "OFF"])
-LedSize   = Enumeration("LedSize",   [("SMALL", 24), ("LARGE", 48)])
+LedSize = Enumeration("LedSize",   [("SMALL", 24), ("LARGE", 48)])
+
 
-    
 class QLed(QPixmapWidget):
     """A Led"""
-    
-    DefaultLedPattern = ":leds/images256/led_{color}_{status}.png"
+    DefaultLedPattern = "leds_images256:led_{color}_{status}.png"
     DefaultLedColor = "green"
     DefaultLedStatus = True
     DefaultLedInverted = False
     DefaultBlinkingInterval = 0
-    
-    def __init__(self, parent = None, designMode=False):
+
+    def __init__(self, parent=None, designMode=False):
         self._ledStatus = self.DefaultLedStatus
         self._ledColor = self.DefaultLedColor
         self._ledPatternName = self.DefaultLedPattern
@@ -59,36 +59,39 @@ class QLed(QPixmapWidget):
         self._timer = None
         QPixmapWidget.__init__(self, parent)
         self._refresh()
-    
+
     def sizeHint(self):
         if self.layout() is None:
             return Qt.QSize(24, 24)
         return QPixmapWidget.sizeHint(self)
-    
+
     def minimumSizeHint(self):
         """Overwrite the default minimum size hint (0,0) to be (16,16)
         :return: the minimum size hint 16,16
-        :rtype: PyQt4.Qt.QSize""" 
+        :rtype: PyQt4.Qt.QSize"""
         return Qt.QSize(8, 8)
 
     def toLedName(self, status=None, color=None, inverted=None):
         """Gives the led name for the given status and color. If status or
         color are not given, the current led status or color are used.
-        
+
         :param status: the status
         :type  status: bool
         :param color: the color
         :type  color: str
         :return: string containing the led name
         :rtype: str"""
-        if status is None: status = self._ledStatus
-        if color is None: color = self._ledColor
-        if inverted is None: inverted = self._ledInverted
+        if status is None:
+            status = self._ledStatus
+        if color is None:
+            color = self._ledColor
+        if inverted is None:
+            inverted = self._ledInverted
         if inverted:
             status = not status
         status = status and "on" or "off"
         return self._ledPatternName.format(color=color, status=status)
-        
+
     def isLedColorValid(self, name):
         """Determines if the given color name is valid.
         :param color: the color
@@ -96,70 +99,70 @@ class QLed(QPixmapWidget):
         :return: True is the given color name is valid or False otherwise
         :rtype: bool"""
         return LedColor.has_key(name.upper())
-        
+
     def _refresh(self):
         """internal usage only"""
         self._ledName = self.toLedName()
-        pixmap = getPixmap(self._ledName)
+        pixmap = getCachedPixmap(self._ledName)
         self.setPixmap(pixmap)
         return self.update()
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
         return {
-            'module' : 'taurus.qt.qtgui.display',
-            'group' : 'Taurus Display',
-            'icon' : ":/designer/ledred.png",
-            'container' : False,
+            'module': 'taurus.qt.qtgui.display',
+            'group': 'Taurus Display',
+            'icon': "designer:ledred.png",
+            'container': False,
         }
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # QT property definition
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getLedPatternName(self):
         """Returns the current led pattern name
         :return: led pattern name
         :rtype: str"""
         return self._ledPatternName
-    
+
     def setLedPatternName(self, name):
         """Sets the led pattern name. Should be a string containing a path
         to valid images. The string can contain the keywords:
-        
+
             1. {status} - transformed to 'on' of 'off' according to the status
             2. {color} - transformed to the current led color
-            
+
         Example: **:leds/images256/led_{color}_{status}.png** will be transformed
         to **:leds/images256/led_red_on.png** when the led status is True and
         the led color is red.
-        
+
         :param name: new pattern
         :type  name: str"""
         self._ledPatternName = str(name)
         self._refresh()
-        
+
     def resetLedPatternName(self):
         """Resets the led pattern to **:leds/images256/led_{color}_{status}.png**."""
         self.setLedPatternName(self.DefaultLedPattern)
-        
+
     def getLedStatus(self):
         """Returns the led status
         :return: led status
         :rtype: bool"""
         return self._ledStatus
-        
+
     def setLedStatus(self, status):
         """Sets the led status
         :param status: the new status
         :type  status: bool"""
         self._ledStatus = bool(status)
         self._refresh()
-    
+
     def resetLedStatus(self):
         """Resets the led status"""
         self.setLedStatus(self.DefaultLedStatus)
-        
+
     def toggleLedStatus(self):
         """toggles the current status of the led"""
         self.setLedStatus(not self.getLedStatus())
@@ -169,14 +172,14 @@ class QLed(QPixmapWidget):
         :return: inverted mode
         :rtype: bool"""
         return self._ledInverted
-        
+
     def setLedInverted(self, inverted):
         """Sets the led inverted mode
         :param status: the new inverted mode
         :type  status: bool"""
         self._ledInverted = bool(inverted)
         self._refresh()
-    
+
     def resetLedInverted(self):
         """Resets the led inverted mode"""
         self.setLedInverted(self.DefaultLedInverted)
@@ -186,7 +189,7 @@ class QLed(QPixmapWidget):
         :return: led color
         :rtype: str"""
         return self._ledColor
-        
+
     def setLedColor(self, color):
         """Sets the led color
         :param status: the new color
@@ -196,41 +199,41 @@ class QLed(QPixmapWidget):
             raise Exception("Invalid color '%s'" % color)
         self._ledColor = color
         self._refresh()
-    
+
     def resetLedColor(self):
         """Resets the led color"""
         self.setLedColor(self.DefaultLedColor)
-        
+
     def setBlinkingInterval(self, interval):
         """sets the blinking interval (the time between status switching).
         Set to a nonpositive number for disabling blinking
-        
+
         :param interval: (int) the blinking interval in millisecs. Set to 0 for disabling blinking
         """
         if interval > 0:
             if self._timer is None:
                 self._timer = Qt.QTimer(self)
-                self.connect(self._timer, Qt.SIGNAL('timeout()'), self.toggleLedStatus)
+                self._timer.timeout.connect(self.toggleLedStatus)
             self._timer.start(interval)
         else:
             if self._timer is not None:
                 self._timer.stop()
                 self._timer = None
-        
+
     def getBlinkingInterval(self):
         """returns the blinking interval
-        
+
         :return: (int) blinking interval or 0 if blinking is not enabled.
-        """ 
-        if self._timer is None: 
+        """
+        if self._timer is None:
             return 0
         else:
             return self._timer.interval()
-    
+
     def resetBlinkingInterval(self):
         """resets the blinking interval"""
         self.setBlinkingInterval(self.__class__.DefaultBlinkingInterval)
-    
+
     #: This property holds the led status: False means OFF, True means ON
     #:
     #: **Access functions:**
@@ -261,7 +264,7 @@ class QLed(QPixmapWidget):
     #:     * :meth:`QLed.resetLedInverted`
     ledInverted = Qt.pyqtProperty("bool", getLedInverted, setLedInverted,
                                   resetLedInverted, doc="led inverted mode")
-    
+
     #: This property holds the led pattern name
     #:
     #: **Access functions:**
@@ -271,7 +274,7 @@ class QLed(QPixmapWidget):
     #:     * :meth:`QLed.resetLedPatternName`
     ledPattern = Qt.pyqtProperty("QString", getLedPatternName, setLedPatternName,
                                  resetLedPatternName, doc="led pattern name")
-    
+
     #: This property holds the blinking interval in millisecs. 0 means no blinking
     #:
     #: **Access functions:**
@@ -280,43 +283,43 @@ class QLed(QPixmapWidget):
     #:     * :meth:`QLed.setBlinkingInterval`
     #:     * :meth:`QLed.resetBlinkingInterval`
     blinkingInterval = Qt.pyqtProperty("int", getBlinkingInterval, setBlinkingInterval,
-                                resetBlinkingInterval, doc="blinking interval")
-    
-    
-    
+                                       resetBlinkingInterval, doc="blinking interval")
+
+
 class QLedOld(Qt.QLabel):
     ledDirPattern = ":leds/images%(size)d"
 
-    def __init__(self, parent = None, ledsize = LedSize.SMALL, ledcolor = LedColor.GREEN):
+    def __init__(self, parent=None, ledsize=LedSize.SMALL, ledcolor=LedColor.GREEN):
 
         Qt.QLabel.__init__(self, parent)
-        
+
         self.ledsize = ledsize
         self.status = LedStatus.OFF
         self.ledcolor = ledcolor
-        
+
         self.setObjectName("Led")
-        sizePolicy = Qt.QSizePolicy(Qt.QSizePolicy.Policy(0),Qt.QSizePolicy.Policy(0))
+        sizePolicy = Qt.QSizePolicy(
+            Qt.QSizePolicy.Policy(0), Qt.QSizePolicy.Policy(0))
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
         self.setSizePolicy(sizePolicy)
-        
+
         # no need to call changeColor. changeSize calls it for us
         self.changeSize(ledsize)
-        
+
         self.retranslateUi(self)
         Qt.QMetaObject.connectSlotsByName(self)
 
-    def toLedName(self,status,color):
+    def toLedName(self, status, color):
         name = "led" + LedColor.whatis(color).lower()
         if status == LedStatus.OFF:
             name += LedStatus.whatis(status).lower()
         return name
-    
-    def toCompleteLedName(self,size,status,color):
-        ret = self.ledDirPattern % { "size" : size} 
-        ret += "/" + self.toLedName(status,color) + ".png"
+
+    def toCompleteLedName(self, size, status, color):
+        ret = self.ledDirPattern % {"size": size}
+        ret += "/" + self.toLedName(status, color) + ".png"
         return ret
 
     def tr(self, string):
@@ -324,39 +327,42 @@ class QLedOld(Qt.QLabel):
 
     def retranslateUi(self, Led):
         Led.setWindowTitle(self.tr("Form"))
-    
+
     def on(self):
         if self.status == LedStatus.OFF:
             self.status = LedStatus.ON
             self.setPixmap(self.onled)
-    
+
     def off(self):
         if self.status == LedStatus.ON:
             self.status = LedStatus.OFF
-            self.setPixmap(self.offled)  
-    
+            self.setPixmap(self.offled)
+
     def changeSize(self, ledSize):
         self.ledsize = ledSize
-        self.resize(ledSize,ledSize)
-        self.setMinimumSize(Qt.QSize(ledSize,ledSize))
-        self.setMaximumSize(Qt.QSize(ledSize,ledSize))
-        
-        # force a call to led color to change the place from which the images are fetched
+        self.resize(ledSize, ledSize)
+        self.setMinimumSize(Qt.QSize(ledSize, ledSize))
+        self.setMaximumSize(Qt.QSize(ledSize, ledSize))
+
+        # force a call to led color to change the place from which the images
+        # are fetched
         self.changeColor(self.ledcolor)
-        
+
     def changeColor(self, ledColor):
         self.ledcolor = ledColor
-        
-        off_pixmap_name = self.toCompleteLedName(self.ledsize, LedStatus.OFF, ledColor)
+
+        off_pixmap_name = self.toCompleteLedName(
+            self.ledsize, LedStatus.OFF, ledColor)
         self.offled = Qt.QPixmap(off_pixmap_name)
-        on_pixmap_name = self.toCompleteLedName(self.ledsize, LedStatus.ON, ledColor)
+        on_pixmap_name = self.toCompleteLedName(
+            self.ledsize, LedStatus.ON, ledColor)
         self.onled = Qt.QPixmap(on_pixmap_name)
-        
+
         if self.status == LedStatus.OFF:
             self.setPixmap(self.offled)
         else:
             self.setPixmap(self.onled)
-    
+
     def _setProblemsBackground(self, doIt=True):
         if doIt:
             self.setAutoFillBackground(True)
@@ -368,15 +374,16 @@ class QLedOld(Qt.QLabel):
         else:
             self.setAutoFillBackground(False)
 
+
 def main():
     """hello"""
-    
+
     app = Qt.QApplication.instance()
     owns_app = app is None
-    
+
     if owns_app:
         app = Qt.QApplication(sys.argv)
-        
+
     w = Qt.QWidget()
     layout = Qt.QGridLayout()
     layout.setContentsMargins(2, 2, 2, 2)
@@ -396,7 +403,7 @@ def main():
         led.blinkingInterval = 500
         layout.addWidget(led, i, 2)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
diff --git a/lib/taurus/qt/qtgui/display/qlogo.py b/lib/taurus/qt/qtgui/display/qlogo.py
index 981f923..8a0b2a2 100644
--- a/lib/taurus/qt/qtgui/display/qlogo.py
+++ b/lib/taurus/qt/qtgui/display/qlogo.py
@@ -2,75 +2,81 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-qlogo.py: 
+qlogo.py:
 """
 
 __all__ = ["QLogo"]
 
 __docformat__ = 'restructuredtext'
 
+from taurus import tauruscustomsettings
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.resource import getPixmap
+from taurus.qt.qtgui.icon import getCachedPixmap
+
 
 class QLogo(Qt.QLabel):
-    
+
     def __init__(self, parent=None, designMode=False):
         self.__name = self.__class__.__name__
         Qt.QLabel.__init__(self, parent)
-        sizePolicy = Qt.QSizePolicy(Qt.QSizePolicy.Policy(0),Qt.QSizePolicy.Policy(0))
+        sizePolicy = Qt.QSizePolicy(
+            Qt.QSizePolicy.Policy(0), Qt.QSizePolicy.Policy(0))
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
         self.setSizePolicy(sizePolicy)
         self.setScaledContents(True)
-        self.setPixmap(getPixmap(":/logo.png"))
+        logo = getattr(tauruscustomsettings, 'ORGANIZATION_LOGO',
+                       "logos:taurus.png")
+        self.setPixmap(getCachedPixmap(logo))
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
         """Returns pertinent information in order to be able to build a valid
         QtDesigner widget plugin.
-        
-        The dictionary returned by this method should contain *at least* the 
+
+        The dictionary returned by this method should contain *at least* the
         following keys and values:
-        
+
             - 'module' : a string representing the full python module name (ex.: 'taurus.qt.qtgui.base')
-            - 'icon' : a string representing valid resource icon (ex.: ':/designer/combobox.png')
+            - 'icon' : a string representing valid resource icon (ex.: 'designer:combobox.png')
             - 'container' : a bool telling if this widget is a container widget or not.
-        
+
         This default implementation returns the following dictionary:
-        
+
             { 'module'    : 'taurus.qt.qtgui.base',
               'group'     : 'Taurus Widgets',
-              'icon'      : ':/designer/taurus.svg',
+              'icon'      : 'logos:taurus.svg',
               'container' : False }
-        
+
         :return: (dict) a map with pertinent designer information"""
-        return { 
-            'group'     : 'Taurus Widgets',
-            'icon'      : ':/designer/taurus.png',
-            'container' : False }
+        return {
+            'group': 'Taurus Widgets',
+            'icon': 'logos:taurus.png',
+            'container': False}
+
 
 def main():
     import sys
@@ -78,6 +84,6 @@ def main():
     w = QLogo()
     w.show()
     sys.exit(app.exec_())
-    
+
 if __name__ == "__main__":
-    main()
\ No newline at end of file
+    main()
diff --git a/lib/taurus/qt/qtgui/display/qpixmapwidget.py b/lib/taurus/qt/qtgui/display/qpixmapwidget.py
index fcad541..38a0bdc 100644
--- a/lib/taurus/qt/qtgui/display/qpixmapwidget.py
+++ b/lib/taurus/qt/qtgui/display/qpixmapwidget.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,48 +30,46 @@ __all__ = ["QPixmapWidget"]
 __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
-import taurus.qt.qtgui.resource
 
-getPixmap = taurus.qt.qtgui.resource.getPixmap
 
 class QPixmapWidget(Qt.QWidget):
     """This widget displays an image (pixmap). By default the pixmap is
     scaled to the widget size and the aspect ratio is kept.
     The default alignment of the pixmap inside the widget space is horizontal
     left, vertical center."""
-    
-    DefaultAlignment          = Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter
-    DefaultAspectRatioMode    = Qt.Qt.KeepAspectRatio
+
+    DefaultAlignment = Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter
+    DefaultAspectRatioMode = Qt.Qt.KeepAspectRatio
     DefaultTransformationMode = Qt.Qt.SmoothTransformation
-    
+
     def __init__(self, parent=None, designMode=False):
         self._pixmap = Qt.QPixmap()
         self._pixmapDrawn = None
         self._alignment = self.DefaultAlignment
         self._pixmapAspectRatioMode = self.DefaultAspectRatioMode
         self._pixmapTransformationMode = self.DefaultTransformationMode
-        
+
         Qt.QWidget.__init__(self, parent)
-    
+
     def _getPixmap(self):
         if self._pixmapDrawn is None:
             self._pixmapDrawn = self.recalculatePixmap()
         return self._pixmapDrawn
-    
+
     def recalculatePixmap(self):
         origPixmap = self._pixmap
         if origPixmap.isNull():
             return origPixmap
         return origPixmap.scaled(self.size(), self._pixmapAspectRatioMode,
                                  self._pixmapTransformationMode)
-    
+
     def _setDirty(self):
         self._pixmapDrawn = None
-    
+
     def paintEvent(self, paintEvent):
         """Overwrite the paintEvent from QWidget to draw the pixmap"""
         pixmap = self._getPixmap()
-                
+
         w, h = self.width(), self.height()
         painter = Qt.QPainter(self)
         painter.setRenderHint(Qt.QPainter.Antialiasing)
@@ -94,20 +92,20 @@ class QPixmapWidget(Qt.QWidget):
     def resizeEvent(self, event):
         self._setDirty()
         return Qt.QWidget.resizeEvent(self, event)
-        
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         return {
-            'module' : 'taurus.qt.qtgui.display',
-            'group' : 'Taurus Display',
-            'icon' : ":/designer/graphicsview.png",
-            'container' : False,
+            'module': 'taurus.qt.qtgui.display',
+            'group': 'Taurus Display',
+            'icon': "designer:graphicsview.png",
+            'container': False,
         }
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # QT property definition
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getPixmap(self):
         """Returns the pixmap.Returns None if no pixmap is set.
         :return: the current pixmap
@@ -118,23 +116,23 @@ class QPixmapWidget(Qt.QWidget):
         """Sets the pixmap for this widget. Setting it to None disables pixmap
         :param pixmap: the new pixmap
         :type  pixmap: PyQt4.Qt.QPixmap"""
-        # make sure to make a copy because of bug in PyQt 4.4. This is actually 
+        # make sure to make a copy because of bug in PyQt 4.4. This is actually
         # copying the internal bitmap, just the qpixmap, so there is no performance
         # penalty here
         self._pixmap = Qt.QPixmap(pixmap)
         self._setDirty()
         self.update()
-        
+
     def resetPixmap(self):
         """Resets the pixmap for this widget."""
         self.setPixmap(Qt.QPixmap())
-    
+
     def getAspectRatioMode(self):
         """Returns the aspect ratio to apply when drawing the pixmap.
         :return: the current aspect ratio
         :rtype: PyQt4.Qt.AspectRatioMode"""
         return self._pixmapAspectRatioMode
-        
+
     def setAspectRatioMode(self, aspect):
         """Sets the aspect ratio mode to apply when drawing the pixmap.
         :param pixmap: the new aspect ratio mode
@@ -142,17 +140,17 @@ class QPixmapWidget(Qt.QWidget):
         self._pixmapAspectRatioMode = aspect
         self._setDirty()
         self.update()
-    
+
     def resetAspectRatioMode(self):
         """Resets the aspect ratio mode to KeepAspectRatio"""
         self.setAspectRatioMode(self.DefaultAspectRatioMode)
-        
+
     def getTransformationMode(self):
         """Returns the transformation mode to apply when drawing the pixmap.
         :return: the current transformation mode
         :rtype: PyQt4.Qt.TransformationMode"""
         return self._pixmapTransformationMode
-        
+
     def setTransformationMode(self, transformation):
         """Sets the transformation mode to apply when drawing the pixmap.
         :param pixmap: the new transformation mode
@@ -160,7 +158,7 @@ class QPixmapWidget(Qt.QWidget):
         self._pixmapTransformationMode = transformation
         self._setDirty()
         self.update()
-    
+
     def resetTransformationMode(self):
         """Resets the transformation mode to SmoothTransformation"""
         self.setTransformationMode(self.DefaultTransformationMode)
@@ -170,18 +168,18 @@ class QPixmapWidget(Qt.QWidget):
         :return: the current alignment
         :rtype: PyQt4.Qt.Alignment"""
         return self._alignment
-        
+
     def setAlignment(self, alignment):
         """Sets the alignment to apply when drawing the pixmap.
         :param pixmap: the new alignment
         :type  pixmap: PyQt4.Qt.Alignment"""
         self._alignment = Qt.Qt.Alignment(alignment)
         self.update()
-    
+
     def resetAlignment(self):
         """Resets the transformation mode to Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter"""
         self.setAlignment(self.DefaultAlignment)
-        
+
     #: This property holds the widget's pixmap
     #:
     #: **Access functions:**
@@ -189,7 +187,7 @@ class QPixmapWidget(Qt.QWidget):
     #:     * :meth:`QPixmapWidget.getPixmap`
     #:     * :meth:`QPixmapWidget.setPixmap`
     #:     * :meth:`QPixmapWidget.resetLedStatus`
-    pixmap = Qt.pyqtProperty("QPixmap", getPixmap, setPixmap, 
+    pixmap = Qt.pyqtProperty("QPixmap", getPixmap, setPixmap,
                              resetPixmap, doc="the widget's pixmap")
 
     #: This property holds the widget's pixmap aspect ratio mode
@@ -199,7 +197,7 @@ class QPixmapWidget(Qt.QWidget):
     #:     * :meth:`QPixmapWidget.getAspectRatioMode`
     #:     * :meth:`QPixmapWidget.setAspectRatioMode`
     #:     * :meth:`QPixmapWidget.resetAspectRatioMode`
-    aspectRatioMode = Qt.pyqtProperty("Qt::AspectRatioMode", getAspectRatioMode, 
+    aspectRatioMode = Qt.pyqtProperty("Qt::AspectRatioMode", getAspectRatioMode,
                                       setAspectRatioMode, resetAspectRatioMode,
                                       doc="the widget's pixmap aspect ratio mode")
 
@@ -210,10 +208,10 @@ class QPixmapWidget(Qt.QWidget):
     #:     * :meth:`QPixmapWidget.getTransformationMode`
     #:     * :meth:`QPixmapWidget.setTransformationMode`
     #:     * :meth:`QPixmapWidget.resetTransformationMode`
-    transformationMode = Qt.pyqtProperty("Qt::TransformationMode", getTransformationMode, 
+    transformationMode = Qt.pyqtProperty("Qt::TransformationMode", getTransformationMode,
                                          setTransformationMode, resetTransformationMode,
                                          doc="the widget's pixmap transformation mode")
-    
+
     #: This property holds the widget's pixmap alignment
     #:
     #: **Access functions:**
@@ -221,16 +219,18 @@ class QPixmapWidget(Qt.QWidget):
     #:     * :meth:`QPixmapWidget.getAlignment`
     #:     * :meth:`QPixmapWidget.setAlignment`
     #:     * :meth:`QPixmapWidget.resetAlignment`
-    alignment = Qt.pyqtProperty("Qt::Alignment", getAlignment, setAlignment, 
+    alignment = Qt.pyqtProperty("Qt::Alignment", getAlignment, setAlignment,
                                 resetAlignment, doc="the widget's pixmap alignment")
 
+
 def demo():
     "QPixmap Widget"
     import demo.qpixmapwidgetdemo
     return demo.qpixmapwidgetdemo.main()
 
+
 def main():
     return demo()
-    
+
 if __name__ == "__main__":
     main()
diff --git a/lib/taurus/qt/qtgui/display/qsevensegment.py b/lib/taurus/qt/qtgui/display/qsevensegment.py
index c2bac78..8287f88 100644
--- a/lib/taurus/qt/qtgui/display/qsevensegment.py
+++ b/lib/taurus/qt/qtgui/display/qsevensegment.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -36,6 +36,7 @@ from taurus.external.qt import Qt
 POLY = Qt.QPolygonF
 P = Qt.QPointF
 
+
 class Q7SegDigit(Qt.QWidget):
     """
     A widget representing a single seven segment digit. The style can be
@@ -48,21 +49,21 @@ class Q7SegDigit(Qt.QWidget):
         - ledOffPenColor 160, 160, 120
         - ledOffbgColor 150, 150, 112
     """
-    Leds = ( 
-        ( 1, 1, 1, 0, 1, 1, 1 ), # 0
-        ( 0, 0, 1, 0, 0, 1, 0 ), # 1
-        ( 1, 0, 1, 1, 1, 0, 1 ), # 2
-        ( 1, 0, 1, 1, 0, 1, 1 ), # 3
-        ( 0, 1, 1, 1, 0, 1, 0 ), # 4
-        ( 1, 1, 0, 1, 0, 1, 1 ), # 5
-        ( 1, 1, 0, 1, 1, 1, 1 ), # 6
-        ( 1, 0, 1, 0, 0, 1, 0 ), # 7
-        ( 1, 1, 1, 1, 1, 1, 1 ), # 8
-        ( 1, 1, 1, 1, 0, 1, 0 ), # 9
-        ( 0, 0, 0, 0, 0, 0, 0 ), # 10 'nothing'
-        ( 0, 0, 0, 1, 0, 0, 0 ), # 11 -
-        ( 1, 0, 1, 1, 1, 1, 1 ), # 12 a
-        ( 0, 0, 0, 1, 1, 1, 0 ), # 13 n
+    Leds = (
+        (1, 1, 1, 0, 1, 1, 1),  # 0
+        (0, 0, 1, 0, 0, 1, 0),  # 1
+        (1, 0, 1, 1, 1, 0, 1),  # 2
+        (1, 0, 1, 1, 0, 1, 1),  # 3
+        (0, 1, 1, 1, 0, 1, 0),  # 4
+        (1, 1, 0, 1, 0, 1, 1),  # 5
+        (1, 1, 0, 1, 1, 1, 1),  # 6
+        (1, 0, 1, 0, 0, 1, 0),  # 7
+        (1, 1, 1, 1, 1, 1, 1),  # 8
+        (1, 1, 1, 1, 0, 1, 0),  # 9
+        (0, 0, 0, 0, 0, 0, 0),  # 10 'nothing'
+        (0, 0, 0, 1, 0, 0, 0),  # 11 -
+        (1, 0, 1, 1, 1, 1, 1),  # 12 a
+        (0, 0, 0, 1, 1, 1, 0),  # 13 n
     )
 
 #    LedGeometries = (
@@ -74,12 +75,13 @@ class Q7SegDigit(Qt.QWidget):
 #        POLY([P(290, 207), P(260, 222), P(260, 303), P(290, 333), P(290, 207)]),
 #        POLY([P(67, 340), P(283, 340), P(253, 310), P(97, 310), P(67, 340)]),
 #    )
-    
+
     LedGeometriesWithFrame300x400 = (
         POLY([P(37, 30), P(263, 30), P(233, 60), P(67, 60), P(37, 30)]),
         POLY([P(30, 37), P(60, 67), P(60, 178), P(30, 193), P(30, 37)]),
         POLY([P(270, 37), P(240, 67), P(240, 178), P(270, 193), P(270, 37)]),
-        POLY([P(37, 200), P(67, 185), P(233, 185), P(263, 200), P(233, 215), P(67, 215), P(37, 200)]),
+        POLY([P(37, 200), P(67, 185), P(233, 185), P(
+            263, 200), P(233, 215), P(67, 215), P(37, 200)]),
         POLY([P(30, 207), P(60, 222), P(60, 333), P(30, 363), P(30, 207)]),
         POLY([P(270, 207), P(240, 222), P(240, 333), P(270, 363), P(270, 207)]),
         POLY([P(37, 370), P(263, 370), P(233, 340), P(67, 340), P(37, 370)]),
@@ -89,7 +91,8 @@ class Q7SegDigit(Qt.QWidget):
         POLY([P(7, 0), P(293, 0), P(263, 30), P(37, 30), P(7, 0)]),
         POLY([P(0, 7), P(30, 37), P(30, 178), P(0, 193), P(0, 7)]),
         POLY([P(300, 7), P(270, 37), P(270, 178), P(300, 193), P(300, 7)]),
-        POLY([P(7, 200), P(37, 185), P(263, 185), P(293, 200), P(263, 215), P(37, 215), P(7, 200)]),
+        POLY([P(7, 200), P(37, 185), P(263, 185), P(
+            293, 200), P(263, 215), P(37, 215), P(7, 200)]),
         POLY([P(0, 207), P(30, 222), P(30, 363), P(0, 393), P(0, 207)]),
         POLY([P(300, 207), P(270, 222), P(270, 363), P(300, 393), P(300, 207)]),
         POLY([P(7, 400), P(293, 400), P(263, 370), P(37, 370), P(7, 400)]),
@@ -99,7 +102,8 @@ class Q7SegDigit(Qt.QWidget):
         POLY([P(37, 30), P(263, 30), P(233, 60), P(67, 60), P(37, 30)]),
         POLY([P(30, 37), P(60, 67), P(60, 128), P(30, 143), P(30, 37)]),
         POLY([P(270, 37), P(240, 67), P(240, 128), P(270, 143), P(270, 37)]),
-        POLY([P(37, 150), P(67, 135), P(233, 135), P(263, 150), P(233, 165), P(67, 165), P(37, 150)]),
+        POLY([P(37, 150), P(67, 135), P(233, 135), P(
+            263, 150), P(233, 165), P(67, 165), P(37, 150)]),
         POLY([P(30, 157), P(60, 172), P(60, 233), P(30, 263), P(30, 157)]),
         POLY([P(270, 157), P(240, 172), P(240, 233), P(270, 263), P(270, 157)]),
         POLY([P(37, 270), P(263, 270), P(233, 240), P(67, 240), P(37, 270)]),
@@ -109,29 +113,30 @@ class Q7SegDigit(Qt.QWidget):
         POLY([P(7, 0), P(293, 0), P(263, 30), P(37, 30), P(7, 0)]),
         POLY([P(0, 7), P(30, 37), P(30, 128), P(0, 143), P(0, 7)]),
         POLY([P(300, 7), P(270, 37), P(270, 128), P(300, 143), P(300, 7)]),
-        POLY([P(7, 150), P(37, 135), P(263, 135), P(293, 150), P(263, 165), P(37, 165), P(7, 150)]),
+        POLY([P(7, 150), P(37, 135), P(263, 135), P(
+            293, 150), P(263, 165), P(37, 165), P(7, 150)]),
         POLY([P(0, 157), P(30, 172), P(30, 263), P(0, 293), P(0, 157)]),
         POLY([P(300, 157), P(270, 172), P(270, 263), P(300, 293), P(300, 157)]),
         POLY([P(7, 300), P(293, 300), P(263, 270), P(37, 270), P(7, 300)]),
     )
-    
-    DftLedOnPenColor  = Qt.QColor(193, 0, 0, 255)
-    DftLedOnBgColor   = Qt.Qt.red
-    
+
+    DftLedOnPenColor = Qt.QColor(193, 0, 0, 255)
+    DftLedOnBgColor = Qt.Qt.red
+
     DftLedOffPenColor = Qt.QColor(30, 30, 30, 255)
-    DftLedOffBgColor  = Qt.QColor(40, 40, 40, 255)
-    
-    DftBgBrush        = Qt.QBrush(Qt.Qt.black, Qt.Qt.SolidPattern)
-    
-    DftLedPenWidth    = 5
-    DftValue          = ''
-    
-    DftWidth          = 300
-    DftHeight         = 300
-    DftAspectRatio    = DftWidth / DftHeight
-    DftUseFrame       = True
-    
-    def __init__(self, parent = None, **kwargs):
+    DftLedOffBgColor = Qt.QColor(40, 40, 40, 255)
+
+    DftBgBrush = Qt.QBrush(Qt.Qt.black, Qt.Qt.SolidPattern)
+
+    DftLedPenWidth = 5
+    DftValue = ''
+
+    DftWidth = 300
+    DftHeight = 300
+    DftAspectRatio = DftWidth / DftHeight
+    DftUseFrame = True
+
+    def __init__(self, parent=None, **kwargs):
         Qt.QWidget.__init__(self, parent)
 
         self._setLedPenWidth(Q7SegDigit.DftLedPenWidth)
@@ -147,14 +152,16 @@ class Q7SegDigit(Qt.QWidget):
 
     def minimumSizeHint(self):
         return Qt.QSize(4, 5.9)
-    
+
     def sizeHint(self):
-        #return Qt.QSize(Q7SegDigit.DftWidth, Q7SegDigit.DftHeight)
+        # return Qt.QSize(Q7SegDigit.DftWidth, Q7SegDigit.DftHeight)
         return Qt.QSize(40, 50)
-    
+
     def _updatePensAndBrushes(self):
-        pon = Qt.QPen(self._ledOnPenColor, self._ledPenWidth, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)
-        poff = Qt.QPen(self._ledOffPenColor, self._ledPenWidth, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)
+        pon = Qt.QPen(self._ledOnPenColor, self._ledPenWidth,
+                      Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)
+        poff = Qt.QPen(self._ledOffPenColor, self._ledPenWidth,
+                       Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin)
         bon = Qt.QBrush(self._ledOnBgColor, Qt.Qt.SolidPattern)
         boff = Qt.QBrush(self._ledOffBgColor, Qt.Qt.SolidPattern)
         pens, brushes = [], []
@@ -162,23 +169,31 @@ class Q7SegDigit(Qt.QWidget):
             nPens = []
             nBrushes = []
             for onoff in nLeds:
-                if onoff: pen, brush = pon, bon
-                else: pen, brush = poff, boff
+                if onoff:
+                    pen, brush = pon, bon
+                else:
+                    pen, brush = poff, boff
                 nPens.append(pen)
                 nBrushes.append(brush)
             pens.append(nPens)
             brushes.append(nBrushes)
         self._pens, self._brushes = pens, brushes
         self.update()
-        
+
     def __valueStrToLedIndex(self, s):
-        if s is None:  s = 10
-        elif s == '-': s = 11
-        elif s == 'a': s = 12
-        elif s == 'n': s = 13
-        else: 
-            try: s = int(s)
-            except: s = 10
+        if s is None:
+            s = 10
+        elif s == '-':
+            s = 11
+        elif s == 'a':
+            s = 12
+        elif s == 'n':
+            s = 13
+        else:
+            try:
+                s = int(s)
+            except:
+                s = 10
         return s
 
     def paintEvent(self, evt):
@@ -188,36 +203,37 @@ class Q7SegDigit(Qt.QWidget):
         w, h = float(self.width()), float(self.height())
         aspect = w / h
         if aspect > 0.75:
-            w = h*aspect
+            w = h * aspect
         else:
-            h = w/aspect
+            h = w / aspect
         painter.setViewport(0, 0, w, h)
         self._paintBorder(painter)
         self._paintSegment(painter)
 
     def _paintBorder(self, painter):
         if self.getUseFrame():
-            painter.setPen(Qt.QPen(Qt.Qt.black, 2, Qt.Qt.SolidLine, Qt.Qt.RoundCap, Qt.Qt.RoundJoin))
+            painter.setPen(Qt.QPen(Qt.Qt.black, 2, Qt.Qt.SolidLine,
+                                   Qt.Qt.RoundCap, Qt.Qt.RoundJoin))
             linGrad = Qt.QLinearGradient(30, 200, 200, 150)
             linGrad.setColorAt(0, Qt.Qt.darkGray)
             linGrad.setColorAt(1, Qt.Qt.white)
             linGrad.setSpread(Qt.QGradient.ReflectSpread)
             painter.setBrush(linGrad)
-            border2 = Qt.QRectF (0, 0, self.DftWidth, self.DftHeight)
+            border2 = Qt.QRectF(0, 0, self.DftWidth, self.DftHeight)
             painter.drawRoundRect(border2, 10, 10)
             painter.setBrush(self.getBgBrush())
             dist = 20
-            border1 = Qt.QRectF (dist, dist, self.DftWidth - 2*dist, self.DftHeight - 2*dist)
+            border1 = Qt.QRectF(dist, dist, self.DftWidth -
+                                2 * dist, self.DftHeight - 2 * dist)
             painter.drawRoundRect(border1, 5, 5)
         else:
             painter.setBrush(self.getBgBrush())
-            border1 = Qt.QRectF (0, 0, self.DftWidth, self.DftHeight)
+            border1 = Qt.QRectF(0, 0, self.DftWidth, self.DftHeight)
             painter.drawRect(border1)
-            
-            
+
     def _paintSegment(self, painter):
         idx = self.__valueStrToLedIndex(self._value)
-        
+
         if self.getUseFrame():
             if self.DftHeight == 300:
                 geom = self.LedGeometriesWithFrame300x300
@@ -228,9 +244,9 @@ class Q7SegDigit(Qt.QWidget):
                 geom = self.LedGeometriesWithoutFrame300x300
             else:
                 geom = self.LedGeometriesWithoutFrame300x400
-                
+
         pens, brushes = self._pens[idx], self._brushes[idx]
-        
+
         for i in xrange(7):
             seg = Qt.QPainterPath()
             seg.addPolygon(geom[i])
@@ -241,25 +257,32 @@ class Q7SegDigit(Qt.QWidget):
     def __str__(self):
         _, idx = '', self.__valueStrToLedIndex(self._value)
         leds = self.Leds[idx]
-            
+
         # line 0
         c = ' '
-        if leds[0]: c = '_'
+        if leds[0]:
+            c = '_'
         ret = ' %c \n' % c
-        
+
         # line 1
         c1, c2, c3 = ' ', ' ', ' '
-        if leds[1]: c1 = '|'
-        if leds[3]: c2 = '_'
-        if leds[2]: c3 = '|'
-        ret += '%c%c%c\n' % (c1,c2,c3)
-        
+        if leds[1]:
+            c1 = '|'
+        if leds[3]:
+            c2 = '_'
+        if leds[2]:
+            c3 = '|'
+        ret += '%c%c%c\n' % (c1, c2, c3)
+
         # line 2
         c1, c2, c3 = ' ', ' ', ' '
-        if leds[4]: c1 = '|'
-        if leds[6]: c2 = '_'
-        if leds[5]: c3 = '|'
-        ret += '%c%c%c' % (c1,c2,c3)
+        if leds[4]:
+            c1 = '|'
+        if leds[6]:
+            c2 = '_'
+        if leds[5]:
+            c3 = '|'
+        ret += '%c%c%c' % (c1, c2, c3)
         return ret
 
     def _setValue(self, n):
@@ -267,19 +290,19 @@ class Q7SegDigit(Qt.QWidget):
             self._value = n
         else:
             self._value = str(n)
-    
+
     def _setLedPenWidth(self, w):
         self._ledPenWidth = w
-    
+
     def _setLedOnPenColor(self, penColor):
         self._ledOnPenColor = penColor
-    
+
     def _setLedOnBgColor(self, bgColor):
         self._ledOnBgColor = bgColor
 
     def _setLedOffPenColor(self, penColor):
         self._ledOffPenColor = penColor
-    
+
     def _setLedOffBgColor(self, bgColor):
         self._ledOffBgColor = bgColor
 
@@ -290,67 +313,67 @@ class Q7SegDigit(Qt.QWidget):
         if isinstance(bgBrush, Qt.QColor):
             bgBrush = Qt.QBrush(bgBrush, Qt.Qt.SolidPattern)
         self._bgBrush = bgBrush
-    
+
     def _setUseFrame(self, useFrame):
         self._useFrame = useFrame
-    
+
     def getLedOnPenColor(self):
         return self._ledOnPenColor
-    
+
     def setLedOnPenColor(self, penColor):
         self._setLedOnPenColor(penColor)
         self._updatePensAndBrushes()
-        
+
     def resetLedOnPenColor(self):
         self.setLenOnPenColor(Q7SegDigit.DftLedOnPenColor)
-        
+
     def getLedOnBgColor(self):
         return self._ledOnBgColor
-    
+
     def setLedOnBgColor(self, bgColor):
         self._setLedOnBgColor(bgColor)
         self._updatePensAndBrushes()
-        
+
     def resetLedOnBgColor(self):
         self.setLedOnBgColor(Q7SegDigit.DftLedOnBgColor)
 
     def getLedOffPenColor(self):
         return self._ledOffPenColor
-    
+
     def setLedOffPenColor(self, penColor):
         self._setLedOffPenColor(penColor)
         self._updatePensAndBrushes()
-        
+
     def resetLedOffPenColor(self):
         self.setLenOffPenColor(Q7SegDigit.DftLedOffPenColor)
-        
+
     def getLedOffBgColor(self):
         return self._ledOffBgColor
-    
+
     def setLedOffBgColor(self, bgColor):
         self._setLedOffBgColor(bgColor)
         self._updatePensAndBrushes()
-        
+
     def resetLedOffBgColor(self):
         self.setLedOffBgColor(Q7SegDigit.DftLedOffBgColor)
 
     def getBgBrush(self):
         return self._bgBrush
-    
+
     def setBgBrush(self, bgBrush):
         self._setBgBrush(bgBrush)
         self.update()
-        
+
     def resetBgBrush(self):
         self.setBgBrush(Q7SegDigit.DftBgBrush)
-        
+
     def setValue(self, n):
         self._setValue(n)
         self.update()
 
     def getValue(self):
         return self._value
-    
+
     def resetValue(self):
         self.setValue(Q7SegDigit.DftValue)
 
@@ -360,7 +383,7 @@ class Q7SegDigit(Qt.QWidget):
 
     def getLedPenWidth(self):
         return self._ledPenWidth
-    
+
     def resetLedPenWidth(self):
         self.setLedPenWidth(Q7SegDigit.DftLenPenWidth)
 
@@ -379,12 +402,12 @@ class Q7SegDigit(Qt.QWidget):
 
     def getUseFrame(self):
         return self._useFrame
-    
+
     def resetUseFrame(self):
         self.setUseFrame(Q7SegDigit.DftUseFrame)
 
     #: This property holds the led pen color when the led is light ON
-    #: 
+    #:
     #: **Access functions:**
     #:
     #:     * :meth:`taurus.qt.qtgui.display.Q7SegDigit.getLedOnPenColor`
@@ -395,7 +418,7 @@ class Q7SegDigit(Qt.QWidget):
                                     setLedOnPenColor, resetLedOnPenColor)
 
     #: This property holds the led background color when the led is light ON
-    #: 
+    #:
     #: **Access functions:**
     #:
     #:     * :meth:`taurus.qt.qtgui.display.Q7SegDigit.getLedOnBgColor`
@@ -406,7 +429,7 @@ class Q7SegDigit(Qt.QWidget):
                                    setLedOnBgColor, resetLedOnBgColor)
 
     #: This property holds the led pen color when the led is light OFF
-    #: 
+    #:
     #: **Access functions:**
     #:
     #:     * :meth:`taurus.qt.qtgui.display.Q7SegDigit.getLedOffPenColor`
@@ -417,7 +440,7 @@ class Q7SegDigit(Qt.QWidget):
                                      setLedOffPenColor, resetLedOffPenColor)
 
     #: This property holds the led background color when the led is light OFF
-    #: 
+    #:
     #: **Access functions:**
     #:
     #:     * :meth:`taurus.qt.qtgui.display.Q7SegDigit.getLedOffBgColor`
@@ -428,7 +451,7 @@ class Q7SegDigit(Qt.QWidget):
                                     setLedOffBgColor, resetLedOffBgColor)
 
     #: This property holds the background brush
-    #: 
+    #:
     #: **Access functions:**
     #:
     #:     * :meth:`taurus.qt.qtgui.display.Q7SegDigit.getBgBrush`
@@ -438,7 +461,7 @@ class Q7SegDigit(Qt.QWidget):
     bgBrush = Qt.pyqtProperty("QBrush", getBgBrush, setBgBrush, resetBgBrush)
 
     #: This property holds the pen width
-    #: 
+    #:
     #: **Access functions:**
     #:
     #:     * :meth:`taurus.qt.qtgui.display.Q7SegDigit.getLedPenWidth`
@@ -449,7 +472,7 @@ class Q7SegDigit(Qt.QWidget):
                                   setLedPenWidth, resetLedPenWidth)
 
     #: This property holds wheater of not to draw a frame
-    #: 
+    #:
     #: **Access functions:**
     #:
     #:     * :meth:`taurus.qt.qtgui.display.Q7SegDigit.getUseFrame`
@@ -459,7 +482,7 @@ class Q7SegDigit(Qt.QWidget):
     useFrame = Qt.pyqtProperty("bool", getUseFrame, setUseFrame, resetUseFrame)
 
     #: This property holds the widget value
-    #: 
+    #:
     #: **Access functions:**
     #:
     #:     * :meth:`taurus.qt.qtgui.display.Q7SegDigit.getValue`
@@ -470,17 +493,17 @@ class Q7SegDigit(Qt.QWidget):
 
 
 class Q7SegDisplay(Qt.QWidget):
-    
+
     def __init__(self, qt_parent=None):
         Qt.QWidget.__init__(self, qt_parent)
         self.__init()
-        
+
     def __init(self):
         l = Qt.QHBoxLayout()
         l.setSpacing(10)
         l.setMargin(5)
         self.setLayout(l)
-        
+
         self._digits = []
         for i in xrange(5):
             d = Q7SegDigit()
@@ -494,36 +517,42 @@ class Q7SegDisplay(Qt.QWidget):
         palette.setBrush(Qt.QPalette.Active, Qt.QPalette.Window, brush)
         self.setPalette(palette)
 
+
 def __setBgBrush():
     global digitWidget
     color = Qt.QColorDialog.getColor(Qt.Qt.red)
     if color.isValid():
         digitWidget.setBgBrush(color)
 
+
 def __setLedOnPenColor():
     global digitWidget
     color = Qt.QColorDialog.getColor(Qt.Qt.red)
     if color.isValid():
         digitWidget.setLedOnPenColor(color)
 
+
 def __setLedOnBgColor():
     global digitWidget
     color = Qt.QColorDialog.getColor(Qt.Qt.red)
     if color.isValid():
         digitWidget.setLedOnBgColor(color)
-        
+
+
 def __setLedOffPenColor():
     global digitWidget
     color = Qt.QColorDialog.getColor(Qt.Qt.red)
     if color.isValid():
         digitWidget.setLedOffPenColor(color)
 
+
 def __setLedOffBgColor():
     global digitWidget
     color = Qt.QColorDialog.getColor(Qt.Qt.red)
     if color.isValid():
         digitWidget.setLedOffBgColor(color)
 
+
 def main1():
     import sys
     a = Qt.QApplication([])
@@ -538,6 +567,7 @@ def main1():
     panel.setVisible(True)
     a.exec_()
 
+
 def main2():
     import sys
     a = Qt.QApplication([])
@@ -546,14 +576,16 @@ def main2():
     dw.setVisible(True)
     print dw
     a.exec_()
-    
+
+
 def main3():
     a = Qt.QApplication([])
     dw = Q7SegDisplay()
-    #dw.setValue(int(sys.argv[1]))
+    # dw.setValue(int(sys.argv[1]))
     dw.setVisible(True)
     a.exec_()
-    
+
+
 def main():
     global digitWidget
     a = Qt.QApplication([])
@@ -571,7 +603,7 @@ def main():
     LedOnBgColor = Qt.QPushButton("ON bg color")
     LedOffPenColor = Qt.QPushButton("OFF pen color")
     LedOffBgColor = Qt.QPushButton("OFF bg color")
-    
+
     l.addRow("Value", digitWidget)
     l.addRow("Digit", valueLineEdit)
     l.addRow("Pen width", ledPenWidthWidget)
@@ -580,18 +612,16 @@ def main():
     l.addRow(LedOnBgColor)
     l.addRow(LedOffPenColor)
     l.addRow(LedOffBgColor)
-    Qt.QObject.connect(valueLineEdit, Qt.SIGNAL("textChanged(QString)"), digitWidget.setValue)
-    Qt.QObject.connect(ledPenWidthWidget, Qt.SIGNAL("valueChanged ( int )"), digitWidget.setLedPenWidth)
-    Qt.QObject.connect(bgBrushWidget, Qt.SIGNAL("clicked()"), __setBgBrush)
-    Qt.QObject.connect(LedOnPenColor, Qt.SIGNAL("clicked()"), __setLedOnPenColor)
-    Qt.QObject.connect(LedOnBgColor, Qt.SIGNAL("clicked()"), __setLedOnBgColor)
-    Qt.QObject.connect(LedOffPenColor, Qt.SIGNAL("clicked()"), __setLedOffPenColor)
-    Qt.QObject.connect(LedOffBgColor, Qt.SIGNAL("clicked()"), __setLedOffBgColor)
+    valueLineEdit.textChanged.connect(digitWidget.setValue)
+    ledPenWidthWidget.valueChanged.connect(digitWidget.setLedPenWidth)
+    bgBrushWidget.clicked.connect(__setBgBrush)
+    LedOnPenColor.clicked.connect(__setLedOnPenColor)
+    LedOnBgColor.clicked.connect(__setLedOnBgColor)
+    LedOffPenColor.clicked.connect(__setLedOffPenColor)
+    LedOffBgColor.clicked.connect(__setLedOffBgColor)
     panel.setVisible(True)
     a.exec_()
 
 
-    
-
 if __name__ == "__main__":
-    main3()
\ No newline at end of file
+    main3()
diff --git a/lib/taurus/qt/qtgui/display/taurusboolled.py b/lib/taurus/qt/qtgui/display/taurusboolled.py
deleted file mode 100644
index a0af537..0000000
--- a/lib/taurus/qt/qtgui/display/taurusboolled.py
+++ /dev/null
@@ -1,221 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 provides a set of basic Taurus widgets based on QLabel"""
-
-__all__ = ["TaurusBoolLed"]
-
-__docformat__ = 'restructuredtext'
-
-from taurus.external.qt import Qt
-
-# ugly
-import PyTango
-
-import taurus.core.util
-from taurus.qt.qtgui.base import TaurusBaseWidget
-from qled import LedStatus, LedColor, LedSize
-from qled import QLedOld as QLed
-    
-class TaurusBoolLed(QLed, TaurusBaseWidget):
-    """
-       A led widget displaying the boolean tango attribute value
-       
-       .. deprecated:: 2.0
-           Use :class:`taurus.qt.qtgui.display.TaurusLed` instead.
-    """
-
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-
-    def __init__(self, parent = None, designMode = False):
-        self._ledColor = 'GREEN'
-        self._ledColorOff = 'GREENOFF'
-        self._ledSize = 24
-        self._ledColorPixmap = None
-        self._ledColorOffPixmap = None
-        self._boolIndex = 0
-        
-        self.call__init__wo_kw(QLed, parent)
-        self.call__init__(TaurusBaseWidget, str(self.objectName()), designMode=designMode)
-
-        self.setLedColor(self._ledColor)
-        self.setLedColorOff(self._ledColorOff)
-        
-        self.setEventFilters([taurus.core.util.eventfilters.IGNORE_CONFIG]) #This widget does not need to attend to config events
-
-    def sizeHint(self):
-        return Qt.QSize(24, 24)
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget overwritting
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    def getModelClass(self):
-        return taurus.core.taurusattribute.TaurusAttribute
-
-    def isReadOnly(self):
-        return True
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    def getLedColor(self):
-        return self._ledColor
-
-    @Qt.pyqtSignature("setLedColor(QString)")
-    def setLedColor(self, lc):
-        self._ledColor = str(lc)
-
-        status = LedStatus.ON
-        color = self._ledColor
-        if color.endswith('OFF'):
-            status = LedStatus.OFF
-            color = color[:-3]
-        color = LedColor[color]
-        file_name = self.toCompleteLedName(self.ledsize, status, color)
-        self._ledColorPixmap = Qt.QPixmap(file_name)
-        
-    def resetLedColor(self,lc):
-        self.setLedColor('GREEN')
-
-    def getLedColorOff(self):
-        return self._ledColorOff
-
-    @Qt.pyqtSignature("setLedColorOff(QString)")
-    def setLedColorOff(self, lc):
-        self._ledColorOff = str(lc)
-
-        status = LedStatus.ON
-        color = self._ledColorOff
-        if color.endswith('OFF'):
-            status = LedStatus.OFF
-            color = color[:-3]
-
-        color = LedColor[color]
-        file_name = self.toCompleteLedName(self.ledsize, status, color)
-        self._ledColorOffPixmap = Qt.QPixmap(file_name)
-        
-    def resetLedColorOff(self,lc):
-        self.setLedColorOff('GREENOFF')
-
-    def getLedSize(self):
-        return self._ledSize
-
-    @Qt.pyqtSignature("setLedSize(int)")
-    def setLedSize(self,size):
-        self._ledSize = size
-        try:
-            getattr(LedSize,str(self._ledSize))
-            self.changeSize(self._ledSize)
-        except:
-            pass
-
-    def resetLedSize(self,size):
-        self.setLedSize(24)
-
-    def getBoolIndex(self):
-        return self._boolIndex
-
-    @Qt.pyqtSignature("setBoolIndex(int)")
-    def setBoolIndex(self,i):
-        self._boolIndex = i
-        try:
-            getattr(BoolIndex,str(self._boolIndex))
-            self.changeSize(self._boolIndex)
-        except:
-            pass
-
-    def resetBoolIndex(self):
-        self.setBoolIndex(0)
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        return None
-#        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-#        ret['module'] = 'taurus.qt.qtgui.display'
-#        ret['group'] = 'Taurus Widgets [Old]'
-#        ret['icon'] = ":/designer/ledgreen.png"
-#        return ret
-        
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
-                            TaurusBaseWidget.setModel,
-                            TaurusBaseWidget.resetModel)
-
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
-                                     TaurusBaseWidget.setUseParentModel,
-                                     TaurusBaseWidget.resetUseParentModel)
-
-    ledColor = Qt.pyqtProperty("QString", getLedColor, setLedColor, resetLedColor,
-                               doc='valid values are (case insensitive) "BLUE", "GREEN", "RED", "YELLOW", "ORANGE", "BLUEOFF", "GREENOFF", "REDOFF", "YELLOWOFF", "ORANGEOFF"')
-
-    ledColorOff = Qt.pyqtProperty("QString", getLedColorOff, setLedColorOff,
-                                  resetLedColorOff,
-                                  doc='valid values are (case insensitive) "BLUE", "GREEN", "RED", "YELLOW", "ORANGE", "BLUEOFF", "GREENOFF", "REDOFF", "YELLOWOFF", "ORANGEOFF"')
-
-    ledSize = Qt.pyqtProperty("int", getLedSize, setLedSize, resetLedSize,
-                              doc='valid values as 24 and 48')
-
-    boolIndex = Qt.pyqtProperty("int", getBoolIndex, setBoolIndex, resetBoolIndex,)
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT signal handlers
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    def handleEvent(self, evt_src, evt_type, evt_value):
-        if evt_value is None:
-            return
-        if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Error:
-            self._setProblemsBackground(True)
-            self.updateStyle()
-            return
-        self._setProblemsBackground(False)
-
-        if evt_value.data_format == PyTango.AttrDataFormat.SCALAR:
-            v = evt_value.value
-        elif evt_value.data_format == PyTango.AttrDataFormat.SPECTRUM:
-            v = evt_value.value[self.boolIndex]
-
-        if v is True: #we know that evt_value will always be a DeviceAttribute because we filter out Config events
-            self.setPixmap(self._ledColorPixmap)
-        else:
-            self.setPixmap(self._ledColorOffPixmap)
-        self.updateStyle()
-
-
-if __name__ == "__main__":
-    import sys
-    app = Qt.QApplication(sys.argv)
-    
-    model = 'sys/tg_test/1/boolean_scalar'
-    if len(sys.argv)>1: model=sys.argv[1]
-    
-    w = TaurusBoolLed()
-    w.setModel(model)
-    w.setVisible(True)
-    
-    sys.exit(app.exec_())
-
diff --git a/lib/taurus/qt/qtgui/display/taurusconfiglabel.py b/lib/taurus/qt/qtgui/display/taurusconfiglabel.py
deleted file mode 100644
index 59fdcea..0000000
--- a/lib/taurus/qt/qtgui/display/taurusconfiglabel.py
+++ /dev/null
@@ -1,231 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 provides a set of basic Taurus widgets based on QLabel"""
-
-__all__ = ["TaurusConfigLabel"]
-
-__docformat__ = 'restructuredtext'
-
-from taurus.external.qt import Qt
-
-import taurus.core
-from taurus.qt.qtgui.util import QT_DEVICE_STATE_PALETTE
-from taurus.qt.qtgui.base import TaurusBaseWidget
-
-
-class TaurusConfigLabel(Qt.QLabel, TaurusBaseWidget):
-    """
-       A label widget displaying the tango attribute configuration.
-       
-    .. deprecated:: 2.0
-           Use :class:`taurus.qt.qtgui.display.TaurusLabel` instead.
-    """
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-
-    def __init__(self, parent = None, designMode = False):
-        name = "TaurusConfigLabel"
-        self._prefix = ''
-        self._suffix = ''
-        self._configParam = None
-        self._extra_style = ''
-        self.call__init__wo_kw(Qt.QLabel, parent)
-        self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-        
-        self.setAlignment(Qt.Qt.AlignVCenter)
-        
-    def defineStyle(self):
-        
-        palette = self.palette()
-        
-        # define a default background color in case the model is not connected
-        bg_brush, fg_brush = QT_DEVICE_STATE_PALETTE.qbrush(None)
-        palette.setBrush(Qt.QPalette.Window,bg_brush)
-        palette.setBrush(Qt.QPalette.Base,bg_brush)
-        palette.setBrush(Qt.QPalette.WindowText,fg_brush)
-        self.setPalette(palette) # mandatory since PyQt 4.5
-        self.updateStyle()
-
-    def sizeHint(self):
-        return Qt.QSize(60, 24)
-
-    def getConfigurationAttributeValue(self):
-        """Helper method to get the proper parameter value from the configuration"""
-        model = self.getModelObj()
-        if model is None:
-            return self.getNoneValue()
-        try:
-            val = getattr(model, str(self._configParam))
-            try:
-                no_val = getattr(model, "no_" + str(self._configParam))
-                if val.lower() == no_val.lower():
-                    val = self.getNoneValue()
-            except:
-                pass
-        except:
-            self.debug("Invalid configuration parameter %s" % self._configParam)
-            val = self.getNoneValue()
-        return val
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget overwriting
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def getModelClass(self):
-        return taurus.core.taurusconfiguration.TaurusConfiguration
-
-    def getDisplayValue(self):
-        cfg_value = self.getConfigurationAttributeValue()
-        cfg_value = (self._prefix or '') + (cfg_value or '') + (self._suffix or '')
-        return cfg_value
-
-    def getFormatedToolTip(self,cache=True):
-        obj = self.getModelObj()
-        if obj is None:
-            return Qt.QString.fromLatin1(self.getNoneValue())
-        p = obj.getParentObj()
-        if p is None:
-            return Qt.QString.fromLatin1(self.getNoneValue())
-        return Qt.QString.fromLatin1("<HTML>" + self._configParam + ' for ' + p.getDisplayName())
-    
-    def isReadOnly(self):
-        return True
-    
-    def setStyleSheet(self, ss):
-        ss = str(ss)
-        self._extra_style = ss
-        if not self.getModelValueObj():
-            ss = """TaurusConfigLabel { 
-                background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
-                              stop: 0.00 rgb(240,240,240),
-                              stop: 0.33 rgb(200,200,200),
-                              stop: 0.66 rgb(240,240,240),
-                              stop: 1.00 rgb(200,200,200));
-                color: gray;
-            %s}""" % (ss)
-        else:
-            ss = """TaurusConfigLabel { %s }""" % ss
-        Qt.QLabel.setStyleSheet(self, ss)
-        
-    def updateStyle(self):
-        self.setStyleSheet(self._extra_style)
-        self.updatePendingOpsStyle()
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
-    @Qt.pyqtSignature("setModel(QString)")
-    def setModel(self, model):
-        model = str(model)
-        try:
-            self._configParam = model[model.rfind('=')+1:].lower()
-        except:
-            self._configParam = ''
-        TaurusBaseWidget.setModel(self,model)
-    
-    def getPrefixText(self):
-        return self._prefix
-    
-    @Qt.pyqtSignature("setPrefixText(QString)")
-    def setPrefixText(self,prefix):
-        self._prefix = prefix
-        self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
-
-    def resetPrefixText(self):
-        self.setPrefixText('')
-        
-    def getSuffixText(self):
-        return self._suffix
-    
-    @Qt.pyqtSignature("setSuffixText(QString)")
-    def setSuffixText(self,suffix):
-        self._suffix = suffix
-        self.fireEvent(evt_type = taurus.core.taurusbasetypes.TaurusEventType.Change)
-    
-    def resetSuffixText(self):
-        self.setSuffixText('')
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        return None
-#        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-#        ret['module'] = 'taurus.qt.qtgui.display'
-#        ret['group'] = 'Taurus Widgets [Old]'
-#        ret['icon'] = ":/designer/label.png"
-#        return ret
-    
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, setModel, 
-                            TaurusBaseWidget.resetModel)
-                                
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel, 
-                                     TaurusBaseWidget.setUseParentModel,
-                                     TaurusBaseWidget.resetUseParentModel)
-                                         
-    prefixText = Qt.pyqtProperty("QString", getPrefixText, setPrefixText, 
-                                 resetPrefixText, doc="prefix text (optional)")
-                                     
-    suffixText = Qt.pyqtProperty("QString", getSuffixText, setSuffixText, 
-                                 resetSuffixText, doc="suffix text (optional)")
-
-
-def main():
-    """hello"""
-    import sys
-    import taurus.qt.qtgui.application
-    Application = taurus.qt.qtgui.application.TaurusApplication
-    
-    app = Application.instance()
-    owns_app = app is None
-    
-    if owns_app:
-        import taurus.core.util.argparse
-        parser = taurus.core.util.argparse.get_taurus_parser()
-        parser.usage = "%prog [options] <full configuration_name(s)>"
-        app = Application(sys.argv, cmd_line_parser=parser)
-        
-    args = app.get_command_line_args()
-
-    if len(args) > 0:
-        models = map(str.lower, args)
-    else:
-        models = [ 'sys/tg_test/1/%s?configuration=label' % a for a in ('state', 'status', 'double_scalar' ) ]
-
-    w = Qt.QWidget()
-    layout = Qt.QGridLayout()
-    w.setLayout(layout)
-    for model in models:
-        label = TaurusConfigLabel()
-        label.model = model
-        layout.addWidget(label)
-    w.show()
-    
-    if owns_app:
-        sys.exit(app.exec_())
-    else:
-        return w
-
-if __name__ == '__main__':
-    main()
diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py
index ebd96c5..87cd754 100644
--- a/lib/taurus/qt/qtgui/display/tauruslabel.py
+++ b/lib/taurus/qt/qtgui/display/tauruslabel.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -44,9 +44,9 @@ from taurus.qt.qtgui.base import TaurusConfigurationControllerHelper
 from taurus.qt.qtgui.base import updateLabelBackground
 
 _QT_PLUGIN_INFO = {
-    'module' : 'taurus.qt.qtgui.display',
-    'group' : 'Taurus Display',
-    'icon' : ":/designer/label.png",
+    'module': 'taurus.qt.qtgui.display',
+    'group': 'Taurus Display',
+    'icon': "designer:label.png",
 }
 
 TaurusModelType = TaurusElementType
@@ -54,7 +54,7 @@ EventType = TaurusEventType
 
 
 class TaurusLabelController(TaurusBaseController):
-    
+
     StyleSheetTemplate = "border-style: outset; border-width: 2px; border-color: {0}; {1}"
 
     def __init__(self, label):
@@ -71,7 +71,7 @@ class TaurusLabelController(TaurusBaseController):
             label.setFrameShape(Qt.QFrame.Box)
             label.setFrameShadow(Qt.QFrame.Raised)
             label.setLineWidth(1)
-    
+
     def label(self):
         return self.widget()
 
@@ -82,28 +82,17 @@ class TaurusLabelController(TaurusBaseController):
         label = self.label()
         ret = 'state' in (label.fgRole, label.bgRole)
         return ret
-    
+
     def _updateForeground(self, label):
-        fgRole, value = label.fgRole, ""
-        if fgRole == 'value':
-            value += self.getDisplayValue()
-        elif fgRole == 'w_value':
-            value += self.getDisplayValue(True)
-        elif fgRole == 'state':
-            stateObj = self.stateObj()
-            value += stateObj and stateObj.getDisplayValue() or label.getNoneValue()
-        elif fgRole == 'quality':
-            quality = self.quality()
-            if quality is None:
-                value += label.getNoneValue()
-            else:
-                value += str(quality)
-        elif fgRole in ('', 'none'):
+        fgRole, value = label.fgRole, ''
+
+        # handle special cases (that are not covered with fragment)
+        if fgRole.lower() == 'state':
+            value = self.state().name
+        elif fgRole.lower() in ('', 'none'):
             pass
         else:
-            label.setText("undef")
-            return
-        
+            value = label.getDisplayValue(fragmentName=fgRole)
         self._text = text = label.prefixText + value + label.suffixText
 
         # Checks that the display fits in the widget and sets it to "..." if
@@ -111,14 +100,12 @@ class TaurusLabelController(TaurusBaseController):
         self._trimmedText = self._shouldTrim(label, text)
         if self._trimmedText:
             text = "<a href='...'>...</a>"
-
         label.setText(text)
 
-    
     def _shouldTrim(self, label, text):
         if not label.autoTrim:
             return False
-        text = re.sub(self._trimPattern,'',text)
+        text = re.sub(self._trimPattern, '', text)
         font_metrics = Qt.QFontMetrics(label.font())
         size, textSize = label.size().width(), font_metrics.width(text)
         return textSize > size
@@ -128,12 +115,14 @@ class TaurusLabelController(TaurusBaseController):
             return
         toolTip = label.getFormatedToolTip()
         if self._trimmedText:
-            toolTip = u"<p><b>Value:</b> %s</p><hr>%s" % (unicode(self._text,errors='replace'), unicode(toolTip,errors='replace'))
+            toolTip = u"<p><b>Value:</b> %s</p><hr>%s" %\
+                      (unicode(self._text, errors='replace'),
+                       unicode(str(toolTip), errors='replace'))
         label.setToolTip(toolTip)
 
     _updateBackground = updateLabelBackground
 
-            
+
 class TaurusLabelControllerAttribute(TaurusScalarAttributeControllerHelper, TaurusLabelController):
 
     def __init__(self, label):
@@ -143,9 +132,10 @@ class TaurusLabelControllerAttribute(TaurusScalarAttributeControllerHelper, Taur
     def _setStyle(self):
         TaurusLabelController._setStyle(self)
         label = self.label()
-        label.setDynamicTextInteractionFlags(Qt.Qt.TextSelectableByMouse | Qt.Qt.LinksAccessibleByMouse)
+        label.setDynamicTextInteractionFlags(
+            Qt.Qt.TextSelectableByMouse | Qt.Qt.LinksAccessibleByMouse)
+
 
-        
 class TaurusLabelControllerConfiguration(TaurusConfigurationControllerHelper, TaurusLabelController):
 
     def __init__(self, label):
@@ -163,25 +153,25 @@ class TaurusLabelControllerConfiguration(TaurusConfigurationControllerHelper, Ta
 #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
 class TaurusLabelControllerDesignMode(object):
-    
+
     def _updateLength(self, lcd):
         lcd.setNumDigits(6)
-        
+
     def getDisplayValue(self, write=False):
         v = self.w_value()
         if not write:
             v = self.value()
         return "%6.2f" % v
-    
+
     def value(self):
         return 99.99
-    
+
     def w_value(self):
         return 0.0
-        
+
     def quality(self):
         return PyTango.AttrQuality.ATTR_VALID
-    
+
     def state(self):
         return PyTango.DevState.ON
 
@@ -190,7 +180,7 @@ class TaurusLabelControllerDesignMode(object):
 
 
 class TaurusLabelControllerAttributeDesignMode(TaurusLabelControllerDesignMode, TaurusLabelControllerAttribute):
-    
+
     def __init__(self, label):
         TaurusLabelControllerDesignMode.__init__(self)
         TaurusLabelControllerAttribute.__init__(self, label)
@@ -201,40 +191,43 @@ class TaurusLabelControllerConfigurationDesignMode(TaurusLabelControllerDesignMo
     def __init__(self, label):
         TaurusLabelControllerDesignMode.__init__(self)
         TaurusLabelControllerConfiguration.__init__(self, label)
-    
+
     def getDisplayValue(self, write=False):
         return "%6.2f" % -99.99
-        
+
     def _updateToolTip(self, lcd):
-        lcd.setToolTip("Some random configuration value for design purposes only")
+        lcd.setToolTip(
+            "Some random configuration value for design purposes only")
 
 
 _CONTROLLER_MAP = {
-                         None : None,
-      TaurusModelType.Unknown : None,
-    TaurusModelType.Attribute : TaurusLabelControllerAttribute,
-TaurusModelType.Configuration : TaurusLabelControllerConfiguration,
+    None: None,
+    TaurusModelType.Unknown: None,
+    TaurusModelType.Attribute: TaurusLabelControllerAttribute,
+    TaurusModelType.Configuration: TaurusLabelControllerConfiguration,
 }
 
 _DESIGNER_CONTROLLER_MAP = {
-                         None : TaurusLabelControllerAttributeDesignMode,
-      TaurusModelType.Unknown : TaurusLabelControllerAttributeDesignMode,
-    TaurusModelType.Attribute : TaurusLabelControllerAttributeDesignMode,
-TaurusModelType.Configuration : TaurusLabelControllerConfigurationDesignMode,
+    None: TaurusLabelControllerAttributeDesignMode,
+    TaurusModelType.Unknown: TaurusLabelControllerAttributeDesignMode,
+    TaurusModelType.Attribute: TaurusLabelControllerAttributeDesignMode,
+    TaurusModelType.Configuration: TaurusLabelControllerConfigurationDesignMode,
 }
 
 
 class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
-    
+
     DefaultPrefix = ''
     DefaultSuffix = ''
     DefaultBgRole = 'quality'
-    DefaultFgRole = 'value'
+    DefaultFgRole = 'rvalue'
     DefaultShowText = True
     DefaultModelIndex = None
     DefaultAutoTrim = True
     DefaultAlignment = Qt.Qt.AlignRight | Qt.Qt.AlignVCenter
 
+    _deprecatedRoles = dict(value='rvalue', w_value='wvalue')
+
     def __init__(self, parent=None, designMode=False):
         self._prefix = self.DefaultPrefix
         self._suffix = self.DefaultSuffix
@@ -251,11 +244,10 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
 
         self.setAlignment(self.DefaultAlignment)
 
-        self.connect(self, Qt.SIGNAL("linkActivated (const QString &)"), 
-                     self.showValueDialog)
+        self.linkActivated.connect(self.showValueDialog)
 
         # if we are in design mode there will be no events so we force the
-        # creation of a controller object 
+        # creation of a controller object
         if self._designMode:
             self.controllerUpdate()
 
@@ -263,24 +255,28 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
         ctrl_map = _CONTROLLER_MAP
         if self._designMode:
             ctrl_map = _DESIGNER_CONTROLLER_MAP
-            
+
         model_type = self.getModelType()
+        # ugly workaround to adapt TaurusLabel to tep14 without refactoring
+        # TODO: proper refactoring of TaurusValue to supress the Conf API
+        if model_type == TaurusModelType.Attribute and self.modelFragmentName:
+            model_type = TaurusModelType.Configuration
         ctrl_klass = ctrl_map.get(model_type, TaurusLabelController)
         return ctrl_klass
-    
+
     def controller(self):
         ctrl = self._controller
         # if there is a controller object and it is not the base controller...
         if ctrl is not None and not ctrl.__class__ == TaurusLabelController:
             return ctrl
-        
+
         # if there is a controller object and it is still the same class...
         ctrl_klass = self._calculate_controller_class()
         if ctrl_klass is None:
             return None
         elif ctrl.__class__ == ctrl_klass:
             return ctrl
-    
+
         self._controller = ctrl = ctrl_klass(self)
         return ctrl
 
@@ -288,37 +284,39 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
         ctrl = self.controller()
         if ctrl is not None:
             ctrl.update()
-    
+
     def showValueDialog(self, *args):
         ctrl = self.controller()
         if ctrl is not None:
             ctrl.showValueDialog(self)
 
-    def resizeEvent(self,event):
-    #    # recheck the display every time we resize to make sure the text should
-    #    # become trimmed or not
+    def resizeEvent(self, event):
+        #    # recheck the display every time we resize to make sure the text should
+        #    # become trimmed or not
         if not getattr(self, '_inResize', False):
             self._inResize = True
             self.controllerUpdate()
             self._inResize = False
         Qt.QLabel.resizeEvent(self, event)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
+
     def handleEvent(self, evt_src, evt_type, evt_value):
         ctrl = self.controller()
         if ctrl is not None:
             ctrl.handleEvent(evt_src, evt_type, evt_value)
-    
+
     def isReadOnly(self):
         return True
 
     def setModel(self, m):
-        #force to build another controller
+        # force to build another controller
         self._controller = None
         TaurusBaseWidget.setModel(self, m)
+        if self.modelFragmentName:
+            self.setFgRole(self.modelFragmentName)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # QT property definition
@@ -329,7 +327,7 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
 
     def getModelIndex(self):
         return self._modelIndexStr
-    
+
     def setModelIndex(self, modelIndex):
         mi = str(modelIndex)
         if len(mi) == 0:
@@ -346,7 +344,7 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
             self._modelIndex = mi_value
         self._modelIndexStr = mi
         self.controllerUpdate()
-        
+
     def getModelMimeData(self):
         mimeData = TaurusBaseWidget.getModelMimeData(self)
         mimeData.setText(self.text())
@@ -357,7 +355,7 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
 
     def getBgRole(self):
         return self._bgRole
-    
+
     def setBgRole(self, bgRole):
         self._bgRole = str(bgRole).lower()
         self.controllerUpdate()
@@ -367,38 +365,43 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
 
     def getFgRole(self):
         return self._fgRole
-    
+
     def setFgRole(self, fgRole):
-        self._fgRole = str(fgRole).lower()
+        # warn about deprecated roles
+        role = self._deprecatedRoles.get(fgRole, fgRole)
+        if fgRole != role:
+            self.deprecated(rel='4.0', dep='setFgRole(%s)' % fgRole,
+                            alt='setFgRole(%s)' % role)
+        self._fgRole = str(role)
         self.controllerUpdate()
 
     def resetFgRole(self):
         self.setFgRole(self.DefaultFgRole)
-        
+
     def getPrefixText(self):
         return self._prefix
-    
-    def setPrefixText(self,prefix):
+
+    def setPrefixText(self, prefix):
         self._prefix = str(prefix)
         self.controllerUpdate()
 
     def resetPrefixText(self):
         self.setPrefixText(self.DefaultPrefix)
-        
+
     def getSuffixText(self):
         return self._suffix
-    
-    def setSuffixText(self,suffix):
+
+    def setSuffixText(self, suffix):
         self._suffix = str(suffix)
         self.controllerUpdate()
-    
+
     def resetSuffixText(self):
         self.setSuffixText(self.DefaultSuffix)
 
     def setAutoTrim(self, trim):
         self._autoTrim = trim
         self.controllerUpdate()
-        
+
     def setDynamicTextInteractionFlags(self, flags):
         if self.hasDynamicTextInteractionFlags():
             Qt.QLabel.setTextInteractionFlags(self, flags)
@@ -426,11 +429,11 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
         d.update(_QT_PLUGIN_INFO)
         return d
 
-    #: This property holds the unique URI string representing the model name 
-    #: with which this widget will get its data from. The convention used for 
+    #: This property holds the unique URI string representing the model name
+    #: with which this widget will get its data from. The convention used for
     #: the string can be found :ref:`here <model-concept>`.
-    #: 
-    #: In case the property :attr:`useParentModel` is set to True, the model 
+    #:
+    #: In case the property :attr:`useParentModel` is set to True, the model
     #: text must start with a '/' followed by the attribute name.
     #:
     #: **Access functions:**
@@ -443,7 +446,7 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
     model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, setModel,
                             TaurusBaseWidget.resetModel)
 
-    #: This property holds whether or not this widget should search in the 
+    #: This property holds whether or not this widget should search in the
     #: widget hierarchy for a model prefix in a parent widget.
     #:
     #: **Access functions:**
@@ -453,7 +456,7 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
     #:     * :meth:`TaurusBaseWidget.resetUseParentModel`
     #:
     #: .. seealso:: :ref:`model-concept`
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel, 
+    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
                                      TaurusBaseWidget.setUseParentModel,
                                      TaurusBaseWidget.resetUseParentModel)
 
@@ -467,7 +470,8 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
     #:     * :meth:`TaurusLabel.resetModelIndex`
     #:
     #: .. seealso:: :ref:`model-concept`
-    modelIndex = Qt.pyqtProperty("QString", getModelIndex, setModelIndex, resetModelIndex)
+    modelIndex = Qt.pyqtProperty(
+        "QString", getModelIndex, setModelIndex, resetModelIndex)
 
     #: This property holds a prefix text
     #:
@@ -476,9 +480,9 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
     #:     * :meth:`TaurusLabel.getPrefixText`
     #:     * :meth:`TaurusLabel.setPrefixText`
     #:     * :meth:`TaurusLabel.resetPrefixText`
-    prefixText = Qt.pyqtProperty("QString", getPrefixText, setPrefixText, 
+    prefixText = Qt.pyqtProperty("QString", getPrefixText, setPrefixText,
                                  resetPrefixText, doc="prefix text")
-                                     
+
     #: This property holds a suffix text
     #:
     #: **Access functions:**
@@ -491,7 +495,7 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
 
     #: This property holds the foreground role (the text).
     #: Valid values are:
-    #:  
+    #:
     #:     #. ''/'None' - no value is displayed
     #:     #. 'value' - the value is displayed
     #:     #. 'w_value' - the write value is displayed
@@ -505,7 +509,7 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
     #:     * :meth:`TaurusLabel.resetFgRole`
     fgRole = Qt.pyqtProperty("QString", getFgRole, setFgRole,
                              resetFgRole, doc="foreground role")
-                                     
+
     #: This property holds the background role.
     #: Valid values are ''/'None', 'quality', 'state'
     #:
@@ -517,7 +521,7 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
     bgRole = Qt.pyqtProperty("QString", getBgRole, setBgRole,
                              resetBgRole, doc="background role")
 
-    #: This property holds the 
+    #: This property holds the
     #:
     #: **Access functions:**
     #:
@@ -526,19 +530,19 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
     #:     * :meth:`TaurusLabel.resetAutoTrim`
     autoTrim = Qt.pyqtProperty("bool", getAutoTrim, setAutoTrim,
                                resetAutoTrim, doc="auto trim text")
-    
-    #: This property holds the 
+
+    #: This property holds the
     #:
     #: **Access functions:**
     #:
     #:     * :meth:`TaurusLabel.isDragEnabled`
     #:     * :meth:`TaurusLabel.setDragEnabled`
     #:     * :meth:`TaurusLabel.resetDragEnabled`
-    dragEnabled = Qt.pyqtProperty("bool", TaurusBaseWidget.isDragEnabled, 
+    dragEnabled = Qt.pyqtProperty("bool", TaurusBaseWidget.isDragEnabled,
                                   TaurusBaseWidget.setDragEnabled,
-                                  TaurusBaseWidget.resetDragEnabled, 
+                                  TaurusBaseWidget.resetDragEnabled,
                                   doc="enable dragging")
-    
+
     #: Specifies how the label should interact with user input if it displays
     #: text.
     #:
@@ -549,39 +553,40 @@ class TaurusLabel(Qt.QLabel, TaurusBaseWidget):
     #:     * :meth:`TaurusLabel.resetTextInteractionFlags
     try:
         textInteractionFlags = Qt.pyqtProperty(Qt.Qt.TextInteractionFlag,
-                                   Qt.QLabel.textInteractionFlags,
-                                   setTextInteractionFlags,
-                                   resetTextInteractionFlags,
-                                   doc="Specifies how the label should interact with user input if it displays text.")
-    except TypeError: #Old PyQt4 version only accept strings for the type arg
+                                               Qt.QLabel.textInteractionFlags,
+                                               setTextInteractionFlags,
+                                               resetTextInteractionFlags,
+                                               doc="Specifies how the label should interact with user input if it displays text.")
+    except TypeError:  # Old PyQt4 version only accept strings for the type arg
         textInteractionFlags = Qt.pyqtProperty("int",
-                                   Qt.QLabel.textInteractionFlags,
-                                   setTextInteractionFlags,
-                                   resetTextInteractionFlags,
-                                   doc="Specifies how the label should interact with user input if it displays text.")
+                                               Qt.QLabel.textInteractionFlags,
+                                               setTextInteractionFlags,
+                                               resetTextInteractionFlags,
+                                               doc="Specifies how the label should interact with user input if it displays text.")
+
 
-    
 def demo():
     "Label"
     import demo.tauruslabeldemo
     return demo.tauruslabeldemo.main()
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         import taurus.core.util.argparse
         parser = taurus.core.util.argparse.get_taurus_parser()
-        parser.usage = "%prog [options] <full_attribute_name(s) or full configuration_name(s)>"
-        app = Application(sys.argv, cmd_line_parser=parser, 
+        parser.usage = "%prog [options] <full_attribute_name(s)>"
+        app = Application(sys.argv, cmd_line_parser=parser,
                           app_name="Taurus label demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
-        
+
     args = app.get_command_line_args()
 
     if len(args) == 0:
@@ -597,7 +602,7 @@ def main():
             label.model = model
             layout.addWidget(label)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
@@ -605,4 +610,3 @@ def main():
 
 if __name__ == '__main__':
     main()
-    
diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py
index 4c2a3b9..a8932b4 100644
--- a/lib/taurus/qt/qtgui/display/tauruslcd.py
+++ b/lib/taurus/qt/qtgui/display/tauruslcd.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides a set of basic Taurus widgets based on QLabel"""
+"""This module provides a Taurus widget based on QLCDNumber"""
 
 __all__ = ["TaurusLCD"]
 
@@ -43,9 +43,9 @@ from taurus.qt.qtgui.base import TaurusConfigurationControllerHelper
 from taurus.qt.qtgui.base import updateLabelBackground
 
 _QT_PLUGIN_INFO = {
-    'module' : 'taurus.qt.qtgui.display',
-    'group' : 'Taurus Display',
-    'icon' : ":/designer/lcdnumber.png",
+    'module': 'taurus.qt.qtgui.display',
+    'group': 'Taurus Display',
+    'icon': "designer:lcdnumber.png",
 }
 
 TaurusModelType = TaurusElementType
@@ -55,8 +55,9 @@ EventType = TaurusEventType
 # Controller classes for LCD
 #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
+
 class TaurusLCDController(TaurusBaseController):
-    
+
     def _setStyle(self):
         TaurusBaseController._setStyle(self)
         lcd = self.lcd()
@@ -64,19 +65,19 @@ class TaurusLCDController(TaurusBaseController):
             lcd.setFrameShape(Qt.QFrame.Box)
             lcd.setFrameShadow(Qt.QFrame.Raised)
             lcd.setLineWidth(1)
-    
+
     def lcd(self):
         """Helper method that returns the LCDNumber widget"""
         return self.widget()
-    
+
     def _updateForeground(self, lcd):
         self._updateLength(lcd)
         self._updateValue(lcd)
-        
+
     def _needsStateConnection(self):
         lcd = self.lcd()
         return 'state' in (lcd.fgRole, lcd.bgRole)
-    
+
     def _getCharsToDisplayFromFormat(self, fmt):
         n = ''
         for c in fmt:
@@ -85,7 +86,7 @@ class TaurusLCDController(TaurusBaseController):
             if c.isdigit():
                 n += c
         return int(n)
-    
+
     def _updateLength(self, lcd):
         model = self.modelObj()
         n = 6
@@ -96,11 +97,17 @@ class TaurusLCDController(TaurusBaseController):
         except:
             pass
         lcd.setNumDigits(n)
-        
+
     def _updateValue(self, lcd):
         fgRole, value = lcd.fgRole, ""
         if fgRole == 'value':
-            value += self.getDisplayValue()
+            w = self.getDisplayValue()
+            # @todo: sometimes getDisplayValue called but self.widget() is None.
+            # For the moment it is just protected by substituting the following
+            # line by the ones after it.
+            # value += self.getDisplayValue()
+            if w is not None:
+                value += self.getDisplayValue()
         elif fgRole == 'w_value':
             value += self.getDisplayValue(True)
         elif fgRole in ('', 'none'):
@@ -109,7 +116,7 @@ class TaurusLCDController(TaurusBaseController):
             lcd.display("udef")
             return
         lcd.display(value)
-    
+
     _updateBackground = updateLabelBackground
 
 
@@ -119,6 +126,20 @@ class TaurusLCDControllerAttribute(TaurusScalarAttributeControllerHelper, Taurus
         TaurusScalarAttributeControllerHelper.__init__(self)
         TaurusLCDController.__init__(self, lcd)
 
+    def _getDisplayValue(self, widget, valueObj, idx, write):
+        try:
+            if write:
+                value = valueObj.wvalue.magnitude
+            else:
+                value = valueObj.rvalue.magnitude
+            if idx is not None and len(idx):
+                for i in idx:
+                    value = value[i]
+            if self._last_config_value is None or value is None:
+                return widget.displayValue(value)
+        except Exception, e:
+            return widget.getNoneValue()
+
 
 class TaurusLCDControllerConfiguration(TaurusConfigurationControllerHelper, TaurusLCDController):
 
@@ -135,22 +156,22 @@ class TaurusLCDControllerDesignMode(object):
 
     def _updateLength(self, lcd):
         lcd.setNumDigits(6)
-        
+
     def getDisplayValue(self, write=False):
         v = self.w_value()
         if not write:
             v = self.value()
         return "%6.2f" % v
-    
+
     def value(self):
         return 99.99
-    
+
     def w_value(self):
         return 0.0
-        
+
     def quality(self):
         return PyTango.AttrQuality.ATTR_VALID
-    
+
     def state(self):
         return PyTango.DevState.ON
 
@@ -170,26 +191,27 @@ class TaurusLCDControllerConfigurationDesignMode(TaurusLCDControllerDesignMode,
     def __init__(self, label):
         TaurusLCDControllerDesignMode.__init__(self)
         TaurusLCDControllerConfiguration.__init__(self, label)
-    
+
     def getDisplayValue(self, write=False):
         return "%6.2f" % -99.99
-        
+
     def _updateToolTip(self, lcd):
-        lcd.setToolTip("Some random configuration value for design purposes only")
+        lcd.setToolTip(
+            "Some random configuration value for design purposes only")
+
 
-                
 _CONTROLLER_MAP = {
-                         None : TaurusLCDController,
-      TaurusModelType.Unknown : TaurusLCDController,
-    TaurusModelType.Attribute : TaurusLCDControllerAttribute,
-TaurusModelType.Configuration : TaurusLCDControllerConfiguration,
+    None: TaurusLCDController,
+    TaurusModelType.Unknown: TaurusLCDController,
+    TaurusModelType.Attribute: TaurusLCDControllerAttribute,
+    TaurusModelType.Configuration: TaurusLCDControllerConfiguration,
 }
 
 _DESIGNER_CONTROLLER_MAP = {
-                         None : TaurusLCDControllerAttributeDesignMode,
-      TaurusModelType.Unknown : TaurusLCDControllerAttributeDesignMode,
-    TaurusModelType.Attribute : TaurusLCDControllerAttributeDesignMode,
-TaurusModelType.Configuration : TaurusLCDControllerConfigurationDesignMode,
+    None: TaurusLCDControllerAttributeDesignMode,
+    TaurusModelType.Unknown: TaurusLCDControllerAttributeDesignMode,
+    TaurusModelType.Attribute: TaurusLCDControllerAttributeDesignMode,
+    TaurusModelType.Configuration: TaurusLCDControllerConfigurationDesignMode,
 }
 
 
@@ -197,19 +219,22 @@ def Controller(lcd):
     ctrl_map = _CONTROLLER_MAP
     if lcd._designMode:
         ctrl_map = _DESIGNER_CONTROLLER_MAP
-        
+
     model_type = lcd.getModelType()
     ctrl_klass = ctrl_map.get(model_type, TaurusLCDController)
     return ctrl_klass(lcd)
 
 
 class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
-    
+    """ A Taurus-enabled :class:`Qt.QLCDNumber` widget. Its text can represent
+    either the rvalue or wvalue *magnitude* (or nothing), and the background
+    can colour-code the attribute quality or the device state (or nothing)"""
+
     DefaultBgRole = 'quality'
     DefaultFgRole = 'value'
     DefaultShowText = True
     DefaultModelIndex = None
-    
+
     def __init__(self, parent=None, designMode=False):
         self._bgRole = self.DefaultBgRole
         self._fgRole = self.DefaultFgRole
@@ -221,48 +246,48 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
 
         # if we are in design mode there will be no events so we force the
-        # creation of a controller object 
+        # creation of a controller object
         if self._designMode:
             self.controller().update()
-    
+
     def _calculate_controller_class(self):
         ctrl_map = _CONTROLLER_MAP
         if self._designMode:
             ctrl_map = _DESIGNER_CONTROLLER_MAP
-            
+
         model_type = self.getModelType()
         ctrl_klass = ctrl_map.get(model_type, TaurusLCDController)
         return ctrl_klass
-    
+
     def controller(self):
         ctrl = self._controller
         # if there is a controller object and it is not the base controller...
         if ctrl is not None and not ctrl.__class__ == TaurusLCDController:
             return ctrl
-        
+
         # if there is a controller object and it is still the same class...
         ctrl_klass = self._calculate_controller_class()
         if ctrl is not None and ctrl.__class__ == ctrl_klass:
             return ctrl
-    
+
         self._controller = ctrl = ctrl_klass(self)
         return ctrl
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
+
     def handleEvent(self, evt_src, evt_type, evt_value):
         self.controller().handleEvent(evt_src, evt_type, evt_value)
-    
+
     def isReadOnly(self):
         return True
 
     def setModel(self, m):
-        #force to build another controller
+        # force to build another controller
         self._controller = None
         TaurusBaseWidget.setModel(self, m)
-            
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # QT property definition
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
@@ -272,7 +297,7 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
 
     def getModelIndex(self):
         return self._modelIndexStr
-    
+
     def setModelIndex(self, modelIndex):
         mi = str(modelIndex)
         if len(mi) == 0:
@@ -295,7 +320,7 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
 
     def getBgRole(self):
         return self._bgRole
-    
+
     def setBgRole(self, bgRole):
         self._bgRole = str(bgRole).lower()
         self.controller().update()
@@ -305,7 +330,7 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
 
     def getFgRole(self):
         return self._fgRole
-    
+
     def setFgRole(self, fgRole):
         self._fgRole = str(fgRole).lower()
         self.controller().update()
@@ -318,12 +343,12 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
         d = TaurusBaseWidget.getQtDesignerPluginInfo()
         d.update(_QT_PLUGIN_INFO)
         return d
-        
-    #: This property holds the unique URI string representing the model name 
-    #: with which this widget will get its data from. The convention used for 
+
+    #: This property holds the unique URI string representing the model name
+    #: with which this widget will get its data from. The convention used for
     #: the string can be found :ref:`here <model-concept>`.
-    #: 
-    #: In case the property :attr:`useParentModel` is set to True, the model 
+    #:
+    #: In case the property :attr:`useParentModel` is set to True, the model
     #: text must start with a '/' followed by the attribute name.
     #:
     #: **Access functions:**
@@ -336,7 +361,7 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
     model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, setModel,
                             TaurusBaseWidget.resetModel)
 
-    #: This property holds whether or not this widget should search in the 
+    #: This property holds whether or not this widget should search in the
     #: widget hierarchy for a model prefix in a parent widget.
     #:
     #: **Access functions:**
@@ -346,7 +371,7 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
     #:     * :meth:`TaurusBaseWidget.resetUseParentModel`
     #:
     #: .. seealso:: :ref:`model-concept`
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel, 
+    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
                                      TaurusBaseWidget.setUseParentModel,
                                      TaurusBaseWidget.resetUseParentModel)
 
@@ -360,11 +385,12 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
     #:     * :meth:`TaurusLCD.resetModelIndex`
     #:
     #: .. seealso:: :ref:`model-concept`
-    modelIndex = Qt.pyqtProperty("QString", getModelIndex, setModelIndex, resetModelIndex)
+    modelIndex = Qt.pyqtProperty(
+        "QString", getModelIndex, setModelIndex, resetModelIndex)
 
     #: This property holds the foreground role.
     #: Valid values are:
-    #:  
+    #:
     #:     #. ''/'None' - no value is displayed
     #:     #. 'value' - the value is displayed
     #:     #. 'w_value' - the write value is displayed
@@ -376,7 +402,7 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
     #:     * :meth:`TaurusLCD.resetFgRole`
     fgRole = Qt.pyqtProperty("QString", getFgRole, setFgRole,
                              resetFgRole, doc="foreground role")
-                                     
+
     #: This property holds the background role.
     #: Valid values are ''/'None', 'quality', 'state'
     #:
@@ -388,27 +414,29 @@ class TaurusLCD(Qt.QLCDNumber, TaurusBaseWidget):
     bgRole = Qt.pyqtProperty("QString", getBgRole, setBgRole,
                              resetBgRole, doc="background role")
 
+
 def demo():
     "LCD"
     import demo.tauruslcddemo
     return demo.tauruslcddemo.main()
-    
+
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         import taurus.core.util.argparse
         parser = taurus.core.util.argparse.get_taurus_parser()
-        parser.usage = "%prog [options] <full_attribute_name(s) or full configuration_name(s)>"
+        parser.usage = "%prog [options] <full_attribute_name(s)>"
         app = Application(sys.argv, cmd_line_parser=parser,
                           app_name="Taurus LCD demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
-        
+
     args = app.get_command_line_args()
 
     if len(args) == 0:
@@ -424,7 +452,7 @@ def main():
             label.model = model
             layout.addWidget(label)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
@@ -432,4 +460,3 @@ def main():
 
 if __name__ == '__main__':
     main()
-    
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/display/tauruslcdvalue.py b/lib/taurus/qt/qtgui/display/tauruslcdvalue.py
deleted file mode 100644
index 3661740..0000000
--- a/lib/taurus/qt/qtgui/display/tauruslcdvalue.py
+++ /dev/null
@@ -1,183 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 provides a set of basic Taurus widgets based on QLCDNumber"""
-
-__all__ = ["TaurusLCDValue"]
-
-__docformat__ = 'restructuredtext'
-
-from taurus.external.qt import Qt
-from taurus.qt.qtgui.util import QT_ATTRIBUTE_QUALITY_PALETTE
-from taurus.qt.qtgui.base import TaurusBaseWidget
-
-
-class TaurusLCDValue(Qt.QLCDNumber, TaurusBaseWidget):
-    """
-       A LCD widget displaying a tango attribute value
-       
-       .. deprecated:: 2.0
-           Use :class:`taurus.qt.qtgui.display.TaurusLCD` instead.
-    """
-
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-
-    def __init__(self, parent = None, designMode = False):
-        name = self.__class__.__name__
-
-        self.call__init__wo_kw(Qt.QLCDNumber, parent)
-        self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-        
-        self.defineStyle()
-    
-    def defineStyle(self):
-        self.setFrameShape(Qt.QFrame.Panel)
-        self.setFrameShadow(Qt.QFrame.Raised)
-        self.setSmallDecimalPoint(True)
-        self.setMode(Qt.QLCDNumber.Dec)
-        self.setSegmentStyle(Qt.QLCDNumber.Filled)
-        self.updateStyle()
-    
-    # The minimum size of the widget (a limit for the user)
-    def minimumSizeHint(self):
-        return Qt.QSize(80, 40)
-    
-    # The default size of the widget
-    #def sizeHint(self):
-    #    return Qt.QSize(100, 32)
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget over writing
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def getModelClass(self):
-        import taurus.core
-        return taurus.core.taurusattribute.TaurusAttribute
-        
-    def isReadOnly(self):
-        return True
-        
-    def getCharsToDisplayFromFormat(self,fmt):
-        n = ''
-        for c in fmt:
-            if c == '.':
-                break
-            if c.isdigit():
-                n += c
-        return int(n)
-    
-    def updateStyle(self):
-        n = 6
-        model = self.getModelObj()
-        if not model is None:
-            fmt = model.getFormat()
-            if fmt:
-                n = self.getCharsToDisplayFromFormat(fmt)
-        
-        if n != self.numDigits():
-            self.setNumDigits(n)
-        
-        self.setAutoFillBackground(self.getShowQuality())
-        
-        if self.getShowQuality():
-            v = self.getModelValueObj()
-            quality = None
-            if v:
-                quality = v.quality
-            bg_brush, fg_brush = QT_ATTRIBUTE_QUALITY_PALETTE.qbrush(quality)
-            palette = self.palette()
-            palette.setBrush(Qt.QPalette.Window,bg_brush)
-            palette.setBrush(Qt.QPalette.WindowText,fg_brush)
-        else:
-            palette = self.palette()
-            palette.setBrush(Qt.QPalette.Window, Qt.Qt.white)
-            palette.setBrush(Qt.QPalette.WindowText, Qt.Qt.black)
-        self.update()
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        return None
-#        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-#        ret['module'] = 'taurus.qt.qtgui.display'
-#        ret['group'] = 'Taurus Widgets [Old]'
-#        ret['icon'] = ":/designer/lcdnumber.png"
-#        return ret
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
-                            TaurusBaseWidget.setModel,
-                            TaurusBaseWidget.resetModel)
-                                
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
-                                     TaurusBaseWidget.setUseParentModel,
-                                     TaurusBaseWidget.resetUseParentModel)
-    
-    showQuality = Qt.pyqtProperty("bool", TaurusBaseWidget.getShowQuality, 
-                                  TaurusBaseWidget.setShowQuality,
-                                  TaurusBaseWidget.resetShowQuality)
-
-def main():
-    """hello"""
-    import sys
-    import taurus.qt.qtgui.application
-    Application = taurus.qt.qtgui.application.TaurusApplication
-    
-    app = Application.instance()
-    owns_app = app is None
-    
-    if owns_app:
-        import taurus.core.util.argparse
-        parser = taurus.core.util.argparse.get_taurus_parser()
-        parser.usage = "%prog [options] <full_attribute_name>"
-        app = Application(sys.argv, cmd_line_parser=parser)
-        
-    args = app.get_command_line_args()
-
-    if len(args) > 0:
-        args = map(str.lower, args)
-    else:
-        args = [ 'sys/tg_test/1/double_scalar' ]
-
-    w = Qt.QWidget()
-    w.setAutoFillBackground(True)
-    layout = Qt.QGridLayout()
-    layout.setContentsMargins(0,0,0,0)
-    layout.setSpacing(0)
-    w.setLayout(layout)
-    lcd = TaurusLCDValue(w)
-    lcd.model = args[0]
-    layout.addWidget(lcd)
-    w.show()
-    
-    if owns_app:
-        sys.exit(app.exec_())
-    else:
-        return w
-        
-if __name__ == "__main__":
-    main()
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/display/taurusled.py b/lib/taurus/qt/qtgui/display/taurusled.py
index 1d8ceac..21eaedd 100644
--- a/lib/taurus/qt/qtgui/display/taurusled.py
+++ b/lib/taurus/qt/qtgui/display/taurusled.py
@@ -3,24 +3,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,79 +35,72 @@ import operator
 
 from taurus.external.qt import Qt
 
-# Shame on me!!!!
-import PyTango
-
-State = PyTango.DevState
-DataFormat = PyTango.AttrDataFormat
-Quality = PyTango.AttrQuality
+from taurus.core import DataFormat, AttrQuality
+from taurus.core.tango import DevState
 
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from qled import QLed
 
 _QT_PLUGIN_INFO = {
-    'module' : 'taurus.qt.qtgui.display',
-    'group' : 'Taurus Display',
-    'icon' : ":/designer/ledgreen.png",
+    'module': 'taurus.qt.qtgui.display',
+    'group': 'Taurus Display',
+    'icon': "designer:ledgreen.png",
 }
 
 
 class _TaurusLedController(object):
 
     #            key     status,     color, inTrouble
-    LedMap = {  True : (   True,    "green",    False),
-               False : (  False,    "black",    False),
-                None : (  False,    "black",     True) }
+    LedMap = {True: (True,    "green",    False),
+              False: (False,    "black",    False),
+              None: (False,    "black",     True)}
 
     LedQualityMap = {
-        Quality.ATTR_ALARM : (   True,   "orange",    False),
-     Quality.ATTR_CHANGING : (   True,     "blue",    False),
-      Quality.ATTR_INVALID : (   True,      "red",    False),
-        Quality.ATTR_VALID : (   True,    "green",    False),
-      Quality.ATTR_WARNING : (   True,   "orange",    False),
-                      None : (  False,    "black",     True) }
-    
+        AttrQuality.ATTR_ALARM: (True,   "orange",    False),
+        AttrQuality.ATTR_CHANGING: (True,     "blue",    False),
+        AttrQuality.ATTR_INVALID: (True,      "red",    False),
+        AttrQuality.ATTR_VALID: (True,    "green",    False),
+        AttrQuality.ATTR_WARNING: (True,   "orange",    False),
+        None: (False,    "black",     True)}
+
     def __init__(self, widget):
         self._widget = weakref.ref(widget)
 
     def widget(self):
         return self._widget()
-    
+
     def modelObj(self):
         return self.widget().getModelObj()
 
-    def valueObj(self):
-        modelObj = self.modelObj()
-        if modelObj is None: return None
-        return modelObj.getValueObj()
-    
     def value(self):
-        widget, obj = self.widget(), self.valueObj()
+        widget, obj = self.widget(), self.modelObj()
         fgRole = widget.fgRole
         value = None
-        if fgRole == 'value':
-            value = obj.value
-        elif fgRole == 'w_value':
-            value = obj.w_value
+        if fgRole == 'rvalue':
+            value = obj.rvalue
+        elif fgRole == 'wvalue':
+            value = obj.wvalue
         elif fgRole == 'quality':
             return obj.quality
-        
+
         # handle 1D and 2D values
-        if obj.data_format == DataFormat.SCALAR: return value
-        
+        if obj.data_format == DataFormat._0D:
+            return value
+
         idx = widget.getModelIndexValue()
         if idx is None or len(idx) == 0:
             return value
 
-        for i in idx: value = value[i]
+        for i in idx:
+            value = value[i]
         return value
-    
+
     def usePreferedColor(self, widget):
         return True
-    
+
     def handleEvent(self, evt_src, evt_type, evt_value):
         self.update()
-    
+
     def update(self):
         widget = self.widget()
 
@@ -149,7 +142,7 @@ class _TaurusLedController(object):
 
 
 class _TaurusLedControllerBool(_TaurusLedController):
-    
+
     def usePreferedColor(self, widget):
         # use prefered widget color if representing the boolean read or write
         # value. If representing the quality, use the quality map
@@ -157,30 +150,31 @@ class _TaurusLedControllerBool(_TaurusLedController):
 
 
 class _TaurusLedControllerState(_TaurusLedController):
-    
+
     #                key      status,       color, inTrouble
-    LedMap = {    State.ON : (   True,    "green",    False),
-                 State.OFF : (  False,    "black",    False),
-               State.CLOSE : (   True,    "white",    False),
-                State.OPEN : (   True,    "green",    False),
-              State.INSERT : (   True,    "green",    False),
-             State.EXTRACT : (   True,    "green",    False),
-              State.MOVING : (   True,     "blue",    False),
-             State.STANDBY : (   True,   "yellow",    False),
-               State.FAULT : (   True,      "red",    False),
-                State.INIT : (   True,   "yellow",    False),
-             State.RUNNING : (   True,     "blue",    False),
-               State.ALARM : (   True,   "orange",    False),
-             State.DISABLE : (   True,  "magenta",    False),
-             State.UNKNOWN : (  False,    "black",    False),
-                      None : (  False,    "black",     True) }
-    
+    LedMap = {DevState.ON: (True,    "green",    False),
+              DevState.OFF: (False,    "black",    False),
+              DevState.CLOSE: (True,    "white",    False),
+              DevState.OPEN: (True,    "green",    False),
+              DevState.INSERT: (True,    "green",    False),
+              DevState.EXTRACT: (True,    "green",    False),
+              DevState.MOVING: (True,     "blue",    False),
+              DevState.STANDBY: (True,   "yellow",    False),
+              DevState.FAULT: (True,      "red",    False),
+              DevState.INIT: (True,   "yellow",    False),
+              DevState.RUNNING: (True,     "blue",    False),
+              DevState.ALARM: (True,   "orange",    False),
+              DevState.DISABLE: (True,  "magenta",    False),
+              DevState.UNKNOWN: (False,    "black",    False),
+              None: (False,    "black",     True)}
+
     def usePreferedColor(self, widget):
         # never use prefered widget color. Use always the map
         return False
 
+
 class _TaurusLedControllerDesignMode(_TaurusLedController):
-    
+
     def _updateDisplay(self, widget):
         widget.ledStatus = True
         if widget.ledStatus:
@@ -188,21 +182,23 @@ class _TaurusLedControllerDesignMode(_TaurusLedController):
         else:
             widget.ledColor = widget.offColor
         widget.setAutoFillBackground(False)
-    
+
     def _updateToolTip(self, widget):
         widget.setToolTip("Design mode TaurusLed")
 
 
 class TaurusLed(QLed, TaurusBaseWidget):
-    """A widget designed to represent with a LED image the state of a device, 
+    """A widget designed to represent with a LED image the state of a device,
     the value of a boolean attribute or the quality of an attribute."""
-    
+
     DefaultModelIndex = None
-    DefaultFgRole = 'value'
+    DefaultFgRole = 'rvalue'
     DefaultOnColor = "green"
     DefaultOffColor = "black"
-    
-    def __init__(self, parent = None, designMode = False):
+
+    _deprecatedRoles = dict(value='rvalue', w_value='wvalue')
+
+    def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self._designMode = designMode
         self._modelIndex = self.DefaultModelIndex
@@ -213,15 +209,15 @@ class TaurusLed(QLed, TaurusBaseWidget):
         self._controller = None
         self.call__init__wo_kw(QLed, parent)
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-        
+
         # if we are in design mode there will be no events so we force the
-        # creation of a controller object 
+        # creation of a controller object
         if self._designMode:
             self.controller().update()
-            
+
     def _calculate_controller_class(self):
         model = self.getModelObj()
-        
+
         klass = _TaurusLedController
         if self._designMode:
             klass = _TaurusLedControllerDesignMode
@@ -238,50 +234,54 @@ class TaurusLed(QLed, TaurusBaseWidget):
         # if there is a controller object and it is not the base controller...
         if ctrl is not None and not ctrl.__class__ == _TaurusLedController:
             return ctrl
-        
+
         # if there is a controller object and it is still the same class...
         ctrl_klass = self._calculate_controller_class()
         if ctrl is not None and ctrl.__class__ == ctrl_klass:
             return ctrl
-    
+
         self._controller = ctrl = ctrl_klass(self)
         return ctrl
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
+
     def handleEvent(self, evt_src, evt_type, evt_value):
         self.controller().handleEvent(evt_src, evt_type, evt_value)
-    
+
     def isReadOnly(self):
         return True
 
     def setModel(self, m):
-        #force to build another controller
+        # force to build another controller
         self._controller = None
         TaurusBaseWidget.setModel(self, m)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # QT property definition
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getFgRole(self):
         return self._fgRole
-    
+
     def setFgRole(self, fgRole):
-        self._fgRole = str(fgRole).lower()
+        role = self._deprecatedRoles.get(fgRole, fgRole)
+        if fgRole != role:
+            self.deprecated(rel='4.0', dep='setFgRole(%s)' % fgRole,
+                            alt='setFgRole(%s)' % role)
+        self._fgRole = str(role)
         self.controller().update()
 
     def resetFgRole(self):
         self.setFgRole(self.DefaultFgRole)
-        
+
     def getOnColor(self):
         """Returns the preferred led on color
         :return: led on color
         :rtype: str"""
         return self._onColor
-        
+
     def setOnColor(self, color):
         """Sets the preferred led on color
         :param status: the new on color
@@ -291,7 +291,7 @@ class TaurusLed(QLed, TaurusBaseWidget):
             raise Exception("Invalid color '%s'" % color)
         self._onColor = color
         self.controller().update()
-    
+
     def resetOnColor(self):
         """Resets the preferred led on color"""
         self.setOnColor(self.DefaultOnColor)
@@ -301,7 +301,7 @@ class TaurusLed(QLed, TaurusBaseWidget):
         :return: led off color
         :rtype: str"""
         return self._offColor
-        
+
     def setOffColor(self, color):
         """Sets the preferred led off color
         :param status: the new off color
@@ -311,7 +311,7 @@ class TaurusLed(QLed, TaurusBaseWidget):
             raise Exception("Invalid color '%s'" % color)
         self._offColor = color
         self.controller().update()
-    
+
     def resetOffColor(self):
         """Resets the preferred led color"""
         self.setOffColor(self.DefaultOffColor)
@@ -321,7 +321,7 @@ class TaurusLed(QLed, TaurusBaseWidget):
 
     def getModelIndex(self):
         return self._modelIndexStr
-    
+
     def setModelIndex(self, modelIndex):
         mi = str(modelIndex)
         if len(mi) == 0:
@@ -348,11 +348,11 @@ class TaurusLed(QLed, TaurusBaseWidget):
         d.update(_QT_PLUGIN_INFO)
         return d
 
-    #: This property holds the unique URI string representing the model name 
-    #: with which this widget will get its data from. The convention used for 
+    #: This property holds the unique URI string representing the model name
+    #: with which this widget will get its data from. The convention used for
     #: the string can be found :ref:`here <model-concept>`.
-    #: 
-    #: In case the property :attr:`useParentModel` is set to True, the model 
+    #:
+    #: In case the property :attr:`useParentModel` is set to True, the model
     #: text must start with a '/' followed by the attribute name.
     #:
     #: **Access functions:**
@@ -365,7 +365,7 @@ class TaurusLed(QLed, TaurusBaseWidget):
     model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, setModel,
                             TaurusBaseWidget.resetModel)
 
-    #: This property holds whether or not this widget should search in the 
+    #: This property holds whether or not this widget should search in the
     #: widget hierarchy for a model prefix in a parent widget.
     #:
     #: **Access functions:**
@@ -375,7 +375,7 @@ class TaurusLed(QLed, TaurusBaseWidget):
     #:     * :meth:`TaurusBaseWidget.resetUseParentModel`
     #:
     #: .. seealso:: :ref:`model-concept`
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel, 
+    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
                                      TaurusBaseWidget.setUseParentModel,
                                      TaurusBaseWidget.resetUseParentModel)
 
@@ -394,7 +394,7 @@ class TaurusLed(QLed, TaurusBaseWidget):
 
     #: This property holds the foreground role.
     #: Valid values are:
-    #:  
+    #:
     #:     #. 'value' - the value is used
     #:     #. 'w_value' - the write value is used
     #:     #. 'quality' - the quality is used
@@ -406,7 +406,7 @@ class TaurusLed(QLed, TaurusBaseWidget):
     #:     * :meth:`TaurusLed.resetFgRole`
     fgRole = Qt.pyqtProperty("QString", getFgRole, setFgRole,
                              resetFgRole, doc="foreground role")
-                             
+
     #: This property holds the preferred led color
     #: This value is used for the cases where the model value does not contain
     #: enough information to distinguish between different On colors.
@@ -420,7 +420,7 @@ class TaurusLed(QLed, TaurusBaseWidget):
     #:     * :meth:`TaurusLed.setOnColor`
     #:     * :meth:`TaurusLed.resetOnColor`
     onColor = Qt.pyqtProperty("QString", getOnColor, setOnColor, resetOnColor,
-                               doc="preferred led On color")
+                              doc="preferred led On color")
 
     #: This property holds the preferred led color
     #: This value is used for the cases where the model value does not contain
@@ -437,23 +437,25 @@ class TaurusLed(QLed, TaurusBaseWidget):
     offColor = Qt.pyqtProperty("QString", getOffColor, setOffColor, resetOffColor,
                                doc="preferred led Off color")
 
+
 def demo():
     "Led"
     import demo.taurusleddemo
     return demo.taurusleddemo.main()
-    
+
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         import taurus.core.util.argparse
         parser = taurus.core.util.argparse.get_taurus_parser()
-        parser.usage = "%prog [options] <full_attribute_name(s) or full configuration_name(s)>"
+        parser.usage = "%prog [options] <full_attribute_name(s)>"
         app = Application(sys.argv, cmd_line_parser=parser,
                           app_name="Taurus led demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
@@ -473,7 +475,7 @@ def main():
             led.model = model
             layout.addWidget(led)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
diff --git a/lib/taurus/qt/qtgui/display/taurusstateled.py b/lib/taurus/qt/qtgui/display/taurusstateled.py
deleted file mode 100644
index d978ec2..0000000
--- a/lib/taurus/qt/qtgui/display/taurusstateled.py
+++ /dev/null
@@ -1,190 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 provides a set of basic Taurus widgets based on QLabel"""
-
-__all__ = ["TaurusStateLed"]
-
-__docformat__ = 'restructuredtext'
-
-# ugly
-import PyTango
-
-from taurus.core.taurusbasetypes import TaurusEventType
-from taurus.external.qt import Qt
-from taurus.qt.qtgui.base import TaurusBaseWidget
-from qled import LedStatus, LedColor
-from qled import QLedOld as QLed
-
-
-class TaurusStateLed(QLed, TaurusBaseWidget):
-    """
-       A led widget displaying the state tango attribute value
-    
-       .. deprecated:: 2.0
-           Use :class:`taurus.qt.qtgui.display.TaurusLed` instead.
-    """
-
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-
-    DEVICE_STATE_DATA = {
-        PyTango.DevState.ON      : (LedStatus.ON,   LedColor.GREEN),
-        PyTango.DevState.OFF     : (LedStatus.OFF,  LedColor.GREEN),
-        PyTango.DevState.CLOSE   : (LedStatus.ON,   LedColor.GREEN),
-        PyTango.DevState.OPEN    : (LedStatus.ON,   LedColor.GREEN),
-        PyTango.DevState.INSERT  : (LedStatus.ON,   LedColor.GREEN),
-        PyTango.DevState.EXTRACT : (LedStatus.ON,   LedColor.GREEN),
-        PyTango.DevState.MOVING  : (LedStatus.ON,   LedColor.BLUE),
-        PyTango.DevState.STANDBY : (LedStatus.ON,   LedColor.YELLOW),
-        PyTango.DevState.FAULT   : (LedStatus.ON,   LedColor.RED),
-        PyTango.DevState.INIT    : (LedStatus.ON,   LedColor.YELLOW),
-        PyTango.DevState.RUNNING : (LedStatus.ON,   LedColor.BLUE),
-        PyTango.DevState.ALARM   : (LedStatus.ON,   LedColor.ORANGE),
-        PyTango.DevState.DISABLE : (LedStatus.OFF,  LedColor.ORANGE),
-        PyTango.DevState.UNKNOWN : (LedStatus.OFF,  LedColor.BLUE),
-        None                     : (LedStatus.OFF,  LedColor.RED)}
-
-    def __init__(self, parent = None, designMode = False):
-        name = self.__class__.__name__
-        self._boolIndex = 0
-        self.call__init__wo_kw(QLed, parent)
-        self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-
-    # The default size of the widget
-    def sizeHint(self):
-        return Qt.QSize(24, 24)
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget overwritting
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    def getModelClass(self):
-        import taurus.core
-        return taurus.core.taurusattribute.TaurusAttribute
-
-    def isReadOnly(self):
-        return True
-
-    def getFormatedToolTip(self, cache=True):
-        """ The tooltip should refer to the device and not the state attribute.
-            That is why this method is being rewritten
-        """
-        if self.modelObj is None:
-            return self.getNoneValue()
-        parent = self.modelObj.getParentObj()
-        if parent is None:
-            return self.getNoneValue()
-        return self.toolTipObjToStr( parent.getDisplayDescrObj() )
-
-    def handleEvent(self, evt_src, evt_type, evt_value):
-
-        if evt_type == TaurusEventType.Error:
-            self._setProblemsBackground(True)
-            self.updateStyle()
-            return
-        self._setProblemsBackground(False)
-    
-        v = getattr(evt_value, 'value',                                  
-                    getattr(self.getModelValueObj(), 'value', None)) #tries to get the value from the event itself, and asks if not
-
-        if evt_value.data_format == PyTango.AttrDataFormat.SPECTRUM:
-            v = v[self.boolIndex]
-
-        onOff,state = TaurusStateLed.DEVICE_STATE_DATA[v]
-        if onOff == LedStatus.OFF:
-            self.off()
-        else:
-            self.on()
-        self.changeColor(state)
-        
-        #update tooltip
-        self.setToolTip(self.getFormatedToolTip())
-        
-        #TODO: update whatsThis
-        
-        #update appearance
-        self.updateStyle()
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        return None
-#        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-#        ret['group'] = 'Taurus Widgets [Old]'
-#        ret['module'] = 'taurus.qt.qtgui.display'
-#        ret['icon'] = ":/designer/ledred.png"
-#        return ret
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    def getBoolIndex(self):
-        return self._boolIndex
-
-    @Qt.pyqtSignature("setBoolIndex(int)")
-    def setBoolIndex(self,i):
-        self._boolIndex = i
-
-    def resetBoolIndex(self):
-        self.setBoolIndex(0)
-        
-    def getLedSize(self):
-        return self.ledsize
-
-    @Qt.pyqtSignature("setLedSize(QString)")
-    def setLedSize(self,size):
-        self.changeSize(size)
-
-    def resetLedSize(self,size):
-        self.changeSize('24')
-
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
-                            TaurusBaseWidget.setModel,
-                            TaurusBaseWidget.resetModel)
-
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
-                                     TaurusBaseWidget.setUseParentModel,
-                                     TaurusBaseWidget.resetUseParentModel)
-
-    ledSize = Qt.pyqtProperty("int", getLedSize, setLedSize, resetLedSize,
-                              doc='valid values as 24 and 48')
-
-    boolIndex = Qt.pyqtProperty("int", getBoolIndex, setBoolIndex, resetBoolIndex)
-
-
-if __name__ == "__main__":
-    import sys
-    app = Qt.QApplication(sys.argv)
-    
-    model = 'sys/tg_test/1/state'
-    if len(sys.argv)>1: model=sys.argv[1]
-    
-    w = TaurusStateLed()
-    w.setModel(model)    
-    w.setVisible(True)
-    
-    sys.exit(app.exec_())
-
diff --git a/lib/taurus/qt/qtgui/display/taurusvaluelabel.py b/lib/taurus/qt/qtgui/display/taurusvaluelabel.py
deleted file mode 100644
index 325d621..0000000
--- a/lib/taurus/qt/qtgui/display/taurusvaluelabel.py
+++ /dev/null
@@ -1,419 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 provides a set of basic Taurus widgets based on QLabel"""
-
-__all__ = ["TaurusStateLabel", "TaurusValueLabel"]
-
-__docformat__ = 'restructuredtext'
-
-from taurus.external.qt import Qt
-
-import taurus.core
-from taurus.qt.qtgui.util import QT_ATTRIBUTE_QUALITY_PALETTE, QT_DEVICE_STATE_PALETTE
-from taurus.qt.qtgui.base import TaurusBaseWidget
-
- 
-class TaurusValueLabel(Qt.QLabel, TaurusBaseWidget):
-    """
-    A widget that represents the read value of an attribute.
-
-    .. deprecated::
-        Use :class:`taurus.qt.qtgui.display.TaurusLabel` instead.
-
-    The following features are present:
-    
-        * The background color changes with the attribute quality according to the :ref:`color-guide`
-        * The attribute value is displayed according to the attribute format
-        * Supports all data types and formats (although it is designed mainly for SCALAR format)
-        * A tooltip is automatically generated displaying additional attribute information
-        * If the size of the widget is too small to display the entire value, the text changes to
-          a symbolic link that opens a dialog with the attribute value when clicked
-    
-    This widget emits the following signals (excluding signals of the super classes):
-    
-    **modelChanged**:
-        - *Signature*: ``modelChanged(const QString &) -> None``
-        - *Description*: the signal is emmited when the model for this widget 
-          changes either by direct model manipulation, change of the useParentModel 
-          and change of the parent model (if useParentModel is set to True)
-    
-    Example::
-    
-        import sys
-        from taurus.external.qt import Qt
-        from taurus.qt.qtgui.display import TaurusValueLabel
-
-        app = Qt.QApplication(sys.argv)
-
-        w = TaurusValueLabel()
-        w.model = 'sys/taurustest/1/position'
-
-        w.setVisible(True)
-        sys.exit(app.exec_())
-
-    .. image:: /_static/label01.png
-        :align: center
-
-    """
-    
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-    
-    def __init__(self, parent = None, designMode = False, background = 'quality'):
-        name = self.__class__.__name__
-
-        self.call__init__wo_kw(Qt.QLabel, parent)
-        self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-
-        self.setSizePolicy(Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Preferred)
-        self.setTextInteractionFlags (Qt.Qt.TextSelectableByMouse|Qt.Qt.LinksAccessibleByMouse)
-        self.setAlignment(Qt.Qt.AlignRight|Qt.Qt.AlignTrailing|Qt.Qt.AlignVCenter)
-        self._charWidth = self.font().pointSize()
-        self._showState = False
-        self._showValueStateAsBackground = False
-        self.defineBackground(background)
-        self.connect(self, Qt.SIGNAL("linkActivated (const QString&)"), self.showFullValueDialog)
-        self._text = ''
-    
-    def defineBackground(self, background):
-        background = str(background).lower()
-        self.setShowQuality(background == 'quality')
-        self.setShowState(background == 'state')
-        self.setShowValueStateAsBackground(background == 'value_state')
-        self.__background = background;
-        
-    # The minimum size of the widget (a limit for the user)
-    def minimumSizeHint(self):
-        return Qt.QSize(20, 20)
-        
-#    # The default size of the widget
-#    def sizeHint(self):
-#        return Qt.QSize(60, 22)
-#        #return Qt.QSize(Qt.QLabel.sizeHint(self).width(), 24)
-    
-    def _stateListener(self, s, t, v):
-        # this method exists to force state to have at least one listener
-        # when showState is set to True 
-        pass
-    
-    @Qt.pyqtSignature("setShowState(bool)")
-    def setShowState(self, showState):
-        '''Whether or not to show the device state as background color.
-        Note: obviously, setShowState(True) forces setShowQuality(False) !'''
-        if showState == self._showState:
-            return
-        if showState and self.getShowQuality():
-            self.setShowQuality(False)
-        self._showState = showState
-        
-        modelObj = self.getModelObj()
-        if modelObj is not None:
-            s = modelObj.getParent().getStateObj()
-            if showState:
-                s.addListener(self._stateListener)
-            else:
-                s.removeListener(self._stateListener)
-            
-        self.updateStyle()
-    
-    def getShowState(self):
-        """either or not to show the state as a background color"""
-        return self._showState
-
-    def resetShowState(self):
-        self.setShowState(False)
-    
-    @Qt.pyqtSignature("setShowValueStateAsBackground(bool)")
-    def setShowValueStateAsBackground(self, showState):
-        '''Whether or not to show the value as background color.
-        The attribute value must be a state!
-        Note: obviously, forces setShowState(False) and setShowQuality(False)
-    '''
-        if showState:
-            self.setShowQuality(False)
-            self.setShowState(False)
-        self._showValueStateAsBackground = showState
-
-    def getShowValueStateAsBackground(self):
-        """either or not to show the state as a background color"""
-        return self._showValueStateAsBackground
-
-    def resetShowValueStateAsBackground(self):
-        self.setShowValueStateAsBackground(False)
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget overwriting
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def getModelClass(self):
-        return taurus.core.taurusattribute.TaurusAttribute
-
-    def isReadOnly(self):
-        return True
-    
-    def updateStyle(self, extra=''):
-        if self.getShowQuality():
-            quality = getattr(self.getModelValueObj(), 'quality', None)
-            ss = QT_ATTRIBUTE_QUALITY_PALETTE.qtStyleSheet(quality)
-        elif self.getShowState():
-            try: state = self.getModelObj().getParent().getState()
-            except Exception:
-                state = None
-            ss = QT_DEVICE_STATE_PALETTE.qtStyleSheet(state)
-        elif self.getShowValueStateAsBackground():
-            value = getattr(self.getModelValueObj(), 'value', None)
-            ss = QT_DEVICE_STATE_PALETTE.qtStyleSheet(value)
-        else:
-            ss = "background-color: transparent; color:black;"
-        ss = """TaurusValueLabel {
-            border-style: outset;
-            border-width: 2px;
-            border-color: rgba(255,255,255,128);
-            %s %s}""" % (ss, extra)
-        self.setStyleSheet(ss)
-        TaurusBaseWidget.updateStyle(self)
-
-    def validateDisplay(self):
-        '''Checks that the display fits in the widget and sets it to "..." if it does not'''
-        trimmedtext = "<a href='...'>...</a>"
-        self._text = self.text()
-        if Qt.QLabel.sizeHint(self).width() > self.size().width():
-            self.setToolTip(self.getFormatedToolTip(showValue=True) )
-            self._setText(trimmedtext)
-            self.updateStyle()
-            return False
-        return True
-    
-    def getFormatedToolTip(self,cache=True, showValue=False):
-        ret = TaurusBaseWidget.getFormatedToolTip(self,cache=cache)
-        if showValue:
-            ret = u"<p><b>Value:</b> %s</p><hr>%s"%(self._text, ret)
-        return Qt.QString(ret)
-    
-    def showFullValueDialog(self,*args):
-        Qt.QMessageBox.about(self,  "Full text", self._text)
-    
-    def handleEvent(self, evt_src, evt_type, evt_value):
-        '''reimplemented to check that the display fits the size each time that the value changes'''
-        TaurusBaseWidget.handleEvent(self, evt_src, evt_type, evt_value)
-        self.validateDisplay()
-    
-    def resizeEvent(self,event):
-        #We recheck the Display every time we resize
-        self.updateStyle()
-        self.setText(self._text) #We set the original (untrimmed) text to force a validation from scratch.
-        self.validateDisplay()
-        Qt.QLabel.resizeEvent(self,event)
-    
-    def setModel(self, m):
-        oldModelObj = self.getModelObj()
-
-        TaurusBaseWidget.setModel(self, m)
-
-        newModelObj = self.getModelObj()
-        if self.getShowState():
-            if oldModelObj is not None:
-                s = oldModelObj.getParent().getStateObj()
-                s.removeListener(self._stateListener)
-            if newModelObj is not None:
-                s = newModelObj.getParent().getStateObj()
-                s.addListener(self._stateListener)
-        
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        return None
-#        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-#        ret['module'] = 'taurus.qt.qtgui.display'
-#        ret['group'] = 'Taurus Widgets [Old]'
-#        ret['icon'] = ":/designer/label.png"
-#        return ret
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT property definition
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    #: This property holds the unique URI string representing the model name 
-    #: with which this widget will get its data from. The convention used for 
-    #: the string can be found :ref:`here <model-concept>`.
-    #: 
-    #: In case the property :attr:`useParentModel` is set to True, the model 
-    #: text must start with a '/' followed by the attribute name.
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`TaurusBaseWidget.getModel`
-    #:     * :meth:`TaurusValueLabel.setModel`
-    #:     * :meth:`TaurusBaseWidget.resetModel`
-    #:
-    #: .. seealso:: :ref:`model-concept`
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,setModel,
-                            TaurusBaseWidget.resetModel)
-    
-    #: This property holds whether or not this widget should search in the 
-    #: widget hierarchy for a model prefix in a parent widget.
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`TaurusBaseWidget.getUseParentModel`
-    #:     * :meth:`TaurusBaseWidget.setUseParentModel`
-    #:     * :meth:`TaurusBaseWidget.resetUseParentModel`
-    #:
-    #: .. seealso:: :ref:`model-concept`
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel, 
-                                     TaurusBaseWidget.setUseParentModel,
-                                     TaurusBaseWidget.resetUseParentModel)
-
-    #: This property holds whether or not this widget should fill the background
-    #: with the attribute quality/device state according to the 
-    #: :ref:`color-guide`
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`TaurusBaseWidget.getShowQuality`
-    #:     * :meth:`TaurusBaseWidget.setShowQuality`
-    #:     * :meth:`TaurusBaseWidget.resetShowQuality`
-    #:
-    #: .. seealso:: :ref:`color-guide`
-    showQuality = Qt.pyqtProperty("bool", TaurusBaseWidget.getShowQuality,
-                                  TaurusBaseWidget.setShowQuality,
-                                  TaurusBaseWidget.resetShowQuality)
-    
-    #: This property holds whether or not this widget should display the current
-    #: value of the model as text. Setting this to False is useful when you just
-    #: want to represent the quality/state as background color in a small space
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`TaurusBaseWidget.getShowText`
-    #:     * :meth:`TaurusBaseWidget.setShowText`
-    #:     * :meth:`TaurusBaseWidget.resetShowText`
-    showText = Qt.pyqtProperty("bool", TaurusBaseWidget.getShowText,
-                               TaurusBaseWidget.setShowText, 
-                               TaurusBaseWidget.resetShowText)
-    
-    #: This property holds the contents of a the popup menu as an XML string.
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`TaurusBaseWidget.getTaurusPopupMenu`
-    #:     * :meth:`TaurusBaseWidget.setTaurusPopupMenu`
-    #:     * :meth:`TaurusBaseWidget.resetTaurusPopupMenu`
-    #:
-    #: .. seealso:: :ref:`popupmenu-tutorial`
-    taurusPopupMenu = Qt.pyqtProperty("QString", TaurusBaseWidget.getTaurusPopupMenu,
-                                   TaurusBaseWidget.setTaurusPopupMenu,
-                                   TaurusBaseWidget.resetTaurusPopupMenu)
-
-
-class TaurusStateLabel(TaurusValueLabel):
-    '''
-    .. deprecated::
-        Use :class:`taurus.qt.qtgui.display.TaurusLabel` instead.
-    '''
-    def __init__(self, parent = None, designMode = False):
-        self.call__init__(TaurusValueLabel, parent=parent, designMode=designMode, background = 'value_state')
-        self.setAlignment(Qt.Qt.AlignCenter)
-    
-    def getFormatedToolTip(self, cache=True, **notused):
-        """ The tooltip should refer to the device and not the state attribute.
-            That is why this method is being rewritten
-        """
-        if self.modelObj is None:
-            return Qt.QString.fromLatin1(self.getNoneValue())
-        parent = self.modelObj.getParentObj()
-        if parent is None:
-            return Qt.QString.fromLatin1(self.getNoneValue())
-        return Qt.QString.fromLatin1(self.toolTipObjToStr( parent.getDisplayDescrObj() ))
-    
-    @Qt.pyqtSignature("setModel(QString)")
-    def setModel(self,model):
-        """ Added to allow setModel(device_name); assuming that State attribute
-            is the desired model. To inherit the parent model but with a non
-            'State' named attribute, use slash: '/TheAttribute'
-        """
-        try:
-            if str(model).count('/')<3 and str(model)[0]!='/':
-                model = str(model)+'/State'
-        except Exception:
-            pass
-        TaurusBaseWidget.setModel(self,model)
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        return None
-#        ret = TaurusValueLabel.getQtDesignerPluginInfo()
-#        ret['icon'] = ":/designer/state.png"
-#        return ret
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, setModel,
-                            TaurusBaseWidget.resetModel)
-
-def main():
-    """hello"""
-    import sys
-    import taurus.qt.qtgui.application
-    Application = taurus.qt.qtgui.application.TaurusApplication
-    
-    app = Application.instance()
-    owns_app = app is None
-    
-    if owns_app:
-        import taurus.core.util.argparse
-        parser = taurus.core.util.argparse.get_taurus_parser()
-        parser.usage = "%prog [options] <full_attribute_name(s)>"
-        app = Application(sys.argv, cmd_line_parser=parser)
-        
-    args = app.get_command_line_args()
-
-    if len(args) > 0:
-        models = map(str.lower, args)
-    else:
-        models = [ 'sys/tg_test/1/%s' % a for a in ('state', 'status', 'double_scalar' ) ]
-
-    w = Qt.QWidget()
-    layout = Qt.QGridLayout()
-    w.setLayout(layout)
-    for model in models:
-        if model.endswith('state'):
-            label = TaurusStateLabel()
-        else:
-            label = TaurusValueLabel()
-        label.model = model
-        layout.addWidget(label)
-    w.show()
-    
-    if owns_app:
-        sys.exit(app.exec_())
-    else:
-        return w
-
-if __name__ == '__main__':
-    main()
-
-    
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/display/test/__init__.py b/lib/taurus/qt/qtgui/display/test/__init__.py
index 9503bca..b5a5672 100644
--- a/lib/taurus/qt/qtgui/display/test/__init__.py
+++ b/lib/taurus/qt/qtgui/display/test/__init__.py
@@ -2,23 +2,23 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
diff --git a/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py b/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py
index c07256b..12ce0be 100644
--- a/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py
+++ b/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py
@@ -1,24 +1,24 @@
 #!/usr/bin/env python
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -26,9 +26,16 @@
 """Unit tests for Taurus Label"""
 
 from taurus.external import unittest
+from taurus.external.qt import Qt
+from taurus.test import insertTest
 from taurus.qt.qtgui.test import GenericWidgetTestCase, BaseWidgetTestCase
 from taurus.qt.qtgui.display import TaurusLabel
 from taurus.qt.qtgui.container import TaurusWidget
+from taurus.core.tango.test import TangoSchemeTestLauncher
+import functools
+from taurus.core.util.colors import ATTRIBUTE_QUALITY_DATA, DEVICE_STATE_DATA
+
+DEV_NAME = TangoSchemeTestLauncher.DEV_NAME
 
 
 class TaurusLabelTest(GenericWidgetTestCase, unittest.TestCase):
@@ -39,46 +46,129 @@ class TaurusLabelTest(GenericWidgetTestCase, unittest.TestCase):
     .. seealso: :class:`taurus.qt.qtgui.test.base.GenericWidgetTestCase`
     '''
     _klass = TaurusLabel
-    modelnames = ['sys/tg_test/1/wave', '', 'eval://1', None]
-    
+    modelnames = ['sys/tg_test/1/wave', '', 'eval:1', None]
+
+
 class Bug169_Test(BaseWidgetTestCase, unittest.TestCase):
 
     '''
-    Test bug169: 
-    
-        AttributeError: type object 'TaurusConfigurationProxy' has no attribute
-        'buildModelName'.
-        
-        See: http://sf.net/p/tauruslib/tickets/65/
-    
+    Test bug169:  See: http://sf.net/p/tauruslib/tickets/65/
+                  (aka, Sradana's bug169)
+
 
     .. seealso: :class:`taurus.qt.qtgui.test.base.BaseWidgetTestCase`
     '''
     _klass = TaurusLabel
-    
+
     def setUp(self):
         BaseWidgetTestCase.setUp(self)
-        self._widget.setModel('sys/tg_test/1/double_scalar?configuration=label')
+        self._widget.setModel('sys/tg_test/1/double_scalar#label')
         self._expectedModelClass = self._widget.getModelClass()
         self._parent = TaurusWidget()
         self._parent.setModel('sys/tg_test/1')
         self._widget.setUseParentModel(True)
         self._widget.setParent(self._parent)
-        
+
     def test_bug169(self):
-        '''Check if setModel works when using parent model''' 
-        self._widget.setModel('/double_scalar?configuration=label')
-        
+        '''Check if setModel works when using parent model'''
+        self._widget.setModel('/double_scalar#label')
+        self.assertMaxDeprecations(0)
+
     def test_relativemodelclass(self):
         '''Check consistency in modelClass when using parent model (re: bug169)
-        ''' 
+        '''
         try:
-            self._widget.setModel('/double_scalar?configuration=label')
+            self._widget.setModel('/double_scalar#label')
         finally:
             mc = self._widget.getModelClass()
-            msg = ('getModelClass() inconsistency:\n expected: %s\n got: %s' % 
+            msg = ('getModelClass() inconsistency:\n expected: %s\n got: %s' %
                    (self._expectedModelClass, mc))
             self.assertEqual(self._expectedModelClass, mc, msg)
+        self.assertMaxDeprecations(0)
+
+
+# ------------------------------------------------------------------------------
+# Check bck-compat with pre-tep14  FgRoles: value, w_value, state,
+# quality, none
+testOldFgroles = functools.partial(insertTest, helper_name='text', maxdepr=1,
+                                   model='tango:' + DEV_NAME + '/double_scalar')
+
+
+ at testOldFgroles(fgRole='value', expected='1.23 mm')
+ at testOldFgroles(fgRole='w_value', expected='0.0 mm')
+ at testOldFgroles(fgRole='state', expected='Ready')
+ at testOldFgroles(fgRole='quality', expected='ATTR_VALID')
+ at testOldFgroles(fgRole='none', expected='')
+# ------------------------------------------------------------------------------
+ at insertTest(helper_name='text',
+            model='tango:' + DEV_NAME + '/double_scalar#state',
+            expected='Ready')
+ at insertTest(helper_name='text',
+            model='tango:' + DEV_NAME + '/double_scalar#rvalue',
+            fgRole='label',
+            expected='double_scalar')
+ at insertTest(helper_name='text',
+            model='tango:' + DEV_NAME + '/double_scalar',
+            fgRole='label',
+            expected='double_scalar')
+ at insertTest(helper_name='text',
+            model='tango:' + DEV_NAME + '/double_scalar#label',
+            expected='double_scalar')
+# ------------------------------------------------------------------------------
+# Check bck-compat with pre-tep14  BgRoles: state, quality, none
+ at insertTest(helper_name='bgRole',
+            model='tango:' + DEV_NAME + '/float_scalar_ro',
+            bgRole='none',
+            expected=Qt.QColor(Qt.Qt.transparent).getRgb()[:3])
+ at insertTest(helper_name='bgRole',
+            model='tango:' + DEV_NAME + '/float_scalar_ro',
+            bgRole='state',
+            expected=DEVICE_STATE_DATA["TaurusDevState.Ready"][1:4])
+ at insertTest(helper_name='bgRole',
+            model='tango:' + DEV_NAME + '/float_scalar_ro',
+            bgRole='quality',
+            expected=ATTRIBUTE_QUALITY_DATA["ATTR_VALID"][1:4])
+ at insertTest(helper_name='bgRole',
+            model='tango:' + DEV_NAME + '/float_scalar_ro',
+            expected=ATTRIBUTE_QUALITY_DATA["ATTR_VALID"][1:4])
+class TaurusLabelTest2(TangoSchemeTestLauncher, BaseWidgetTestCase,
+                       unittest.TestCase):
+    '''
+    Specific tests for TaurusLabel
+    '''
+    _klass = TaurusLabel
+
+    def text(self, model=None, expected=None, fgRole=None, maxdepr=0):
+        '''Check that the label text'''
+        self._widget.setModel(model)
+        if fgRole is not None:
+            self._widget.setFgRole(fgRole)
+        self._app.processEvents()
+        got = str(self._widget.text())
+        msg = ('wrong text for "%s":\n expected: %s\n got: %s' %
+               (model, expected, got))
+        self.assertEqual(got, expected, msg)
+        self.assertMaxDeprecations(maxdepr)
+
+    # TODO: fix the bgRole test (they fail sometimes when run by testsuite)
+    # ~~~~~~~~~~~~~~~~~~~~~~~
+    # FAIL: test_bgRole (...)
+    #  expected: (0, 255, 0)
+    #  got: (239, 240, 241)  # <-- these values change (unitialized garbage?)
+    # ~~~~~~~~~~~~~~~~~~~~~~~
+    @unittest.skip('bgRole tests fail randomly. Skip until fixed.')
+    def bgRole(self, model=None, expected=None, bgRole=None, maxdepr=0):
+        '''Check that the label text'''
+        self._widget.setModel(model)
+        self._app.processEvents()
+        if bgRole is not None:
+            self._widget.setBgRole(bgRole)
+        p = self._widget.palette()
+        got = p.color(p.Background).getRgb()[:3]  # RGB value of the background
+        msg = ('wrong background RGB for "%s":\n expected: %s\n got: %s' %
+               (model, expected, got))
+        self.assertEqual(got, expected, msg)
+        self.assertMaxDeprecations(maxdepr)
 
 
 #
diff --git a/lib/taurus/qt/qtgui/editor/__init__.py b/lib/taurus/qt/qtgui/editor/__init__.py
index c2e37c4..16cdc8e 100644
--- a/lib/taurus/qt/qtgui/editor/__init__.py
+++ b/lib/taurus/qt/qtgui/editor/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,8 +29,8 @@ __docformat__ = 'restructuredtext'
 
 from .tauruseditor import *
 
-#try:
+# try:
 #    from .tauruseditor import *
-#except:
+# except:
 #    from taurus.qt.qtgui.display import create_fallback as __create
 #    TaurusBaseEditor = __create("TaurusBaseEditor")
diff --git a/lib/taurus/qt/qtgui/editor/tauruseditor.py b/lib/taurus/qt/qtgui/editor/tauruseditor.py
index a712733..09b5ee6 100644
--- a/lib/taurus/qt/qtgui/editor/tauruseditor.py
+++ b/lib/taurus/qt/qtgui/editor/tauruseditor.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -38,9 +38,9 @@ try:
     import spyderlib
     v = spyderlib.__version__.split('.', 2)[:2]
     v = map(int, v)
-    if v < [2,1]:
+    if v < [2, 1]:
         raise Exception("TaurusEditor needs spyderlib >= 2.1")
-except ImportError: 
+except ImportError:
     raise Exception("TaurusEditor needs spyderlib >= 2.1")
 
 from spyderlib.utils.qthelpers import create_toolbutton
@@ -49,11 +49,12 @@ from spyderlib.widgets.editortools import OutlineExplorerWidget
 from spyderlib.widgets.editor import EditorMainWindow, EditorSplitter
 from taurus.qt.qtgui.util import ActionFactory
 
+
 class TaurusBaseEditor(Qt.QSplitter):
-    
+
     def __init__(self, parent=None):
         Qt.QSplitter.__init__(self, parent)
-                
+
         self.editorstacks = []
         self.editorwindows = []
 
@@ -69,26 +70,26 @@ class TaurusBaseEditor(Qt.QSplitter):
         editor_layout = Qt.QVBoxLayout()
         editor_layout.setContentsMargins(0, 0, 0, 0)
         editor_widgets.setLayout(editor_layout)
-        
+
         editor_layout.addWidget(EditorSplitter(self, self, self.menu_actions,
                                                first=True))
         editor_layout.addWidget(self.find_widget)
-        
+
         self.setContentsMargins(0, 0, 0, 0)
         self.addWidget(editor_widgets)
         self.addWidget(self.outlineexplorer)
-        
+
         self.setStretchFactor(0, 1)
         self.setStretchFactor(1, 0)
 
         self.setup_window([], [])
-    
+
     def editorStack(self):
         return self.editorstacks[0]
-    
+
     def createMenuActions(self):
         return [], []
-    
+
     def closeEvent(self, event):
         for win in self.editorwindows[:]:
             win.close()
@@ -100,7 +101,7 @@ class TaurusBaseEditor(Qt.QSplitter):
         editorstack.analyze_script()
         if goto is not None:
             fileinfo.editor.go_to_line(goto)
-    
+
     def reload(self, idx=None, filename=None, goto=None):
         if idx is None:
             idx = is_file_opened(filename)
@@ -111,43 +112,40 @@ class TaurusBaseEditor(Qt.QSplitter):
             if goto is not None:
                 editorstack.set_current_filename(filename)
                 editorstack.data[idx].editor.go_to_line(goto)
-    
+
     def set_current_filename(self, filename):
         self.editorStack().set_current_filename(filename)
-    
+
     def register_editorstack(self, editorstack):
         self.editorstacks.append(editorstack)
         if self.isAncestorOf(editorstack):
             # editorstack is a child of the Editor plugin
             editorstack.set_fullpath_sorting_enabled(True)
-            editorstack.set_closable( len(self.editorstacks) > 1 )
+            editorstack.set_closable(len(self.editorstacks) > 1)
             editorstack.set_outlineexplorer(self.outlineexplorer)
             editorstack.set_find_widget(self.find_widget)
             oe_btn = create_toolbutton(self)
             oe_btn.setDefaultAction(self.outlineexplorer.visibility_action)
             editorstack.add_corner_widgets_to_tabbar([5, oe_btn])
-        
+
         editorstack.set_io_actions(*self.io_actions)
         font = Qt.QFont("Monospace")
         font.setPointSize(10)
         editorstack.set_default_font(font, color_scheme='Spyder')
-        self.connect(editorstack, Qt.SIGNAL('close_file(int)'),
-                     self.close_file_in_all_editorstacks)
-        self.connect(editorstack, Qt.SIGNAL("create_new_window()"),
-                     self.create_new_window)
-        self.connect(editorstack, Qt.SIGNAL('plugin_load(QString)'),
-                     self.load)
-    
+        editorstack.close_file.connect(self.close_file_in_all_editorstacks)
+        editorstack.create_new_window.connect(self.create_new_window)
+        editorstack.plugin_load.connect(self.load)
+
     def unregister_editorstack(self, editorstack):
         self.editorstacks.pop(self.editorstacks.index(editorstack))
-        
+
     def clone_editorstack(self, editorstack):
         editorstack.clone_from(self.editorStack())
-        
+
     def setup_window(self, toolbar_list, menu_list):
         self.toolbar_list = toolbar_list
         self.menu_list = menu_list
-        
+
     def create_new_window(self):
         window = EditorMainWindow(self, self.menu_actions,
                                   self.toolbar_list, self.menu_list,
@@ -156,15 +154,14 @@ class TaurusBaseEditor(Qt.QSplitter):
         window.resize(self.size())
         window.show()
         self.register_editorwindow(window)
-        self.connect(window, Qt.SIGNAL("destroyed()"),
-                     lambda win=window: self.unregister_editorwindow(win))
-        
+        window.destroyed.connect(lambda win=window: self.unregister_editorwindow(win))
+
     def register_editorwindow(self, window):
         self.editorwindows.append(window)
-        
+
     def unregister_editorwindow(self, window):
         self.editorwindows.pop(self.editorwindows.index(window))
-    
+
     def get_focus_widget(self):
         pass
 
@@ -175,7 +172,7 @@ class TaurusBaseEditor(Qt.QSplitter):
                 editorstack.blockSignals(True)
                 editorstack.close_file(index)
                 editorstack.blockSignals(False)
-    
+
     def register_widget_shortcuts(self, context, widget):
         """Fake!"""
         pass
@@ -185,13 +182,14 @@ class TaurusBaseEditor(Qt.QSplitter):
 
 from spyderlib.plugins.editor import Editor
 
+
 class TaurusBaseEditor2(Qt.QMainWindow):
 
     def __init__(self, parent=None):
         Qt.QMainWindow.__init__(self, parent)
-        
+
         self._editor = Editor(self)
-        
+
         self.setCentralWidget(self._editor)
 
     def register_shortcut(self, qaction_or_qshortcut, context, name,
@@ -201,6 +199,7 @@ class TaurusBaseEditor2(Qt.QMainWindow):
     def show_hide_project_explorer(self):
         pass
 
+
 def demo():
     test = TaurusBaseEditor()
     test.resize(1000, 800)
@@ -209,33 +208,34 @@ def demo():
     test.show()
     return test
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         import taurus.core.util.argparse
         parser = taurus.core.util.argparse.get_taurus_parser()
         parser.usage = "%prog [options] <file names>"
-        app = Application(sys.argv, cmd_line_parser=parser, 
+        app = Application(sys.argv, cmd_line_parser=parser,
                           app_name="Taurus text editor demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
-        
+
     args = app.get_command_line_args()
 
     if len(args) == 0:
         w = demo()
     else:
         w = TaurusEditor()
-        w.resize(900,800)
+        w.resize(900, 800)
         for name in args:
             w.load(name)
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
@@ -243,4 +243,3 @@ def main():
 
 if __name__ == "__main__":
     main()
-    
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/__init__.py b/lib/taurus/qt/qtgui/extra_guiqwt/__init__.py
index 6bc4c9c..33a3b76 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/__init__.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/builder.py b/lib/taurus/qt/qtgui/extra_guiqwt/builder.py
index 1685ecd..0469d40 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/builder.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/builder.py
@@ -2,176 +2,189 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """Extension of :mod:`guiqwt.builder`"""
 
-__all__=["TaurusPlotItemBuilder", "make"]
+__all__ = ["TaurusPlotItemBuilder", "make"]
 
 __docformat__ = 'restructuredtext'
 
 import guiqwt.builder
 
 from curve import TaurusCurveItem, TaurusTrendItem
-from image import TaurusImageItem, TaurusRGBImageItem, TaurusEncodedImageItem, TaurusXYImageItem
+from image import (TaurusImageItem, TaurusRGBImageItem, TaurusEncodedImageItem,
+                   TaurusEncodedRGBImageItem, TaurusXYImageItem)
 from guiqwt.curve import CurveParam
 from guiqwt.image import ImageParam, XYImageItem
 from guiqwt.styles import XYImageParam
 from guiqwt.config import _
-from guiqwt.baseplot import BasePlot
 from guiqwt.histogram import lut_range_threshold
 import numpy
-
+from taurus.external.pint import Quantity
 
 class TaurusPlotItemBuilder(guiqwt.builder.PlotItemBuilder):
     '''extension of :class:`guiqwt.builder.PlotItemBuilder` to provide tauruscurve and taurusimage items'''
+
     def __init__(self, *args, **kwargs):
         guiqwt.builder.PlotItemBuilder.__init__(self, *args, **kwargs)
-        
+
     def set_curve_axes(self, *args, **kwargs):
-        #ugly hack: I need to redefine this here because it is a private method in PlotItemBuilder
-        guiqwt.builder.PlotItemBuilder._PlotItemBuilder__set_curve_axes(self, *args, **kwargs)
-        
+        # ugly hack: I need to redefine this here because it is a private
+        # method in PlotItemBuilder
+        guiqwt.builder.PlotItemBuilder._PlotItemBuilder__set_curve_axes(
+            self, *args, **kwargs)
+
     def set_image_param(self, *args, **kwargs):
-        #ugly hack: I need to redefine this here because it is a private method in PlotItemBuilder
-        guiqwt.builder.PlotItemBuilder._PlotItemBuilder__set_image_param(self, *args, **kwargs)
-        
+        # ugly hack: I need to redefine this here because it is a private
+        # method in PlotItemBuilder
+        guiqwt.builder.PlotItemBuilder._PlotItemBuilder__set_image_param(
+            self, *args, **kwargs)
+
     def set_param(self, *args, **kwargs):
-        #ugly hack: I need to redefine this here because it is a private method in PlotItemBuilder
-        guiqwt.builder.PlotItemBuilder._PlotItemBuilder__set_param(self, *args, **kwargs)
-        
+        # ugly hack: I need to redefine this here because it is a private
+        # method in PlotItemBuilder
+        guiqwt.builder.PlotItemBuilder._PlotItemBuilder__set_param(
+            self, *args, **kwargs)
+
     def pcurve(self, x, y, param, xaxis="bottom", yaxis="left"):
         """
         Extension to meth:`guiqwt.builder.PlotItemBuilder.pcurve` to support x
         and y being taurus attribute models instead of arrays, in which case, a
         TaurusCurveItem is returned. This method is called from :meth:`curve`
-        
+
         Usage: pcurve(x, y, param)
         """
         if x is None or numpy.isscalar(x) or numpy.isscalar(y):
             curve = TaurusCurveItem(param)
-            curve.setModels(x,y)
+            curve.setModels(x, y)
             curve.update_params()
             self.set_curve_axes(curve, xaxis, yaxis)
-        else:     
-            curve = guiqwt.builder.PlotItemBuilder.pcurve(self, x, y, param, xaxis="bottom", yaxis="left")
+        else:
+            curve = guiqwt.builder.PlotItemBuilder.pcurve(
+                self, x, y, param, xaxis="bottom", yaxis="left")
         return curve
-    
+
     def image(self, taurusmodel=None, **kwargs):
         """
-        Extension to meth:`guiqwt.builder.PlotItemBuilder.image` to support passing a 
+        Extension to meth:`guiqwt.builder.PlotItemBuilder.image` to support passing a
         'taurusmodel' as a keyword argument instead passing 'data' or 'filename'.
         """
         if taurusmodel is None:
             image = guiqwt.builder.PlotItemBuilder.image(self, **kwargs)
         else:
             title = kwargs.get('title', taurusmodel)
-            data = kwargs.get('data',None)
-            filename = kwargs.get('filename',None)
-            alpha_mask = kwargs.get('alpha_mask',None)
-            alpha = kwargs.get('alpha',None) 
-            background_color = kwargs.get('background_color',None)
-            colormap = kwargs.get('colormap',None)
-            xdata = kwargs.get('xdata',[None, None])
-            ydata = kwargs.get('ydata',[None, None])
-            pixel_size = kwargs.get('pixel_size',None)
-            interpolation = kwargs.get('interpolation','linear')
-            eliminate_outliers = kwargs.get('eliminate_outliers',None)
-            xformat = kwargs.get('xformat','%.1f')
-            yformat = kwargs.get('yformat','%.1f')
-            zformat = kwargs.get('zformat','%.1f')
+            data = kwargs.get('data', None)
+            filename = kwargs.get('filename', None)
+            alpha_mask = kwargs.get('alpha_mask', None)
+            alpha = kwargs.get('alpha', None)
+            background_color = kwargs.get('background_color', None)
+            colormap = kwargs.get('colormap', None)
+            xdata = kwargs.get('xdata', [None, None])
+            ydata = kwargs.get('ydata', [None, None])
+            pixel_size = kwargs.get('pixel_size', None)
+            interpolation = kwargs.get('interpolation', 'linear')
+            eliminate_outliers = kwargs.get('eliminate_outliers', None)
+            xformat = kwargs.get('xformat', '%.1f')
+            yformat = kwargs.get('yformat', '%.1f')
+            zformat = kwargs.get('zformat', '%.1f')
             forceRGB = kwargs.get('force_rgb', False)
-            
+
             assert isinstance(xdata, (tuple, list)) and len(xdata) == 2
             assert isinstance(ydata, (tuple, list)) and len(ydata) == 2
             assert filename is None
             assert data is None
-            
+
             param = ImageParam(title=_("Image"), icon='image.png')
-            
+
+            from taurus import Attribute
             if pixel_size is None:
                 xmin, xmax = xdata
                 ymin, ymax = ydata
             else:
-                from taurus import Attribute
                 attr = Attribute(taurusmodel)
                 valueobj = attr.read()
-                attrdata = getattr(valueobj, 'value', numpy.zeros((1,1)))
-                xmin, xmax, ymin, ymax = self.compute_bounds(attrdata, pixel_size)
-            
+                data = getattr(valueobj, 'rvalue', numpy.zeros((1, 1)))
+                attrdata = data
+                if isinstance(data, Quantity):
+                    attrdata = data.magnitude
+                xmin, xmax, ymin, ymax = self.compute_bounds(attrdata,
+                                                             pixel_size)
+
             self.set_image_param(param, title, alpha_mask, alpha, interpolation,
-                                   background=background_color,
-                                   colormap=colormap,
-                                   xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
-                                   xformat=xformat, yformat=yformat,
-                                   zformat=zformat)
+                                 background=background_color,
+                                 colormap=colormap,
+                                 xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,
+                                 xformat=xformat, yformat=yformat,
+                                 zformat=zformat)
+
+            from taurus.core import DataType
             if forceRGB:
-                image = TaurusRGBImageItem(param)
+                if Attribute(taurusmodel).getType() == DataType.DevEncoded:
+                    image = TaurusEncodedRGBImageItem(param)
+                else:
+                    image = TaurusRGBImageItem(param)
             else:
-                from taurus import Attribute
-                try:
-                    from PyTango import DevEncoded  #@todo: replace this (Tango-centric).
-                except:
-                    DevEncoded = 28 #@todo: hardcoded fallback to be replaced when the data types are handled in Taurus
-                if Attribute(taurusmodel).read().type == DevEncoded:
+                if Attribute(taurusmodel).getType() == DataType.DevEncoded:
                     image = TaurusEncodedImageItem(param)
                 else:
                     image = TaurusImageItem(param)
             image.setModel(taurusmodel)
             if eliminate_outliers is not None:
-                image.set_lut_range(lut_range_threshold(image, 256, eliminate_outliers))
-                
+                image.set_lut_range(lut_range_threshold(image, 256,
+                                                        eliminate_outliers))
+
         return image
-    
+
     def xyimage(self, taurusmodel=None, **kwargs):
 
         if taurusmodel is None:
             return guiqwt.builder.PlotItemBuilder.xyimage(self, **kwargs)
-    
+
         title = kwargs.get('title', taurusmodel)
-        data = kwargs.get('data',None)
-        alpha_mask = kwargs.get('alpha_mask',None)
-        alpha = kwargs.get('alpha',None) 
-        background_color = kwargs.get('background_color',None)
-        colormap = kwargs.get('colormap',None)
-        interpolation = kwargs.get('interpolation','linear')
-        eliminate_outliers = kwargs.get('eliminate_outliers',None)
-        xformat = kwargs.get('xformat','%.1f')
-        yformat = kwargs.get('yformat','%.1f')
-        zformat = kwargs.get('zformat','%.1f')
+        data = kwargs.get('data', None)
+        alpha_mask = kwargs.get('alpha_mask', None)
+        alpha = kwargs.get('alpha', None)
+        background_color = kwargs.get('background_color', None)
+        colormap = kwargs.get('colormap', None)
+        interpolation = kwargs.get('interpolation', 'linear')
+        eliminate_outliers = kwargs.get('eliminate_outliers', None)
+        xformat = kwargs.get('xformat', '%.1f')
+        yformat = kwargs.get('yformat', '%.1f')
+        zformat = kwargs.get('zformat', '%.1f')
         if data is None:
-            x=y=None
+            x = y = None
         else:
-            x=numpy.arange(data.shape[0])
-            y=numpy.arange(data.shape[1])
-        
-        data=numpy.ones((251,251))
-        x,y=numpy.arange(251)*333,numpy.arange(251)*1000
+            x = numpy.arange(data.shape[0])
+            y = numpy.arange(data.shape[1])
+
+        data = numpy.ones((251, 251))
+        x, y = numpy.arange(251) * 333, numpy.arange(251) * 1000
 
         param = XYImageParam(title=_("Image"), icon='image.png')
         self.set_image_param(param, title, alpha_mask, alpha, interpolation,
-                               background=background_color, colormap=colormap,
-                               xformat=xformat, yformat=yformat,
-                               zformat=zformat)
+                             background=background_color, colormap=colormap,
+                             xformat=xformat, yformat=yformat,
+                             zformat=zformat)
 
         image = TaurusXYImageItem(param)
         image.setModel(taurusmodel)
@@ -179,38 +192,36 @@ class TaurusPlotItemBuilder(guiqwt.builder.PlotItemBuilder):
             image.set_lut_range(lut_range_threshold(image, 256,
                                                     eliminate_outliers))
         return image
-    
+
     def rgbimage(self, taurusmodel=None, **kwargs):
         if taurusmodel is None:
             image = guiqwt.builder.PlotItemBuilder.rgbimage(self, **kwargs)
         else:
-            image = self.image(taurusmodel=taurusmodel, force_rgb=True, **kwargs)
+            image = self.image(taurusmodel=taurusmodel,
+                               force_rgb=True, **kwargs)
         return image
-    
-    def ttrend(self, model, taurusparam =None, title=u"",
-              color=None, linestyle=None, linewidth=None,
-              marker=None, markersize=None, markerfacecolor=None,
-              markeredgecolor=None, shade=None, fitted=None,
-              curvestyle=None, curvetype=None, baseline=None):
+
+    def ttrend(self, model, taurusparam=None, title=u"",
+               color=None, linestyle=None, linewidth=None,
+               marker=None, markersize=None, markerfacecolor=None,
+               markeredgecolor=None, shade=None, fitted=None,
+               curvestyle=None, curvetype=None, baseline=None):
         """
         Make a taurus trend item
-        
-        :return (TaurusTrendItem): 
+
+        :return (TaurusTrendItem):
         """
         curveparam = CurveParam(icon='curve.png')
         if not title:
             title = model
         self.set_param(curveparam, title, color, linestyle, linewidth, marker,
-                         markersize, markerfacecolor, markeredgecolor,
-                         shade, fitted, curvestyle, curvetype, baseline)
-        
-        item = TaurusTrendItem(curveparam=curveparam, taurusparam = taurusparam)
+                       markersize, markerfacecolor, markeredgecolor,
+                       shade, fitted, curvestyle, curvetype, baseline)
+
+        item = TaurusTrendItem(curveparam=curveparam, taurusparam=taurusparam)
         item.setModel(model)
         item.update_params()
         return item
 
 #"make" is an instance of the builder (this mimics the structure of guiqwt.builder.make)
 make = TaurusPlotItemBuilder()
-     
-
-        
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py
index d78b646..05a8196 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py
@@ -2,33 +2,34 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """Extension of :mod:`guiqwt.curve`"""
 
-__all__=["TaurusCurveItem"]
+__all__ = ["TaurusCurveItem"]
 
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseComponent
+from taurus.qt.qtcore.util.signal import baseSignal
 import taurus
 from guiqwt.curve import CurveItem
 from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam, TaurusTrendParam
@@ -36,83 +37,88 @@ from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam, TaurusTrendPar
 from taurus.core.util.containers import ArrayBuffer
 import numpy
 
-        
+
 class TaurusCurveItem(CurveItem, TaurusBaseComponent):
     '''A CurveItem that autoupdates its values & params when x or y components change'''
+
+    dataChanged = baseSignal('dataChanged')
+
     def __init__(self, curveparam=None, taurusparam=None):
         CurveItem.__init__(self, curveparam=curveparam)
         TaurusBaseComponent.__init__(self, self.__class__.__name__)
-        self._signalGen = Qt.QObject()
-        self._signalGen.connect(self._signalGen, Qt.SIGNAL('taurusEvent'), self.filterEvent) #I need to do this because I am not using the standard model attach mechanism
+        # I need to do this because I am not using the standard model attach
+        # mechanism
+        self.taurusEvent.connect(self.filterEvent)
         self._xcomp = None
         self._ycomp = None
         if taurusparam is None:
             taurusparam = TaurusCurveParam()
         self.taurusparam = taurusparam
-        
 
-    def getSignaller(self):
-        '''reimplemented from TaurusBaseComponent because TaurusCurveItem is 
-        not (and cannot be) a QObject'''
-        return self._signalGen  
-        
     def setModels(self, x, y):
-        #create/get new components
+        # create/get new components
         if x is None:
             newX = None
         else:
             newX = taurus.Attribute(x)
         newY = taurus.Attribute(y)
-        
-        #stop listening to previous components (if they are not the same as the new)
+
+        # stop listening to previous components (if they are not the same as
+        # the new)
         if self._xcomp is not None and self._xcomp is not newX:
             self._xcomp.removeListener(self)
         self._xcomp = newX
         if self._ycomp is not None and self._ycomp is not newY:
             self._ycomp.removeListener(self)
         self._ycomp = newY
-        
-        #start listening to new components
+
+        # start listening to new components
         if self._xcomp is not None:
             self._xcomp.addListener(self)
         self._ycomp.addListener(self)
         self.onCurveDataChanged()
         self.taurusparam.xModel = x
         self.taurusparam.yModel = y
-        
+
     def getModels(self):
         return self.taurusparam.xModel, self.taurusparam.yModel
-        
+
     def handleEvent(self, evt_src, ect_type, evt_value):
-        if evt_value is None or getattr(evt_value,'value', None) is None:
-            self.debug('Ignoring event from %s'%repr(evt_src))
+        if evt_value is None or getattr(evt_value, 'rvalue', None) is None:
+            self.debug('Ignoring event from %s' % repr(evt_src))
             return
         if evt_src is self._xcomp or evt_src is self._ycomp:
             self.onCurveDataChanged()
-            self.getSignaller().emit(Qt.SIGNAL('dataChanged'))
-        
+            self.dataChanged.emit()
+
     def onCurveDataChanged(self):
-        try: yvalue = self._ycomp.read().value
-        except: yvalue = None
-        
+        # TODO: Take units into account for displaying curves, axis, etc.
+        try:
+            yvalue = self._ycomp.read().rvalue.magnitude
+        except:
+            yvalue = None
+
         if yvalue is None:
-            return        
-        
-        try: xvalue = self._xcomp.read().value
-        except: xvalue = None
-        
+            return
+
+        # TODO: Take units into account for displaying curves, axis, etc.
+        try:
+            xvalue = self._xcomp.read().rvalue.magnitude
+        except:
+            xvalue = None
+
         if xvalue is None:
             xvalue = numpy.arange(len(yvalue))
-        
+
         self.set_data(xvalue, yvalue)
         p = self.plot()
-        if p is not None: 
+        if p is not None:
             p.replot()
-            
+
     def get_item_parameters(self, itemparams):
         CurveItem.get_item_parameters(self, itemparams)
         itemparams.add("TaurusParam", self, self.taurusparam)
-        
+
     def updateTaurusParams(self):
         self.taurusparam.update_curve(self)
 
@@ -120,33 +126,30 @@ class TaurusCurveItem(CurveItem, TaurusBaseComponent):
         CurveItem.set_item_parameters(self, itemparams)
         self.updateTaurusParams()
 
-     
+
 class TaurusTrendItem(CurveItem, TaurusBaseComponent):
     '''A CurveItem that listens to events from a Taurus scalar attribute and appends new values to it'''
+
+    dataChanged = baseSignal('dataChanged')
+    scrollRequested = baseSignal('scrollRequested', object, object, object)
+
     def __init__(self, curveparam=None, taurusparam=None):
         CurveItem.__init__(self, curveparam=curveparam)
         TaurusBaseComponent.__init__(self, self.__class__.__name__)
-        self._signalGen = Qt.QObject()
-        
+
         self.__xBuffer = None
         self.__yBuffer = None
-        
+
         self.__timeOffset = None
 
         if taurusparam is None:
             taurusparam = TaurusTrendParam()
         self.taurusparam = taurusparam
         self.updateTaurusParams()
-        
 
-    def getSignaller(self):
-        '''reimplemented from TaurusBaseComponent because TaurusCurveItem is 
-        not (and cannot be) a QObject'''
-        return self._signalGen  
-        
     def setBufferSize(self, buffersize):
         '''sets the size of the stack.
-        
+
         :param buffersize: (int) size of the stack
         '''
         self.taurusparam.maxBufferSize = buffersize
@@ -156,36 +159,40 @@ class TaurusTrendItem(CurveItem, TaurusBaseComponent):
             if self.__yBuffer is not None:
                 self.__yBuffer.setMaxSize(buffersize)
         except ValueError:
-            self.info('buffer downsizing  requested. Current contents will be discarded')
+            self.info(
+                'buffer downsizing  requested. Current contents will be discarded')
             self.__xBuffer = None
             self.__yBuffer = None
-        
+
     def setModel(self, model):
-        #do the standard stuff
+        # do the standard stuff
         TaurusBaseComponent.setModel(self, model)
-        #update the taurusparam
-        self.taurusparam.model=self.getModelName()
+        # update the taurusparam
+        self.taurusparam.model = self.getModelName()
         #... and fire a fake event for initialization
         try:
             value = self.getModelObj().read()
-            self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
+            self.fireEvent(
+                self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
         except:
             pass
 
     def handleEvent(self, evt_src, evt_type, evt_value):
-        if evt_value is None or getattr(evt_value,'value', None) is None:
-            self.debug('Ignoring event from %s'%repr(evt_src))
+        if evt_value is None or getattr(evt_value, 'rvalue', None) is None:
+            self.debug('Ignoring event from %s' % repr(evt_src))
             return
-        
+
         plot = self.plot()
-            
-        #initialization\
+
+        # initialization\
         if self.__xBuffer is None:
-            self.__xBuffer = ArrayBuffer(numpy.zeros(min(128,self.taurusparam.maxBufferSize), dtype='d'), maxSize=self.taurusparam.maxBufferSize )
+            self.__xBuffer = ArrayBuffer(numpy.zeros(min(
+                128, self.taurusparam.maxBufferSize), dtype='d'), maxSize=self.taurusparam.maxBufferSize)
         if self.__yBuffer is None:
-            self.__yBuffer = ArrayBuffer(numpy.zeros(min(128,self.taurusparam.maxBufferSize), dtype='d'), maxSize=self.taurusparam.maxBufferSize )
-        
-        #update x values
+            self.__yBuffer = ArrayBuffer(numpy.zeros(min(
+                128, self.taurusparam.maxBufferSize), dtype='d'), maxSize=self.taurusparam.maxBufferSize)
+
+        # update x values
         if self.taurusparam.stackMode == 'datetime':
             if self.__timeOffset is None:
                 self.__timeOffset = evt_value.time.totime()
@@ -193,56 +200,60 @@ class TaurusTrendItem(CurveItem, TaurusBaseComponent):
                     plot.set_axis_title('bottom', 'Time')
                     plot.set_axis_unit('bottom', '')
             self.__xBuffer.append(evt_value.time.totime())
-        
+
         elif self.taurusparam.stackMode == 'deltatime':
             try:
-                self.__xBuffer.append(evt_value.time.totime() - self.__timeOffset)
-            except TypeError: #this will happen if self.__timeOffset has not been initialized
+                self.__xBuffer.append(
+                    evt_value.time.totime() - self.__timeOffset)
+            except TypeError:  # this will happen if self.__timeOffset has not been initialized
                 self.__timeOffset = evt_value.time.totime()
                 self.__xBuffer.append(0)
                 if plot is not None:
-                    plot.set_axis_title('bottom', 'Time since %s'%evt_value.time.isoformat())
+                    plot.set_axis_title('bottom', 'Time since %s' %
+                                        evt_value.time.isoformat())
                     plot.set_axis_unit('bottom', '')
-        else:  
+        else:
             try:
-                step = 1 # +numpy.random.randint(0,4) #for debugging we can put a variable step
-                self.__xBuffer.append(self.__xBuffer[-1]+step) 
-            except IndexError: #this will happen when the x buffer is empty
-                self.__xBuffer.append(0) 
+                # +numpy.random.randint(0,4) #for debugging we can put a variable step
+                step = 1
+                self.__xBuffer.append(self.__xBuffer[-1] + step)
+            except IndexError:  # this will happen when the x buffer is empty
+                self.__xBuffer.append(0)
                 if plot is not None:
                     plot.set_axis_title('bottom', 'Event #')
                     plot.set_axis_unit('bottom', '')
-        
-        #update y
-        self.__yBuffer.append(evt_value.value)
-        
-        #update the plot data
-        x,y = self.__xBuffer.contents(), self.__yBuffer.contents()
-        self.set_data(x,y)
-        
-        #signal data changed and replot
-        self.getSignaller().emit(Qt.SIGNAL('dataChanged'), self)
-        
+
+        # update y
+        # TODO: Take units into account for displaying curves, axis, etc.
+        self.__yBuffer.append(evt_value.rvalue.magnitude)
+
+        # update the plot data
+        x, y = self.__xBuffer.contents(), self.__yBuffer.contents()
+        self.set_data(x, y)
+
+        # signal data changed and replot
+        self.dataChanged.emit()
+
         if plot is not None:
-            value=x[-1]
+            value = x[-1]
             axis = self.xAxis()
             xmin, xmax = plot.get_axis_limits(axis)
-            if value>xmax or value<xmin:
-                self.getSignaller().emit(Qt.SIGNAL('scrollRequested'), plot, axis, value )
+            if value > xmax or value < xmin:
+                self.scrollRequested.emit(plot, axis, value)
             plot.replot()
-            
+
     def get_item_parameters(self, itemparams):
         CurveItem.get_item_parameters(self, itemparams)
         itemparams.add("TaurusParam", self, self.taurusparam)
-        
+
     def updateTaurusParams(self):
         self.taurusparam.update_curve(self)
 
     def set_item_parameters(self, itemparams):
         CurveItem.set_item_parameters(self, itemparams)
         self.updateTaurusParams()
-          
-          
+
+
 def taurusTrendMain():
     from taurus.qt.qtgui.extra_guiqwt.builder import make
     from taurus.qt.qtgui.application import TaurusApplication
@@ -250,55 +261,59 @@ def taurusTrendMain():
     from guiqwt.tools import HRangeTool
     import taurus.core.util.argparse
     import sys
-    
+
     parser = taurus.core.util.argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [<model1> [<model2>] ...]")
     parser.set_description("a taurus application for plotting 1D data sets")
     parser.add_option("-x", "--x-axis-mode", dest="x_axis_mode", default='d', metavar="t|d|e",
-                      help="interpret X values as timestamps (t), time deltas (d) or event numbers (e). Accepted values: t|d|e")    
-    parser.add_option("-b", "--buffer", dest="max_buffer_size", default='16384', 
+                      help="interpret X values as timestamps (t), time deltas (d) or event numbers (e). Accepted values: t|d|e")
+    parser.add_option("-b", "--buffer", dest="max_buffer_size", default='16384',
                       help="maximum number of values to be plotted (when reached, the oldest values will be discarded)")
-    parser.add_option("-a", "--use-archiving", action="store_true", dest="use_archiving", default=False)
-    parser.add_option("--demo", action="store_true", dest="demo", default=False, help="show a demo of the widget")
-    app = TaurusApplication(cmd_line_parser=parser, app_name="taurusplot2", app_version=taurus.Release.version)
+    parser.add_option("-a", "--use-archiving",
+                      action="store_true", dest="use_archiving", default=False)
+    parser.add_option("--demo", action="store_true", dest="demo",
+                      default=False, help="show a demo of the widget")
+    app = TaurusApplication(
+        cmd_line_parser=parser, app_name="taurusplot2", app_version=taurus.Release.version)
     args = app.get_command_line_args()
     options = app.get_command_line_options()
-    
-    #check & process options
-    stackModeMap = dict(t='datetime', d='deltatime', e='event')  
+
+    # check & process options
+    stackModeMap = dict(t='datetime', d='deltatime', e='event')
     if options.x_axis_mode.lower() not in stackModeMap:
         parser.print_help(sys.stderr)
         sys.exit(1)
-    
+
     stackMode = stackModeMap[options.x_axis_mode.lower()]
-      
+
     if options.demo:
-        args.append('eval://rand()')
-        
+        args.append('eval:rand()')
+
     w = CurveDialog(edit=False, toolbar=True, wintitle="Taurus Trend")
 
-    #set archiving
+    # set archiving
     if options.use_archiving:
         raise NotImplementedError('Archiving support is not yet implemented')
         w.setUseArchiving(True)
-    
+
     w.add_tool(HRangeTool)
-    #w.add_tool(TaurusCurveChooserTool)
-    #w.add_tool(TimeAxisTool)
-    
+    # w.add_tool(TaurusCurveChooserTool)
+    # w.add_tool(TimeAxisTool)
+
     if len(args) == 0:
         parser.print_help(sys.stderr)
         sys.exit(1)
-    
+
     plot = w.get_plot()
     for a in args:
-        item = TaurusTrendItem(stackMode=stackMode, buffersize=int(options.max_buffer_size))
+        item = TaurusTrendItem(stackMode=stackMode,
+                               buffersize=int(options.max_buffer_size))
         plot.add_item(item)
-        item.setModel(a)  
-    
+        item.setModel(a)
+
     w.show()
-    sys.exit(app.exec_())  
-    
+    sys.exit(app.exec_())
+
 
 def taurusCurveMain():
     from taurus.qt.qtgui.extra_guiqwt.builder import make
@@ -308,46 +323,47 @@ def taurusCurveMain():
     from taurus.qt.qtgui.extra_guiqwt.tools import TaurusCurveChooserTool, TimeAxisTool
     import taurus.core.util.argparse
     import sys
-    
+
     parser = taurus.core.util.argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [<model1> [<model2>] ...]")
     parser.set_description("a taurus application for plotting 1D data sets")
-    app = TaurusApplication(cmd_line_parser=parser, app_name="taurusplot2", app_version=taurus.Release.version)
+    app = TaurusApplication(
+        cmd_line_parser=parser, app_name="taurusplot2", app_version=taurus.Release.version)
     args = app.get_command_line_args()
-    
+
     win = CurveDialog(edit=False, toolbar=True, wintitle="TaurusPlot2",
                       options=dict(title="", xlabel="xlabel", ylabel="ylabel"))
     win.add_tool(HRangeTool)
     win.add_tool(TaurusCurveChooserTool)
     win.add_tool(TimeAxisTool)
-    
+
     plot = win.get_plot()
-      
+
     for a in args:
         mx_my = a.split('|')
         n = len(mx_my)
-        if n == 1: 
+        if n == 1:
             mx, my = None, mx_my[0]
         elif n == 2:
             mx, my = mx_my
         else:
-            print "Invalid model: %s\n"%mx_my
+            print "Invalid model: %s\n" % mx_my
             parser.print_help(sys.stderr)
             sys.exit(1)
-        #cycle colors
+        # cycle colors
         style = make.style.next()
-        color=style[0]
+        color = style[0]
         linestyle = style[1:]
-        plot.add_item(make.curve(mx,my, color=color, linestyle=linestyle, linewidth=2))
-        
+        plot.add_item(make.curve(mx, my, color=color,
+                                 linestyle=linestyle, linewidth=2))
+
     win.get_itemlist_panel().show()
     plot.set_items_readonly(False)
     win.show()
-    win.exec_()    
-    
-    
+    win.exec_()
+
 
 if __name__ == "__main__":
-#    test1()
-#    taurusCurveMain()    
-    taurusTrendMain() 
+    #    test1()
+    #    taurusCurveMain()
+    taurusTrendMain()
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
index a205f41..a4206ed 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
 """
-curvesmodel Model and view for new CurveItem configuration 
+curvesmodel Model and view for new CurveItem configuration
 """
 __all__ = ['TaurusCurveItemTableModel', 'CurveItemConf', 'CurveItemConfDlg']
 #raise UnimplementedError('Under Construction!')
@@ -38,21 +38,21 @@ from guiqwt.builder import make
 import taurus
 from taurus.core.taurusexception 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 taurus.qt.qtgui.util.ui import UILoadable
 from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam
 
-AXIS_ID2NAME = {Qwt5.QwtPlot.yLeft:'left', Qwt5.QwtPlot.yRight:'right',
-                Qwt5.QwtPlot.xBottom:'bottom', Qwt5.QwtPlot.xTop:'top'}
+AXIS_ID2NAME = {Qwt5.QwtPlot.yLeft: 'left', Qwt5.QwtPlot.yRight: 'right',
+                Qwt5.QwtPlot.xBottom: 'bottom', Qwt5.QwtPlot.xTop: 'top'}
 
-#set some named constants
-#columns:
+# set some named constants
+# columns:
 NUMCOLS = 3
 X, Y, TITLE = range(NUMCOLS)
 SRC_ROLE = Qt.Qt.UserRole + 1
 
 
 class Component(object):
+
     def __init__(self, src):
         self.display = ''
         self.icon = Qt.QIcon()
@@ -62,40 +62,46 @@ class Component(object):
     def processSrc(self, src):
         '''processes the src and sets the values of display, icon and ok attributes'''
         if src is None:
-            self.display, self.icon, self.ok = '(Use indices)', Qt.QIcon(), True
+            self.display, self.icon, self.ok = '(Use indices)', Qt.QIcon(
+            ), True
             return
         src = str(src).strip()
-        #empty
+        # empty
         if src == '':
-            self.display, self.icon, self.ok = '(Use indices)', Qt.QIcon(), True
+            self.display, self.icon, self.ok = '(Use indices)', Qt.QIcon(
+            ), True
             return
-        #for formulas
+        # for formulas
         if src.startswith('='):
             #@todo: evaluate/validate the expression
-            self.display, self.icon, self.ok = src[1:].strip(), getThemeIcon('accessories-calculator'), True
+            self.display, self.icon, self.ok = src[
+                1:].strip(), Qt.QIcon.fromTheme('accessories-calculator'), True
             return
-        #for tango attributes
+        # for tango attributes
         try:
             attr = taurus.Attribute(src)
             dev = attr.getParentObj()
         except TaurusException:
-            self.display, self.icon, self.ok = src, getThemeIcon('dialog-warning'), False
+            self.display, self.icon, self.ok = src, Qt.QIcon.fromTheme(
+                'dialog-warning'), False
             return
         if not dev.isValidDev():
-            self.display, self.icon, self.ok = src, getThemeIcon('network-error'), False
+            self.display, self.icon, self.ok = src, Qt.QIcon.fromTheme(
+                'network-error'), False
             return
-        self.display, self.icon, self.ok = attr.getSimpleName(), getIcon(':/taurus.png'), True
-
+        self.display, self.icon, self.ok = attr.getSimpleName(),\
+                                           Qt.QIcon('logos:taurus.png'), True
 
 
 class CurveItemConf(object):
+
     def __init__(self, taurusparam=None, curveparam=None, axesparam=None):
         if taurusparam is None:
             taurusparam = TaurusCurveParam()
         self.taurusparam = taurusparam
         if curveparam is None:
             curveparam = CurveParam()
-            style = make.style.next()  #cycle through colors and linestyles
+            style = make.style.next()  # cycle through colors and linestyles
             update_style_attr(style, curveparam)
             curveparam.line.width = 2
         self.curveparam = curveparam
@@ -106,7 +112,8 @@ class CurveItemConf(object):
             self.curveparam.label = taurusparam.xModel
 
     def __repr__(self):
-        ret = "CurveItemConf(xModel='%s', yModel='%s')" % (self.taurusparam.xModel, self.taurusparam.yModel)
+        ret = "CurveItemConf(xModel='%s', yModel='%s')" % (
+            self.taurusparam.xModel, self.taurusparam.yModel)
         return ret
 
     @staticmethod
@@ -119,14 +126,18 @@ class CurveItemConf(object):
 
     @staticmethod
     def fromAny(obj):
-        '''return a CurveItemConf from whatever given in input (if possible). 
+        '''return a CurveItemConf from whatever given in input (if possible).
         Raises ValueError if not possible'''
         if isinstance(obj, CurveItemConf):
             return copy.deepcopy(obj)
-        try: return CurveItemConf.fromTaurusCurveItem(obj)
-        except: raise
-        try: return CurveItemConf(*obj)
-        except: pass
+        try:
+            return CurveItemConf.fromTaurusCurveItem(obj)
+        except:
+            raise
+        try:
+            return CurveItemConf(*obj)
+        except:
+            pass
         raise ValueError('Cannot convert %s into a CurveItemConf' % repr(obj))
 
 
@@ -134,9 +145,12 @@ class TaurusCurveItemTableModel(Qt.QAbstractTableModel):
     ''' A Qt data model for describing curves
     '''
 
+    dataChanged = Qt.pyqtSignal('QModelIndex', 'QModelIndex')
+
     def __init__(self, curves=None):
-        if curves is None: curves = []
-        curves = [CurveItemConf.fromAny(c) for c in curves]  #convert curves
+        if curves is None:
+            curves = []
+        curves = [CurveItemConf.fromAny(c) for c in curves]  # convert curves
         super(TaurusCurveItemTableModel, self).__init__()
         self.ncolumns = NUMCOLS
         self.curves = curves
@@ -155,34 +169,55 @@ class TaurusCurveItemTableModel(Qt.QAbstractTableModel):
             return Qt.QVariant()
         row = index.row()
         column = index.column()
-        #Display Role
+        # Display Role
         if role == Qt.Qt.DisplayRole:
-            if column == X: return Qt.QVariant(str(self.curves[row].x.display))
-            elif column == Y: return Qt.QVariant(str(self.curves[row].y.display))
+            if column == X:
+                return Qt.QVariant(str(self.curves[row].x.display))
+            elif column == Y:
+                return Qt.QVariant(str(self.curves[row].y.display))
             elif column == TITLE:
                 return Qt.QVariant(str(self.curves[row].curveparam.label))
-            else: return Qt.QVariant()
+            else:
+                return Qt.QVariant()
         elif role == Qt.Qt.DecorationRole:
-            if column == X: return Qt.QVariant(self.curves[row].x.icon)
-            elif column == Y: return Qt.QVariant(self.curves[row].y.icon)
-            else: return Qt.QVariant()
+            if column == X:
+                return Qt.QVariant(self.curves[row].x.icon)
+            elif column == Y:
+                return Qt.QVariant(self.curves[row].y.icon)
+            else:
+                return Qt.QVariant()
         elif role == Qt.Qt.TextColorRole:
-            if column == X: Qt.QVariant(Qt.QColor(self.curves[row].x.ok and 'green' or 'red'))
-            elif column == Y: Qt.QVariant(Qt.QColor(self.curves[row].y.ok and 'green' or 'red'))
-            else: return Qt.QVariant()
+            if column == X:
+                Qt.QVariant(
+                    Qt.QColor(self.curves[row].x.ok and 'green' or 'red'))
+            elif column == Y:
+                Qt.QVariant(
+                    Qt.QColor(self.curves[row].y.ok and 'green' or 'red'))
+            else:
+                return Qt.QVariant()
         elif role == SRC_ROLE:
-            if column == X: return Qt.QVariant(str(self.curves[row].taurusparam.xModel))
-            elif column == Y: return Qt.QVariant(str(self.curves[row].taurusparam.yModel))
-            else: return Qt.QVariant()
+            if column == X:
+                return Qt.QVariant(str(self.curves[row].taurusparam.xModel))
+            elif column == Y:
+                return Qt.QVariant(str(self.curves[row].taurusparam.yModel))
+            else:
+                return Qt.QVariant()
         elif role == Qt.Qt.ToolTipRole:
-            if column == X: return Qt.QVariant(str(self.curves[row].taurusparam.xModel))
-            elif column == Y: return Qt.QVariant(str(self.curves[row].taurusparam.yModel))
-            else: return Qt.QVariant()
+            if column == X:
+                return Qt.QVariant(str(self.curves[row].taurusparam.xModel))
+            elif column == Y:
+                return Qt.QVariant(str(self.curves[row].taurusparam.yModel))
+            else:
+                return Qt.QVariant()
         if role == Qt.Qt.EditRole:
-            if column == X: return Qt.QVariant(str(self.curves[row].taurusparam.xModel))
-            elif column == Y: return Qt.QVariant(str(self.curves[row].taurusparam.yModel))
-            elif column == TITLE: return Qt.QVariant(str(self.curves[row].curveparam.label))
-            else: return Qt.QVariant()
+            if column == X:
+                return Qt.QVariant(str(self.curves[row].taurusparam.xModel))
+            elif column == Y:
+                return Qt.QVariant(str(self.curves[row].taurusparam.yModel))
+            elif column == TITLE:
+                return Qt.QVariant(str(self.curves[row].curveparam.label))
+            else:
+                return Qt.QVariant()
         return Qt.QVariant()
 
     def headerData(self, section, orientation, role=Qt.Qt.DisplayRole):
@@ -192,16 +227,19 @@ class TaurusCurveItemTableModel(Qt.QAbstractTableModel):
             return Qt.QVariant(int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter))
         if role != Qt.Qt.DisplayRole:
             return Qt.QVariant()
-        #So this is DisplayRole...
+        # So this is DisplayRole...
         if orientation == Qt.Qt.Horizontal:
-            if section == X: return Qt.QVariant("X source")
-            elif section == Y: return Qt.QVariant("Y Source")
-            elif section == TITLE: return Qt.QVariant("Title")
+            if section == X:
+                return Qt.QVariant("X source")
+            elif section == Y:
+                return Qt.QVariant("Y Source")
+            elif section == TITLE:
+                return Qt.QVariant("Title")
             return Qt.QVariant()
         else:
             return Qt.QVariant(str(section + 1))
 
-    def flags(self, index):  #use this to set the editable flag when fix is selected
+    def flags(self, index):  # use this to set the editable flag when fix is selected
         if not index.isValid():
             return Qt.Qt.ItemIsEnabled
         column = index.column()
@@ -223,14 +261,17 @@ class TaurusCurveItemTableModel(Qt.QAbstractTableModel):
             elif column == Y:
                 curve.taurusparam.yModel = value
                 curve.y.processSrc(value)
-            elif column == TITLE: curve.curveparam.label = value
-            self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index)
+            elif column == TITLE:
+                curve.curveparam.label = value
+            self.dataChanged.emit(index, index)
             return True
         return False
 
     def insertRows(self, position=None, rows=1, parentindex=None):
-        if position is None: position = self.rowCount()
-        if parentindex is None: parentindex = Qt.QModelIndex()
+        if position is None:
+            position = self.rowCount()
+        if parentindex is None:
+            parentindex = Qt.QModelIndex()
         self.beginInsertRows(parentindex, position, position + rows - 1)
         slice = [CurveItemConf() for i in range(rows)]
         self.curves = self.curves[:position] + slice + self.curves[position:]
@@ -238,7 +279,8 @@ class TaurusCurveItemTableModel(Qt.QAbstractTableModel):
         return True
 
     def removeRows(self, position, rows=1, parentindex=None):
-        if parentindex is None: parentindex = Qt.QModelIndex()
+        if parentindex is None:
+            parentindex = Qt.QModelIndex()
         self.beginRemoveRows(parentindex, position, position + rows - 1)
         self.curves = self.curves[:position] + self.curves[position + rows:]
         self.endRemoveRows()
@@ -255,11 +297,15 @@ class TaurusCurveItemTableModel(Qt.QAbstractTableModel):
 
     def dropMimeData(self, data, action, row, column, parent):
         if row == -1:
-            if parent.isValid(): row = parent.row()
-            else: row = parent.rowCount()
+            if parent.isValid():
+                row = parent.row()
+            else:
+                row = parent.rowCount()
         if column == -1:
-            if parent.isValid(): column = parent.column()
-            else: column = parent.columnCount()
+            if parent.isValid():
+                column = parent.column()
+            else:
+                column = parent.columnCount()
         if data.hasFormat(TAURUS_ATTR_MIME_TYPE):
             self.setData(self.index(row, column),
                          value=Qt.QVariant(str(data.data(TAURUS_ATTR_MIME_TYPE))))
@@ -284,22 +330,25 @@ class TaurusCurveItemTableModel(Qt.QAbstractTableModel):
     def mimeData(self, indexes):
         mimedata = Qt.QAbstractTableModel.mimeData(self, indexes)
         if len(indexes) == 1:
-#            data = Qt.from_qvariant(self.data(indexes[0], str)
-#            mimedata.setData(TAURUS_ATTR_MIME_TYPE, data)
+            #            data = Qt.from_qvariant(self.data(indexes[0], str)
+            #            mimedata.setData(TAURUS_ATTR_MIME_TYPE, data)
             data = Qt.from_qvariant(self.data(indexes[0], role=SRC_ROLE), str)
             mimedata.setText(data)
         return mimedata
-        #mimedata.setData()
+        # mimedata.setData()
 
 
 @UILoadable(with_ui='ui')
 class CurveItemConfDlg(Qt.QWidget):
     ''' A configuration dialog for creating new CurveItems.
-    
+
     Provides a browser for Taurus models and an editable table for the sources
     and title of data
     '''
 
+    dataChanged = Qt.pyqtSignal('QModelIndex', 'QModelIndex')
+    applied = Qt.pyqtSignal()
+
     def __init__(self, parent=None, curves=None, showXcol=True):
         super(CurveItemConfDlg, self).__init__(parent)
         self.loadUi()
@@ -307,7 +356,7 @@ class CurveItemConfDlg(Qt.QWidget):
 
         if curves is None:
             curves = [CurveItemConf()]
-        #add the NeXusWidget if extra_nexus is available
+        # add the NeXusWidget if extra_nexus is available
         try:
             from taurus.qt.qtgui.extra_nexus import TaurusNeXusBrowser
             nexusWidget = TaurusNeXusBrowser()
@@ -320,7 +369,8 @@ class CurveItemConfDlg(Qt.QWidget):
 
         self.ui.tangoTree.setButtonsPos(Qt.Qt.RightToolBarArea)
 
-        self.ui.reloadBT.setEnabled(False)  #@todo: The action for this button is not yet implemented
+        # @todo: The action for this button is not yet implemented
+        self.ui.reloadBT.setEnabled(False)
 
         self.model = TaurusCurveItemTableModel(curves)
 
@@ -338,30 +388,33 @@ class CurveItemConfDlg(Qt.QWidget):
 #            for col in xrange(self.model.columnCount()):
 #                table.setColumnWidth(col, table.columnWidth(col)+extraSpace)
 
-        #host
+        # host
 
-        import taurus  #@todo: I get "UnboundLocalError: local variable 'taurus' referenced before assignment" if I don't import taurus again here ????
-        host = taurus.Database().getNormalName()
+        import taurus  # @todo: I get "UnboundLocalError: local variable 'taurus' referenced before assignment" if I don't import taurus again here ????
+        host = taurus.Authority().getNormalName()
         self.ui.tangoTree.setModel(host)
 
-        #Connections
-        self.connect(self.ui.applyBT, Qt.SIGNAL("clicked()"), self.onApply)
-        self.connect(self.ui.reloadBT, Qt.SIGNAL("clicked()"), self.onReload)
-        self.connect(self.ui.cancelBT, Qt.SIGNAL("clicked()"), self.close)
-        self.connect(self.ui.tangoTree, Qt.SIGNAL("addModels"), self.onModelsAdded)
-        self.connect(self.ui.curvesTable, Qt.SIGNAL("customContextMenuRequested(QPoint)"), self.onTableContextMenu)
-
+        # Connections
+        self.ui.applyBT.clicked.connect(self.onApply)
+        self.ui.reloadBT.clicked.connect(self.onReload)
+        self.ui.cancelBT.clicked.connect(self.close)
+        self.ui.tangoTree.addModels.connect(self.onModelsAdded)
+        self.ui.curvesTable.customContextMenuRequested.connect(self.onTableContextMenu)
 
     def onTableContextMenu(self, pos):
         index = self.ui.curvesTable.indexAt(pos)
         row = index.row()
         menu = Qt.QMenu(self.ui.curvesTable)
         if row >= 0:
-            removeThisAction = menu.addAction(getThemeIcon('list-remove'), 'Remove this curve', self._onRemoveThisAction)
-        removeAllAction = menu.addAction(getThemeIcon('edit-clear'), 'Clear all', self.model.clearAll)
-        addRowAction = menu.addAction(getThemeIcon('list-add'), 'Add new row', self.model.insertRows)
+            removeThisAction = menu.addAction(Qt.QIcon.fromTheme(
+                'list-remove'), 'Remove this curve', self._onRemoveThisAction)
+        removeAllAction = menu.addAction(Qt.QIcon.fromTheme(
+            'edit-clear'), 'Clear all', self.model.clearAll)
+        addRowAction = menu.addAction(Qt.QIcon.fromTheme(
+            'list-add'), 'Add new row', self.model.insertRows)
         if row >= 0:
-            editParsAction = menu.addAction(getThemeIcon('preferences-system'), 'Edit parameters of this curve...', self._onEditParsAction)
+            editParsAction = menu.addAction(Qt.QIcon.fromTheme(
+                'preferences-system'), 'Edit parameters of this curve...', self._onEditParsAction)
 
         menu.exec_(Qt.QCursor.pos())
 
@@ -373,24 +426,29 @@ class CurveItemConfDlg(Qt.QWidget):
         row = self.ui.curvesTable.currentIndex().row()
         if row >= 0:
             c = self.model.curves[row]
-            params = [p for p in (c.curveparam, c.axesparam, c.taurusparam) if p is not None ]
+            params = [p for p in (c.curveparam, c.axesparam,
+                                  c.taurusparam) if p is not None]
             if params:
                 from guidata.dataset.datatypes import DataSetGroup
-                group = DataSetGroup(params, "Parameters for curve %s" % c.curveparam.label)
+                group = DataSetGroup(
+                    params, "Parameters for curve %s" % c.curveparam.label)
                 group.edit()
                 c.x.processSrc(c.taurusparam.xModel)
                 c.y.processSrc(c.taurusparam.yModel)
-                self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.model.index(row, 0), self.model.index(row, self.model.rowCount()))
-
+                self.dataChanged.emit(self.model.index(
+                    row, 0), self.model.index(row, self.model.rowCount()))
 
     def onModelsAdded(self, models):
         nmodels = len(models)
         rowcount = self.model.rowCount()
         self.model.insertRows(rowcount, nmodels)
         for i, m in enumerate(models):
-            self.model.setData(self.model.index(rowcount + i, Y), value=Qt.QVariant(m))
-            title = self.model.data(self.model.index(rowcount + i, Y))  # the display data
-            self.model.setData(self.model.index(rowcount + i, TITLE), value=title)
+            self.model.setData(self.model.index(
+                rowcount + i, Y), value=Qt.QVariant(m))
+            title = self.model.data(self.model.index(
+                rowcount + i, Y))  # the display data
+            self.model.setData(self.model.index(
+                rowcount + i, TITLE), value=title)
 
     def getCurveItemConfs(self):
         return self.model.dumpData()
@@ -398,10 +456,10 @@ class CurveItemConfDlg(Qt.QWidget):
     @staticmethod
     def showDlg(parent=None, curves=None):
         '''Static method that launches a modal dialog containing a CurveItemConfDlg
-        
-        :param parent: (QObject) parent for the dialog 
-        
-        :return: (list,bool or QMimeData,bool) Returns a models,ok tuple. models can be 
+
+        :param parent: (QObject) parent for the dialog
+
+        :return: (list,bool or QMimeData,bool) Returns a models,ok tuple. models can be
                  either a list of models or a QMimeData object, depending on
                  `asMimeData`. ok is True if the dialog was accepted (by
                  clicking on the "update" button) and False otherwise
@@ -412,13 +470,13 @@ class CurveItemConfDlg(Qt.QWidget):
         w = CurveItemConfDlg(parent=parent, curves=curves)
         layout.addWidget(w)
         dlg.setLayout(layout)
-        dlg.connect(w, Qt.SIGNAL('applied'), dlg.accept)
-        dlg.connect(w.ui.cancelBT, Qt.SIGNAL("clicked()"), dlg.close)
+        w.applied.connect(dlg.accept)
+        w.ui.cancelBT.clicked.connect(dlg.close)
         dlg.exec_()
         return w.getCurveItemConfs(), (dlg.result() == dlg.Accepted)
 
     def onApply(self):
-        self.emit(Qt.SIGNAL('applied'))
+        self.applied.emit()
 
     def onReload(self):
         print "RELOAD!!! (todo)"
@@ -426,7 +484,7 @@ class CurveItemConfDlg(Qt.QWidget):
 
 #
 #
-#def test2():
+# def test2():
 #    from taurus.qt.qtgui.application import TaurusApplication
 #    app = TaurusApplication(app_name="CurvesSelection", app_version=taurus.Release.version)
 #
@@ -435,6 +493,6 @@ class CurveItemConfDlg(Qt.QWidget):
 #    sys.exit()
 #
 #
-#if __name__ == "__main__":
+# if __name__ == "__main__":
 #    import sys
 #    test2()
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/image.py b/lib/taurus/qt/qtgui/extra_guiqwt/image.py
index 4aedefa..ee390de 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/image.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/image.py
@@ -1,37 +1,39 @@
- #!/usr/bin/env python
+#!/usr/bin/env python
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
 Extension of :mod:`guiqwt.image`
 """
-__all__=["TaurusImageItem","TaurusRGBImageItem","TaurusTrend2DItem",
-         "TaurusTrend2DScanItem","TaurusEncodedImageItem",
-         "TaurusEncodedRGBImageItem"]
+__all__ = ["TaurusImageItem", "TaurusRGBImageItem", "TaurusTrend2DItem",
+           "TaurusTrend2DScanItem", "TaurusEncodedImageItem",
+           "TaurusEncodedRGBImageItem"]
 
+from taurus.external.pint import Quantity
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseComponent
+from taurus.qt.qtcore.util.signal import baseSignal
 import taurus.core
 from taurus.core.util.containers import ArrayBuffer
 
@@ -43,42 +45,40 @@ import numpy
 
 class TaurusBaseImageItem(TaurusBaseComponent):
     '''A ImageItem that gets its data from a taurus attribute'''
-    def __init__(self, classname):
-        TaurusBaseComponent.__init__(self, classname)
-        self._signalGen = Qt.QObject()
 
-    def getSignaller(self):
-        '''reimplemented from TaurusBaseComponent because TaurusImageItem is 
-        not (and cannot be) a QObject'''
-        return self._signalGen
+    dataChanged = baseSignal('dataChanged')
 
     def setModel(self, model):
-        #do the standard stuff
+        # do the standard stuff
         TaurusBaseComponent.setModel(self, model)
         #... and fire a fake event for initialization
         try:
             value = self.getModelObj().read()
-            self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
+            self.fireEvent(
+                self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
         except:
             pass
 
     def handleEvent(self, evt_src, evt_type, evt_value):
-        if evt_value is None or getattr(evt_value,'value', None) is None:
-            self.debug('Ignoring event from %s'%repr(evt_src))
+        if evt_value is None or getattr(evt_value, 'rvalue', None) is None:
+            self.debug('Ignoring event from %s' % repr(evt_src))
             return
-        v = evt_value.value
+        v = evt_value.rvalue
+        if isinstance(v, Quantity):
+            v = v.magnitude
+            # TODO: units should be used for setting some title in the colorbar
         try:
             v = self.filterData(v)
         except Exception, e:
             self.info('Ignoring event. Reason: %s', e.message)
             return
-        #this is the range of the z axis (color scale)
+        # this is the range of the z axis (color scale)
         lut_range = self.get_lut_range()
-        #if the range was not set, make it None (autoscale z axis)
+        # if the range was not set, make it None (autoscale z axis)
         if lut_range[0] == lut_range[1]:
             lut_range = None
         self.set_data(v, lut_range=lut_range)
-        self.getSignaller().emit(Qt.SIGNAL('dataChanged'))
+        self.dataChanged.emit()
         p = self.plot()
 
         if p is not None:
@@ -86,16 +86,16 @@ class TaurusBaseImageItem(TaurusBaseComponent):
             p.replot()
 
     def filterData(self, data):
-        '''Reimplement this method if you want to pre-process 
+        '''Reimplement this method if you want to pre-process
         the data that will be passed to set_data.
-        
+
         It should return something acceptable by :meth:`setData`
         and raise an exception if the data cannot be processed.
-        
-        This default implementation casts array types not 
+
+        This default implementation casts array types not
         supported by guiqwt to numpy.int32
-        
-        See: 
+
+        See:
           - http://code.google.com/p/guiqwt/issues/detail?id=44 and
           - https://sourceforge.net/tracker/?func=detail&atid=484769&aid=3603991&group_id=57612
           - https://sourceforge.net/p/tauruslib/tickets/33/
@@ -104,30 +104,34 @@ class TaurusBaseImageItem(TaurusBaseComponent):
             dtype = data.dtype
             v = data
         except:
-            v = numpy.array(data) #note that this is potentially expensive
+            v = numpy.array(data)  # note that this is potentially expensive
             dtype = v.dtype
 
         if dtype not in (float, numpy.double, numpy.int32, numpy.uint16,
-                          numpy.int16, numpy.uint8, numpy.int8, bool): 
-            #note: numpy.uint32 was not included because of https://sourceforge.net/p/tauruslib/tickets/33/    
-            try: 
+                         numpy.int16, numpy.uint8, numpy.int8, bool):
+            # note: numpy.uint32 was not included because of
+            # https://sourceforge.net/p/tauruslib/tickets/33/
+            try:
                 self.debug('casting to numpy.int32')
-                v = numpy.int32(v)  
+                v = numpy.int32(v)
             except OverflowError:
-                raise OverflowError("type %s not supported by guiqwt and cannot be casted to int32"%repr(v.dtype))
+                raise OverflowError(
+                    "type %s not supported by guiqwt and cannot be casted to int32" % repr(v.dtype))
 
         return v
 
 
 class TaurusEncodedBaseImageItem(TaurusBaseImageItem):
     '''A ImageItem that gets its data from a taurus DevEncoded attribute'''
+
     def setModel(self, model):
-        #do the standard stuff
+        # do the standard stuff
         TaurusBaseComponent.setModel(self, model)
         #... and fire a fake event for initialization
         try:
-            fmt,value = self.codec.decode(self.getModelObj().read())
-            self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
+            fmt, value = self.codec.decode(self.getModelObj().read())
+            self.fireEvent(
+                self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
         except:
             pass
 
@@ -147,59 +151,69 @@ class TaurusEncodedBaseImageItem(TaurusBaseImageItem):
                 dtype = decoded_data.dtype
                 v = decoded_data
             except:
-                v = numpy.array(decoded_data) #note that this is potentially expensive
+                # note that this is potentially expensive
+                v = numpy.array(decoded_data)
                 dtype = v.dtype
 
             if dtype not in (float, numpy.double, numpy.int32, numpy.uint16,
-                             numpy.int16, numpy.uint8, numpy.int8, bool): 
-            #note: numpy.uint32 was not included because of https://sourceforge.net/p/tauruslib/tickets/33/    
+                             numpy.int16, numpy.uint8, numpy.int8, bool):
+                # note: numpy.uint32 was not included because of
+                # https://sourceforge.net/p/tauruslib/tickets/33/
                 try:
                     self.debug('casting to numpy.int32')
-                    v = numpy.int32(v)  
+                    v = numpy.int32(v)
                 except OverflowError:
-                    raise OverflowError("type %s not supported by guiqwt and cannot be casted to int32"%repr(v.dtype))
+                    raise OverflowError(
+                        "type %s not supported by guiqwt and cannot be casted to int32" % repr(v.dtype))
 
             return v
         else:
-            raise ValueError('Unexpected data type (%s) for DevEncoded attribute (tuple expected)'%type(data))
+            raise ValueError(
+                'Unexpected data type (%s) for DevEncoded attribute (tuple expected)' % type(data))
 
 
 class TaurusImageItem(ImageItem, TaurusBaseImageItem):
     '''A ImageItem that gets its data from a taurus attribute'''
+
     def __init__(self, param=None):
-        ImageItem.__init__(self, numpy.zeros((1,1)), param=param)
+        ImageItem.__init__(self, numpy.zeros((1, 1)), param=param)
         TaurusBaseImageItem.__init__(self, self.__class__.__name__)
 
 
 class TaurusEncodedImageItem(ImageItem, TaurusEncodedBaseImageItem):
     '''A ImageItem that gets its data from a DevEncoded attribute'''
+
     def __init__(self, param=None):
-        ImageItem.__init__(self, numpy.zeros((1,1)), param=param)
+        ImageItem.__init__(self, numpy.zeros((1, 1)), param=param)
         TaurusEncodedBaseImageItem.__init__(self, self.__class__.__name__)
 
 
 class TaurusXYImageItem(XYImageItem, TaurusBaseImageItem):
     '''A XYImageItem that gets its data from a taurus attribute'''
+
     def __init__(self, param=None):
-        XYImageItem.__init__(self, numpy.arange(2), numpy.arange(2), numpy.zeros((2,2)), param=param)
+        XYImageItem.__init__(self, numpy.arange(2), numpy.arange(
+            2), numpy.zeros((2, 2)), param=param)
         TaurusBaseImageItem.__init__(self, self.__class__.__name__)
 
 
 class TaurusRGBImageItem(RGBImageItem, TaurusBaseImageItem):
     '''A RGBImageItem that gets its data from a taurus attribute'''
+
     def __init__(self, param=None):
-        RGBImageItem.__init__(self, numpy.zeros((1,1,3)), param=param)
+        RGBImageItem.__init__(self, numpy.zeros((1, 1, 3)), param=param)
         TaurusBaseImageItem.__init__(self, self.__class__.__name__)
-        
-    def set_data(self, data, lut_range=None, **kwargs): 
+
+    def set_data(self, data, lut_range=None, **kwargs):
         '''dummy reimplementation to accept the lut_range kwarg (just ignoring it)'''
         return RGBImageItem.set_data(self, data, **kwargs)
 
-        
+
 class TaurusEncodedRGBImageItem(RGBImageItem, TaurusEncodedBaseImageItem):
     '''A RGBImageItem that gets its data from a DevEncoded attribute'''
+
     def __init__(self, param=None):
-        RGBImageItem.__init__(self, numpy.zeros((1,1,3)), param=param)
+        RGBImageItem.__init__(self, numpy.zeros((1, 1, 3)), param=param)
         TaurusEncodedBaseImageItem.__init__(self, self.__class__.__name__)
 
     def set_data(self, data, lut_range=None, **kwargs):
@@ -209,10 +223,14 @@ class TaurusEncodedRGBImageItem(RGBImageItem, TaurusEncodedBaseImageItem):
 
 class TaurusTrend2DItem(XYImageItem, TaurusBaseComponent):
     '''A XYImageItem that is constructed by stacking 1D arrays from events from a Taurus 1D attribute'''
+
+    scrollRequested = baseSignal('scrollRequested', object, object, object)
+    dataChanged = baseSignal('dataChanged')
+
     def __init__(self, param=None, buffersize=512, stackMode='datetime'):
-        XYImageItem.__init__(self, numpy.arange(2), numpy.arange(2), numpy.zeros((2,2)), param=param)
+        XYImageItem.__init__(self, numpy.arange(2), numpy.arange(
+            2), numpy.zeros((2, 2)), param=param)
         TaurusBaseComponent.__init__(self, self.__class__.__name__)
-        self._signalGen = Qt.QObject()
         self.maxBufferSize = buffersize
         self._yValues = None
         self._xBuffer = None
@@ -221,14 +239,9 @@ class TaurusTrend2DItem(XYImageItem, TaurusBaseComponent):
         self.set_interpolation(INTERP_NEAREST)
         self.__timeOffset = None
 
-    def getSignaller(self):
-        '''reimplemented from TaurusBaseComponent because TaurusImageItem is 
-        not (and cannot be) a QObject'''
-        return self._signalGen  
-    
     def setBufferSize(self, buffersize):
         '''sets the size of the stack
-        
+
         :param buffersize: (int) size of the stack
         '''
         self.maxBufferSize = buffersize
@@ -238,64 +251,71 @@ class TaurusTrend2DItem(XYImageItem, TaurusBaseComponent):
             if self._zBuffer is not None:
                 self._zBuffer.setMaxSize(buffersize)
         except ValueError:
-            self.info('buffer downsizing  requested. Current contents will be discarded')
+            self.info(
+                'buffer downsizing  requested. Current contents will be discarded')
             self._xBuffer = None
             self._zBuffer = None
-        
+
     def setModel(self, model):
-        #do the standard stuff
+        # do the standard stuff
         TaurusBaseComponent.setModel(self, model)
         #... and fire a fake event for initialization
         try:
             value = self.getModelObj().read()
-            self.fireEvent(self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
+            self.fireEvent(
+                self, taurus.core.taurusbasetypes.TaurusEventType.Change, value)
         except:
             pass
 
     def handleEvent(self, evt_src, evt_type, evt_value):
-        if evt_value is None or getattr(evt_value,'value', None) is None:
-            self.debug('Ignoring event from %s'%repr(evt_src))
+        if evt_value is None or getattr(evt_value, 'rvalue', None) is None:
+            self.debug('Ignoring event from %s' % repr(evt_src))
             return
         plot = self.plot()
         if plot is None:
             return
-            
-        #initialization
-        ySize = len(evt_value.value)
+
+        # initialization
+        ySize = len(evt_value.rvalue)
         if self._yValues is None:
-            self._yValues = numpy.arange(ySize,dtype='d')
+            self._yValues = numpy.arange(ySize, dtype='d')
         if self._xBuffer is None:
-            self._xBuffer = ArrayBuffer(numpy.zeros(min(128,self.maxBufferSize), dtype='d'), maxSize=self.maxBufferSize )
+            self._xBuffer = ArrayBuffer(numpy.zeros(
+                min(128, self.maxBufferSize), dtype='d'), maxSize=self.maxBufferSize)
         if self._zBuffer is None:
-            self._zBuffer = ArrayBuffer(numpy.zeros((min(128,self.maxBufferSize), ySize),dtype='d'), maxSize=self.maxBufferSize )
+            self._zBuffer = ArrayBuffer(numpy.zeros(
+                (min(128, self.maxBufferSize), ySize), dtype='d'), maxSize=self.maxBufferSize)
             return
-        
-        #check that new data is compatible with previous data    
+
+        # check that new data is compatible with previous data
         if ySize != self._yValues.size:
-            self.info('Incompatible shape in data from event (orig=%i, current=%i). Ignoring'%(self._yValues.size, ySize))
+            self.info('Incompatible shape in data from event (orig=%i, current=%i). Ignoring' % (
+                self._yValues.size, ySize))
             return
-        
-        #update x values
+
+        # update x values
         if self.stackMode == 'datetime':
             x = evt_value.time.totime()
             if self.__timeOffset is None:
                 self.__timeOffset = x
                 plot.set_axis_title('bottom', 'Time')
                 plot.set_axis_unit('bottom', '')
-        
+
         elif self.stackMode == 'deltatime':
             try:
                 x = evt_value.time.totime() - self.__timeOffset
-            except TypeError: #this will happen if self.__timeOffset has not been initialized
+            except TypeError:  # this will happen if self.__timeOffset has not been initialized
                 self.__timeOffset = evt_value.time.totime()
                 x = 0
-                plot.set_axis_title('bottom', 'Time since %s'%evt_value.time.isoformat())
+                plot.set_axis_title('bottom', 'Time since %s' %
+                                    evt_value.time.isoformat())
                 plot.set_axis_unit('bottom', '')
-        else:  
+        else:
             try:
-                step = 1 # +numpy.random.randint(0,4) #for debugging we can put a variable step
-                x = self._xBuffer[-1]+step
-            except IndexError: #this will happen when the x buffer is empty
+                # +numpy.random.randint(0,4) #for debugging we can put a variable step
+                step = 1
+                x = self._xBuffer[-1] + step
+            except IndexError:  # this will happen when the x buffer is empty
                 x = 0
                 plot.set_axis_title('bottom', 'Event #')
                 plot.set_axis_unit('bottom', '')
@@ -304,51 +324,60 @@ class TaurusTrend2DItem(XYImageItem, TaurusBaseComponent):
             self.info('Ignoring event (non-increasing x value)')
             return
         self._xBuffer.append(x)
-        
-        #update z
-        self._zBuffer.append(evt_value.value)
-        
-        #check if there is enough data to start plotting
-        if len(self._xBuffer)<2:
-            self.info('waiting for at least 2 values to start plotting') 
+
+        # update z
+        rvalue = evt_value.rvalue
+        if isinstance(evt_value.rvalue, Quantity):
+            rvalue = evt_value.rvalue.magnitude
+            # TODO: units should be checked for coherence with previous values
+        self._zBuffer.append(rvalue)
+
+        # check if there is enough data to start plotting
+        if len(self._xBuffer) < 2:
+            self.info('waiting for at least 2 values to start plotting')
             return
-        
+
         x = self._xBuffer.contents()
         y = self._yValues
         z = self._zBuffer.contents().transpose()
-        
+
         if x.size == 2:
-            plot.set_axis_limits('left',y.min(), y.max())
-            xmax = x[0]+(x[1]-x[0])*self.maxBufferSize #guess the max of the scale allowed by the buffer
+            plot.set_axis_limits('left', y.min(), y.max())
+            # guess the max of the scale allowed by the buffer
+            xmax = x[0] + (x[1] - x[0]) * self.maxBufferSize
             plot.set_axis_limits('bottom', x.min(), xmax)
-        
-        #update the plot data
-        lut_range = self.get_lut_range() #this is the range of the z axis (color scale)
-        if lut_range[0] == lut_range[1]: lut_range = None #if the range was not set, make it None (autoscale z axis)
+
+        # update the plot data
+        lut_range = self.get_lut_range()  # this is the range of the z axis (color scale)
+        if lut_range[0] == lut_range[1]:
+            # if the range was not set, make it None (autoscale z axis)
+            lut_range = None
         self.set_data(z, lut_range=lut_range)
         self.set_xy(x, y)
-        
-        #signal data changed and replot
-        self.getSignaller().emit(Qt.SIGNAL('dataChanged'))
-        
-        if plot is not None: 
-            value=x[-1]
+
+        # signal data changed and replot
+        self.dataChanged.emit()
+
+        if plot is not None:
+            value = x[-1]
             axis = self.xAxis()
             xmin, xmax = plot.get_axis_limits(axis)
-            if value>xmax or value<xmin:
-                self.getSignaller().emit(Qt.SIGNAL('scrollRequested'), plot, axis, value )
+            if value > xmax or value < xmin:
+                self.scrollRequested.emit(plot, axis, value)
             plot.update_colormap_axis(self)
             plot.replot()
-            
-            
+
+
 class TaurusTrend2DScanItem(TaurusTrend2DItem):
     _xDataKey = 'point_nb'
+
     def __init__(self, channelKey, xDataKey, door, param=None, buffersize=512):
-        TaurusTrend2DItem.__init__(self, param=param, buffersize=buffersize, stackMode=None)
+        TaurusTrend2DItem.__init__(
+            self, param=param, buffersize=buffersize, stackMode=None)
         self._channelKey = channelKey
         self._xDataKey = xDataKey
         self.connectWithQDoor(door)
-    
+
     def scanDataReceived(self, packet):
         '''
         packet is a dict with {type:str, "data":object} and the accepted types are: data_desc, record_data, record_end
@@ -357,36 +386,35 @@ class TaurusTrend2DScanItem(TaurusTrend2DItem):
         if packet is None:
             self.debug('Ignoring empty scan data packet')
             return
-        id,packet = packet
-        pcktype = packet.get("type","__UNKNOWN_PCK_TYPE__")
-        if pcktype == "data_desc": 
+        id, packet = packet
+        pcktype = packet.get("type", "__UNKNOWN_PCK_TYPE__")
+        if pcktype == "data_desc":
             self._dataDescReceived(packet["data"])
-        elif pcktype == "record_data": 
+        elif pcktype == "record_data":
             self._scanLineReceived(packet["data"])
         elif pcktype == "record_end":
             pass
         else:
-            self.debug("Ignoring packet of type %s"%repr(pcktype))
-    
+            self.debug("Ignoring packet of type %s" % repr(pcktype))
+
     def clearTrend(self):
         self._yValues = None
         self._xBuffer = None
         self._zBuffer = None
 
-    
     def _dataDescReceived(self, datadesc):
         '''prepares the plot according to the info in the datadesc dictionary'''
         self.clearTrend()
-        #decide which data to use for x
+        # decide which data to use for x
         if self._xDataKey is None or self._xDataKey == "<mov>":
             self._autoXDataKey = datadesc['ref_moveables'][0]
         elif self._xDataKey == "<idx>":
             self._autoXDataKey = 'point_nb'
         else:
             self._autoXDataKey = self._xDataKey
-        #set the x axis
-        columndesc = datadesc.get('column_desc',[])
-        xinfo = {'min_value':None, 'max_value':None}
+        # set the x axis
+        columndesc = datadesc.get('column_desc', [])
+        xinfo = {'min_value': None, 'max_value': None}
         for e in columndesc:
             if e['label'] == self._autoXDataKey:
                 xinfo = e
@@ -395,139 +423,147 @@ class TaurusTrend2DScanItem(TaurusTrend2DItem):
         plot.set_axis_title('bottom', self._autoXDataKey)
         xmin, xmax = xinfo.get('min_value'), xinfo.get('max_value')
         if xmin is None or xmax is None:
-            pass  #@todo: autoscale if any limit is unknown
+            pass  # @todo: autoscale if any limit is unknown
         else:
-            plot.set_axis_limits('bottom',xmin, xmax)
-            
+            plot.set_axis_limits('bottom', xmin, xmax)
 
-    
     def _scanLineReceived(self, recordData):
         '''Receives a recordData dictionary and updates the curves associated to it
-        
+
         .. seealso:: <Sardana>/MacroServer/scan/scandata.py:Record.data
-        
+
         '''
-        #obtain the x value
+        # obtain the x value
         try:
             xval = recordData[self._autoXDataKey]
         except KeyError:
-            self.warning('Cannot find data "%s" in the current scan record. Ignoring',self._autoXDataKey)
+            self.warning(
+                'Cannot find data "%s" in the current scan record. Ignoring', self._autoXDataKey)
             return
         if not numpy.isscalar(xval):
-            self.warning('Data for "%s" is of type "%s". Cannot use it for the X values. Ignoring',self._autoXDataKey, type(xval))
+            self.warning('Data for "%s" is of type "%s". Cannot use it for the X values. Ignoring',
+                         self._autoXDataKey, type(xval))
             return
-        #obtain y value
+        # obtain y value
         try:
             chval = recordData[self._channelKey]
         except KeyError:
-            self.warning('Cannot find data "%s" in the current scan record. Ignoring',self._channelKey)
-        if chval.shape !=  self._yValues.shape:
-            self.warning('Incompatible shape of "%s" (%s). Ignoring',self._channelKey, repr(chval.shape))
+            self.warning(
+                'Cannot find data "%s" in the current scan record. Ignoring', self._channelKey)
+        if chval.shape != self._yValues.shape:
+            self.warning('Incompatible shape of "%s" (%s). Ignoring',
+                         self._channelKey, repr(chval.shape))
             return
-          
-        #initialization
+
+        # initialization
         if self._yValues is None:
-            self._yValues = numpy.arange(chval.size,dtype='d')
+            self._yValues = numpy.arange(chval.size, dtype='d')
         if self._xBuffer is None:
-            self._xBuffer = ArrayBuffer(numpy.zeros(min(16,self.maxBufferSize), dtype='d'), maxSize=self.maxBufferSize )
+            self._xBuffer = ArrayBuffer(numpy.zeros(
+                min(16, self.maxBufferSize), dtype='d'), maxSize=self.maxBufferSize)
         if self._zBuffer is None:
-            self._zBuffer = ArrayBuffer(numpy.zeros((min(16,self.maxBufferSize), chval.size),dtype='d'), maxSize=self.maxBufferSize )
-        
-        #update x           
-        self._xBuffer.append(xval) 
-        #update z
+            self._zBuffer = ArrayBuffer(numpy.zeros(
+                (min(16, self.maxBufferSize), chval.size), dtype='d'), maxSize=self.maxBufferSize)
+
+        # update x
+        self._xBuffer.append(xval)
+        # update z
         self._zBuffer.append(chval)
-        
-        #check if there is enough data to start plotting
-        if len(self._xBuffer)<2:
-            self.info('waiting for at least 2 values to start plotting') 
+
+        # check if there is enough data to start plotting
+        if len(self._xBuffer) < 2:
+            self.info('waiting for at least 2 values to start plotting')
             return
-        
+
         x = self._xBuffer.contents()
         y = self._yValues
         z = self._zBuffer.contents().transpose()
-        
-        #update the plot data
-        lut_range = self.get_lut_range() #this is the range of the z axis (color scale)
-        if lut_range[0] == lut_range[1]: lut_range = None #if the range was not set, make it None (autoscale z axis)
+
+        # update the plot data
+        lut_range = self.get_lut_range()  # this is the range of the z axis (color scale)
+        if lut_range[0] == lut_range[1]:
+            # if the range was not set, make it None (autoscale z axis)
+            lut_range = None
         self.set_data(z, lut_range=lut_range)
         self.set_xy(x, y)
-        
-        #signal data changed and replot
-        self.getSignaller().emit(Qt.SIGNAL('dataChanged'))
+
+        # signal data changed and replot
+        self.dataChanged.emit()
         plot = self.plot()
-        if plot is not None: 
-            value=x[-1]
+        if plot is not None:
+            value = x[-1]
             axis = self.xAxis()
             xmin, xmax = plot.get_axis_limits(axis)
-            if value>xmax or value<xmin:
-                self.getSignaller().emit(Qt.SIGNAL('scrollRequested'), plot, axis, value )
+            if value > xmax or value < xmin:
+                self.scrollRequested.emit(plot, axis, value)
             plot.update_colormap_axis(self)
             plot.replot()
-                  
+
     def connectWithQDoor(self, doorname):
         '''connects this TaurusTrend2DScanItem to a QDoor
-        
+
         :param doorname: (str) the QDoor name
         '''
         qdoor = taurus.Device(doorname)
-        qdoor.connect(qdoor, Qt.SIGNAL("recordDataUpdated"), self.scanDataReceived)
-            
+        qdoor.recordDataUpdated.connect(self.scanDataReceived)
+
     def getModel(self):
-        return self.__model 
-    
+        return self.__model
+
     def setModel(self, model):
         self.__model = model
-        
-        
+
 
 def taurusImageMain():
     from guiqwt.tools import (RectangleTool, EllipseTool, HRangeTool, PlaceAxesTool,
-                          MultiLineTool, FreeFormTool, SegmentTool, CircleTool,
-                          AnnotatedRectangleTool, AnnotatedEllipseTool,
-                          AnnotatedSegmentTool, AnnotatedCircleTool, LabelTool,
-                          AnnotatedPointTool, ObliqueRectangleTool, 
-                          AnnotatedObliqueRectangleTool)
-    try: #In newer guiqwt versions, Annotated*CursorTool have been replaced by *CursorTool
+                              MultiLineTool, FreeFormTool, SegmentTool, CircleTool,
+                              AnnotatedRectangleTool, AnnotatedEllipseTool,
+                              AnnotatedSegmentTool, AnnotatedCircleTool, LabelTool,
+                              AnnotatedPointTool, ObliqueRectangleTool,
+                              AnnotatedObliqueRectangleTool)
+    try:  # In newer guiqwt versions, Annotated*CursorTool have been replaced by *CursorTool
         from guiqwt.tools import AnnotatedVCursorTool, AnnotatedHCursorTool
         VCursorTool, HCursorTool = AnnotatedVCursorTool, AnnotatedHCursorTool
     except ImportError:
-        from guiqwt.tools import VCursorTool, HCursorTool 
-        
+        from guiqwt.tools import VCursorTool, HCursorTool
+
     from taurus.qt.qtgui.extra_guiqwt.tools import TaurusImageChooserTool
     from guiqwt.plot import ImageDialog
     from taurus.qt.qtgui.extra_guiqwt.builder import make
     from taurus.qt.qtgui.application import TaurusApplication
     import taurus.core.util.argparse
     import sys
-    
+
     parser = taurus.core.util.argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [<model1> [<model2>] ...]")
     parser.set_description("a taurus application for plotting 2D data sets")
-    app = TaurusApplication(cmd_line_parser=parser, app_name="taurusimage", app_version=taurus.Release.version)
+    app = TaurusApplication(
+        cmd_line_parser=parser, app_name="taurusimage", app_version=taurus.Release.version)
     args = app.get_command_line_args()
-    
-    #create a dialog with a plot and add the images
+
+    # create a dialog with a plot and add the images
     win = ImageDialog(edit=False, toolbar=True, wintitle="Taurus Image",
                       options=dict(show_xsection=False, show_ysection=False))
-    
-    #add tools
+
+    # add tools
     for toolklass in (TaurusImageChooserTool,
-                      LabelTool, HRangeTool, 
+                      LabelTool, HRangeTool,
                       MultiLineTool, FreeFormTool, PlaceAxesTool,
                       AnnotatedObliqueRectangleTool,
                       AnnotatedEllipseTool, AnnotatedSegmentTool,
                       AnnotatedPointTool, VCursorTool,
                       HCursorTool):
         win.add_tool(toolklass)
-    
-    #add images from given models
+
+    # add images from given models
     plot = win.get_plot()
     for m in args:
-        img = make.image(taurusmodel= m)
+        img = make.image(taurusmodel=m)
         plot.add_item(img)
-        win.connect(img.getSignaller(), Qt.SIGNAL("dataChanged"), win.update_cross_sections) #IMPORTANT: connect the cross section plots to the taurusimage so that they are updated when the taurus data changes
-        
+        # IMPORTANT: connect the cross section plots to the taurusimage so that
+        # they are updated when the taurus data changes
+        img.dataChanged.connect(win.update_cross_sections)
+
     win.exec_()
 
 
@@ -537,21 +573,21 @@ def test1():
     from taurus.qt.qtgui.extra_guiqwt.builder import make
     from taurus.qt.qtgui.application import TaurusApplication
     app = TaurusApplication()
-        
-    #define a taurus image
+
+    # define a taurus image
     #model1 = 'sys/tg_test/1/short_image_ro'
     #model1 = 'sys/tg_test/1/long64_image_ro'
     model1 = 'sys/tg_test/1/ulong_image_ro'
-    taurusimage = make.image(taurusmodel= model1)
-    #taurusrgbimage = make.rgbimage(taurusmodel= 'eval://array([[[ 222, 0, 0], [0, 222, 0]], [[0, 0, 222], [222, 222, 222]]])')
+    taurusimage = make.image(taurusmodel=model1)
+    #taurusrgbimage = make.rgbimage(taurusmodel= 'eval:array([[[ 222, 0, 0], [0, 222, 0]], [[0, 0, 222], [222, 222, 222]]])')
     #taurusxyimage= make.xyimage(taurusmodel= model1)
     #taurusxyimage.set_xy(numpy.arange(251)*10,numpy.arange(251)*100 )
-    
-    #define normal image (guiqwt standard)
+
+    # define normal image (guiqwt standard)
     #data = numpy.random.rand(100,100)
     #image = make.image(data=data)
-    
-    #create a dialog with a plot and add the images
+
+    # create a dialog with a plot and add the images
     win = ImageDialog(edit=False, toolbar=True, wintitle="Taurus Cross sections test",
                       options=dict(show_xsection=False, show_ysection=False))
     from taurus.qt.qtgui.extra_guiqwt.tools import TaurusImageChooserTool
@@ -563,13 +599,12 @@ def test1():
 #    plot.add_item(taurusrgbimage)
 
 #    win.get_itemlist_panel().show()
-    
-    #IMPORTANT: connect the cross section plots to the taurusimage so that they are updated when the taurus data changes
-    #win.connect(taurusimage.getSignaller(), Qt.SIGNAL("dataChanged"), win.update_cross_sections)
-    
+
+    # IMPORTANT: connect the cross section plots to the taurusimage so that they are updated when the taurus data changes
+    # taurusimage.dataChanged.connect(win.update_cross_sections)
+
     win.exec_()
 
 if __name__ == "__main__":
     test1()
-    #taurusImageMain()   
-
+    # taurusImageMain()
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py
index db4bb25..bd8c0bc 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py
@@ -2,31 +2,31 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
 Extension of :mod:`guiqwt.plot`
 """
-__all__=["TaurusCurveDialog", "TaurusTrendDialog", "TaurusImageDialog"]
+__all__ = ["TaurusCurveDialog", "TaurusTrendDialog", "TaurusImageDialog"]
 
 import copy
 
@@ -41,15 +41,18 @@ from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_
 from taurus.qt.qtgui.extra_guiqwt.builder import make
 from taurus.qt.qtgui.extra_guiqwt.curve import TaurusCurveItem, TaurusTrendParam, TaurusTrendItem
 
+
 class TaurusCurveDialog(CurveDialog, TaurusBaseWidget):
     '''A taurus dialog for showing 1D data.
     It behaves as a regular :class:`guiqwt.plot.CurveDialog` but it also offers
     the expected Taurus interface (e.g. setting models, save/apply configs,
     drag&drops,...)
-    
+
     .. seealso:: :class:`TaurusCurveWidget`
     '''
     _modifiableByUser = True
+    modelChanged = Qt.pyqtSignal([], ['QStringList'], [str])
+
     def __init__(self, parent=None, designMode=False, toolbar=True, **kwargs):
         '''see :class:`guiqwt.plot.CurveDialog` for other valid initialization parameters'''
         CurveDialog.__init__(self, parent=parent, toolbar=toolbar, **kwargs)
@@ -59,30 +62,31 @@ class TaurusCurveDialog(CurveDialog, TaurusBaseWidget):
         self._modelNames = CaselessList()
         from guiqwt.styles import style_generator
         self.style = style_generator()
-        self.setSupportedMimeTypes([TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE])
+        self.setSupportedMimeTypes(
+            [TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE])
         from taurus.qt.qtgui.extra_guiqwt.tools import TaurusCurveChooserTool
         self.add_tool(TaurusCurveChooserTool)
         self.setModifiableByUser(self._modifiableByUser)
         self.setContextMenuPolicy(Qt.Qt.CustomContextMenu)
 
-    def keyPressEvent(self,event):
+    def keyPressEvent(self, event):
         if(event.key() == Qt.Qt.Key_Escape):
             event.ignore()
         else:
-            ImageDialog.keyPressEvent(self,event)
-  
+            ImageDialog.keyPressEvent(self, event)
+
     def getModelClass(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         return taurus.core.taurusattribute.TaurusAttribute
-    
+
     def _splitModel(self, modelNames):
         '''convert str to list if needed (commas and whitespace are considered as separators)'''
-        if isinstance(modelNames,(basestring,Qt.QString)): 
-            modelNames = str(modelNames).replace(',',' ')
+        if isinstance(modelNames, (basestring, Qt.QString)):
+            modelNames = str(modelNames).replace(',', ' ')
             modelNames = modelNames.split()
         return modelNames
-    
-    @Qt.pyqtSignature("setModel(QStringList)")
+
+    @Qt.pyqtSlot('QStringList')
     def setModel(self, modelNames):
         '''Removes current TaurusCurveItems and adds new ones.
 
@@ -98,20 +102,21 @@ class TaurusCurveDialog(CurveDialog, TaurusBaseWidget):
 
         .. seealso:: :meth:`addModels`
         '''
-        
+
         plot = self.get_plot()
-        #delete current TaurusCurveItems
-        taurusCurveItems = [item for item in plot.get_public_items() if isinstance(item, TaurusCurveItem)]
+        # delete current TaurusCurveItems
+        taurusCurveItems = [item for item in plot.get_public_items(
+        ) if isinstance(item, TaurusCurveItem)]
         plot.del_items(taurusCurveItems)
         self._modelNames = CaselessList()
-        #add new TaurusCurveItems
+        # add new TaurusCurveItems
         self.addModels(modelNames)
-        
+
     def addModels(self, modelNames):
-        '''Creates TaurusCurveItems (one for each model in modelNames) and attaches 
+        '''Creates TaurusCurveItems (one for each model in modelNames) and attaches
         them to the plot.
-        
-        .. note:: you can also add curves using :meth:`add_items`. :meth:`addModels` 
+
+        .. note:: you can also add curves using :meth:`add_items`. :meth:`addModels`
                   is only a more Taurus-oriented interface. :meth:`add_items`
                   gives you more control.
 
@@ -128,43 +133,44 @@ class TaurusCurveDialog(CurveDialog, TaurusBaseWidget):
         .. seealso:: :meth:`add_item`
         '''
         plot = self.get_plot()
-         
-        #pre-process the model names
+
+        # pre-process the model names
         modelNames = self._splitModel(modelNames)
         self._modelNames.extend([str(n) for n in modelNames])
         if self._designMode:
             return
-        #create and attach new TaurusCurveItems
+        # create and attach new TaurusCurveItems
         for m in modelNames:
-            #split model into x and y components
+            # split model into x and y components
             mx_my = m.split('|')
             n = len(mx_my)
-            if n == 1: 
+            if n == 1:
                 mx, my = None, mx_my[0]
             elif n == 2:
                 mx, my = mx_my
             else:
-                self.warning('Invalid model "%s" (Skipping)'%mx_my)
-            #cycle styles
+                self.warning('Invalid model "%s" (Skipping)' % mx_my)
+            # cycle styles
             style = self.style.next()
-            color=style[0]
+            color = style[0]
             linestyle = style[1:]
-            #add the item 
-            item = make.curve(mx,my, color=color, linestyle=linestyle, linewidth=2)
+            # add the item
+            item = make.curve(mx, my, color=color,
+                              linestyle=linestyle, linewidth=2)
             item.set_readonly(not self.isModifiableByUser())
             plot.add_item(item)
-        self.emit(Qt.SIGNAL("modelChanged()"))
+        self.modelChanged.emit()
 
     def getModel(self):
         """reimplemented from :class:`TaurusBaseWidget`"""
         return self._modelNames
-        
+
     def setModifiableByUser(self, modifiable):
         """reimplemented from :class:`TaurusBaseWidget`"""
         from taurus.qt.qtgui.extra_guiqwt.tools import TaurusCurveChooserTool
         self.get_tool(TaurusCurveChooserTool).action.setEnabled(modifiable)
         self.get_plot().set_items_readonly(not modifiable)
-        TaurusBaseWidget.setModifiableByUser(self, modifiable)    
+        TaurusBaseWidget.setModifiableByUser(self, modifiable)
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
@@ -172,21 +178,27 @@ class TaurusCurveDialog(CurveDialog, TaurusBaseWidget):
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.extra_guiqwt'
         ret['group'] = 'Taurus Display'
-        ret['icon'] =':/designer/qwtplot.png'
+        ret['icon'] = 'designer:qwtplot.png'
         return ret
-    
-    model = Qt.pyqtProperty("QStringList", getModel, setModel, TaurusBaseWidget.resetModel)
-    modifiableByUser = Qt.pyqtProperty("bool", TaurusBaseWidget.isModifiableByUser, setModifiableByUser, TaurusBaseWidget.resetModifiableByUser)
+
+    model = Qt.pyqtProperty("QStringList", getModel,
+                            setModel, TaurusBaseWidget.resetModel)
+    modifiableByUser = Qt.pyqtProperty(
+        "bool", TaurusBaseWidget.isModifiableByUser, setModifiableByUser, TaurusBaseWidget.resetModifiableByUser)
+
 
 class TaurusTrendDialog(CurveDialog, TaurusBaseWidget):
     '''A taurus widget for showing trends of scalar data.
     It is an specialization of :class:`guiqwt.plot.CurveWidget`, for displaying
     trends and offering the expected Taurus interface (e.g. setting models,
     save/apply configs, drag&drops,...)
-    
+
     .. seealso:: :class:`TaurusTrendDialog`
     '''
     _modifiableByUser = True
+
+    modelChanged = Qt.pyqtSignal([], ['QStringList'], [str])
+
     def __init__(self, parent=None, designMode=False, taurusparam=None, toolbar=True, **kwargs):
         '''see :class:`guiqwt.plot.CurveDialog` for other valid initialization parameters'''
         CurveDialog.__init__(self, parent=parent, toolbar=toolbar, **kwargs)
@@ -196,37 +208,39 @@ class TaurusTrendDialog(CurveDialog, TaurusBaseWidget):
         self._modelNames = CaselessList()
         from guiqwt.styles import style_generator
         self.style = style_generator()
-        self.setSupportedMimeTypes([TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE])
-        from taurus.qt.qtgui.extra_guiqwt.tools import TaurusModelChooserTool,AutoScrollTool
+        self.setSupportedMimeTypes(
+            [TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE])
+        from taurus.qt.qtgui.extra_guiqwt.tools import TaurusModelChooserTool, AutoScrollTool
         self.add_tool(TaurusModelChooserTool, singleModel=False)
-        self.add_tool(AutoScrollTool)        
+        self.add_tool(AutoScrollTool)
         self.setModifiableByUser(self._modifiableByUser)
         if taurusparam is None:
             taurusparam = TaurusTrendParam()
         self.defaultTaurusparam = taurusparam
         self.setContextMenuPolicy(Qt.Qt.CustomContextMenu)
+        self.registerConfigDelegate(self.get_tool(AutoScrollTool))
 
-    def keyPressEvent(self,event):
+    def keyPressEvent(self, event):
         if(event.key() == Qt.Qt.Key_Escape):
             event.ignore()
         else:
-            ImageDialog.keyPressEvent(self,event)
-        
+            ImageDialog.keyPressEvent(self, event)
+
     def getModelClass(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         return taurus.core.taurusattribute.TaurusAttribute
-    
+
     def getTaurusTrendItems(self):
         return [item for item in self.get_plot().get_public_items() if isinstance(item, TaurusTrendItem)]
-         
+
     def _splitModel(self, modelNames):
         '''convert str to list if needed (commas and whitespace are considered as separators)'''
-        if isinstance(modelNames,(basestring,Qt.QString)): 
-            modelNames = str(modelNames).replace(',',' ')
+        if isinstance(modelNames, (basestring, Qt.QString)):
+            modelNames = str(modelNames).replace(',', ' ')
             modelNames = modelNames.split()
         return modelNames
-       
-    @Qt.pyqtSignature("setModel(QStringList)")
+
+    @Qt.pyqtSlot('QStringList')
     def setModel(self, modelNames):
         '''Removes current TaurusCurveItems and adds new ones.
 
@@ -238,20 +252,20 @@ class TaurusTrendDialog(CurveDialog, TaurusBaseWidget):
 
         .. seealso:: :meth:`addModels`
         '''
-        
+
         plot = self.get_plot()
-        #delete current TaurusCurveItems
+        # delete current TaurusCurveItems
         taurusTrendItems = self.getTaurusTrendItems()
         plot.del_items(taurusTrendItems)
         self._modelNames = CaselessList()
-        #add new TaurusCurveItems
+        # add new TaurusCurveItems
         self.addModels(modelNames)
-        
+
     def addModels(self, modelNames):
-        '''Creates TaurusCurveItems (one for each model in modelNames) and attaches 
+        '''Creates TaurusCurveItems (one for each model in modelNames) and attaches
         them to the plot.
-        
-        .. note:: you can also add curves using :meth:`add_items`. :meth:`addModels` 
+
+        .. note:: you can also add curves using :meth:`add_items`. :meth:`addModels`
                   is only a more Taurus-oriented interface. :meth:`add_items`
                   gives you more control.
 
@@ -259,49 +273,50 @@ class TaurusTrendDialog(CurveDialog, TaurusBaseWidget):
                            plotted. For convenience, a string is also accepted
                            (instead of a sequence of strings), in which case the
                            string will be internally converted to a sequence by
-                           splitting it on whitespace and commas. 
+                           splitting it on whitespace and commas.
 
         .. seealso:: :meth:`add_item`
         '''
         plot = self.get_plot()
-         
-        #pre-process the model names
+
+        # pre-process the model names
         modelNames = self._splitModel(modelNames)
         self._modelNames.extend([str(n) for n in modelNames])
         if self._designMode:
             return
-        #create and attach new TaurusCurveItems
+        # create and attach new TaurusCurveItems
         for m in modelNames:
-            #cycle styles
+            # cycle styles
             style = self.style.next()
-            #add the item
-            item = make.ttrend(m, color=style[0], linestyle=style[1:], linewidth=2, taurusparam=copy.deepcopy(self.defaultTaurusparam))
+            # add the item
+            item = make.ttrend(m, color=style[0], linestyle=style[
+                               1:], linewidth=2, taurusparam=copy.deepcopy(self.defaultTaurusparam))
             item.set_readonly(not self.isModifiableByUser())
             plot.add_item(item)
             item.update_params()
-        
+
         self.setStackMode(self.defaultTaurusparam.stackMode)
-        self.emit(Qt.SIGNAL("modelChanged()"))
-        
+        self.modelChanged.emit()
+
     def getModel(self):
         """reimplemented from :class:`TaurusBaseWidget`"""
         return self._modelNames
-    
+
     def setUseArchiving(self, enable):
         '''enables/disables looking up in the archiver for data stored before
         the Trend was started
-        
+
         :param enable: (bool) if True, archiving values will be used if available
         '''
-        if not self.defaultTaurusparam.stackMode=='datetime':
+        if not self.defaultTaurusparam.stackMode == 'datetime':
             self.info('ignoring setUseArchiving. Reason: not in X time scale')
         self.defaultTaurusparam.useArchiving = enable
-        
+
     def getUseArchiving(self):
         '''whether TaurusTrend is looking for data in the archiver when needed
-        
+
         :return: (bool)
-        
+
         .. seealso:: :meth:`setUseArchiving`
         '''
         return self.defaultTaurusparam.useArchiving
@@ -309,29 +324,29 @@ class TaurusTrendDialog(CurveDialog, TaurusBaseWidget):
     def resetUseArchiving(self):
         '''Same as setUseArchiving(False)'''
         self.setUseArchiving(False)
-        
+
     def setMaxDataBufferSize(self, maxSize):
         '''sets the maximum number of events that will be stacked
-        
+
         :param maxSize: (int) the maximum limit
-        
+
         .. seealso:: :class:`TaurusTrendSet`
         '''
         for item in self.getTaurusTrendItems():
             item.setBufferSize(maxSize)
-    
+
         self.defaultTaurusparam.maxBufferSize = maxSize
-        
+
     def getMaxDataBufferSize(self):
         '''returns the maximum number of events that can be plotted in the trend
-        
+
         :return: (int)
         '''
         return self.defaultTaurusparam.maxBufferSize
-            
+
     def resetMaxDataBufferSize(self):
         '''Same as setMaxDataBufferSize(16384)'''
-        self.setMaxDataBufferSize(16384) 
+        self.setMaxDataBufferSize(16384)
 
     def setStackMode(self, mode):
         '''set the type of stack to be used. This determines how X values are
@@ -340,7 +355,7 @@ class TaurusTrendDialog(CurveDialog, TaurusBaseWidget):
             - as timestamps ('datetime')
             - as time deltas ('timedelta')
             - as event numbers ('event')
-        
+
         :param mode:(one of 'datetime', 'timedelta' or 'event')
         '''
         from taurus.qt.qtgui.extra_guiqwt.tools import TimeAxisTool
@@ -361,55 +376,62 @@ class TaurusTrendDialog(CurveDialog, TaurusBaseWidget):
             if hasattr(scaleEngine, 'disableInAxis'):
                 scaleEngine.disableInAxis(plot, plot.xBottom)
         else:
-            self.error('Unknown stack mode "%s"'%repr(mode))
+            self.error('Unknown stack mode "%s"' % repr(mode))
             return
-        
+
         self.defaultTaurusparam.stackMode = mode
-        
+
         for item in self.getTaurusTrendItems():
             item.taurusparam.stackMode = mode
- 
+
     def getStackMode(self):
         return self.defaultTaurusparam.stackMode
-        
+
     def resetStackMode(self):
         self.setStackMode('datetime')
-        
+
     def setModifiableByUser(self, modifiable):
         """reimplemented from :class:`TaurusBaseWidget`"""
         from taurus.qt.qtgui.extra_guiqwt.tools import TaurusModelChooserTool
         self.get_tool(TaurusModelChooserTool).action.setEnabled(modifiable)
         self.get_plot().set_items_readonly(not modifiable)
-        TaurusBaseWidget.setModifiableByUser(self, modifiable) 
-        
+        TaurusBaseWidget.setModifiableByUser(self, modifiable)
+
     def getDropEventCallback(self):
         """reimplemented from :class:`TaurusBaseWidget`"""
         return self.addModels
-        
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         """reimplemented from :class:`TaurusBaseWidget`"""
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.extra_guiqwt'
         ret['group'] = 'Taurus Display'
-        ret['icon'] =':/designer/qwtplot.png'
+        ret['icon'] = 'designer:qwtplot.png'
         return ret
-    
-    model = Qt.pyqtProperty("QStringList", getModel, setModel, TaurusBaseWidget.resetModel)
-    useArchiving = Qt.pyqtProperty("bool", getUseArchiving, setUseArchiving, resetUseArchiving)
-    maxDataBufferSize = Qt.pyqtProperty("int", getMaxDataBufferSize, setMaxDataBufferSize, resetMaxDataBufferSize)
-    stackMode = Qt.pyqtProperty("QString", getStackMode, setStackMode, resetStackMode)
-    modifiableByUser = Qt.pyqtProperty("bool", TaurusBaseWidget.isModifiableByUser, setModifiableByUser, TaurusBaseWidget.resetModifiableByUser)
-    
+
+    model = Qt.pyqtProperty("QStringList", getModel,
+                            setModel, TaurusBaseWidget.resetModel)
+    useArchiving = Qt.pyqtProperty(
+        "bool", getUseArchiving, setUseArchiving, resetUseArchiving)
+    maxDataBufferSize = Qt.pyqtProperty(
+        "int", getMaxDataBufferSize, setMaxDataBufferSize, resetMaxDataBufferSize)
+    stackMode = Qt.pyqtProperty(
+        "QString", getStackMode, setStackMode, resetStackMode)
+    modifiableByUser = Qt.pyqtProperty(
+        "bool", TaurusBaseWidget.isModifiableByUser, setModifiableByUser, TaurusBaseWidget.resetModifiableByUser)
+
+
 class TaurusImageDialog(ImageDialog, TaurusBaseWidget):
     '''A taurus dialog for showing 2D data.
     It behaves as a regular :class:`guiqwt.plot.ImageDialog` but it also offers
     the expected Taurus interface (e.g. setting models, save/apply configs,
     drag&drops,...)
-    
+
     .. seealso:: :class:`TaurusImageWidget`
     '''
     _rgbmode = False
+
     def __init__(self, parent=None, designMode=False, toolbar=True, **kwargs):
         '''see :class:`guiqwt.plot.ImageDialog` for other valid initialization parameters'''
         ImageDialog.__init__(self, parent=parent, toolbar=toolbar, **kwargs)
@@ -421,34 +443,35 @@ class TaurusImageDialog(ImageDialog, TaurusBaseWidget):
         self.setModifiableByUser(True)
         self.setContextMenuPolicy(Qt.Qt.CustomContextMenu)
 
-    def keyPressEvent(self,event):
+    def keyPressEvent(self, event):
         if(event.key() == Qt.Qt.Key_Escape):
             event.ignore()
         else:
-            ImageDialog.keyPressEvent(self,event)
-    
-    def setRGBmode(self,enable):
+            ImageDialog.keyPressEvent(self, event)
+
+    def setRGBmode(self, enable):
         self._rgbmode = enable
-        #enable the zaxis only when not in rgb mode
+        # enable the zaxis only when not in rgb mode
         plot = self.get_plot()
         zaxis = plot.colormap_axis
         plot.enableAxis(zaxis, not enable)
-        
+
     def getRGBmode(self):
         return self._rgbmode
-    
+
     def resetRGBmode(self):
         self.setRGBmode(self.__class__._rgbmode)
-    
+
     def getModelClass(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         return taurus.core.taurusattribute.TaurusAttribute
-        
+
     @Qt.pyqtSlot(str)
     def setModel(self, model):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         if self.getUseParentModel():
-            model ="/".join((str(self.getParentModelName()),str(model))) #@fixme: This assumes Tango models.
+            # @fixme: This assumes Tango models.
+            model = "/".join((str(self.getParentModelName()), str(model)))
         plot = self.get_plot()
         if self.imgItem is not None:
             try:
@@ -464,166 +487,182 @@ class TaurusImageDialog(ImageDialog, TaurusBaseWidget):
             self.imgItem = make.image(taurusmodel=model)
         plot.add_item(self.imgItem)
         self.imgItem.set_readonly(not self.isModifiableByUser())
-        self.connect(self.imgItem.getSignaller(), Qt.SIGNAL("dataChanged"), self.update_cross_sections) #IMPORTANT: connect the cross section plots to the taurusimage so that they are updated when the taurus data changes
-        
+        # IMPORTANT: connect the cross section plots to the taurusimage so that
+        # they are updated when the taurus data changes
+        self.imgItem.dataChanged.connect(self.update_cross_sections)
+
     def getModel(self):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         if self.imgItem is None:
             return ''
         else:
             return self.imgItem.getModel()
-        
+
     def setModifiableByUser(self, modifiable):
         '''reimplemented from :class:`TaurusBaseWidget`'''
         from taurus.qt.qtgui.extra_guiqwt.tools import TaurusModelChooserTool
         self.get_tool(TaurusModelChooserTool).action.setEnabled(modifiable)
         self.get_plot().set_items_readonly(not modifiable)
         TaurusBaseWidget.setModifiableByUser(self, modifiable)
-   
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         """reimplemented from :class:`TaurusBaseWidget`"""
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.extra_guiqwt'
         ret['group'] = 'Taurus Display'
-        ret['icon'] =':/designer/qwtplot.png'
+        ret['icon'] = 'designer:qwtplot.png'
         return ret
-    
-    model = Qt.pyqtProperty("QString", getModel, setModel, TaurusBaseWidget.resetModel)
+
+    model = Qt.pyqtProperty("QString", getModel, setModel,
+                            TaurusBaseWidget.resetModel)
     rgbmode = Qt.pyqtProperty("bool", getRGBmode, setRGBmode, resetRGBmode)
     useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
                                      TaurusBaseWidget.setUseParentModel,
                                      TaurusBaseWidget.resetUseParentModel)
-    modifiableByUser = Qt.pyqtProperty("bool", TaurusBaseWidget.isModifiableByUser, 
-                                       setModifiableByUser, 
+    modifiableByUser = Qt.pyqtProperty("bool", TaurusBaseWidget.isModifiableByUser,
+                                       setModifiableByUser,
                                        TaurusBaseWidget.resetModifiableByUser)
-    
-    
-    
+
+
 def taurusCurveDlgMain():
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.qt.qtgui.extra_guiqwt.tools import TimeAxisTool
     import taurus.core.util.argparse
     import sys
-    
+
     parser = taurus.core.util.argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [<model1> [<model2>] ...]")
     parser.set_description("a taurus application for plotting 1D data sets")
-    parser.add_option("--demo", action="store_true", dest="demo", default=False, help="show a demo of the widget")
-    parser.add_option("--window-name", dest="window_name", default="Taurus Curve Dialog", help="Name of the window")
-    app = TaurusApplication(cmd_line_parser=parser, app_name="Taurus Curve Dialog", app_version=taurus.Release.version)
+    parser.add_option("--demo", action="store_true", dest="demo",
+                      default=False, help="show a demo of the widget")
+    parser.add_option("--window-name", dest="window_name",
+                      default="Taurus Curve Dialog", help="Name of the window")
+    app = TaurusApplication(
+        cmd_line_parser=parser, app_name="Taurus Curve Dialog", app_version=taurus.Release.version)
     args = app.get_command_line_args()
     options = app.get_command_line_options()
-    
-    #check & process options
+
+    # check & process options
     if options.demo:
-        args.append('eval://rand(128)')
-        
+        args.append('eval:rand(128)')
+
     w = TaurusCurveDialog(edit=False, wintitle=options.window_name)
-    
+
     w.add_tool(TimeAxisTool)
-     
-    #set model
+
+    # set model
     if len(args) > 0:
         w.setModel(args)
     else:
         parser.print_help(sys.stderr)
         sys.exit(1)
-    
+
     w.show()
-    sys.exit(app.exec_())   
- 
+    sys.exit(app.exec_())
+
 
 def taurusTrendDlgMain():
     from taurus.qt.qtgui.application import TaurusApplication
     import taurus.core
     import sys
-    
-    #prepare options
+
+    # prepare options
     parser = taurus.core.util.argparse.get_taurus_parser()
     parser.set_usage("%prog [options] <model>")
-    parser.set_description('a Taurus application for plotting trends of scalars')
+    parser.set_description(
+        'a Taurus application for plotting trends of scalars')
     parser.add_option("-x", "--x-axis-mode", dest="x_axis_mode", default='t', metavar="t|d|e",
-                  help="interpret X values as timestamps (t), time deltas (d) or event numbers (e). Accepted values: t|d|e")    
-    parser.add_option("-b", "--buffer", dest="max_buffer_size", default='10000', 
+                      help="interpret X values as timestamps (t), time deltas (d) or event numbers (e). Accepted values: t|d|e")
+    parser.add_option("-b", "--buffer", dest="max_buffer_size", default='10000',
                       help="maximum number of values to be plotted (when reached, the oldest values will be discarded)")
-    parser.add_option("-a", "--use-archiving", action="store_true", dest="use_archiving", default=False)
-    parser.add_option("--demo", action="store_true", dest="demo", default=False, help="show a demo of the widget")
-    parser.add_option("--window-name", dest="window_name", default="Taurus Trend", help="Name of the window")
-    app = TaurusApplication(cmd_line_parser=parser, app_name="Taurus Trend", app_version=taurus.Release.version)
+    parser.add_option("-a", "--use-archiving",
+                      action="store_true", dest="use_archiving", default=False)
+    parser.add_option("--demo", action="store_true", dest="demo",
+                      default=False, help="show a demo of the widget")
+    parser.add_option("--window-name", dest="window_name",
+                      default="Taurus Trend", help="Name of the window")
+    app = TaurusApplication(
+        cmd_line_parser=parser, app_name="Taurus Trend", app_version=taurus.Release.version)
     args = app.get_command_line_args()
     options = app.get_command_line_options()
-    
-    #check & process options
-    stackModeMap = dict(t='datetime', d='deltatime', e='event')  
+
+    # check & process options
+    stackModeMap = dict(t='datetime', d='deltatime', e='event')
     if options.x_axis_mode.lower() not in stackModeMap:
         parser.print_help(sys.stderr)
         sys.exit(1)
-    
+
     stackMode = stackModeMap[options.x_axis_mode.lower()]
 
     if options.use_archiving:
         raise NotImplementedError('Archiving support is not yet implemented')
-      
+
     if options.demo:
-        args.append('eval://rand()')
-    
+        args.append('eval:rand()')
+
     taurusparam = TaurusTrendParam()
     taurusparam.stackMode = stackMode
     taurusparam.maxBufferSize = int(options.max_buffer_size)
     taurusparam.useArchiving = options.use_archiving
-    
-    w = TaurusTrendDialog(wintitle=options.window_name, taurusparam=taurusparam)
-    
-    #set model
+
+    w = TaurusTrendDialog(wintitle=options.window_name,
+                          taurusparam=taurusparam)
+
+    # set model
     if len(args) > 0:
         w.setModel(args)
     else:
         parser.print_help(sys.stderr)
         sys.exit(1)
-    
+
     w.show()
-    sys.exit(app.exec_())      
-  
-    
+    sys.exit(app.exec_())
+
+
 def taurusImageDlgMain():
     from taurus.qt.qtgui.application import TaurusApplication
     import taurus.core
     import sys
-    
-    #prepare options
+
+    # prepare options
     parser = taurus.core.util.argparse.get_taurus_parser()
     parser.set_usage("%prog [options] <model>")
-    parser.set_description('a Taurus application for plotting Image Attributes')
-    parser.add_option("--demo", action="store_true", dest="demo", default=False, help="show a demo of the widget")
-    parser.add_option("--rgb", action="store_true", dest="rgb_mode", default=False, help="assume image is RGB")
-    parser.add_option("--window-name", dest="window_name", default="Taurus Image", help="Name of the window")
-    app = TaurusApplication(cmd_line_parser=parser, app_name="Taurus Image Dialog", app_version=taurus.Release.version)
+    parser.set_description(
+        'a Taurus application for plotting Image Attributes')
+    parser.add_option("--demo", action="store_true", dest="demo",
+                      default=False, help="show a demo of the widget")
+    parser.add_option("--rgb", action="store_true", dest="rgb_mode",
+                      default=False, help="assume image is RGB")
+    parser.add_option("--window-name", dest="window_name",
+                      default="Taurus Image", help="Name of the window")
+    app = TaurusApplication(
+        cmd_line_parser=parser, app_name="Taurus Image Dialog", app_version=taurus.Release.version)
     args = app.get_command_line_args()
     options = app.get_command_line_options()
-    
-    #check & process options
+
+    # check & process options
     if options.demo:
         if options.rgb_mode:
-            args.append('eval://randint(0,256,(10,20,3))')
+            args.append('eval:randint(0,256,(10,20,3))')
         else:
-            args.append('eval://rand(256,128)')
+            args.append('eval:rand(256,128)')
     w = TaurusImageDialog(wintitle=options.window_name)
-    
+
     w.setRGBmode(options.rgb_mode)
-        
-    #set model
+
+    # set model
     if len(args) == 1:
         w.setModel(args[0])
     else:
         parser.print_help(sys.stderr)
         sys.exit(1)
-    
+
     w.show()
-    sys.exit(app.exec_())      
-        
+    sys.exit(app.exec_())
+
 
 if __name__ == "__main__":
-#    taurusCurveDlgMain()
-    taurusTrendDlgMain()
+    taurusCurveDlgMain()
+    # taurusTrendDlgMain()
 #    taurusImageDlgMain()
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/styles.py b/lib/taurus/qt/qtgui/extra_guiqwt/styles.py
index 26183f6..7a26401 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/styles.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/styles.py
@@ -2,31 +2,30 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """Extension of :mod:`guiqwt.styles`"""
 
 
-
 __docformat__ = 'restructuredtext'
 
 
@@ -45,28 +44,29 @@ class TaurusCurveParam(DataSet):
         self.xModel.update_param(curve.taurusparam.xModel)
         self.yModel.update_param(curve.taurusparam.yModel)
 #        DataSet.update_param(self, curve)
-    
+
     def update_curve(self, curve):
         curve.setModels(self.xModel or None, self.yModel)
 #        DataSet.update_curve(self, curve)
 
+
 class TaurusTrendParam(DataSet):
     model = StringItem("Model", default="")
     maxBufferSize = IntItem("Buffer Size", default=16384)
     useArchiving = BoolItem("Use Archiving", default=False)
     stackMode = ChoiceItem("Stack Mode",
-                       [("datetime",  "Absolute Time"),
-                        ("timedelta", "Relative Time"),
-                        ("event", "Event")],
-                       default="datetime")
+                           [("datetime",  "Absolute Time"),
+                            ("timedelta", "Relative Time"),
+                               ("event", "Event")],
+                           default="datetime")
 
     def update_param(self, curve):
         self.model.update_param(curve.taurusparam.model)
         self.maxBufferSize.update_param(curve.taurusparam.maxBufferSize)
         self.stackMode.update_param(curve.taurusparam.stackMode)
-    
+
     def update_curve(self, curve):
         curve.setModel(self.model)
         curve.setBufferSize(self.maxBufferSize)
-        #the stackMode is directly used from the param, so there is no need to update
-        
\ No newline at end of file
+        # the stackMode is directly used from the param, so there is no need to
+        # update
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
index 8c6c148..9f67698 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py
@@ -2,89 +2,92 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
 taurustrend.py: Generic trend widget for Taurus
 """
-__all__=["TaurusTrend2DDialog"]
+__all__ = ["TaurusTrend2DDialog"]
 
 from guiqwt.plot import ImageDialog
 from taurus.external.qt import Qt
 import taurus.core
 from taurus.qt.qtgui.base import TaurusBaseWidget
 from taurus.qt.qtgui.extra_guiqwt.image import TaurusTrend2DItem
-from taurus.qt.qtgui.extra_guiqwt.tools import TaurusModelChooserTool, TimeAxisTool, AutoScrollTool
-
-
+from taurus.qt.qtgui.extra_guiqwt.tools import (TaurusModelChooserTool,
+                                                TimeAxisTool, AutoScrollTool)
 
 
 class TaurusTrend2DDialog(ImageDialog, TaurusBaseWidget):
-    '''
+    """
     This is a widget for displaying trends from 1D Taurus attributes (i.e.,
     representing the variation over time of a 1D array). Sometimes this kind of
     plots are also known as "spectrograms".
-    
+
     The widget shows a 3D plot (Z represented with colors) where the values in
     the 1D array are plotted in the Y-Z plane and are stacked along the X axis.
-    '''
+    """
     _modifiableByUser = True
+
     def __init__(self, parent=None, designMode=False, toolbar=True,
                  stackMode='deltatime', buffersize=512, options=None, **kwargs):
-        '''see :class:`guiqwt.plot.ImageDialog` for other valid initialization parameters'''
+        """see :class:`guiqwt.plot.ImageDialog` for other valid initialization
+        parameters"""
         defaultOptions = dict(lock_aspect_ratio=False)
         if options is not None:
             defaultOptions.update(options)
-        ImageDialog.__init__(self, parent=parent, toolbar=toolbar, options=defaultOptions, **kwargs)
+        ImageDialog.__init__(self, parent=parent, toolbar=toolbar,
+                             options=defaultOptions, **kwargs)
         TaurusBaseWidget.__init__(self, "TaurusTrend2DDialog")
-        self.trendItem = None  
+        self.trendItem = None
         self.buffersize = buffersize
         self._useArchiving = False
         self._stackMode = stackMode
         self.setStackMode(stackMode)
         self.setWindowFlags(Qt.Qt.Widget)
-        #add some tools
-        for toolklass in (TaurusModelChooserTool,AutoScrollTool):
+        # add some tools
+        for toolklass in (TaurusModelChooserTool, AutoScrollTool):
             self.add_tool(toolklass)
         self.get_tool(TaurusModelChooserTool).singleModel = True
         self.setModifiableByUser(self._modifiableByUser)
         self.setContextMenuPolicy(Qt.Qt.CustomContextMenu)
-    
-    def keyPressEvent(self,event):
+        self.registerConfigDelegate(self.get_tool(AutoScrollTool))
+
+    def keyPressEvent(self, event):
         if(event.key() == Qt.Qt.Key_Escape):
             event.ignore()
         else:
-            ImageDialog.keyPressEvent(self,event)
-                    
+            ImageDialog.keyPressEvent(self, event)
+
     def setStackMode(self, mode):
-        '''set the type of stack to be used. This determines how X values are
+        """set the type of stack to be used. This determines how X values are
         interpreted:
-            
+
             - as timestamps ('datetime')
             - as time deltas ('timedelta')
             - as event numbers ('event')
-        
+
         :param mode:(one of 'datetime', 'timedelta' or 'event')
-        '''
+        """
         mode = str(mode)
         if mode == 'datetime':
             self.add_tool(TimeAxisTool)
@@ -100,35 +103,37 @@ class TaurusTrend2DDialog(ImageDialog, TaurusBaseWidget):
             if hasattr(scaleEngine, 'disableInAxis'):
                 scaleEngine.disableInAxis(plot, plot.xBottom)
         else:
-            self.error('Unknown stack mode "%s"'%repr(mode))
+            self.error('Unknown stack mode "%s"' % repr(mode))
             return
         self._stackMode = mode
-        if hasattr(self.trendItem,'stackMode'):
+        if hasattr(self.trendItem, 'stackMode'):
             self.trendItem.stackMode = mode
-               
+
     def getStackMode(self):
         return self._stackMode
-        
+
     def resetStackMode(self):
         self.setStackMode('datetime')
-    
+
     def getModelClass(self):
-        '''reimplemented from :class:`TaurusBaseWidget`'''
+        """reimplemented from :class:`TaurusBaseWidget`"""
         return taurus.core.taurusattribute.TaurusAttribute
-        
+
     def setModel(self, model):
-        '''reimplemented from :class:`TaurusBaseWidget`'''
+        """reimplemented from :class:`TaurusBaseWidget`"""
         plot = self.get_plot()
         if self.trendItem is not None:
             plot.del_item(self.trendItem)
-        self.trendItem = TaurusTrend2DItem(stackMode=self.getStackMode(), buffersize = self.buffersize)
+        self.trendItem = TaurusTrend2DItem(
+            stackMode=self.getStackMode(), buffersize=self.buffersize)
         self.trendItem.setModel(model)
         plot.add_item(self.trendItem)
         self.trendItem.set_readonly(not self.isModifiableByUser())
         plot.set_axis_title(plot.colormap_axis, 'value')
         plot.set_axis_unit('left', 'index')
         try:
-            plot.set_axis_title('left', self.trendItem.getModelObj().getSimpleName())
+            plot.set_axis_title(
+                'left', self.trendItem.getModelObj().getSimpleName())
         except:
             self.debug('cannot set title for left axis')
             self.traceback()
@@ -138,135 +143,156 @@ class TaurusTrend2DDialog(ImageDialog, TaurusBaseWidget):
         except:
             self.debug('cannot set units for colormap axis')
             self.traceback()
-        
-        self.connect(self.trendItem.getSignaller(), Qt.SIGNAL("dataChanged"), self.update_cross_sections)
-        
+
+        self.trendItem.dataChanged.connect(self.update_cross_sections)
+
     def getModel(self):
-        '''reimplemented from :class:`TaurusBaseWidget`'''
+        """reimplemented from :class:`TaurusBaseWidget`"""
         if self.trendItem is None:
             return None
         else:
             return self.trendItem.getModel()
-    
+
     def setUseArchiving(self, enable):
-        '''enables/disables looking up in the archiver for data stored before
+        """enables/disables looking up in the archiver for data stored before
         the Trend was started
-        
-        :param enable: (bool) if True, archiving values will be used if available
-        '''
-        if not self._stackMode=='datetime':
+
+        :param enable: (bool) if True, archiving values will be used if
+                       available
+        """
+        if not self._stackMode == 'datetime':
             self.info('ignoring setUseArchiving. Reason: not in X time scale')
         self._useArchiving = enable
-        
+
     def getUseArchiving(self):
-        '''whether TaurusTrend is looking for data in the archiver when needed
-        
+        """whether TaurusTrend is looking for data in the archiver when needed
+
         :return: (bool)
-        
+
         .. seealso:: :meth:`setUseArchiving`
-        '''
+        """
         return self._useArchiving
 
     def resetUseArchiving(self):
-        '''Same as setUseArchiving(False)'''
+        """Same as setUseArchiving(False)"""
         self.setUseArchiving(False)
-        
+
     def setMaxDataBufferSize(self, maxSize):
-        '''sets the maximum number of events that will be stacked
-        
+        """sets the maximum number of events that will be stacked
+
         :param maxSize: (int) the maximum limit
-        
+
         .. seealso:: :class:`TaurusTrendSet`
-        '''
+        """
         if self.trendItem is not None:
             self.trendItem.setBufferSize(maxSize)
-    
+
         self.buffersize = maxSize
-        
+
     def getMaxDataBufferSize(self):
-        '''returns the maximum number of events that can be plotted in the trend
-        
+        """returns the maximum number of events that can be plotted in the trend
+
         :return: (int)
-        '''
+        """
         return self.buffersize
-            
+
     def resetMaxDataBufferSize(self):
-        '''Same as setMaxDataBufferSize(512)  (i.e. 512 events)'''
-        self.setMaxDataBufferSize(512) 
-    
+        """Same as setMaxDataBufferSize(512)  (i.e. 512 events)"""
+        self.setMaxDataBufferSize(512)
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         """reimplemented from :class:`TaurusBaseWidget`"""
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.plot'
         ret['group'] = 'Taurus Display'
-        ret['icon'] =':/designer/qwtplot.png'
-        return ret  
-    
+        ret['icon'] = 'designer:qwtplot.png'
+        return ret
+
     def setModifiableByUser(self, modifiable):
         """reimplemented from :class:`TaurusBaseWidget`"""
         self.get_tool(TaurusModelChooserTool).action.setEnabled(modifiable)
         self.get_plot().set_items_readonly(not modifiable)
         TaurusBaseWidget.setModifiableByUser(self, modifiable)
-    
-    model = Qt.pyqtProperty("QString", getModel, setModel, TaurusBaseWidget.resetModel)
-    useArchiving = Qt.pyqtProperty("bool", getUseArchiving, setUseArchiving, resetUseArchiving) #@todo uncomment this when archiving is supported
-    maxDataBufferSize = Qt.pyqtProperty("int", getMaxDataBufferSize, setMaxDataBufferSize, resetMaxDataBufferSize)
-    stackMode = Qt.pyqtProperty("QString", getStackMode, setStackMode, resetStackMode)
-    modifiableByUser = Qt.pyqtProperty("bool", TaurusBaseWidget.isModifiableByUser, setModifiableByUser, TaurusBaseWidget.resetModifiableByUser) 
-    
-
-        
+
+    model = Qt.pyqtProperty("QString", getModel, setModel,
+                            TaurusBaseWidget.resetModel)
+    # @todo uncomment this when archiving is supported
+    useArchiving = Qt.pyqtProperty("bool", getUseArchiving, setUseArchiving,
+                                   resetUseArchiving)
+    maxDataBufferSize = Qt.pyqtProperty("int", getMaxDataBufferSize,
+                                        setMaxDataBufferSize,
+                                        resetMaxDataBufferSize)
+    stackMode = Qt.pyqtProperty("QString", getStackMode, setStackMode,
+                                resetStackMode)
+    modifiableByUser = Qt.pyqtProperty("bool",
+                                       TaurusBaseWidget.isModifiableByUser,
+                                       setModifiableByUser,
+                                       TaurusBaseWidget.resetModifiableByUser)
+
+
 def taurusTrend2DMain():
     from taurus.qt.qtgui.application import TaurusApplication
     import taurus.core
     import sys
-    
-    #prepare options
+
+    # prepare options
     parser = taurus.core.util.argparse.get_taurus_parser()
     parser.set_usage("%prog [options] <model>")
-    parser.set_description('a Taurus application for plotting trends of arrays (aka "spectrograms")')
-    parser.add_option("-x", "--x-axis-mode", dest="x_axis_mode", default='d', metavar="t|d|e",
-                  help="interpret X values as timestamps (t), time deltas (d) or event numbers (e). Accepted values: t|d|e")    
-    parser.add_option("-b", "--buffer", dest="max_buffer_size", default='512', 
-                      help="maximum number of values to be stacked (when reached, the oldest values will be discarded)")
-    parser.add_option("-a", "--use-archiving", action="store_true", dest="use_archiving", default=False)
-    parser.add_option("--demo", action="store_true", dest="demo", default=False, help="show a demo of the widget")
-    parser.add_option("--window-name", dest="window_name", default="Taurus Trend 2D", help="Name of the window")
-    
-    app = TaurusApplication(cmd_line_parser=parser, app_name="Taurus Trend 2D", app_version=taurus.Release.version)
+    parser.set_description('a Taurus application for plotting trends of ' +
+                           'arrays (aka "spectrograms")')
+    parser.add_option("-x", "--x-axis-mode", dest="x_axis_mode", default='d',
+                      metavar="t|d|e",
+                      help=("interpret X values as timestamps (t), " +
+                            "time deltas (d) or event numbers (e). " +
+                            "Accepted values: t|d|e")
+                      )
+    parser.add_option("-b", "--buffer", dest="max_buffer_size", default='512',
+                      help=("maximum number of values to be stacked " +
+                            "(when reached, the oldest values will be " +
+                            "discarded)")
+                      )
+    parser.add_option("-a", "--use-archiving",
+                      action="store_true", dest="use_archiving", default=False)
+    parser.add_option("--demo", action="store_true", dest="demo",
+                      default=False, help="show a demo of the widget")
+    parser.add_option("--window-name", dest="window_name",
+                      default="Taurus Trend 2D", help="Name of the window")
+
+    app = TaurusApplication(cmd_line_parser=parser, app_name="Taurus Trend 2D",
+                            app_version=taurus.Release.version)
     args = app.get_command_line_args()
     options = app.get_command_line_options()
-    
-    #check & process options
-    stackModeMap = dict(t='datetime', d='deltatime', e='event')  
+
+    # check & process options
+    stackModeMap = dict(t='datetime', d='deltatime', e='event')
     if options.x_axis_mode.lower() not in stackModeMap:
         parser.print_help(sys.stderr)
         sys.exit(1)
-    
+
     stackMode = stackModeMap[options.x_axis_mode.lower()]
-      
+
     if options.demo:
-        args.append('eval://sin(x+t)?x=linspace(0,3,40);t=rand()')
-        
-    w = TaurusTrend2DDialog(stackMode=stackMode, wintitle=options.window_name, 
+        args.append('eval:x=linspace(0,3,40);t=rand();sin(x+t)')
+
+    w = TaurusTrend2DDialog(stackMode=stackMode, wintitle=options.window_name,
                             buffersize=int(options.max_buffer_size))
-    
-    #set archiving
+
+    # set archiving
     if options.use_archiving:
         raise NotImplementedError('Archiving support is not yet implemented')
         w.setUseArchiving(True)
-    
-    #set model
+
+    # set model
     if len(args) == 1:
         w.setModel(args[0])
     else:
         parser.print_help(sys.stderr)
         sys.exit(1)
-    
+
     w.show()
-    sys.exit(app.exec_())      
-        
+    sys.exit(app.exec_())
+
 
 if __name__ == "__main__":
-    taurusTrend2DMain()    
+    taurusTrend2DMain()
diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py
index 0c55967..bae57f3 100644
--- a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py
+++ b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py
@@ -2,42 +2,40 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """Extension of :mod:`guiqwt.tools`"""
 
 
-
 __docformat__ = 'restructuredtext'
 
 
 from taurus.external.qt import Qt
-from guiqwt.tools import CommandTool, ToggleTool, DefaultToolbarID, QActionGroup, add_actions
-from guiqwt.signals import SIG_ITEMS_CHANGED
-
+from guiqwt.tools import (CommandTool, ToggleTool, DefaultToolbarID,
+                          QActionGroup, add_actions)
 from taurus.core.taurusbasetypes import TaurusElementType
-from taurus.qt.qtgui.resource import getIcon
+from taurus.qt.qtcore.configuration import BaseConfigurableClass
 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.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
@@ -46,41 +44,53 @@ 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
+    A tool that shows the Taurus Model Chooser to create/edit the taurus curves
+    of a plot
     """
+
     def __init__(self, manager, toolbar_id=DefaultToolbarID):
-        super(TaurusCurveChooserTool,self).__init__(manager, "Taurus Models...", getIcon(":/taurus.png"), toolbar_id=toolbar_id)
+        super(TaurusCurveChooserTool, self).__init__(
+                manager, "Taurus Models...", Qt.QIcon("logos:taurus.png"),
+                toolbar_id=toolbar_id)
 
     def activate_command(self, plot, checked):
         """Activate tool"""
-        #retrieve current Taurus curves
-        tauruscurves = [item for item in plot.get_public_items() if isinstance(item, TaurusCurveItem)]
-        #show a dialog
+        # retrieve current Taurus curves
+        tauruscurves = [item for item in plot.get_public_items(
+        ) if isinstance(item, TaurusCurveItem)]
+        # show a dialog
         confs, ok = CurveItemConfDlg.showDlg(parent=plot, curves=tauruscurves)
         if ok:
-            #remove previous taurus curves
+            # remove previous taurus curves
             plot.del_items(tauruscurves)
-            #create curve items and add them to the plot 
+            # create curve items and add them to the plot
             for c in confs:
                 if c.taurusparam.yModel:
-                    item = make.pcurve(c.taurusparam.xModel or None, c.taurusparam.yModel, c.curveparam)
+                    item = make.pcurve(c.taurusparam.xModel or None,
+                                       c.taurusparam.yModel, c.curveparam)
                     plot.add_item(item)
                     if c.axesparam is not None:
                         c.axesparam.update_axes(item)
 
+
 class TaurusImageChooserTool(CommandTool):
     """
-    A tool that shows the Taurus Model Chooser and adds new taurus image items to a plot
+    A tool that shows the Taurus Model Chooser and adds new taurus image items
+    to a plot
     """
+
     def __init__(self, manager, toolbar_id=DefaultToolbarID):
-        super(TaurusImageChooserTool,self).__init__(manager, "Add Taurus images...", getIcon(":/taurus.png"), toolbar_id=toolbar_id)
+        super(TaurusImageChooserTool, self).__init__(
+                manager, "Add Taurus images...", Qt.QIcon("logos:taurus.png"),
+                toolbar_id=toolbar_id)
 
     def activate_command(self, plot, checked):
         """Activate tool"""
-        #show a dialog
-        models, ok = TaurusModelChooser.modelChooserDlg(parent=plot, selectables=[TaurusElementType.Attribute])
+        # show a dialog
+        models, ok = TaurusModelChooser.modelChooserDlg(
+            parent=plot, selectables=[TaurusElementType.Attribute])
         if ok:
-            #create image items and add them to the plot 
+            # create image items and add them to the plot
             for m in models:
                 item = make.image(taurusmodel=m)
                 plot.add_item(item)
@@ -88,17 +98,25 @@ class TaurusImageChooserTool(CommandTool):
 
 class TaurusModelChooserTool(CommandTool):
     """
-    A tool that shows the Taurus Model Chooser and sets the chosen model on the manager
+    A tool that shows the Taurus Model Chooser and sets the chosen model on
+    the manager
     """
+
     def __init__(self, manager, toolbar_id=DefaultToolbarID, singleModel=False):
-        super(TaurusModelChooserTool,self).__init__(manager, "Change Taurus Model...", getIcon(":/taurus.png"), toolbar_id=toolbar_id)
+        super(TaurusModelChooserTool, self).__init__(
+                manager, "Change Taurus Model...", Qt.QIcon("logos:taurus.png"),
+                toolbar_id=toolbar_id)
         self.singleModel = singleModel
-        
+
     def activate_command(self, plot, checked):
         """Activate tool"""
-        #show a dialog
-        models, ok = TaurusModelChooser.modelChooserDlg(parent=plot, selectables=[TaurusElementType.Attribute], singleModel=self.singleModel)
-        if ok: 
+        # show a dialog
+        models, ok = TaurusModelChooser.modelChooserDlg(
+                parent=plot,
+                selectables=[TaurusElementType.Attribute],
+                singleModel=self.singleModel
+        )
+        if ok:
             if self.singleModel:
                 if models:
                     self.manager.setModel(models[0])
@@ -106,18 +124,19 @@ class TaurusModelChooserTool(CommandTool):
                     self.manager.setModel('')
             else:
                 self.manager.setModel(models)
-            
-          
+
+
 class TimeAxisTool(CommandTool):
     """
     A tool that allows the user to change the type of scales to/from time mode
     """
+
     def __init__(self, manager):
-        super(TimeAxisTool, self).__init__(manager, "Time Scale",
-                                            icon=getIcon(":/status/awaiting.svg"),
-                                            tip=None, toolbar_id=None)
+        super(TimeAxisTool, self).__init__(
+                manager, "Time Scale", icon=Qt.QIcon("status:awaiting.svg"),
+                tip=None, toolbar_id=None)
         self.action.setEnabled(True)
-                                 
+
     def create_action_menu(self, manager):
         """Create and return menu for the tool's action"""
         menu = Qt.QMenu()
@@ -128,119 +147,138 @@ class TimeAxisTool(CommandTool):
         t_t = manager.create_action("t(t)", triggered=self.set_scale_t_t)
         self.scale_menu = {(False, False): y_x, (True, False): y_t,
                            (False, True): t_x, (True, True): t_t}
-        for action in (y_x, y_t, t_x, t_t):#I need to do this because the manager.create_action does not accept the "checkable" keyword. 
-            action.setCheckable(True)      #see http://code.google.com/p/guiqwt/issues/detail?id=41
-        for obj in (group, menu):     
+        # I need to do this because the manager.create_action does not accept
+        # the "checkable" keyword.
+        for action in (y_x, y_t, t_x, t_t):
+            # see http://code.google.com/p/guiqwt/issues/detail?id=41
+            action.setCheckable(True)
+        for obj in (group, menu):
             add_actions(obj, (y_x, y_t, t_x, t_t))
-        
+
         return menu
-    
+
     def _getAxesUseTime(self, plot):
         """
-        Returns a tuple (xIsTime, yIsTime) where xIsTime is True if the plot's active x 
-        axis uses a TimeScale. yIsTime is True if plot's active y axis uses a Time
+        Returns a tuple (xIsTime, yIsTime) where xIsTime is True if the plot's
+        active x axis uses a TimeScale. yIsTime is True if plot's active y axis
         Scale. Otherwise they are False.
         """
         if plot is None:
-            return (False,False)
-        xaxis,yaxis = plot.get_active_axes()
+            return False, False
+        xaxis, yaxis = plot.get_active_axes()
         xEngine = plot.axisScaleEngine(xaxis)
         yEngine = plot.axisScaleEngine(yaxis)
-        return isinstance(xEngine, DateTimeScaleEngine), isinstance(yEngine, DateTimeScaleEngine)
-         
+        return (isinstance(xEngine, DateTimeScaleEngine),
+                isinstance(yEngine, DateTimeScaleEngine))
+
     def update_status(self, plot):
         active_scale = self._getAxesUseTime(plot)
         for scale_type, scale_action in self.scale_menu.items():
-                scale_action.setEnabled(True)
-                if active_scale == scale_type:
-                    scale_action.setChecked(True)
-                else:
-                    scale_action.setChecked(False)
-                    
+            scale_action.setEnabled(True)
+            if active_scale == scale_type:
+                scale_action.setChecked(True)
+            else:
+                scale_action.setChecked(False)
+
     def _setPlotTimeScales(self, xIsTime, yIsTime):
         plot = self.get_active_plot()
         if plot is not None:
-            for axis,isTime in zip(plot.get_active_axes(), (xIsTime, yIsTime)):
+            for axis, isTime in zip(plot.get_active_axes(), (xIsTime, yIsTime)):
                 if isTime:
                     DateTimeScaleEngine.enableInAxis(plot, axis, rotation=-45)
                 else:
                     DateTimeScaleEngine.disableInAxis(plot, axis)
             plot.replot()
-            
+
     def set_scale_y_x(self, checked):
         if not checked:
             return
         self._setPlotTimeScales(False, False)
-        
+
     def set_scale_t_x(self, checked):
         if not checked:
             return
         self._setPlotTimeScales(False, True)
-    
+
     def set_scale_y_t(self, checked):
         if not checked:
             return
         self._setPlotTimeScales(True, False)
-    
+
     def set_scale_t_t(self, checked):
         if not checked:
             return
         self._setPlotTimeScales(True, True)
 
 
-class AutoScrollTool(ToggleTool):
-    """A tool that puts the plot in "AutoScroll" mode. 
-    This makes sense in trend plots where we want to keep the last value 
+class AutoScrollTool(ToggleTool, BaseConfigurableClass):
+    """A tool that puts the plot in "AutoScroll" mode.
+    This makes sense in trend plots where we want to keep the last value
     always visible"""
+
     def __init__(self, manager, scrollFactor=0.2, toolbar_id=None):
-        super(AutoScrollTool, self).__init__(manager, title='Auto Scroll', icon=None, tip='Force X scale to always show the last value', toolbar_id=toolbar_id)
+        ToggleTool.__init__(self, manager, title='Auto Scroll', icon=None,
+                tip='Force X scale to always show the last value',
+                toolbar_id=toolbar_id)
+        BaseConfigurableClass.__init__(self)
         self.scrollFactor = scrollFactor
-        
+        self.registerConfigProperty(self.action.isChecked,
+                                    self.action.setChecked,
+                                    'actionChecked')
+
     def register_plot(self, baseplot):
-        ToggleTool.register_plot(self,baseplot)
-        self.connect(baseplot, SIG_ITEMS_CHANGED, self.items_changed)
-        
+        ToggleTool.register_plot(self, baseplot)
+        # TODO: drop support for guiqwt2 once we support guiqwt3
+        import guiqwt
+        _guiqwt_major_version = int(guiqwt.__version__.split('.')[0])
+        if _guiqwt_major_version < 3:
+            from guiqwt.signals import SIG_ITEMS_CHANGED
+            baseplot.connect(baseplot, SIG_ITEMS_CHANGED, self.items_changed)
+        else:
+            baseplot.SIG_ITEMS_CHANGED.connect(self.items_changed)
+
     def activate_command(self, plot, checked):
         """Activate tool"""
-        #retrieve current Taurus curves
+        # retrieve current Taurus curves
         for item in self.getScrollItems(plot):
             if checked:
-                self.connect(item.getSignaller(), Qt.SIGNAL('scrollRequested'), self.onScrollRequested)
+                item.scrollRequested.connect(self.onScrollRequested)
             else:
-                self.disconnect(item.getSignaller(), Qt.SIGNAL('scrollRequested'), self.onScrollRequested)
-        
-    def getScrollItems(self,plot):
-        return [item for item in plot.get_items() if isinstance(item, (TaurusTrendItem,TaurusTrend2DItem))]
-    
+                item.scrollRequested.disconnect(self.onScrollRequested)
+
+    def getScrollItems(self, plot):
+        return [item for item in plot.get_items()
+                if isinstance(item, (TaurusTrendItem, TaurusTrend2DItem))]
+
     def onScrollRequested(self, plot, axis, value):
-        scalemin,scalemax = plot.get_axis_limits(axis)
-        scaleRange=abs(scalemax-scalemin)
-        xmin = value - scaleRange*(1.-self.scrollFactor)
-        xmax = value + scaleRange*self.scrollFactor
+        scalemin, scalemax = plot.get_axis_limits(axis)
+        scaleRange = abs(scalemax - scalemin)
+        # ignore requests that imply setting a null range
+        if scaleRange == 0:
+            return
+        xmin = value - scaleRange * (1. - self.scrollFactor)
+        xmax = value + scaleRange * self.scrollFactor
         plot.set_axis_limits(axis, xmin, xmax)
-        
-    def items_changed(self,plot):
+
+    def items_changed(self, plot):
         self.activate_command(plot, self.action.isChecked())
-          
-        
 
 
 def testTool(tool):
     from taurus.qt.qtgui.application import TaurusApplication
     from guiqwt.plot import CurveDialog
-    import sys
-    
+
     app = TaurusApplication()
     win = CurveDialog(edit=False, toolbar=True)
     win.add_tool(tool)
     win.show()
     win.exec_()
-    
-        
+
+
 def test_timeAxis():
     testTool(TimeAxisTool)
 #    testTool(TaurusCurveChooserTool)
 
 
 if __name__ == "__main__":
-    test_timeAxis()    
+    test_timeAxis()
diff --git a/lib/taurus/qt/qtgui/extra_macroexecutor/__init__.py b/lib/taurus/qt/qtgui/extra_macroexecutor/__init__.py
index ecba5e5..0e88d84 100644
--- a/lib/taurus/qt/qtgui/extra_macroexecutor/__init__.py
+++ b/lib/taurus/qt/qtgui/extra_macroexecutor/__init__.py
@@ -1,24 +1,25 @@
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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 sardana.taurus.qt.qtgui.extra_macroexecutor import *
+raise ImportError('Deprecated module.' +
+                  'Use sardana.taurus.qt.qtgui.extra_macroexecutor')
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/extra_nexus/__init__.py b/lib/taurus/qt/qtgui/extra_nexus/__init__.py
index 9657ed7..44adab7 100644
--- a/lib/taurus/qt/qtgui/extra_nexus/__init__.py
+++ b/lib/taurus/qt/qtgui/extra_nexus/__init__.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-__init__.py: 
+__init__.py:
 """
 
 from .taurusnexuswidget import TaurusNeXusBrowser
diff --git a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py
index 8143ed4..16639a7 100644
--- a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py
+++ b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py
@@ -2,46 +2,45 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-nexusWidget.py: 
+nexusWidget.py:
 """
 
-__all__=["TaurusNexusBrowser"]
+__all__ = ["TaurusNexusBrowser"]
 
 import numpy
 import posixpath
 
-from PyMca import HDF5Widget, HDF5Info, HDF5DatasetTable
+from PyMca5.PyMcaGui.io.hdf5 import HDF5Widget, HDF5Info, HDF5DatasetTable
 from taurus.external.qt import Qt
 
 from taurus.qt.qtgui.container import TaurusWidget
 from taurus.qt.qtgui.plot import TaurusPlot
-import taurus.qt.qtgui.resource
 
 
 class NeXusInfoWidget(Qt.QTabWidget):
-    
+
     def __init__(self, parent=None, info=None):
         Qt.QTabWidget.__init__(self, parent)
 
@@ -50,27 +49,30 @@ class NeXusInfoWidget(Qt.QTabWidget):
         self.addTab(self.generalInfoWidget, 'General')
         self.addTab(self.attributesInfoWidget, 'Attributes')
         self.__previewWidget = None
-        
+
     def setInfoDict(self, info):
         self.__previewWidget = NeXusPreviewWidgetFactory(info)
-    
+
 
 class TaurusNeXusBrowser(TaurusWidget):
     ''' A Browser for nexus files with optional preview. Based on PyMCA's HDF5Widget'''
-    def __init__(self, *args, **kwargs ):
+
+    def __init__(self, *args, **kwargs):
         TaurusWidget.__init__(self, *args)
-        
+
         fileModel = kwargs.get('fileModel', None)
-        if fileModel is None: fileModel = HDF5Widget.FileModel()
+        if fileModel is None:
+            fileModel = HDF5Widget.FileModel()
         self.__fileModel = fileModel
-              
+
         self.treeWidget = HDF5Widget.HDF5Widget(self.__fileModel)
-        self.treeWidget.setSizePolicy(Qt.QSizePolicy(Qt.QSizePolicy.Expanding,Qt.QSizePolicy.Expanding))
+        self.treeWidget.setSizePolicy(Qt.QSizePolicy(
+            Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Expanding))
 #        self.infoWidget = HDF5Info.HDF5InfoWidget()
         self.__previewStack = Qt.QStackedWidget()
         self.__currentPreview = None
-                
-        #layout
+
+        # layout
         self.__splitter = Qt.QSplitter()
         self.__splitter.setOrientation(Qt.Qt.Vertical)
         self.__splitter.addWidget(self.treeWidget)
@@ -79,77 +81,81 @@ class TaurusNeXusBrowser(TaurusWidget):
         self.setLayout(Qt.QVBoxLayout())
         self.layout().addWidget(self.__splitter)
 
-        #Actions
+        # Actions
         self.setContextMenuPolicy(Qt.Qt.ActionsContextMenu)
-        self.openFileAction = Qt.QAction(taurus.qt.qtgui.resource.getThemeIcon("document-open"), "Open Data File...", self)
-        self.togglePreviewAction = Qt.QAction(taurus.qt.qtgui.resource.getIcon(":/actions/view.svg"), "Show/Hide preview", self)
+        self.openFileAction = Qt.QAction(Qt.QIcon.fromTheme("document-open"),
+                                         "Open Data File...", self)
+        self.togglePreviewAction = Qt.QAction(Qt.QIcon("actions:view.svg"),
+                                              "Show/Hide preview", self)
         self.togglePreviewAction.setCheckable(True)
         self.togglePreviewAction.setChecked(True)
         self.addActions([self.openFileAction, self.togglePreviewAction])
 
-        #Toolbar
+        # Toolbar
         self._toolbar = Qt.QToolBar("NeXus browser toolbar")
-        self._toolbar.setIconSize(Qt.QSize(16,16))
+        self._toolbar.setIconSize(Qt.QSize(16, 16))
         self._toolbar.setFloatable(False)
-        self._toolbar.addActions([self.openFileAction, self.togglePreviewAction])
+        self._toolbar.addActions(
+            [self.openFileAction, self.togglePreviewAction])
         self.layout().setMenuBar(self._toolbar)
-        
-        #connections
-        self.connect(self.__fileModel, Qt.SIGNAL('fileAppended'),self.treeWidget.fileAppended)
-        self.connect(self.treeWidget, Qt.SIGNAL("HDF5WidgetSignal"), self.onHDF5WidgetSignal)
-        self.connect(self.openFileAction, Qt.SIGNAL("triggered()"), self.openFile)
-        self.connect(self.togglePreviewAction, Qt.SIGNAL("toggled(bool)"), self.__previewStack.setVisible)
-        
-        #configuration
-        self.registerConfigProperty(self.togglePreviewAction.isChecked, self.togglePreviewAction.setChecked, 'showPreview')
-    
+
+        # connections
+        self.__fileModel.sigFileAppended.connect(self.treeWidget.fileAppended)
+        self.treeWidget.sigHDF5WidgetSignal.connect(self.onHDF5WidgetSignal)
+        self.openFileAction.triggered[()].connect(self.openFile)
+        self.togglePreviewAction.toggled.connect(self.__previewStack.setVisible)
+
+        # configuration
+        self.registerConfigProperty(
+            self.togglePreviewAction.isChecked, self.togglePreviewAction.setChecked, 'showPreview')
+
     def openFile(self, fname=None):
         if fname is None:
-            fname = unicode(Qt.QFileDialog.getOpenFileName(self, "Choose NeXus File","/home/cpascual/local/tmp/scantest.h5"))#@TODO!!
+            fname = unicode(Qt.QFileDialog.getOpenFileName(
+                self, "Choose NeXus File", "/home/cpascual/local/tmp/scantest.h5"))  # @TODO!!
         if fname:
             self.__nexusFile = self.__fileModel.openFile(fname)
-        
+
     def onHDF5WidgetSignal(self, ddict):
         self.__previewStack.removeWidget(self.__currentPreview)
         self.__currentPreview = self.neXusPreviewWidgetFactory(ddict)
         self.__previewStack.addWidget(self.__currentPreview)
         self.__previewStack.setCurrentWidget(self.__currentPreview)
-        
-        
+
     def neXusPreviewWidgetFactory(self, ddict):
         '''returns a widget showing a preview of a node in a NeXus file'''
         #@todo: check if this is the root group and it has a valid nexus data directory, in which case the default plot should be returned
-        if ddict['type'] == 'Dataset':            
+        if ddict['type'] == 'Dataset':
             node = ddict['name']
-            data = self.__nexusFile[node]          
-            if len(data.shape) == 1 and isinstance(data[0], (numpy.floating,numpy.integer,int,float)):
+            data = self.__nexusFile[node]
+            if len(data.shape) == 1 and isinstance(data[0], (numpy.floating, numpy.integer, int, float)):
                 w = TaurusPlot()
-                w.attachRawData({"x":numpy.arange(len(data)),"y":data})
+                w.attachRawData({"x": numpy.arange(len(data)), "y": data})
             else:
                 w = HDF5DatasetTable.HDF5DatasetTable()
                 w.setDataset(data)
         else:
-            info = HDF5Info.getInfo(self.__nexusFile,ddict["name"])
+            info = HDF5Info.getInfo(self.__nexusFile, ddict["name"])
             w = HDF5Info.HDF5InfoWidget()
             w.setInfoDict(info)
         return w
-    
+
     def neXusWidget(self):
         return self.treeWidget
-    
+
     def findNodeIndex(self, filename, nodename):
         nexus_widget = self.neXusWidget()
         file_model = nexus_widget.model()
-        
+
         for node in file_model.rootItem.children:
             if node.file.filename == filename:
                 file_node = node
                 break
         else:
             raise Exception("Could not find file %s" % filename)
-        
+
         index = file_model.index(file_node.row, 0, Qt.QModelIndex())
-        
+
         node_parts = nodename.split(posixpath.sep)
         while node_parts:
             name = posixpath.basename(node_parts.pop(0))
@@ -160,32 +166,32 @@ class TaurusNeXusBrowser(TaurusWidget):
                     index = file_model.index(node.row, 0, index)
                     break
             else:
-                raise Exception("Could not find node %s in %s" % (name, filename))
+                raise Exception("Could not find node %s in %s" %
+                                (name, filename))
         return index
-    
+
     def setCurrentNode(self, filename, nodename):
         index = self.findNodeIndex(filename, nodename)
         self.setCurrentIndex(index)
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         ret = TaurusWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.extra_nexus'
-        ret['icon'] = ":/designer/listview.png"
+        ret['icon'] = "designer:listview.png"
         ret['container'] = False
         ret['group'] = 'Taurus Views'
         return ret
-    
-    
-        
+
+
 if __name__ == "__main__":
     import sys
-    if len(sys.argv) >1:
+    if len(sys.argv) > 1:
         fname = sys.argv[1]
     else:
-        fname=None
+        fname = None
     app = Qt.QApplication(sys.argv)
     w = TaurusNeXusBrowser()
     w.openFile(fname)
     w.show()
-    sys.exit(app.exec_()) 
\ No newline at end of file
+    sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/extra_pool/__init__.py b/lib/taurus/qt/qtgui/extra_pool/__init__.py
index be1ace3..549c64e 100644
--- a/lib/taurus/qt/qtgui/extra_pool/__init__.py
+++ b/lib/taurus/qt/qtgui/extra_pool/__init__.py
@@ -1,24 +1,25 @@
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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 sardana.taurus.qt.qtgui.extra_pool import *
+raise ImportError('Deprecated module.' +
+                  'Use sardana.taurus.qt.qtgui.extra_pool')
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/extra_sardana/__init__.py b/lib/taurus/qt/qtgui/extra_sardana/__init__.py
index 3e35df3..de6a234 100644
--- a/lib/taurus/qt/qtgui/extra_sardana/__init__.py
+++ b/lib/taurus/qt/qtgui/extra_sardana/__init__.py
@@ -1,24 +1,25 @@
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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 sardana.taurus.qt.qtgui.extra_sardana import *
+raise ImportError('Deprecated module.' +
+                  'Use sardana.taurus.qt.qtgui.extra_sardana')
diff --git a/lib/taurus/qt/qtgui/extra_xterm/__init__.py b/lib/taurus/qt/qtgui/extra_xterm/__init__.py
deleted file mode 100644
index 1fcf5d0..0000000
--- a/lib/taurus/qt/qtgui/extra_xterm/__init__.py
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-__init__.py: 
-"""
-
-from .qxtermwidget import QXTermWidget
diff --git a/lib/taurus/qt/qtgui/extra_xterm/qxtermwidget.py b/lib/taurus/qt/qtgui/extra_xterm/qxtermwidget.py
deleted file mode 100644
index c8b255d..0000000
--- a/lib/taurus/qt/qtgui/extra_xterm/qxtermwidget.py
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-QXTermWidget.py: 
-"""
-
-import sys
-from taurus.external.qt import QtCore, QtGui, Qt
-
-class QXTermWidget(QtGui.QWidget):
-
-    __pyqtSignals__ = ("commandFinished(int)")
-
-    def __init__(self, parent = None, designMode = False):
-        QtGui.QWidget.__init__(self,parent)
-        self._command = ""
-        self._fontSize = 7
-        layout = QtGui.QVBoxLayout(self)
-        
-        self._proc = None
-        if not designMode:
-            self._proc = QtCore.QProcess(self)
-            QtCore.QObject.connect(self._proc,QtCore.SIGNAL("finished(int, QProcess::ExitStatus)"),self._commandFinished)
-
-
-    def closeEvent(self, event):
-        self._endTheProcess()
-        event.accept()
-
-
-    @QtCore.pyqtSignature("commandFinished(int,QProcess::ExitStatus)")
-    def _commandFinished(self,exitCode,exitStatus):
-        self.emit(QtCore.SIGNAL("commandFinished(int)"),exitCode)
-        if exitStatus == 0:
-            self._restartTheProcess()
-
-
-    def _endTheProcess(self):
-        if self._proc is not None:
-            self._proc.kill()
-            self._proc.waitForFinished()
-
-
-    def _restartTheProcess(self):
-        if self._proc is None:
-            return
-        size = self.size()
-        width = (size.width()/self._fontSize-2)-3
-        height = size.height()/(self._fontSize*2)
-        xt_cmd = "xterm"
-        xt_cmd = xt_cmd + " -fn -*-fixed-medium-*-*-*-*-*-*-*-*-"+str(self._fontSize*10)+"-*-*"
-        xt_cmd = xt_cmd + " -geometry "+str(width)+"x"+str(height)
-        xt_cmd = xt_cmd + " -into "+str(self.winId())
-
-        if self._command != "":
-            xt_cmd = xt_cmd + " -e "+self._command
-        
-        try:
-            self._endTheProcess()
-            self._proc.start(xt_cmd)
-        except Exception,e:
-            print sys.exc_info()
-
-
-    def resizeEvent(self,e):
-        self._restartTheProcess()
-        e.accept()
-
-
-    def sizeHint(self):
-        return QtCore.QSize(300, 150)
-
-
-    def getCommand(self):
-        return self._command
-
-
-    @QtCore.pyqtSignature("setCommand(QString)")
-    def setCommand(self,value):
-        self._command = value
-        self._restartTheProcess()
-
-
-    def resetCommand(self):
-        self.setCommand("")
-
-
-    command = QtCore.pyqtProperty("QString", getCommand, setCommand,
-                                  resetCommand, doc='The command to be executed within the XTerm')
-
-
-    def getFontSize(self):
-        return self._fontSize
-
-
-    @QtCore.pyqtSignature("setFontSize(int)")
-    def setFontSize(self,value):
-        self._fontSize = value
-        self._restartTheProcess()
-
-
-    def resetFontSize(self):
-        self.setFontSize(7)
-
-
-    def destroy(self, destroyWindow = True, destroySubWindows = True):
-        self._endTheProcess()
-        self._proc = None
-        QtGui.QWidget.destroy(self, destroyWindow, destroySubWindows)
-
-
-    def __del__(self):
-        self._endTheProcess()
-        self._proc = None
-
-    fontSize = QtCore.pyqtProperty("int", getFontSize, setFontSize,
-                                  resetFontSize, doc='The fontSize to be used by the XTerm')
diff --git a/lib/taurus/qt/qtgui/gauge/__init__.py b/lib/taurus/qt/qtgui/gauge/__init__.py
deleted file mode 100644
index 31968cb..0000000
--- a/lib/taurus/qt/qtgui/gauge/__init__.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 package contains a collection of taurus Qt gauge widgets"""
-
-__docformat__ = 'restructuredtext'
-
-try:
-    from .taurusgauge import *
-except:
-    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")
-
-from .qmeter import *
diff --git a/lib/taurus/qt/qtgui/gauge/demo/__init__.py b/lib/taurus/qt/qtgui/gauge/demo/__init__.py
deleted file mode 100644
index ae329fb..0000000
--- a/lib/taurus/qt/qtgui/gauge/demo/__init__.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 package contains a collection of taurus gauge widgets demos"""
-
-__docformat__ = 'restructuredtext'
diff --git a/lib/taurus/qt/qtgui/gauge/demo/qmeterdemo.py b/lib/taurus/qt/qtgui/gauge/demo/qmeterdemo.py
deleted file mode 100644
index 5005dc9..0000000
--- a/lib/taurus/qt/qtgui/gauge/demo/qmeterdemo.py
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 provides a demo for the :class:`taurus.qt.qtgui.display.TaurusLabel`
-widget """
-
-__all__ = ["demo", "main"]
-
-__docformat__ = 'restructuredtext'
-
-from taurus.external.qt import Qt
-
-def demo():
-    import sys
-    import taurus.qt.qtgui.application
-    import taurus.qt.qtgui.gauge
-    import taurus.qt.qtgui.resource
-
-    getPixmap = taurus.qt.qtgui.resource.getPixmap
-    Application = taurus.qt.qtgui.application.TaurusApplication
-    QManoMeter = taurus.qt.qtgui.gauge.QManoMeter
-    
-    app = Application.instance()
-    owns_app = app is None
-    
-    if owns_app:
-        import taurus.core.util.argparse
-        app = Application()
-
-    M = 2
-
-    class QManoMeterTestPanel(Qt.QWidget):
-        
-        def __init__(self, parent=None):
-            Qt.QWidget.__init__(self, parent)
-            panel_l = Qt.QVBoxLayout()
-            self.setLayout(panel_l)
-            panel_l.setContentsMargins(M, M, M, M)
-            panel_l.setSpacing(M)
-
-            w = QManoMeter()
-            w.setMinimumSize(256, 256)
-            display_panel = Qt.QGroupBox("QMeter Display")
-            display_l = Qt.QHBoxLayout()
-            display_l.setContentsMargins(M, M, M, M)
-            display_l.setSpacing(M)
-            display_panel.setLayout(display_l)
-            display_l.addWidget(w, 1)
-
-            control_panel = Qt.QGroupBox("Control Panel")
-            control_l = Qt.QFormLayout()
-            control_l.setContentsMargins(M, M, M, M)
-            control_l.setSpacing(M)
-            control_panel.setLayout(control_l)
-            value_widget = Qt.QDoubleSpinBox()
-            minimum_widget = Qt.QDoubleSpinBox()
-            maximum_widget = Qt.QDoubleSpinBox()
-            minimum_alarm_widget = Qt.QDoubleSpinBox()
-            minimum_warning_widget = Qt.QDoubleSpinBox()
-            maximum_alarm_widget = Qt.QDoubleSpinBox()
-            maximum_warning_widget = Qt.QDoubleSpinBox()
-            steps_widget = Qt.QSpinBox()
-            value_offset_widget = Qt.QDoubleSpinBox()
-            digit_offset_widget = Qt.QDoubleSpinBox()
-            frame_width_widget = Qt.QSpinBox()
-            angle_widget = Qt.QDoubleSpinBox()
-            scale_color_widget = Qt.QCheckBox()
-            scale_ticks_widget = Qt.QCheckBox()
-            scale_text_widget = Qt.QCheckBox()
-            value_text_widget = Qt.QCheckBox()
-            
-            control_l.addRow("Value:", value_widget)
-            control_l.addRow("Minimum:", minimum_widget)
-            control_l.addRow("Min. alarm:", minimum_alarm_widget)
-            control_l.addRow("Min. warning:", minimum_warning_widget)
-            control_l.addRow("Max. warning:", maximum_warning_widget)
-            control_l.addRow("Max. alarm:", maximum_alarm_widget)
-            control_l.addRow("Maximum:", maximum_widget)
-            control_l.addRow("Steps:", steps_widget)
-            control_l.addRow("Value offset:", value_offset_widget)
-            control_l.addRow("Digit offset:", digit_offset_widget)
-            control_l.addRow("Frame width:", frame_width_widget)
-            control_l.addRow("Angle:", angle_widget)
-            control_l.addRow("Scale color", scale_color_widget)
-            control_l.addRow("Scale ticks", scale_ticks_widget)
-            control_l.addRow("Scale text", scale_text_widget)
-            control_l.addRow("Value text", value_text_widget)
-            
-            panel_l.addWidget(display_panel, 1)
-            panel_l.addWidget(control_panel, 0)
-
-            value_widget.setRange(-1000.0, 1000.0)
-            minimum_widget.setRange(-1000.0, 1000.0)
-            minimum_alarm_widget.setRange(-1000.0, 1000.0)
-            minimum_warning_widget.setRange(-1000.0, 1000.0)
-            maximum_warning_widget.setRange(-1000.0, 1000.0)
-            maximum_alarm_widget.setRange(-1000.0, 1000.0)
-            maximum_widget.setRange(-1000.0, 1000.0)
-            steps_widget.setRange(2, 100)
-            value_offset_widget.setRange(-1000.0, 1000.0)
-            digit_offset_widget.setRange(-1000.0, 1000.0)
-            frame_width_widget.setRange(0, 100)
-            angle_widget.setRange(0.0, 360.0)
-            value_widget.setValue(w.value)
-            minimum_widget.setValue(w.minimum)
-            minimum_alarm_widget.setValue(w.minimumAlarm)
-            minimum_warning_widget.setValue(w.minimumWarning)
-            maximum_warning_widget.setValue(w.maximumWarning)
-            maximum_alarm_widget.setValue(w.maximumAlarm)
-            maximum_widget.setValue(w.maximum)
-            steps_widget.setValue(w.steps)
-            value_offset_widget.setValue(w.valueOffset)
-            digit_offset_widget.setValue(w.digitOffset)
-            frame_width_widget.setValue(w.frameWidth)
-            angle_widget.setValue(w.angle)
-            scale_color_widget.setChecked(w.showScaleColor)
-            scale_ticks_widget.setChecked(w.showScaleTicks)
-            scale_text_widget.setChecked(w.showScaleText)
-            value_text_widget.setChecked(w.showValueText)
-            
-            Qt.QObject.connect(value_widget, Qt.SIGNAL("valueChanged(double)"), w.setValue)
-            Qt.QObject.connect(minimum_widget, Qt.SIGNAL("valueChanged(double)"), w.setMinimum)
-            Qt.QObject.connect(minimum_alarm_widget, Qt.SIGNAL("valueChanged(double)"), w.setMinimumAlarm)
-            Qt.QObject.connect(minimum_warning_widget, Qt.SIGNAL("valueChanged(double)"), w.setMinimumWarning)
-            Qt.QObject.connect(maximum_warning_widget, Qt.SIGNAL("valueChanged(double)"), w.setMaximumWarning)
-            Qt.QObject.connect(maximum_alarm_widget, Qt.SIGNAL("valueChanged(double)"), w.setMaximumAlarm)
-            Qt.QObject.connect(maximum_widget, Qt.SIGNAL("valueChanged(double)"), w.setMaximum)
-            Qt.QObject.connect(steps_widget, Qt.SIGNAL("valueChanged(int)"), w.setSteps)
-            Qt.QObject.connect(value_offset_widget, Qt.SIGNAL("valueChanged(double)"), w.setValueOffset)
-            Qt.QObject.connect(digit_offset_widget, Qt.SIGNAL("valueChanged(double)"), w.setDigitOffset)
-            Qt.QObject.connect(frame_width_widget, Qt.SIGNAL("valueChanged(int)"), w.setFrameWidth)
-            Qt.QObject.connect(angle_widget, Qt.SIGNAL("valueChanged(double)"), w.setAngle)
-            Qt.QObject.connect(scale_color_widget, Qt.SIGNAL("toggled(bool)"), w.setShowScaleColor)
-            Qt.QObject.connect(scale_ticks_widget, Qt.SIGNAL("toggled(bool)"), w.setShowScaleTicks)
-            Qt.QObject.connect(scale_text_widget, Qt.SIGNAL("toggled(bool)"), w.setShowScaleText)
-            Qt.QObject.connect(value_text_widget, Qt.SIGNAL("toggled(bool)"), w.setShowValueText)
-            
-            self.w = w
-            self.w_minimum = minimum_widget
-            self.w_minimum_alarm = minimum_alarm_widget
-            self.w_minimum_warning = minimum_warning_widget
-            self.w_maximum_warning = maximum_warning_widget
-            self.w_maximum_alarm = maximum_alarm_widget
-            self.w_maximum = maximum_widget
-            self.w_steps = steps_widget
-            self.w_value_offset = value_offset_widget
-            self.w_digit_offset = digit_offset_widget
-            self.w_angle = angle_widget
-        
-    panel = Qt.QWidget()
-    layout=Qt.QGridLayout()
-    panel.setLayout(layout)
-    layout.setContentsMargins(M, M, M, M)
-    layout.setSpacing(M)
-    p1 = QManoMeterTestPanel()
-    layout.addWidget(p1, 0, 0)
-    panel.show()
-    if owns_app:
-        sys.exit(app.exec_())
-    else:
-        return panel
-    
-def main():
-    return demo()
-
-if __name__ == "__main__":
-    main()
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/gauge/qmeter.py b/lib/taurus/qt/qtgui/gauge/qmeter.py
deleted file mode 100644
index 78800f9..0000000
--- a/lib/taurus/qt/qtgui/gauge/qmeter.py
+++ /dev/null
@@ -1,747 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 a collection of Qt meter widgets"""
-
-__docformat__ = 'restructuredtext'
-
-import sys
-import math
-
-from taurus.external.qt import Qt
-from taurus.qt.qtgui.display import QPixmapWidget
-
-class QBaseMeter(QPixmapWidget):
-    
-    DefaultMinimum        = 0.0
-    DefaultMaximum        = 100.0
-    DefaultMinimumAlarm   = 10.0
-    DefaultMaximumAlarm   = 90.0
-    DefaultMinimumWarning = 20.0
-    DefaultMaximumWarning = 80.0
-    DefaultValue          = 0.0
-    DefaultValueOffset    = 0.0
-    DefaultDigitOffset    = 1.0
-    DefaultSteps          = 8
-    DefaultValueFont      = Qt.QFont()
-    DefaultDigitFont      = Qt.QFont()
-    
-    def __init__(self, parent=None, designMode=None):
-        self._minimum = self._min = self.DefaultMinimum
-        self._maximum = self._max = self.DefaultMaximum
-        self._minimumWarning = self.DefaultMinimumWarning
-        self._maximumWarning = self.DefaultMaximumWarning
-        self._minimumAlarm = self.DefaultMinimumAlarm
-        self._maximumAlarm = self.DefaultMaximumAlarm
-        self._value = self.DefaultValue
-        self._valueOffset = self.DefaultValueOffset
-        self._digitOffset = self.DefaultDigitOffset
-        self._valueFont = self.DefaultValueFont
-        self._digitFont = self.DefaultDigitFont
-        #self._valueFont.setPointSize(25)
-        #self._digitFont.setPointSize(20)
-        self._steps = self.DefaultSteps
-        self._autoRangeIt()
-        QPixmapWidget.__init__(self, parent=parent, designMode=designMode)
-
-    def _autoRangeIt(self):
-        ret = self._rangeIt(self._minimum, self._maximum, self._min, self._max,
-                            self._steps, True)
-        self._min, self._max, ret = ret
-        self._setDirty()
-        return ret
-
-    def _rangeIt(self, minimum, maximum, orig_min, orig_max, steps, left=False, inc=5.0):
-        _min, _max, scale, factor = minimum, maximum, 0.0, 0.0
-        diff = abs(_max - _min)
-        
-        # calculate increment
-        while (inc * steps > (maximum - minimum)):
-            new_inc = inc / 10
-            if new_inc > 0: inc = new_inc
-            else: break
-        
-        # calculate scale
-        while diff > scale:
-            factor += inc
-            scale = factor * steps 
-        
-        while True:
-            if _max < 0: _max = _min - math.fmod(_min, steps)
-            else: _max = 0.0
-            while _max < maximum: _max += factor
-            _min = _max - scale
-            if _min < minimum:
-                break
-            factor += inc
-            scale = factor * steps
-        
-        if left:
-            while (_min + factor) <= minimum:
-                _min += factor
-                _max += factor
-        return _min, _max, (_min != orig_min) or (_max != orig_max)
-         
-        
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT property definition
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def getMinimum(self):
-        return self._minimum
-    
-    def setMinimum(self, min):
-        self._minimum = float(min)
-        self._autoRangeIt() 
-        self.update()
-
-    def resetMinimum(self):
-        self.setMinimum(self.DefaultMinimum)
-    
-    def getMaximum(self):
-        return self._maximum
-    
-    def setMaximum(self, max):
-        self._maximum = float(max)
-        self._autoRangeIt()
-        self.update()
-
-    def resetMaximum(self):
-        self.setMaximum(self.DefaultMaximum)
-
-    def getMinimumWarning(self):
-        return self._minimumWarning
-    
-    def setMinimumWarning(self, min):
-        self._minimumWarning = float(min)
-        self._autoRangeIt() 
-        self.update()
-
-    def resetMinimumWarning(self):
-        self.setMinimumWarning(self.DefaultMinimumWarning)
-    
-    def getMaximumWarning(self):
-        return self._maximumWarning
-    
-    def setMaximumWarning(self, max):
-        self._maximumWarning = float(max)
-        self._autoRangeIt()
-        self.update()
-
-    def resetMaximumWarning(self):
-        self.setMaximum(self.DefaultMaximumWarning)
-
-    def getMinimumAlarm(self):
-        return self._minimumAlarm
-    
-    def setMinimumAlarm(self, min):
-        self._minimumAlarm = float(min)
-        self._autoRangeIt() 
-        self.update()
-
-    def resetMinimumAlarm(self):
-        self.setMinimumAlarm(self.DefaultMinimumAlarm)
-    
-    def getMaximumAlarm(self):
-        return self._maximumAlarm
-    
-    def setMaximumAlarm(self, max):
-        self._maximumAlarm = float(max)
-        self._autoRangeIt()
-        self.update()
-
-    def resetMaximumAlarm(self):
-        self.setMaximumAlarm(self.DefaultMaximumAlarm)
-
-    def getValue(self):
-        return self._value
-    
-    def setValue(self, value):
-        self._value = float(value)
-        self.update()
-
-    def resetValue(self):
-        self.setValue(self.DefaultValue)
-
-    def getSteps(self):
-        return self._steps
-    
-    def setSteps(self, steps):
-        steps = int(steps)
-        if steps < 2:
-            raise Exception("Invalid steps. Must be >= 2")
-        self._steps = steps
-        self._autoRangeIt()
-        self.update()
-
-    def resetSteps(self):
-        self.setSteps(self.DefaultSteps)
-        
-    def getValueOffset(self):
-        return self._valueOffset
-    
-    def setValueOffset(self, valueOffset):
-        self._valueOffset = float(valueOffset)
-        self._autoRangeIt()
-        self.update()
-
-    def resetValueOffset(self):
-        self.setValueOffset(self.DefaultValueOffset)
-
-    def getDigitOffset(self):
-        return self._digitOffset
-    
-    def setDigitOffset(self, digitOffset):
-        self._digitOffset = float(digitOffset)
-        self._autoRangeIt()
-        self.update()
-
-    def resetDigitOffset(self):
-        self.setDigitOffset(self.DefaultDigitOffset)
-                
-    def getValueFont(self):
-        return self._valueFont
-    
-    def setValueFont(self, valueFont):
-        self._valueFont = valueFont
-        self._setDirty()
-        self.update()
-
-    def resetValueFont(self):
-        self.setValue(self.DefaultValueFont)
-        
-    def getDigitFont(self):
-        return self._digitFont
-    
-    def setDigitFont(self, digitFont):
-        self._digitFont = digitFont
-        self._setDirty()
-        self.update()
-
-    def resetDigitFont(self):
-        self.setDigitFont(self.DefaultDigitFont)
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        # explicitly do NOT expose this base meter to the designer
-        return
-    
-    #: This property holds the minimum value
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getMinimum`
-    #:     * :meth:`QBaseMeter.setMinimum`
-    #:     * :meth:`QBaseMeter.resetMinimum`
-    minimum = Qt.pyqtProperty("double", getMinimum, setMinimum,
-                              resetMinimum, doc="minimum value")
-
-    #: This property holds the maximum value
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getMaximum`
-    #:     * :meth:`QBaseMeter.setMaximum`
-    #:     * :meth:`QBaseMeter.resetMaximum`
-    maximum = Qt.pyqtProperty("double", getMaximum, setMaximum,
-                              resetMaximum, doc="maximum value")
-                              
-    #: This property holds the value
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getValue`
-    #:     * :meth:`QBaseMeter.setValue`
-    #:     * :meth:`QBaseMeter.resetValue`
-    value = Qt.pyqtProperty("double", getValue, setValue, resetValue, doc="value")
-
-    #: This property holds the minimum alarm value
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getMinimumAlarm`
-    #:     * :meth:`QBaseMeter.setMinimumAlarm`
-    #:     * :meth:`QBaseMeter.resetMinimumAlarm`
-    minimumAlarm = Qt.pyqtProperty("double", getMinimumAlarm, setMinimumAlarm,
-                                   resetMinimumAlarm, doc="minimum alarm")
-
-    #: This property holds the maximum alarm value
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getMaximumAlarm`
-    #:     * :meth:`QBaseMeter.setMaximumAlarm`
-    #:     * :meth:`QBaseMeter.resetMaximumAlarm`
-    maximumAlarm = Qt.pyqtProperty("double", getMaximumAlarm, setMaximumAlarm,
-                                   resetMaximumAlarm, doc="maximum alarm")
-
-    #: This property holds the minimum warning value
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getMinimumWarning`
-    #:     * :meth:`QBaseMeter.setMinimumWarning`
-    #:     * :meth:`QBaseMeter.resetMinimumWarning`
-    minimumWarning = Qt.pyqtProperty("double", getMinimumWarning, setMinimumWarning,
-                                   resetMinimumWarning, doc="minimum warning")
-
-    #: This property holds the maximum warning value
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getMaximumWarning`
-    #:     * :meth:`QBaseMeter.setMaximumWarning`
-    #:     * :meth:`QBaseMeter.resetMaximumWarning`
-    maximumWarning = Qt.pyqtProperty("double", getMaximumWarning, setMaximumWarning,
-                                   resetMaximumWarning, doc="maximum warning")
-
-    #: This property holds the number of steps
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getSteps`
-    #:     * :meth:`QBaseMeter.setSteps`
-    #:     * :meth:`QBaseMeter.resetSteps`
-    steps = Qt.pyqtProperty("int", getSteps, setSteps, resetSteps, doc="steps")
-    
-    #: This property holds the value offset
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getValueOffset`
-    #:     * :meth:`QBaseMeter.setValueOffset`
-    #:     * :meth:`QBaseMeter.resetValueOffset`
-    valueOffset = Qt.pyqtProperty("double", getValueOffset, setValueOffset,
-                                  resetValueOffset, doc="value offset")
-
-    #: This property holds the digit offset
-    #: Used to place scale digits offset. On manometer distance from the 
-    #: center on thermometer distance form left
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getDigitOffset`
-    #:     * :meth:`QBaseMeter.setDigitOffset`
-    #:     * :meth:`QBaseMeter.resetDigitOffset`
-    digitOffset = Qt.pyqtProperty("double", getDigitOffset, setDigitOffset,
-                                  resetDigitOffset, doc="digit offset")
-    
-    #: This property holds the value font
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getValueFont`
-    #:     * :meth:`QBaseMeter.setValueFont`
-    #:     * :meth:`QBaseMeter.resetValueFont`
-    valueFont = Qt.pyqtProperty("QFont", getValueFont, setValueFont,
-                                resetValueFont, doc="value font")
-
-    #: This property holds the digit font
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QBaseMeter.getDigitFont`
-    #:     * :meth:`QBaseMeter.setDigitFont`
-    #:     * :meth:`QBaseMeter.resetDigitFont`
-    digitFont = Qt.pyqtProperty("QFont", getDigitFont, setDigitFont,
-                                resetDigitFont, doc="digit font")
-
-Point = Qt.QPointF
-Color = Qt.QColor
-RadialGradient = Qt.QRadialGradient
-Brush = Qt.QBrush
-Rect = Qt.QRect
-Polygon = Qt.QPolygon
-
-class QManoMeter(QBaseMeter):
-
-    DefaultAngle = 240
-    DefaultFrameWidth = 40
-    DefaultValueOffset = -100
-    DefaultDigitOffset = 105
-    DefaultShowScaleColor = True
-    DefaultShowScaleTicks = True
-    DefaultShowScaleText = True
-    DefaultShowValueText = True
-    
-    def __init__(self, parent=None, designMode=False):
-        self._angle = self.DefaultAngle
-        self._frameWidth = self.DefaultFrameWidth
-        self._showScaleColor = self.DefaultShowScaleColor
-        self._showScaleTicks = self.DefaultShowScaleTicks
-        self._showScaleText = self.DefaultShowScaleText
-        self._showValueText = self.DefaultShowValueText
-        self._bg_cache = None
-        QBaseMeter.__init__(self, parent=parent, designMode=designMode)
-
-    def minimumSizeHint(self):
-        return Qt.QSize(64, 64)
-
-    def _initCoords(self, painter):
-        w, h = self.width(), self.height()
-        side = min(w, h)
-        painter.translate(w/2, h/2)
-        painter.scale(side/335.0, side/335.0)
-    
-    @property
-    def bg_cache(self):
-        if self._bg_cache is not None:
-            return self._bg_cache
-
-        back1 = RadialGradient(Point(0.0, 0.0), 180.0, Point(-35.0, 145.0))
-        back1.setColorAt(0.0, Color(250, 250, 250))
-        back1.setColorAt(1.0, Color(20, 20, 20))
-        back1Brush = Brush(back1)
-
-        back2 = RadialGradient(Point(0.0, 0.0), 225.0, Point(76.5, 135.0))
-        back2.setColorAt(0.0, Color(10, 10, 10))
-        back2.setColorAt(1.0, Color(250, 250, 250))
-        back2Brush = Brush(back2)
-        
-        shield = RadialGradient(Point(0, 0), 182, Point(-12.0, -15.0))
-        shield.setColorAt(0.0, Qt.Qt.white)
-        shield.setColorAt(0.5, Color(240, 240, 240))
-        shield.setColorAt(1.0, Color(215, 215, 215))
-        shieldBrush = Brush(shield)
-        
-        tickTriangle = Polygon([-6, 141, 6, 141, 0, 129])
-        
-        self._bg_cache = [back1Brush, back2Brush, shieldBrush, tickTriangle] 
-        return self._bg_cache
-
-    def recalculatePixmap(self):
-        pixmap = Qt.QPixmap(self.size())
-        pixmap.fill(Qt.Qt.transparent)
-        painter = Qt.QPainter(pixmap)
-        painter.setRenderHint(Qt.QPainter.Antialiasing)
-        self._initCoords(painter)
-        
-        pen = Qt.QPen(Qt.Qt.black)
-        pen.setWidth(4)
-        
-        fw = self.frameWidth
-        back1Brush, back2Brush, shieldBrush, tickTriangle = self.bg_cache
-        painter.setBrush(back1Brush)
-        painter.drawEllipse(-162, -162, 324, 324)
-        painter.setPen(Qt.Qt.NoPen)
-        painter.setBrush(back2Brush)
-        painter.drawEllipse(-162+fw/4, -162+fw/4, 324-fw/2, 324-fw/2)
-
-        # internal scale circle
-        painter.setBrush(shieldBrush)
-        painter.setPen(pen)
-        painter.drawEllipse(-162+fw/2, -162+fw/2, 324-fw, 324-fw)
-        
-        painter.setPen(Qt.Qt.NoPen)
-        steps = self._steps
-        angle = self._angle
-        minimum, maximum = self._min, self._max
-        minWarning,  maxWarning = self.minimumWarning,  self.maximumWarning
-        minAlarm,  maxAlarm = self.minimumAlarm,  self.maximumAlarm
-        fullrange = maximum - minimum
-        min_angle = (360.0 - angle) / 2.0
-        max_angle = 360.0 - min_angle
-
-        if self.showScaleColor:
-            redBrush = Brush(Qt.Qt.red)
-            orangeBrush = Brush(Color(255, 127, 0))
-            greenBrush = Brush(Qt.Qt.green)
-            
-            painter.save()
-            scale_rect = Rect(-162+fw/2+1, -162+fw/2+1, 324-fw-2, 324-fw-2)
-            min_alarm_angle = (angle * (minAlarm - minimum) / fullrange)
-            painter.rotate(90 + min_angle + min_alarm_angle)
-            painter.setBrush(redBrush)
-            if minimum <= minAlarm and minAlarm < minWarning:
-                painter.drawPie(scale_rect, 0, min_alarm_angle*16)
-    
-            min_warning_angle =  (angle * (minWarning - minAlarm) / fullrange)
-            painter.rotate(min_warning_angle)
-            painter.setBrush(orangeBrush)
-            if minAlarm <= minWarning and minWarning < maxWarning:
-                painter.drawPie(scale_rect, 0, min_warning_angle*16)
-    
-            max_warning_angle = (angle * (maxWarning - minWarning) / fullrange)
-            painter.rotate(max_warning_angle)
-            painter.setBrush(greenBrush)
-            if minWarning <= maxWarning and maxWarning < maxAlarm:
-                painter.drawPie(scale_rect, 0, max_warning_angle*16)
-    
-            max_alarm_angle = (angle * (maxAlarm - maxWarning) / fullrange)
-            painter.rotate(max_alarm_angle)
-            painter.setBrush(orangeBrush)
-            if maxWarning <= maxAlarm and maxAlarm < maximum:
-                painter.drawPie(scale_rect, 0, max_alarm_angle*16)
-            
-            max_angle = (angle * (maximum - maxAlarm) / fullrange)
-            painter.rotate(max_angle)
-            painter.setBrush(redBrush)
-            if maxAlarm <= maximum:
-                painter.drawPie(scale_rect, 0, max_angle*16)
-    
-            painter.restore()
-
-            painter.setBrush(shieldBrush)
-            painter.drawEllipse(-162+fw/2+12, -162+fw/2+12, 324-fw-2-24, 324-fw-2-24)
-        painter.rotate(min_angle)
-
-        # draw ticks
-        if self.showScaleTicks:
-            painter.save()
-            painter.setBrush(Brush(Qt.Qt.black))
-            line_length = 10
-            tick_steps = 4*steps
-            tick_stepsf = float(tick_steps)
-            angle_step = angle / tick_stepsf
-            for i in range(tick_steps+1):
-                painter.setPen(pen)
-                if i % 4: painter.drawLine(0, 140, 0, 140-line_length)
-                else:
-                    painter.setPen(Qt.Qt.NoPen)
-                    painter.drawConvexPolygon(tickTriangle)
-    
-                painter.rotate(angle_step)
-                pen.setWidth(3)
-                if i % 2:
-                    line_length = 10
-                else:
-                    line_length = 5
-            painter.restore()
-        
-        digitOffset = self.digitOffset
-        if self.showScaleText and digitOffset:
-            painter.setPen(Qt.Qt.black)
-            painter.rotate(-min_angle)
-            painter.setFont(self.digitFont)
-            stepsf = float(steps)
-            angle_step = angle / stepsf
-            min_angle = 90 + min_angle
-            for i in range(steps+1):
-                v = minimum + i*fullrange/ stepsf
-                if abs(v) < 0.000001: v = 0.0;
-                val = Qt.QString(str(v))
-                textSize = painter.fontMetrics().size(Qt.Qt.TextSingleLine, val)
-                painter.save()
-                ang = min_angle+(i*angle_step)
-                ang = math.pi*ang/180.0 # convert to radians
-                painter.translate(digitOffset * math.cos(ang), digitOffset * math.sin(ang))
-                painter.drawText(Point(textSize.width()/-2.0, textSize.height()/4.0), val)
-                painter.restore()
-        return pixmap
-    
-    _Hand = -4, 0, -1, 129, 1, 129, 4, 0, 8,-50, -8,-50
-    
-    def paintEvent(self, paintEvent):
-        QBaseMeter.paintEvent(self, paintEvent)
-        painter = Qt.QPainter(self)
-        painter.setRenderHint(Qt.QPainter.Antialiasing)
-        self._initCoords(painter)
-        hand = self._Hand
-        path = Qt.QPainterPath(Point(hand[0], hand[1]))
-        for i in range(2,10,2):
-            path.lineTo(hand[i], hand[i+1])
-        
-        path.cubicTo( 8.1, -51.0,  5.0, -48.0,  0.0, -48.0)
-        path.cubicTo(-5.0, -48.0, -8.1, -51.0, -8.0, -50.0)
-        
-        value = self.value
-        minimum, maximum = self._min, self._max
-        minWarning,  maxWarning = self.minimumWarning,  self.maximumWarning
-        minAlarm,  maxAlarm = self.minimumAlarm,  self.maximumAlarm
-        fullrange = maximum - minimum
-        
-        painter.save()
-        painter.rotate(60.0)
-        painter.setPen(Qt.Qt.NoPen)
-        painter.setBrush(Brush(Qt.Qt.black))
-        
-        painter.rotate(((value - minimum) * 240.0) / fullrange)
-        painter.drawPath(path)
-        painter.drawEllipse(-10, -10, 20, 20)
-        painter.restore()
-
-        offset = self.valueOffset
-        if offset and self._showValueText:
-            if value <= minAlarm or value >= maxAlarm:
-                painter.setPen(Qt.Qt.red)
-            painter.setFont(self.valueFont)
-            s = Qt.QString(str(value))
-            size = painter.fontMetrics().size(Qt.Qt.TextSingleLine, s)
-            painter.drawText(Point(size.width() / -2.0, int(0-offset)), s)
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT property definition
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    def getAngle(self):
-        return self._angle
-    
-    def setAngle(self, angle):
-        self._angle = float(angle)
-        self._autoRangeIt()
-        self.update()
-
-    def resetAngle(self):
-        self.setAngle(self.DefaultAngle)
-
-    def getFrameWidth(self):
-        return self._frameWidth
-    
-    def setFrameWidth(self, frameWidth):
-        self._frameWidth = int(frameWidth)
-        self._autoRangeIt()
-        self.update()
-
-    def resetFrameWidth(self):
-        self.setFrameWidth(self.DefaultFrameWidth)
-
-    def getShowScaleColor(self):
-        return self._showScaleColor
-    
-    def setShowScaleColor(self, showScaleColor):
-        self._showScaleColor = bool(showScaleColor)
-        self._autoRangeIt()
-        self.update()
-
-    def resetShowScaleColor(self):
-        self.setShowScaleColor(self.DefaultShowScaleColor)
-
-    def getShowScaleTicks(self):
-        return self._showScaleTicks
-    
-    def setShowScaleTicks(self, showScaleTicks):
-        self._showScaleTicks = bool(showScaleTicks)
-        self._autoRangeIt()
-        self.update()
-
-    def resetShowScaleTicks(self):
-        self.setShowScaleTicks(self.DefaultShowScaleTicks)
-
-    def getShowScaleText(self):
-        return self._showScaleText
-    
-    def setShowScaleText(self, showScaleText):
-        self._showScaleText = bool(showScaleText)
-        self._autoRangeIt()
-        self.update()
-
-    def resetShowScaleText(self):
-        self.setShowScaleText(self.DefaultShowScaleText)
-
-    def resetShowScaleTicks(self):
-        self.setShowScaleTicks(self.DefaultShowScaleTicks)
-
-    def getShowValueText(self):
-        return self._showValueText
-    
-    def setShowValueText(self, showValueText):
-        self._showValueText = bool(showValueText)
-        self.update()
-
-    def resetShowValueText(self):
-        self.setShowValueText(self.DefaultShowValueText)
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        return {
-            'module' : 'taurus.qt.qtgui.gauge',
-            'group' : 'Taurus Display',
-            'icon' : ":/designer/circular_gauge.png",
-            'container' : False,
-        }
-
-    #: This property holds the angle
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QManoMeter.getAngle`
-    #:     * :meth:`QManoMeter.seAngle`
-    #:     * :meth:`QManoMeter.resetAngle`
-    angle = Qt.pyqtProperty("double", getAngle, setAngle, resetAngle, doc="angle")
-
-
-    #: This property holds the frame width
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QManoMeter.getFrameWidth`
-    #:     * :meth:`QManoMeter.setFrameWidth`
-    #:     * :meth:`QManoMeter.resetFrameWidth`
-    frameWidth = Qt.pyqtProperty("int", getFrameWidth, setFrameWidth,
-                                 resetFrameWidth, doc="frame width")
-
-    #: This property holds if should show scale color 
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QManoMeter.getShowScaleColor`
-    #:     * :meth:`QManoMeter.setShowScaleColor`
-    #:     * :meth:`QManoMeter.resetShowScaleColor`
-    showScaleColor = Qt.pyqtProperty("bool", getShowScaleColor,
-                                     setShowScaleColor, resetShowScaleColor,
-                                     doc="show scale color")
-
-    #: This property holds if should show scale ticks 
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QManoMeter.getShowScaleTicks`
-    #:     * :meth:`QManoMeter.setShowScaleTicks`
-    #:     * :meth:`QManoMeter.resetShowScaleTicks`
-    showScaleTicks = Qt.pyqtProperty("bool", getShowScaleTicks,
-                                     setShowScaleTicks, resetShowScaleTicks,
-                                     doc="show scale ticks")
-
-    #: This property holds if should show scale text 
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QManoMeter.getShowScaleText`
-    #:     * :meth:`QManoMeter.setShowScaleText`
-    #:     * :meth:`QManoMeter.resetShowScaleText`
-    showScaleText = Qt.pyqtProperty("bool", getShowScaleText,
-                                    setShowScaleText, resetShowScaleText,
-                                    doc="show scale text")
-
-    #: This property holds if should show value text 
-    #:
-    #: **Access functions:**
-    #:
-    #:     * :meth:`QManoMeter.getShowValueText`
-    #:     * :meth:`QManoMeter.setShowValueText`
-    #:     * :meth:`QManoMeter.resetShowValueText`
-    showValueText = Qt.pyqtProperty("bool", getShowValueText,
-                                    setShowValueText, resetShowValueText,
-                                    doc="show value text")
-                            
-def main():
-    import demo.qmeterdemo
-    demo.qmeterdemo.demo()
-
-if __name__ == "__main__":
-    main()
-    
-    
-    
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/gauge/taurusgauge.py b/lib/taurus/qt/qtgui/gauge/taurusgauge.py
deleted file mode 100644
index 174c938..0000000
--- a/lib/taurus/qt/qtgui/gauge/taurusgauge.py
+++ /dev/null
@@ -1,263 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 a collection of taurus Qt gauge widgets based on ELECTTRA's
-qtcontrols library"""
-
-import qtcontrols
-
-__all__ = ['TaurusLinearGauge', 'TaurusCircularGauge']
-
-__docformat__ = 'restructuredtext'
-
-import math
-
-from taurus.external.qt import Qt
-from taurus.qt.qtgui.base import TaurusBaseWidget
-
-class TaurusLinearGauge(qtcontrols.ELinearGauge, TaurusBaseWidget):
-
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-    
-    def __init__(self, parent = None, designMode = False):
-        name = self.__class__.__name__
-        self.call__init__wo_kw(qtcontrols.ELinearGauge, parent)
-        self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-
-    def sizeHint(self):
-        return Qt.QSize(100, 200)
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget overwritting
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def getModelClass(self):
-        import taurus.core
-        return taurus.core.taurusattribute.TaurusAttribute
-
-    def handleEvent(self, evt_src, evt_type, evt_value):
-        v, v_ref = None, None
-        
-        model = self.getModelObj()
-        v = self.getModelValueObj()
-        
-        if model is None or v is None:
-            self.setEnabled(False)
-        else:
-            self.setEnabled(True)
-
-        if not v is None:
-            v_ref = v.w_value or self.minValue()
-            v = v.value
-        else:
-            v = v_ref = self.minValue()
-
-        self.setValue(v)
-        self.setReference(v_ref)
-
-        if model is None:
-            # no information available
-            # keep the old values
-            pass
-        else:
-            try:
-                minW, maxW = int(model.getMinWarning()), int(model.getMaxWarning())
-                self.setLowWarning(minW)
-                self.setHighWarning(maxW)
-            except:
-                pass
-            try:
-                minV, maxV = int(model.getMinValue()), int(model.getMaxValue())
-                self.setMinValue(minV)
-                self.setMaxValue(maxV)
-            except:
-                pass
-            try:
-                minA, maxA = int(model.getMinAlarm()), int(model.getMaxAlarm())
-                self.setLowError(minA)
-                self.setHighError(maxA)
-            except:
-                pass
-        
-        self.setToolTip(self.getFormatedToolTip())
-
-    def isReadOnly(self):
-        return True
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-        ret['group'] = 'Taurus Display'
-        ret['module'] = 'taurus.qt.qtgui.gauge'
-        ret['icon'] = ":/designer/vertical_linear_gauge.png"
-        return ret
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-  
-
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
-                            TaurusBaseWidget.setModel,
-                            TaurusBaseWidget.resetModel)
-                                
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
-                                     TaurusBaseWidget.setUseParentModel,
-                                     TaurusBaseWidget.resetUseParentModel)
-
-
-class TaurusCircularGauge(qtcontrols.ECircularGauge, TaurusBaseWidget):
-
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-    
-    def __init__(self, parent = None, designMode = False):
-        name = self.__class__.__name__
-        self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-        self.call__init__wo_kw(qtcontrols.ECircularGauge, parent)
-        
-        self._logScale = False
-
-    def sizeHint(self):
-        return Qt.QSize(100, 100)
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget overwritting
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def getModelClass(self):
-        import taurus.core
-        return taurus.core.taurusattribute.TaurusAttribute
-
-    def handleEvent(self, evt_src, evt_type, evt_value):
-        v, v_ref = None, None
-        
-        model = self.getModelObj()
-        v = self.getModelValueObj()
-        
-        if model is None or v is None:
-            self.setEnabled(False)
-        else:
-            self.setEnabled(True)
-
-        if not v is None:
-            v_ref = v.w_value or self.minValue()
-            v = v.value
-        else:
-            v = v_ref = self.minValue()
-
-        if self._logScale:
-            v = math.log(v, 10)
-                
-        self.setValue(v)
-        self.setReference(v_ref)
-
-        if model is None:
-            # no information available
-            # keep the old values
-            pass
-        else:
-            fmt = model.getFormat() or self.valueFormat()
-            self.setValueFormat(fmt)
-            try:
-                minW, maxW = int(model.getMinWarning()), int(model.getMaxWarning())
-                if self._logScale: minW, maxW = math.log(minW, 10), math.log(maxW, 10)
-                self.setLowWarning(minW)
-                self.setHighWarning(maxW)
-            except:
-                pass
-            try:
-                minV, maxV = int(model.getMinValue()), int(model.getMaxValue())
-                if self._logScale: minV, maxV = math.log(minV, 10), math.log(maxV, 10)
-                self.setMinValue(minV)
-                self.setMaxValue(maxV)
-            except:
-                pass
-            try:
-                minA, maxA = int(model.getMinAlarm()), int(model.getMaxAlarm())
-                if self._logScale: minA, maxA = math.log(minA, 10), math.log(maxA, 10)
-                self.setLowError(minA)
-                self.setHighError(maxA)
-            except:
-                pass
-        
-        self.setToolTip(self.getFormatedToolTip())
-
-    def isReadOnly(self):
-        return True
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-  
-    
-    def getLogScale(self):
-        return self._logScale
-
-    @Qt.pyqtSignature("setLogScale(bool)")
-    def setLogScale(self, val):
-        self._logScale = bool(val)
-        self.updateStyle()
-
-    def resetLogScale(self):
-        self._logScale = False
-        self.updateStyle()
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-        ret['group'] = 'Taurus Display'
-        ret['module'] = 'taurus.qt.qtgui.gauge'
-        ret['icon'] = ":/designer/circular_gauge.png"
-        return ret
-    
-    logScale  = Qt.pyqtProperty("bool", getLogScale, setLogScale, resetLogScale)
-    
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
-                            TaurusBaseWidget.setModel, TaurusBaseWidget.resetModel)
-                                
-    useParentModel = Qt.pyqtProperty("bool", TaurusBaseWidget.getUseParentModel,
-                                     TaurusBaseWidget.setUseParentModel,
-                                     TaurusBaseWidget.resetUseParentModel)
-
-def main():
-    import sys
-    import taurus
-    attr_name = sys.argv[1]
-    attr = taurus.Attribute(attr_name)
-    
-    a = Qt.QApplication([])
-    panel = Qt.QWidget()
-    l = Qt.QGridLayout()
-    w1 = TaurusCircularGauge()
-    w2 = TaurusLinearGauge()
-    w1.setModel(attr_name)
-    w2.setModel(attr_name)
-    
-    l.addWidget(w1,0,0)
-    l.addWidget(w2,1,0)
-    panel.setLayout(l)
-    panel.setVisible(True)
-    a.exec_()
-
-if __name__ == "__main__":
-    main()
diff --git a/lib/taurus/qt/qtgui/graphic/__init__.py b/lib/taurus/qt/qtgui/graphic/__init__.py
index 68229bf..48c47cc 100644
--- a/lib/taurus/qt/qtgui/graphic/__init__.py
+++ b/lib/taurus/qt/qtgui/graphic/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/__init__.py b/lib/taurus/qt/qtgui/graphic/jdraw/__init__.py
index c17174a..e2ac42d 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/__init__.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -28,4 +28,4 @@
 __docformat__ = 'restructuredtext'
 
 from .jdraw import *
-from .jdraw_view import TaurusJDrawSynopticsView #*
+from .jdraw_view import TaurusJDrawSynopticsView  # *
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
index 1e0e4c1..caf8faa 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -36,38 +36,37 @@ from taurus.external.qt import Qt
 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,
-                     1: Qt.Qt.DotLine,
-                     2: Qt.Qt.DashLine,
-                     3: Qt.Qt.DashLine,
-                     4: Qt.Qt.DashDotLine }
-
-FILLSTYLE_JDW2QT = { 0: Qt.Qt.NoBrush,
-                     1: Qt.Qt.SolidPattern,
-                     2: Qt.Qt.FDiagPattern,
-                     3: Qt.Qt.BDiagPattern,
-                     4: Qt.Qt.DiagCrossPattern,
-                     5: Qt.Qt.FDiagPattern,
-                     6: Qt.Qt.BDiagPattern,
-                     7: Qt.Qt.Dense5Pattern,
-                     8: Qt.Qt.Dense7Pattern,
-                     9: Qt.Qt.Dense6Pattern,
-                     10:Qt.Qt.Dense4Pattern,
-                     11:Qt.Qt.LinearGradientPattern }
-
-TEXTHINT_JDW2QT = CaselessDict({ 
-    'helvetica'  : Qt.QFont.Helvetica,
-    'serif'      : Qt.QFont.Serif,
-    'sansserif'  : Qt.QFont.SansSerif,
-    'courier'    : Qt.QFont.Courier,
-    'Monospaced' : Qt.QFont.Courier,
-    'times'      : Qt.QFont.Times,
-    ''           : Qt.QFont.AnyStyle,})
+from taurus.qt.qtgui.graphic import (TaurusBaseGraphicsFactory,
+                                     TaurusGraphicsScene, TaurusGraphicsItem)
+
+
+LINESTYLE_JDW2QT = {0: Qt.Qt.SolidLine,
+                    1: Qt.Qt.DotLine,
+                    2: Qt.Qt.DashLine,
+                    3: Qt.Qt.DashLine,
+                    4: Qt.Qt.DashDotLine}
+
+FILLSTYLE_JDW2QT = {0: Qt.Qt.NoBrush,
+                    1: Qt.Qt.SolidPattern,
+                    2: Qt.Qt.FDiagPattern,
+                    3: Qt.Qt.BDiagPattern,
+                    4: Qt.Qt.DiagCrossPattern,
+                    5: Qt.Qt.FDiagPattern,
+                    6: Qt.Qt.BDiagPattern,
+                    7: Qt.Qt.Dense5Pattern,
+                    8: Qt.Qt.Dense7Pattern,
+                    9: Qt.Qt.Dense6Pattern,
+                    10: Qt.Qt.Dense4Pattern,
+                    11: Qt.Qt.LinearGradientPattern}
+
+TEXTHINT_JDW2QT = CaselessDict({
+    'helvetica': Qt.QFont.Helvetica,
+    'serif': Qt.QFont.Serif,
+    'sansserif': Qt.QFont.SansSerif,
+    'courier': Qt.QFont.Courier,
+    'Monospaced': Qt.QFont.Courier,
+    'times': Qt.QFont.Times,
+    '': Qt.QFont.AnyStyle, })
 
 ALIGNMENT = {
     0: Qt.Qt.AlignHCenter,
@@ -81,11 +80,12 @@ VALIGNMENT = {
     2: Qt.Qt.AlignBottom,
 }
 
+
 class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
-    
-    def __init__(self,parent,alias = None, delayed = False):
+
+    def __init__(self, parent, alias=None, delayed=False):
         """ Initialization. Nothing to be done here for now."""
-        self.myparent=parent
+        self.myparent = parent
         self.call__init__wo_kw(TaurusBaseGraphicsFactory, parent)
         self._zBufferLevel = 0
         self._delayed = delayed
@@ -93,23 +93,23 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
 
     def init(self, *args, **kwargs):
         """Singleton instance initialization."""
-        self.call__init__(Logger, self.__class__.__name__) 
+        self.call__init__(Logger, self.__class__.__name__)
         self.call__init__(TaurusBaseGraphicsFactory)
-        
+
     def getZBufferLevel(self):
         return self._zBufferLevel
 
     def incZBufferLevel(self):
         self._zBufferLevel += 1
         return self._zBufferLevel
-        
+
     def setZBufferLevel(self, level):
         self._zBufferLevel = level
-    
+
     def resetZBufferLevel(self):
         self.setZBufferLevel(0)
-    
-    def getSceneObj(self,items):
+
+    def getSceneObj(self, items):
         scene = TaurusGraphicsScene(self.myparent)
         for item in items:
             try:
@@ -121,8 +121,8 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
                 self.warning("Unable to add item %s to scene" % str(item))
                 self.debug("Details:", exc_info=1)
         return scene
-    
-    def getObj(self,name,params):
+
+    def getObj(self, name, params):
         method_name = 'get' + name.lstrip('JD') + 'Obj'
         try:
             method = getattr(self, method_name)
@@ -134,54 +134,54 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
             self.info("Details:", exc_info=1)
             pass
         return None
-    
-    def getRectangleObj(self,params):
-        item = self.getGraphicsItem('Rectangle',params)
+
+    def getRectangleObj(self, params):
+        item = self.getGraphicsItem('Rectangle', params)
         x1, y1, x2, y2 = params.get('summit')
         width = x2 - x1
         height = y2 - y1
-        #item.setPos(x1,y1)
-        item.setRect(x1,y1,width,height)
-        
+        # item.setPos(x1,y1)
+        item.setRect(x1, y1, width, height)
+
         return item
 
-    def getRoundRectangleObj(self,params):
-        item = self.getGraphicsItem('RoundRectangle',params)
+    def getRoundRectangleObj(self, params):
+        item = self.getGraphicsItem('RoundRectangle', params)
         x1, y1, x2, y2 = params.get('summit')
         width = x2 - x1
         height = y2 - y1
         cornerWidth = params.get('cornerWidth', 24)
         nbPoints = params.get('step', 6)
-        #item.setPos(x1,y1)
+        # item.setPos(x1,y1)
         item.setRect(x1, y1, width, height)
         item.setCornerWidth(cornerWidth, nbPoints)
 
         return item
-        
-    def getLineObj(self,params):
-        item = self.getGraphicsItem('Line',params)
-        x1,y1,x2,y2 = params.get('summit')
-        item.setLine(x1,y1,x2,y2)
-        
+
+    def getLineObj(self, params):
+        item = self.getGraphicsItem('Line', params)
+        x1, y1, x2, y2 = params.get('summit')
+        item.setLine(x1, y1, x2, y2)
+
         return item
-    
-    def getEllipseObj(self,params):
-        item = self.getGraphicsItem('Ellipse',params)
-        
+
+    def getEllipseObj(self, params):
+        item = self.getGraphicsItem('Ellipse', params)
+
         x1, y1, x2, y2 = params.get('summit')
         width = x2 - x1
         height = y2 - y1
-        item.setRect(x1,y1,width,height)
+        item.setRect(x1, y1, width, height)
+
+        return item
 
-        return item        
+    def getPolylineObj(self, params):
+        item = self.getGraphicsItem('Polyline', params)
 
-    def getPolylineObj(self,params):
-        item = self.getGraphicsItem('Polyline',params)
-        
         polygon = Qt.QPolygonF()
         p = params.get('summit')
-        for i in xrange(0,len(p),2):
-            polygon.append(Qt.QPointF(p[i],p[i+1]))
+        for i in xrange(0, len(p), 2):
+            polygon.append(Qt.QPointF(p[i], p[i + 1]))
         item.setPolygon(polygon)
 
         return item
@@ -189,7 +189,7 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
     def getSplineObj(self, params):
         item = self.getGraphicsItem('Spline', params)
         p = params.get('summit')
-        p = [Qt.QPointF(p[i],p[i+1]) for i in xrange(0,len(p),2)]
+        p = [Qt.QPointF(p[i], p[i + 1]) for i in xrange(0, len(p), 2)]
         item.setControlPoints(p)
         isClosed = params.get('isClosed', True)
         item.setClose(isClosed)
@@ -218,10 +218,10 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
         hAlignment = ALIGNMENT[hAlignment]
         item.setAlignment(hAlignment | vAlignment)
 
-        fnt = params.get('font',None)
+        fnt = params.get('font', None)
         if fnt:
-            family,style,size = fnt
-            f = Qt.QFont(family, int(.85*size), Qt.QFont.Light, False)
+            family, style, size = fnt
+            f = Qt.QFont(family, int(.85 * size), Qt.QFont.Light, False)
             f.setStyleHint(TEXTHINT_JDW2QT.get(family, Qt.QFont.AnyStyle))
             f.setStyleStrategy(Qt.QFont.PreferMatch)
             if style == 1:
@@ -231,24 +231,24 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
             elif style == 3:
                 f.setWeight(Qt.QFont.DemiBold)
                 f.setItalic(True)
-            #TODO: Improve code in order to be able to set a suitable font
+            # TODO: Improve code in order to be able to set a suitable font
             item.setFont(f)
-        fg = params.get("foreground", (0,0,0))
-        color = Qt.QColor(fg[0],fg[1],fg[2])
+        fg = params.get("foreground", (0, 0, 0))
+        color = Qt.QColor(fg[0], fg[1], fg[2])
         item.setDefaultTextColor(color)
 
         txt = params.get('text')
         if txt:
-            if any(isinstance(txt,t) for t in (list,tuple,set)): #Parsing several lines of text
-                txt = '\n'.join(txt)            
+            if any(isinstance(txt, t) for t in (list, tuple, set)):  # Parsing several lines of text
+                txt = '\n'.join(txt)
             item.setPlainText(Qt.QString(txt))
             item._currText = txt
 
-    def getGroupObj(self,params):
-        item = self.getGraphicsItem('Group',params)
+    def getGroupObj(self, params):
+        item = self.getGraphicsItem('Group', params)
         s = params.get('summit')
         x1, y1 = s[0], s[1]
-        item.setPos(x1,y1)
+        item.setPos(x1, y1)
         children = params.get('children')
         if children:
             for child in children:
@@ -259,11 +259,11 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
             self.set_item_filling(item, expand=True)
         return item
 
-    def getSwingObjectObj(self,params):
+    def getSwingObjectObj(self, params):
         item = self.getGraphicsItem('SwingObject', params)
         s = params.get('summit')
         x1, y1 = s[0], s[1]
-        item.setPos(x1,y1)
+        item.setPos(x1, y1)
 
         className = params.get('className')
         if className == "fr.esrf.tangoatk.widget.attribute.SimpleScalarViewer":
@@ -296,28 +296,29 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
         userFormat = ext.get('userFormat', None)
         item.setUserFormat(userFormat)
 
-    def getImageObj(self,params):
-        item = self.getGraphicsItem('Image',params)
+    def getImageObj(self, params):
+        item = self.getGraphicsItem('Image', params)
         s = params.get('summit')
-        x1, y1 , x2, y2 = s
-        item.setPos(x1,y1)
-        
+        x1, y1, x2, y2 = s
+        item.setPos(x1, y1)
+
         fname = params.get('file_name')
         if fname:
             if os.path.isfile(fname):
                 fname = os.path.realpath(fname)
-            elif hasattr(self.myparent,'path'):
+            elif hasattr(self.myparent, 'path'):
                 #self.info('using path param ...')
-                fname = self.myparent.path+os.path.sep+fname
-            self.debug('Opening JDImage(%s) = x,y,w,h=%f,%f,%f,%f' % (fname,x1,y1,x2-x1,y2-y1))
+                fname = self.myparent.path + os.path.sep + fname
+            self.debug('Opening JDImage(%s) = x,y,w,h=%f,%f,%f,%f' %
+                       (fname, x1, y1, x2 - x1, y2 - y1))
             pixmap = Qt.QPixmap(fname)
-            item.setPixmap(pixmap.scaled(x2-x1,y2-y1))
+            item.setPixmap(pixmap.scaled(x2 - x1, y2 - y1))
             #item.scale(float(w)/pixmap.width(), float(h)/pixmap.height())
-        else: 
+        else:
             self.warning('No filename for image!?!')
         return item
-        
-    def set_common_params(self,item,params):
+
+    def set_common_params(self, item, params):
         if not item:
             return
         item._params = params
@@ -329,18 +330,19 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
                 params['extensions'] = {}
             params.get('extensions')["ignoreRepaint"] = "true"
 
-        if self.alias: 
-            for k,v in self.alias.items():
-                name = str(name).replace(k,v)
+        if self.alias:
+            for k, v in self.alias.items():
+                name = str(name).replace(k, v)
 
-        #Forcing not-Taurus items to have a name and be able to trigger events
-        setattr(item,'_name',name)
+        # Forcing not-Taurus items to have a name and be able to trigger events
+        setattr(item, '_name', name)
         if name and not self._delayed:
             if isinstance(item, TaurusGraphicsItem):
                 #self.debug('TaurusJDrawGraphicsFactory.set_common_params(): %s.setModel(%s)'%(item,name))
                 item.setModel(name)
             else:
-                self.debug('TaurusJDrawGraphicsFactory.set_common_params(%s): %s is not a TaurusGraphicsItem'%(name,type(item).__name__))
+                self.debug('TaurusJDrawGraphicsFactory.set_common_params(%s): %s is not a TaurusGraphicsItem' % (
+                    name, type(item).__name__))
 
         visibilitymapper = params.get('visibilitymapper')
         if not visibilitymapper is None:
@@ -359,36 +361,37 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
             item._extensions = extensions
 
         try:
-            getattr(item,'setPen')
-            fg = params.get("foreground", (0,0,0))
+            getattr(item, 'setPen')
+            fg = params.get("foreground", (0, 0, 0))
             lineWidth = params.get("lineWidth", 1)
             if lineWidth == 0:
                 pen = Qt.QPen(Qt.Qt.NoPen)
             else:
-                pen = Qt.QPen(Qt.QColor(fg[0],fg[1],fg[2]))
+                pen = Qt.QPen(Qt.QColor(fg[0], fg[1], fg[2]))
                 pen.setWidth(lineWidth)
                 pen.setStyle(LINESTYLE_JDW2QT[params.get("lineStyle", 0)])
             item.setPen(pen)
-        except AttributeError,ae:
+        except AttributeError, ae:
             pass
-        except Exception,e:
-            self.warning('jdraw.set_common_params(%s(%s)).(foreground,width,style) failed!: \n\t%s'%(type(item).__name__,name,traceback.format_exc()))
+        except Exception, e:
+            self.warning('jdraw.set_common_params(%s(%s)).(foreground,width,style) failed!: \n\t%s' % (
+                type(item).__name__, name, traceback.format_exc()))
 
         fillStyle = FILLSTYLE_JDW2QT[params.get('fillStyle', 0)]
         item._fillStyle = fillStyle
 
-        if hasattr(item,'brush'):
+        if hasattr(item, 'brush'):
             brush = Qt.QBrush()
             if fillStyle == Qt.Qt.LinearGradientPattern:
                 ox, oy = params.get('origin', (0, 0))
-                gradient = Qt.QLinearGradient(ox + params.get('gradX1',0),
-                                                oy + params.get('gradY1',0),
-                                                ox + params.get('gradX2',0),
-                                                oy + params.get('gradY2',0))
-                c = params.get('gradC1',(0,0,0))
-                gradient.setColorAt(0,Qt.QColor(c[0],c[1],c[2]))
-                c = params.get('gradC2',(255,255,255))
-                gradient.setColorAt(1,Qt.QColor(c[0],c[1],c[2]))
+                gradient = Qt.QLinearGradient(ox + params.get('gradX1', 0),
+                                              oy + params.get('gradY1', 0),
+                                              ox + params.get('gradX2', 0),
+                                              oy + params.get('gradY2', 0))
+                c = params.get('gradC1', (0, 0, 0))
+                gradient.setColorAt(0, Qt.QColor(c[0], c[1], c[2]))
+                c = params.get('gradC2', (255, 255, 255))
+                gradient.setColorAt(1, Qt.QColor(c[0], c[1], c[2]))
 
                 gradCyclic = params.get('gradCyclic', False)
                 if gradCyclic:
@@ -398,21 +401,21 @@ class TaurusJDrawGraphicsFactory(Singleton, TaurusBaseGraphicsFactory, Logger):
             else:
                 brush.setStyle(fillStyle)
 
-            bg = params.get('background',(255,255,255))
-            brush.setColor(Qt.QColor(bg[0],bg[1],bg[2]))
+            bg = params.get('background', (255, 255, 255))
+            brush.setColor(Qt.QColor(bg[0], bg[1], bg[2]))
             item.setBrush(brush)
 
-    def set_item_filling(self,item,pattern=Qt.Qt.Dense4Pattern,expand=False):
+    def set_item_filling(self, item, pattern=Qt.Qt.Dense4Pattern, expand=False):
         count = 0
         item._fillStyle = item._fillStyle or pattern
-        if hasattr(item,'brush'):
+        if hasattr(item, 'brush'):
             br = item.brush()
             br.setStyle(item._fillStyle)
             item.setBrush(br)
         if expand:
             for c in item.childItems():
                 if not c._fillStyle:
-                    self.set_item_filling(c,pattern=pattern,expand=True)
+                    self.set_item_filling(c, pattern=pattern, expand=True)
         return
 
 if __name__ == "__main__":
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
index c44a5bd..904b0e4 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -38,12 +38,12 @@ from ply import yacc
 
 from taurus.core.util.log import Logger
 
-tokens = ( 'NUMBER', 'SYMBOL', 'LBRACKET', 'RBRACKET', 'TWOP', 'COMMA',
-'JDFILE', 'GLOBAL', 'JDLINE', 'JDRECTANGLE', 'JDROUNDRECTANGLE',
-'JDGROUP', 'JDELLIPSE', 'JDBAR', 'JDSWINGOBJECT', 'JDLABEL', 'JDPOLYLINE', 
-'JDIMAGE', 'JDAXIS', 'JDSLIDER', 'JDSPLINE', 'TEXT', 
-'true', 'false',
-)
+tokens = ('NUMBER', 'SYMBOL', 'LBRACKET', 'RBRACKET', 'TWOP', 'COMMA',
+          'JDFILE', 'GLOBAL', 'JDLINE', 'JDRECTANGLE', 'JDROUNDRECTANGLE',
+          'JDGROUP', 'JDELLIPSE', 'JDBAR', 'JDSWINGOBJECT', 'JDLABEL', 'JDPOLYLINE',
+          'JDIMAGE', 'JDAXIS', 'JDSLIDER', 'JDSPLINE', 'TEXT',
+          'true', 'false',
+          )
 
 t_LBRACKET = r'\{'
 t_RBRACKET = r'\}'
@@ -53,29 +53,30 @@ t_COMMA = r'\,'
 t_TEXT = r'\"[^"]*\"'
 
 reserved = {
-'JDFile' : 'JDFILE',
-'Global' : 'GLOBAL',
-'JDLine' : 'JDLINE',
-'JDRectangle' : 'JDRECTANGLE',
-'JDRoundRectangle' : 'JDROUNDRECTANGLE',
-'JDGroup' : 'JDGROUP',
-'JDEllipse' : 'JDELLIPSE',
-'JDBar' : 'JDBAR',
-'JDSwingObject' : 'JDSWINGOBJECT',
-'JDLabel' : 'JDLABEL',
-'JDPolyline' : 'JDPOLYLINE',
-'JDImage' : 'JDIMAGE',
-'JDAxis' : 'JDAXIS',
-'JDSlider' : 'JDSLIDER',
-'JDSpline' : 'JDSPLINE',
-'true' : 'true',
-'false' : 'false',
+    'JDFile': 'JDFILE',
+    'Global': 'GLOBAL',
+    'JDLine': 'JDLINE',
+    'JDRectangle': 'JDRECTANGLE',
+    'JDRoundRectangle': 'JDROUNDRECTANGLE',
+    'JDGroup': 'JDGROUP',
+    'JDEllipse': 'JDELLIPSE',
+    'JDBar': 'JDBAR',
+    'JDSwingObject': 'JDSWINGOBJECT',
+    'JDLabel': 'JDLABEL',
+    'JDPolyline': 'JDPOLYLINE',
+    'JDImage': 'JDIMAGE',
+    'JDAxis': 'JDAXIS',
+    'JDSlider': 'JDSLIDER',
+    'JDSpline': 'JDSPLINE',
+    'true': 'true',
+    'false': 'false',
 
 }
 
+
 def t_SYMBOL(t):
     r'[a-zA-Z_][a-zA-Z_0-9]*'
-    t.type = reserved.get(t.value,'SYMBOL')    # Check for reserved words
+    t.type = reserved.get(t.value, 'SYMBOL')    # Check for reserved words
     return t
 
 
@@ -84,43 +85,52 @@ def t_NUMBER(t):
     try:
         t.value = float(t.value)
     except:
-        t.lexer.log.info("[%d]: Number %s is not valid!" % (t.lineno,t.value))
+        t.lexer.log.info("[%d]: Number %s is not valid!" % (t.lineno, t.value))
         t.value = 0
     return t
-    
-# Ignored characters 
+
+# Ignored characters
 t_ignore = " \t"
 
+
 def t_newline(t):
-    r'\n+' 
-    t.lexer.lineno += t.value.count("\n") 
-    
-def t_error(t): 
-    t.lexer.log.info("[%d]: Illegal character '%s'" % (t.lexer.lineno,t.value[0]))
+    r'\n+'
+    t.lexer.lineno += t.value.count("\n")
+
+
+def t_error(t):
+    t.lexer.log.info("[%d]: Illegal character '%s'" %
+                     (t.lexer.lineno, t.value[0]))
     t.lexer.skip(1)
 
+
 def p_error(p):
-    p.lexer.log.error("[%d]: Syntax error in input [%s]" % (p.lexer.lineno,(str(p))))
-    
-#-------------------------------------------------------------------------------
+    p.lexer.log.error("[%d]: Syntax error in input [%s]" %
+                      (p.lexer.lineno, (str(p))))
+
+#-------------------------------------------------------------------------
 # Yacc Starting symbol
-#-------------------------------------------------------------------------------
+#-------------------------------------------------------------------------
+
+
 def p_jdfile(p):
     ''' jdfile :  JDFILE SYMBOL LBRACKET global element_list RBRACKET '''
     factory = p.parser.factory
     p[0] = factory.getSceneObj(p[5])
-    
+
     if p[0] is None:
         p.parser.log.info("[%d]: Unable to create Scene" % p.lexer.lineno)
-    
+
+
 def p_jdfile_empty(p):
     ''' jdfile : JDFILE LBRACKET global RBRACKET '''
     factory = p.parser.factory
     p[0] = factory.getSceneObj([])
-    
+
     if p[0] is None:
         p.parser.log.info("[%d]: Unable to create Scene" % p.lexer.lineno)
 
+
 def p_global(p):
     ''' global : GLOBAL LBRACKET RBRACKET
                | GLOBAL LBRACKET parameter_list RBRACKET'''
@@ -129,6 +139,7 @@ def p_global(p):
     else:
         p[0] = p[3]
 
+
 def p_element_list(p):
     '''element_list : element_list element '''
     if not p[2] is None:
@@ -136,59 +147,65 @@ def p_element_list(p):
     else:
         p[0] = p[1]
 
+
 def p_element(p):
     '''element_list : element '''
     p[0] = [p[1]]
 
+
 def p_single_element(p):
     '''element : obj LBRACKET RBRACKET
                | obj LBRACKET parameter_list RBRACKET'''
-    
+
     #elems = None
     if len(p) == 4:
         p[3] = {}
-    
-    # determine the model name 
+
+    # determine the model name
     org = name = p[3].get('name')
-    
-    #change name: if item has no name it should take the name of its nearest-named-parent
-    #as no-name it is also considered any element with a name like a reserved keyword or plain value
-    keywords = ['JDGroup']+[n.replace('JD','') for n in reserved]
-    if not name or name in keywords or re.match('[0-9]+$',name):
+
+    # change name: if item has no name it should take the name of its nearest-named-parent
+    # as no-name it is also considered any element with a name like a reserved
+    # keyword or plain value
+    keywords = ['JDGroup'] + [n.replace('JD', '') for n in reserved]
+    if not name or name in keywords or re.match('[0-9]+$', name):
         #if re.match('[0-9]+$',name):  p[3]['mapvalue'] = name
         p[3]['name'] = name = ""
-        #print '\t name is empty, checking stack: %s' % [str(s) for s in reversed(p.parser.modelStack)]
+        # print '\t name is empty, checking stack: %s' % [str(s) for s in
+        # reversed(p.parser.modelStack)]
         for model in reversed(p.parser.modelStack):
-            if model and model not in keywords and not re.match('[0-9]+$',model):
-                #print 'Setting Model %s to %s' % (model,p[1])
+            if model and model not in keywords and not re.match('[0-9]+$', model):
+                # print 'Setting Model %s to %s' % (model,p[1])
                 p[3]['name'] = name = model
                 break
-    #print 'parser: %s => %s [%s]' % (org,name,p.parser.modelStack)
-    extension = p[3].get("extensions")     
+    # print 'parser: %s => %s [%s]' % (org,name,p.parser.modelStack)
+    extension = p[3].get("extensions")
     if p.parser.modelStack2:
         if extension is None:
-            p[3]["extensions"]=p.parser.modelStack2[0]
-        elif len(p.parser.modelStack2)==2:
+            p[3]["extensions"] = p.parser.modelStack2[0]
+        elif len(p.parser.modelStack2) == 2:
             extension.update(p.parser.modelStack2[0])
             p[3]["extensions"] = extension
 
     # create the corresponding element
     factory = p.parser.factory
     #p.parser.log.debug('ret = factory.getObj(%s,%s)'% (str(p[1]),str(p[3])))
-    ret = factory.getObj(p[1],p[3])
- 
+    ret = factory.getObj(p[1], p[3])
+
     if ret is None:
-        p.parser.log.info("[%d]: Unable to create obj '%s'" % (p.lexer.lineno,p[1]))
-    
-    # clear the model stack 
+        p.parser.log.info("[%d]: Unable to create obj '%s'" %
+                          (p.lexer.lineno, p[1]))
+
+    # clear the model stack
     # if name:
     p.parser.modelStack.pop()
     if extension:
         p.parser.modelStack2.pop()
 
-    #extension = p[3].get("extensions") 
+    #extension = p[3].get("extensions")
     p[0] = ret
-    
+
+
 def p_obj(p):
     '''obj : JDLINE
            | JDRECTANGLE
@@ -205,23 +222,28 @@ def p_obj(p):
            | JDSPLINE'''
     p[0] = p[1]
 
+
 def p_parameter_list(p):
     '''parameter_list : parameter_list parameter'''
     p[0] = p[1]
     p[0].update(p[2])
 
+
 def p_parameter(p):
     '''parameter_list : parameter'''
-    p[0] = p[1] 
-                           
+    p[0] = p[1]
+
+
 def p_single_parameter(p):
     '''parameter : SYMBOL TWOP param_value'''
-    #modelStacks added in this method control how extensions/models/names are propagated within JDGroup items
+    # modelStacks added in this method control how extensions/models/names are
+    # propagated within JDGroup items
     if p[1] == 'name':
-       p.parser.modelStack.append(p[3])
+        p.parser.modelStack.append(p[3])
     if p[1] == 'extensions':
         p.parser.modelStack2.append(p[3])
-    p[0] = { p[1] : p[3] }
+    p[0] = {p[1]: p[3]}
+
 
 def p_complex_parameter(p):
     '''parameter : SYMBOL TWOP LBRACKET RBRACKET
@@ -229,10 +251,11 @@ def p_complex_parameter(p):
                  | SYMBOL TWOP LBRACKET element_list RBRACKET'''
     if len(p) == 5:
         p[4] = []
-    p[0] = { p[1] : p[4] }
+    p[0] = {p[1]: p[4]}
     if p[1] == 'extensions':
         p.parser.modelStack2.append(p[4])
 
+
 def p_param_value_number_list(p):
     '''param_value : value_list '''
     if len(p[1]) == 1:
@@ -240,27 +263,33 @@ def p_param_value_number_list(p):
     else:
         p[0] = p[1]
 
+
 def p_value_list(p):
     ''' value_list : value_list COMMA value '''
     p[0] = p[1] + [p[3]]
 
+
 def p_value_list_value(p):
     ''' value_list : value '''
     p[0] = [p[1]]
 
+
 def p_value_number(p):
     '''value : NUMBER'''
     p[0] = p[1]
 
+
 def p_value_text(p):
     '''value : TEXT'''
     p[0] = p[1].strip('"')
-    
+
+
 def p_value_bool(p):
     '''value : true
              | false'''
     p[0] = p[1] == 'true'
 
+
 def new_parser(optimize=None, debug=0, outputdir=None):
     log = Logger('JDraw Parser')
 
@@ -277,12 +306,12 @@ def new_parser(optimize=None, debug=0, outputdir=None):
     debuglog = None
     if debug:
         debuglog = log
-    
+
     common_kwargs = dict(optimize=optimize, outputdir=outputdir,
                          debug=debug, debuglog=debuglog, errorlog=log)
-    
+
     # lex/yacc v<3.0 do not accept  debuglog or errorlog keyword args
-    if int(lex.__version__.split('.')[0]) < 3: 
+    if int(lex.__version__.split('.')[0]) < 3:
         common_kwargs.pop('debuglog')
         common_kwargs.pop('errorlog')
 
@@ -308,11 +337,12 @@ def new_parser(optimize=None, debug=0, outputdir=None):
     except Exception, e:
         msg = ('Error creating jdraw parser.\n' +
                'HINT: Try removing jdraw_lextab.* and jdraw_yacctab.* from %s' %
-               outputdir )
+               outputdir)
         raise RuntimeError(msg)
-        
+
     return l, p
-    
+
+
 def parse(filename=None, factory=None):
 
     if filename is None or factory is None:
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
index 5497e1b..b6b248d 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -33,20 +33,23 @@ import os
 import traceback
 import taurus
 from taurus.external.qt import Qt
-from taurus.core.taurusvalidator import DeviceNameValidator, AttributeNameValidator
+from taurus.core.taurusbasetypes import TaurusElementType
+from taurus.core import taurushelper
 from taurus.qt.qtgui.graphic.taurusgraphic import parseTangoUri, TaurusGraphicsItem, SynopticSelectionStyle
 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
 
+
 class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
     '''
     Taurus Class that visualizes Synoptics drawn with the JDraw tool (by ESRF). It is equivalent to ATK Synoptic Player (Java).
-    
+
     After initialization call setModel('/your/file.jdw') to parse the synoptic file and connect to controlled objects.
-    
+
     Arguments to TaurusJDrawSynopticsView() creator are:
-    
+
         - designMode; used by Qt Designer
         - updateMode; controls Qt Viewport refresh (disabled by default)
         - alias; a dictionary of name replacements to be applied on graphical objects
@@ -54,26 +57,29 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
         - panelClass: class object, class name or shell command to be shown when an object is clicked (None will show default panel, '' or 'noPanel' will disable it)
 
     TaurusJDrawSynopticsView and TaurusGraphicsScene signals/slots
-    
+
     External events::
-    
+
      Slot selectGraphicItem(const QString &) displays a selection
      mark around the TaurusGraphicsItem that matches the argument passed.
-    
+
     Mouse Left-button events::
-    
+
      Signal graphicItemSelected(QString) is triggered, passing the
      selected TaurusGraphicsItem.name() as argument.
-    
+
     Mouse Right-button events::
-    
+
      TaurusGraphicsItem.setContextMenu([(ActionName,ActionMethod(device_name))]
      allows to configure custom context menus for graphic items using a list
      of tuples. Empty tuples will insert separators in the menu.
-    '''    
-    __pyqtSignals__ = ("itemsChanged","modelsChanged","graphicItemSelected(QString)","graphicSceneClicked(QPoint)")
+    '''
+    itemsChanged = Qt.pyqtSignal(str, dict)
+    modelsChanged = Qt.pyqtSignal(list)
+    graphicItemSelected = Qt.pyqtSignal('QString')
+    graphicSceneClicked = Qt.pyqtSignal('QPoint')
 
-    def __init__(self, parent = None, designMode = False, updateMode=None, alias = None, resizable = True, panelClass = None):
+    def __init__(self, parent=None, designMode=False, updateMode=None, alias=None, resizable=True, panelClass=None):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QGraphicsView, parent)
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
@@ -81,15 +87,15 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
         self.path = ''
         self.w_scene = None
         self.h_scene = None
-        self._fileName ="Root"
-        self._mousePos = (0,0)
+        self._fileName = "Root"
+        self._mousePos = (0, 0)
         self._selectionStyle = SynopticSelectionStyle.OUTLINE
         self.setResizable(resizable)
         self.setInteractive(True)
         self.setAlias(alias)
         self.setDragEnabled(True)
         self.setPanelClass(panelClass)
-        
+
         # By default the items will update the view when necessary.
         # This default value is much more efficient then the QQraphicsView default
         # value, so if you decide to change then expect a lot of processor to be
@@ -110,124 +116,138 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
         return True
 
     def update(self):
-        #self.emit_signal()
+        # self.emit_signal()
         self.emitColors()
 
     def openJDraw(self):
-        ifile = unicode(Qt.QFileDialog.getOpenFileName( self, 'Load JDraw File', '', 'JDraw File (*.jdw)'))
-        if not ifile: return
+        ifile = unicode(Qt.QFileDialog.getOpenFileName(
+            self, 'Load JDraw File', '', 'JDraw File (*.jdw)'))
+        if not ifile:
+            return
         fileName = ifile.split("/")
         self._fileName = fileName[-1]
         self.setModel(ifile)
         return fileName[-1]
-        
-    def setAlias(self,alias):
+
+    def setAlias(self, alias):
         """ Assigning a dictionary like {'Tag':'Value'} with tags to be replaced in object names while parsing. """
-        if (isinstance(alias,dict) or hasattr(alias,'items')) and alias:
+        if (isinstance(alias, dict) or hasattr(alias, 'items')) and alias:
             self.alias = alias
         else:
             self.alias = None
         return
 
     def get_item_list(self):
-        return [item._name for item in self.scene().items() if hasattr(item,'_name') and item._name]
-    
+        return [item._name for item in self.scene().items() if hasattr(item, '_name') and item._name]
+
     def get_device_list(self):
-        items = [(item,parseTangoUri(item)) for item in self.get_item_list()]
-        return list(set(v['devicename'] for k,v in items if v)) 
-    
-    def get_item_colors(self,emit = False):
+        items = [(item, parseTangoUri(item)) for item in self.get_item_list()]
+        return list(set(v['_devslashname'] for k, v in items if v))
+
+    def get_item_colors(self, emit=False):
         item_colors = {}
         try:
             for item in self.scene().items():
-                if not getattr(item,'_name','') or not getattr(item,'_currBgBrush',None):
+                if not getattr(item, '_name', '') or not getattr(item, '_currBgBrush', None):
                     continue
                 item_colors[item._name] = item._currBgBrush.color().name()
-            if emit: self.emit(Qt.SIGNAL("itemsChanged"),self.modelName.split('/')[-1].split('.')[0],item_colors)
+            if emit:
+                self.itemsChanged.emit(self.modelName.split(
+                    '/')[-1].split('.')[0], item_colors)
         except:
-            self.warning('Unable to emitColors: %s'%traceback.format_exc())
+            self.warning('Unable to emitColors: %s' % traceback.format_exc())
         return item_colors
-        
-    #@Qt.pyqtSignature("selectGraphicItem(QString)")
-    @Qt.pyqtSignature("selectGraphicItem(const QString &)")
-    def selectGraphicItem(self,item_name):
+
+    @Qt.pyqtSlot('QString')
+    def selectGraphicItem(self, item_name):
         self.scene().selectGraphicItem(item_name)
         return False
 
-    def _graphicItemSelected(self,item_name):
-        self.debug(' => graphicItemSelected(QString)(%s)'%item_name)
-        self.emit(Qt.SIGNAL("graphicItemSelected(QString)"),item_name)
+    def _graphicItemSelected(self, item_name):
+        self.debug(' => graphicItemSelected(QString)(%s)' % item_name)
+        self.graphicItemSelected.emit(item_name)
 
-    def _graphicSceneClicked(self,point):
-        self.debug('In TaurusJDrawSynopticsView.graphicSceneClicked(%s,%s)'%(point.x(),point.y()))
-        self.emit(Qt.SIGNAL("graphicSceneClicked(QPoint)"),point)        
+    def _graphicSceneClicked(self, point):
+        self.debug('In TaurusJDrawSynopticsView.graphicSceneClicked(%s,%s)' % (
+            point.x(), point.y()))
+        self.graphicSceneClicked.emit(point)
 
-    def modelsChanged(self):
+    def __modelsChanged(self):
         items = self.get_item_list()
-        self.debug('modelsChanged(%s)'%len(items))
-        self.emit(Qt.SIGNAL("modelsChanged"),items)
-    
-    def emitColors(self): 
+        self.debug('modelsChanged(%s)' % len(items))
+        self.modelsChanged.emit(items)
+
+    def emitColors(self):
         '''emit signal which is used to refresh the tree and colors of icons depend of the current status in jdrawSynoptic'''
         self.get_item_colors(True)
 
     def get_sizes(self):
         srect = self.scene().sceneRect()
-        sizes = [x for s in (self.size(),self.sizeHint(),srect.size()) for x in (s.width(),s.height())]
+        sizes = [x for s in (self.size(), self.sizeHint(), srect.size())
+                 for x in (s.width(), s.height())]
         try:
             s = self.parent().size()
-            sizes.extend([s.width(),s.height()])
-        except: sizes.extend([0,0])
+            sizes.extend([s.width(), s.height()])
+        except:
+            sizes.extend([0, 0])
         return tuple(sizes)
-    
-    def fitting(self,ADJUST_FRAME = False):
+
+    def fitting(self, ADJUST_FRAME=False):
         """
         Parent size is the size of the bigger panel (desn't keep ratio)
         Rect size never changes (fixed by the graphics objects)
         Size and SizeHint move one around the other
-        
-        the method works well until an object is clicked, 
+
+        the method works well until an object is clicked,
         then the whole reference changes and doesn't work again.
         """
-        
+
         srect = self.scene().sceneRect()
-        w,h = (srect.width(),srect.height())
-        offset = self.mapToGlobal(Qt.QPoint(srect.x(),srect.y()))
-        x0,y0 = (offset.x(),offset.y())
+        w, h = (srect.width(), srect.height())
+        offset = self.mapToGlobal(Qt.QPoint(srect.x(), srect.y()))
+        x0, y0 = (offset.x(), offset.y())
 
         self.debug('\n\nIn TauJDrawSynopticsView.fitting()')
         self.debug(self.get_sizes())
-        self.debug('\tAdjusting SizeHint: size(%s,%s),hint(%s,%s),srect(%s,%s),parent(%s,%s)'%self.get_sizes())
-        self.debug('\toffset = %s,%s ; size = %s,%s'%(x0,y0,w,h))
-        self.fitInView(x0,y0,w,h,Qt.Qt.KeepAspectRatio)
-        
-        if ADJUST_FRAME: #This additional resizing adjust the "white" frame around the synoptic
-            self.debug('\tResizing: size(%s,%s),hint(%s,%s),srect(%s,%s),parent(%s,%s)'%self.get_sizes())
-            self.resize(self.sizeHint()+Qt.QSize(5,5)) 
-            
-        #THIS LINE MUST BE ALWAYS EXECUTED, It prevents the UP/DOWN resize BUG!!!
-        #apparently Qt needs this 2 fitInView calls to be aware of it, maybe first offset was not good
-        self.debug('\tFitting:: size(%s,%s),hint(%s,%s),srect(%s,%s),parent(%s,%s)'%self.get_sizes())
-        self.fitInView(x0,y0,w,h,Qt.Qt.KeepAspectRatio)
-        
-        self.debug('Done: size(%s,%s),hint(%s,%s),srect(%s,%s),parent(%s,%s)\n\n'%self.get_sizes())
-        
+        self.debug(
+            '\tAdjusting SizeHint: size(%s,%s),hint(%s,%s),srect(%s,%s),parent(%s,%s)' % self.get_sizes())
+        self.debug('\toffset = %s,%s ; size = %s,%s' % (x0, y0, w, h))
+        self.fitInView(x0, y0, w, h, Qt.Qt.KeepAspectRatio)
+
+        if ADJUST_FRAME:  # This additional resizing adjust the "white" frame around the synoptic
+            self.debug(
+                '\tResizing: size(%s,%s),hint(%s,%s),srect(%s,%s),parent(%s,%s)' % self.get_sizes())
+            self.resize(self.sizeHint() + Qt.QSize(5, 5))
+
+        # THIS LINE MUST BE ALWAYS EXECUTED, It prevents the UP/DOWN resize BUG!!!
+        # apparently Qt needs this 2 fitInView calls to be aware of it, maybe
+        # first offset was not good
+        self.debug(
+            '\tFitting:: size(%s,%s),hint(%s,%s),srect(%s,%s),parent(%s,%s)' % self.get_sizes())
+        self.fitInView(x0, y0, w, h, Qt.Qt.KeepAspectRatio)
+
+        self.debug(
+            'Done: size(%s,%s),hint(%s,%s),srect(%s,%s),parent(%s,%s)\n\n' % self.get_sizes())
+
     def resizeEvent(self, event):
         """ It has been needed to reimplent size policies """
-        if not self.resizable() or not self.scene() or isinstance(self.parent(),Qt.QScrollArea) or not self.isVisible():
-            self.debug('In TaurusJDrawSynopticsView('+self._fileName+').resizeEvent(): Disabled')
+        if not self.resizable() or not self.scene() or isinstance(self.parent(), Qt.QScrollArea) or not self.isVisible():
+            self.debug('In TaurusJDrawSynopticsView(' +
+                       self._fileName + ').resizeEvent(): Disabled')
             return
         try:
-            self.debug('In TaurusJDrawSynopticsView('+self._fileName+').resizeEvent()')
+            self.debug('In TaurusJDrawSynopticsView(' +
+                       self._fileName + ').resizeEvent()')
             if self.size() == self.sizeHint():
-                self.debug('\tSize already fits: %s'%self.size())
+                self.debug('\tSize already fits: %s' % self.size())
                 return
             self.setVerticalScrollBarPolicy(Qt.Qt.ScrollBarAlwaysOff)
             self.setHorizontalScrollBarPolicy(Qt.Qt.ScrollBarAlwaysOff)
             self.fitting()
             self.emitColors()
         except Exception:
-            self.warning('Exception in JDrawView('+self._fileName+').resizeEvent: %s' % traceback.format_exc())
+            self.warning('Exception in JDrawView(' + self._fileName +
+                         ').resizeEvent: %s' % traceback.format_exc())
             pass
 
     def refreshModel(self):
@@ -235,147 +255,168 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
 
     def updateStyle(self):
         self.repaint()
-        
+
     def repaint(self):
         Qt.QGraphicsView.repaint(self)
-        #self.fitting()        
-        
-    def getGraphicsFactory(self,delayed=False):
+        # self.fitting()
+
+    def getGraphicsFactory(self, delayed=False):
         import jdraw
-        return jdraw.TaurusJDrawGraphicsFactory(self,alias=(self.alias or None),delayed=delayed) #self.parent())
+        # self.parent())
+        return jdraw.TaurusJDrawGraphicsFactory(self, alias=(self.alias or None), delayed=delayed)
 
     ###########################################################################
-    
+
     def getFramed(self):
-        try: parent = self.parent()
-        except: parent = None
+        try:
+            parent = self.parent()
+        except:
+            parent = None
         frame = Qt.QFrame(parent)
-        self.setFrameStyle(self.StyledPanel|self.Raised)
-        self.setLineWidth(2)        
+        self.setFrameStyle(self.StyledPanel | self.Raised)
+        self.setLineWidth(2)
         self.setParent(frame)
-        return frame      
-        
-    def setResizable(self,resizable):
+        return frame
+
+    def setResizable(self, resizable):
         self._resizable = resizable
-        
+
     def resizable(self):
         return self._resizable
-        
-    def mousePressEvent(self,event):
+
+    def mousePressEvent(self, event):
         """ Records last event position to use it for DragEvents """
-        try: 
-            self.mousePos = event.scenePos().x(),event.scenePos().y()
+        try:
+            self.mousePos = event.scenePos().x(), event.scenePos().y()
         except:
             self.mousePos = event.x(), event.y()
-            self.debug('MouseEvent received is not a GraphicsScene event, using raw position %s'%str(self.mousePos))
-        TaurusBaseWidget.mousePressEvent(self,event)
-        
+            self.debug('MouseEvent received is not a GraphicsScene event, using raw position %s' % str(
+                self.mousePos))
+        TaurusBaseWidget.mousePressEvent(self, event)
+
     def getModelMimeData(self):
         """ Used for drag events """
-        model,mimeData = '',None
+        model, mimeData = '', None
         try:
             #model = getattr(self.scene().itemAt(*self.mousePos),'_name','')
             selected = self.scene()._selectedItems
-            if not selected: 
-                self.debug('jdrawView.getModelMimeData(%s): nothing to drag'%model)
+            if not selected:
+                self.debug(
+                    'jdrawView.getModelMimeData(%s): nothing to drag' % model)
                 return
-            model = getattr(([s for s in selected if s.isUnderMouse() and getattr(s,'_name','')] or [selected])[0],'_name','')
-            self.debug('getModelMimeData(%s)'%model)
+            model = getattr(([s for s in selected if s.isUnderMouse() and getattr(
+                s, '_name', '')] or [selected])[0], '_name', '')
+            self.debug('getModelMimeData(%s)' % model)
             mimeData = Qt.QMimeData()
             if model:
-                if DeviceNameValidator().getParams(model): 
-                    self.debug('getMimeData(): DeviceModel at %s: %s',self.mousePos,model)
-                    mimeData.setData(TAURUS_DEV_MIME_TYPE,model)
-                elif AttributeNameValidator().getParams(model):
-                    self.debug('getMimeData(): AttributeModel at %s: %s',self.mousePos,model)
-                    mimeData.setData(TAURUS_ATTR_MIME_TYPE,model)
+                taurusType = taurushelper.getValidTypesForName(model, False)
+                if TaurusElementType.Device in taurusType:
+                    self.debug('getMimeData(): DeviceModel at %s: %s',
+                               self.mousePos, model)
+                    mimeData.setData(TAURUS_DEV_MIME_TYPE, model)
+                if TaurusElementType.Attribute in taurusType:
+                    self.debug('getMimeData(): AttributeModel at %s: %s',
+                               self.mousePos, model)
+                    mimeData.setData(TAURUS_ATTR_MIME_TYPE, model)
                 else:
-                    self.debug('getMimeData(): UnknownModel at %s: %s',self.mousePos,model)
+                    self.debug('getMimeData(): UnknownModel at %s: %s',
+                               self.mousePos, model)
                     mimeData.setData(TAURUS_MODEL_MIME_TYPE, model)
         except:
-            self.debug('jdrawView.getModelMimeData(%s): unable to get MimeData'%model)
+            self.debug(
+                'jdrawView.getModelMimeData(%s): unable to get MimeData' % model)
             self.debug(traceback.format_exc())
         return mimeData
-        
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     @classmethod
-    def setDefaultPanelClass(klass,other):
+    def setDefaultPanelClass(klass, other):
         """
         This method returns the Class used to open new object panels on double-click (TaurusDevicePanel by default)
         """
         klass._defaultClass = other
-        
+
     @classmethod
     def defaultPanelClass(klass):
         """
         This method assigns the Class used to open new object panels on double-click (TaurusDevicePanel by default)
         If an string is used it can be either a Taurus class or an OS launcher
         """
-        if not hasattr(klass,'_defaultClass'): 
+        if not hasattr(klass, '_defaultClass'):
             from taurus.qt.qtgui.panel import TaurusDevicePanel
-            klass._defaultClass = TaurusDevicePanel #'taurusdevicepanel' #You can use an executable or a class
+            # 'taurusdevicepanel' #You can use an executable or a class
+            klass._defaultClass = TaurusDevicePanel
         obj = klass._defaultClass
         return obj
-        
-    def setPanelClass(self,widget):
+
+    def setPanelClass(self, widget):
         self._panelClass = widget
-        
+
     def panelClass(self):
-        if self._panelClass is None: return self.defaultPanelClass()
-        else: return self._panelClass
+        if self._panelClass is None:
+            return self.defaultPanelClass()
+        else:
+            return self._panelClass
 
-    @Qt.pyqtSignature("setModel(QString)")
-    def setModel(self, model, alias = None, delayed = False, trace = False):
+    @Qt.pyqtSlot('QString')
+    def setModel(self, model, alias=None, delayed=False, trace=False):
         self.modelName = str(model)
         self._currF = str(model)
-        if alias is not None: self.setAlias(alias)
+        if alias is not None:
+            self.setAlias(alias)
         ll = taurus.getLogLevel()
-        if trace: taurus.setLogLevel(taurus.Debug)
-        #self.debug('setModel("%s")'%model)
+        if trace:
+            taurus.setLogLevel(taurus.Debug)
+        # self.debug('setModel("%s")'%model)
         if self._currF:
             #filename = str(self._currFile.absoluteFilePath())
             filename = self._currF
             filename = os.path.realpath(filename)
-            if os.path.isfile(filename):            
+            if os.path.isfile(filename):
                 self.debug("Starting to parse %s" % filename)
                 self.path = os.path.dirname(filename)
                 factory = self.getGraphicsFactory(delayed=delayed)
                 scene = jdraw_parser.parse(filename, factory)
                 scene.setSelectionStyle(self._selectionStyle)
-                self.debug("Obtained %s(%s)", type(scene).__name__,filename)
+                self.debug("Obtained %s(%s)", type(scene).__name__, filename)
                 if not scene:
-                    self.warning("TaurusJDrawSynopticsView.setModel(%s): Unable to parse %s!!!"%(model,filename))
+                    self.warning("TaurusJDrawSynopticsView.setModel(%s): Unable to parse %s!!!" % (
+                        model, filename))
                 elif self.w_scene is None and scene.sceneRect():
                     self.w_scene = scene.sceneRect().width()
                     self.h_scene = scene.sceneRect().height()
-                else: self.debug('JDrawView.sceneRect() is NONE!!!')
+                else:
+                    self.debug('JDrawView.sceneRect() is NONE!!!')
                 self.setScene(scene)
-                Qt.QObject.connect(self.scene(), Qt.SIGNAL("graphicItemSelected(QString)"), self._graphicItemSelected)
-                Qt.QObject.connect(self.scene(), Qt.SIGNAL("graphicSceneClicked(QPoint)"), self._graphicSceneClicked)
-                #Qt.QObject.connect(Qt.QApplication.instance(), Qt.SIGNAL("lastWindowClosed()"), self.close) #It caused a segfault!
-                self.modelsChanged()
+                self.scene().graphicItemSelected.connect(self._graphicItemSelected)
+                self.scene().graphicSceneClicked.connect(self._graphicSceneClicked)
+                # Qt.QApplication.instance().lastWindowClosed.connect(self.close) #It caused a
+                # segfault!
+                self.__modelsChanged()
                 self.setWindowTitle(self.modelName)
-                #The emitted signal contains the filename and a dictionary with the name of items and its color
-                self.emitColors()#get_item_colors(emit=True)
+                # The emitted signal contains the filename and a dictionary
+                # with the name of items and its color
+                self.emitColors()  # get_item_colors(emit=True)
                 self.fitting(True)
             else:
                 self.setScene(None)
         #self.debug('out of setModel()')
         taurus.setLogLevel(ll)
-            
-    def closeEvent(self,event=None):
-        if self.scene(): self.scene().closeAllPanels()
-        Qt.QGraphicsView.closeEvent(self,event)
+
+    def closeEvent(self, event=None):
+        if self.scene():
+            self.scene().closeAllPanels()
+        Qt.QGraphicsView.closeEvent(self, event)
 
     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, TaurusGraphicsItem):
-                self.debug('TaurusJDrawGraphicsFactory.setModels(): calling item.setModel(%s)'%(item._name))
+                self.debug(
+                    'TaurusJDrawGraphicsFactory.setModels(): calling item.setModel(%s)' % (item._name))
                 item.setModel(item._name)
 
     def getModel(self):
@@ -386,9 +427,9 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['group'] = 'Taurus Display'
         ret['module'] = 'taurus.qt.qtgui.graphic'
-        ret['icon'] = ":/designer/graphicsview.png"
+        ret['icon'] = "designer:graphicsview.png"
         return ret
-    
+
     model = Qt.pyqtProperty("QString", getModel, setModel)
 
     def setSelectionStyle(self, selectionStyle):
@@ -399,13 +440,13 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
             except:
                 self.debug('invalid selectionStyle "%s"', selectionStyle)
                 return
-        if self.scene() != None:
+        if self.scene() is not None:
             self.scene().setSelectionStyle(selectionStyle)
         self._selectionStyle = selectionStyle
 
     def getSelectionStyle(self):
         return self._selectionStyle
-    
+
     def getSelectionStyleName(self):
         return SynopticSelectionStyle.whatis(self.getSelectionStyle())
 
@@ -413,32 +454,35 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget):
         self.setSelectionStyle(SynopticSelectionStyle.OUTLINE)
 
     selectionStyle = Qt.pyqtProperty("QString", getSelectionStyleName,
-                                         setSelectionStyle,
-                                         resetSelectionStyle)
+                                     setSelectionStyle,
+                                     resetSelectionStyle)
 
 #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
 def jdraw_view_main():
-    import sys,time
+    import sys
+    import time
     import taurus.qt.qtgui.graphic
     taurus.setLogLevel(taurus.Info)
     app = Qt.QApplication(sys.argv)
-    
+
     #form = Qt.QDialog()
-    #ly=Qt.QVBoxLayout(form)
-    #container=Qt.QWidget()
-    #ly.addWidget(container)   
-    #for m in sys.argv[1:]:
-        #tv=TaurusJDrawSynopticsView(container, designMode=False)
-        #tv.setModel(m)
+    # ly=Qt.QVBoxLayout(form)
+    # container=Qt.QWidget()
+    # ly.addWidget(container)
+    # for m in sys.argv[1:]:
+    #tv=TaurusJDrawSynopticsView(container, designMode=False)
+    # tv.setModel(m)
     form = taurus.qt.qtgui.graphic.TaurusJDrawSynopticsView(designMode=False)
     form.show()
-    #print '%s setModel(%s)'%(time.ctime(),sys.argv[1])
+    # print '%s setModel(%s)'%(time.ctime(),sys.argv[1])
     form.setModel(sys.argv[1])
-    form.setWindowTitle(sys.argv[1].rsplit('.',1)[0])
+    form.setWindowTitle(sys.argv[1].rsplit('.', 1)[0])
     #def kk(*args):print("\tgraphicItemSelected(%s)"%str(args))
     #form.connect(form,Qt.SIGNAL("graphicItemSelected(QString)"), kk)
     form.fitting()
     sys.exit(app.exec_())
 
 if __name__ == "__main__":
-    jdraw_view_main()
\ No newline at end of file
+    jdraw_view_main()
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/test/__init__.py b/lib/taurus/qt/qtgui/graphic/jdraw/test/__init__.py
index b5472aa..b5a5672 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/test/__init__.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/test/__init__.py
@@ -2,23 +2,23 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/test/res/__init__.py b/lib/taurus/qt/qtgui/graphic/jdraw/test/res/__init__.py
index fdef775..1ebf16f 100644
--- a/lib/taurus/qt/qtgui/graphic/jdraw/test/res/__init__.py
+++ b/lib/taurus/qt/qtgui/graphic/jdraw/test/res/__init__.py
@@ -2,33 +2,33 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 resources module contains:
 
-  - SimpleScalarViewer.jdw : a jdraw synoptic for testing visualization of 
-    scalars. 
-   
+  - SimpleScalarViewer.jdw : a jdraw synoptic for testing visualization of
+    scalars.
+
   - styles.jdw : a jdraw synoptic for testing rendering of different styles
-  
-'''
\ No newline at end of file
+
+'''
diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py
old mode 100644
new mode 100755
index e69c8ef..713116a
--- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py
+++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py
@@ -1,33 +1,55 @@
 #!/usr/bin/env python
-import PyTango
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 """
-taurusgraphic.py: 
+taurusgraphic.py:
 """
 
-#__all__ = []
+__all__ = ['SynopticSelectionStyle',
+           'parseTangoUri',
+           'QEmitter',
+           'TaurusGraphicsUpdateThread',
+           'TaurusGraphicsScene',
+           'QGraphicsTextBoxing',
+           'QSpline',
+           'TaurusGraphicsItem',
+           'TaurusGraphicsAttributeItem',
+           'TaurusGraphicsStateItem',
+           'TaurusEllipseStateItem',
+           'TaurusRectStateItem',
+           'TaurusSplineStateItem',
+           'TaurusRoundRectItem',
+           'TaurusRoundRectStateItem',
+           'TaurusGroupItem',
+           'TaurusGroupStateItem',
+           'TaurusPolygonStateItem',
+           'TaurusLineStateItem',
+           'TaurusTextStateItem',
+           'TaurusTextAttributeItem',
+           'TYPE_TO_GRAPHICS',
+           'TaurusBaseGraphicsFactory',
+           ]
 
 __docformat__ = 'restructuredtext'
 
@@ -41,36 +63,48 @@ import types
 import Queue
 
 from taurus import Manager
+from taurus.core import AttrQuality, DataType
 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.core.util.enumeration import Enumeration
+# TODO: tango-centric!
+from taurus.core.tango import DevState
+from taurus.core.tango.tangovalidator import (TangoDeviceNameValidator,
+                                              TangoAttributeNameValidator)
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseComponent
 from taurus.qt.qtgui.util import (QT_ATTRIBUTE_QUALITY_PALETTE, QT_DEVICE_STATE_PALETTE,
                                   ExternalAppAction, TaurusWidgetFactory)
 
+
 SynopticSelectionStyle = Enumeration("SynopticSelectionStyle", [
     # A blue ellipse is displayed around the selected objects
     "ELLIPSE",
     # The own outline of selected object is displayed in blue and bolder
     "OUTLINE",
-    ])
+])
+
 
 def parseTangoUri(name):
     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)
-    except: 
+    validator = {tango.TangoDevice: TangoDeviceNameValidator,
+                 tango.TangoAttribute: TangoAttributeNameValidator}
+    try:
+        val = validator[tango.TangoFactory().findObjectClass(name)]()
+        params = val.getUriGroups(name)
+        return (params if '_devslashname' in params else None)
+    except:
         return None
 
+
+class QEmitter(Qt.QObject):
+    updateView = Qt.pyqtSignal('QGraphicsView')
+
+
 class TaurusGraphicsUpdateThread(Qt.QThread):
-    
+
     def __init__(self, parent=None, period=3):
         """Parent most not be None and must be a TaurusGraphicsScene!"""
         if not isinstance(parent, TaurusGraphicsScene):
@@ -79,26 +113,27 @@ class TaurusGraphicsUpdateThread(Qt.QThread):
         self.period = period
         self.log = Logger('TaurusGraphicsUpdateThread')
 
-    def _updateView(self,v):
+    def _updateView(self, v):
         # The first one is the prefered one because it improves performance
         # since updates don't come very often in comparison to with the refresh
         # rate of the monitor (~70Hz)
         if v.viewportUpdateMode() == Qt.QGraphicsView.NoViewportUpdate:
-            # We call the update to the viewport instead of the view 
-            #itself because apparently there is a bug in QT 4.3 that
-            #prevents a proper update when the view is inside a QTab 
+            # We call the update to the viewport instead of the view
+            # itself because apparently there is a bug in QT 4.3 that
+            # prevents a proper update when the view is inside a QTab
             v.viewport().update()
         else:
-            v.updateScene(item_rects) #@todo This is probably a bug (item_rects is not defined). But it is defined in .run(), see "todo" below...
-            #v.invalidateScene(item.boundingRect())
+            # @todo This is probably a bug (item_rects is not defined). But it is defined in .run(), see "todo" below...
+            v.updateScene(item_rects)
+            # v.invalidateScene(item.boundingRect())
         return
 
     def run(self):
         self.log.debug("run... - TaurusGraphicsUpdateThread")
-        emitter = Qt.QObject()
+        emitter = QEmitter()
         emitter.moveToThread(Qt.QApplication.instance().thread())
         emitter.setParent(Qt.QApplication.instance())
-        Qt.QObject.connect(emitter, Qt.SIGNAL("updateView"), self._updateView)
+        emitter.updateView.connect(self._updateView)
 
         p = self.parent()
         while True:
@@ -110,47 +145,54 @@ class TaurusGraphicsUpdateThread(Qt.QThread):
                     continue
             if not operator.isSequenceType(item):
                 item = (item,)
-            item_rects = [ i.boundingRect() for i in item ]  # @todo: Unless the call to boundingRect() has a side effect, this line is useless..  probably related to todo in _updateView()
-            
+            # @todo: Unless the call to boundingRect() has a side effect, this line is useless..  probably related to todo in _updateView()
+            item_rects = [i.boundingRect() for i in item]
+
             for v in p.views():
-                #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
-        #End of Thread
+                # p.debug("emit('updateView')")
+                # emitter.updateView.emit(v)
+                self.emitter.updateView.emit(v)
+            # This sleep is needed to reduce CPU usage of the application!
+            self.sleep(self.period)
+            # End of while
+        # End of Thread
 
 
 class TaurusGraphicsScene(Qt.QGraphicsScene):
     '''
     This class encapsulates TaurusJDrawSynopticsView and TaurusGraphicsScene signals/slots
-    
+
     External events::
-    
+
      Slot selectGraphicItem(const QString &) displays a selection
      mark around the TaurusGraphicsItem that matches the argument passed.
-    
+
     Mouse Left-button events::
-    
+
      Signal graphicItemSelected(QString) is triggered, passing the
      selected TaurusGraphicsItem.name() as argument.
-    
+
     Mouse Right-button events::
-    
+
      TaurusGraphicsItem.setContextMenu([(ActionName,ActionMethod(device_name))]
      allows to configure custom context menus for graphic items using a list
      of tuples. Empty tuples will insert separators in the menu.
     '''
-    __pyqtSignals__ = ("refreshTree2","graphicItemSelected(QString)","graphicSceneClicked(QPoint)")
     ANY_ATTRIBUTE_SELECTS_DEVICE = True
     TRACE_ALL = False
 
-    def __init__(self, parent = None, strt = True):
+    refreshTree2 = Qt.pyqtSignal()
+    graphicItemSelected = Qt.pyqtSignal('QString')
+    graphicSceneClicked = Qt.pyqtSignal('QPoint')
+
+    def __init__(self, parent=None, strt=True):
         name = self.__class__.__name__
-        #self.call__init__(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 = CaselessDefaultDict(lambda k:set())
+        self._itemnames = CaselessDefaultDict(lambda k: set())
         self._selection = []
         self._selectedItems = []
         self._selectionStyle = SynopticSelectionStyle.OUTLINE
@@ -158,25 +200,28 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         self.pids = []
         self.panels = []
         self.panel_launcher = None
-        
+
         try:
             self.logger = Logger(name)
-            #self.logger.setLogLevel(self.logger.Info)
+            # self.logger.setLogLevel(self.logger.Info)
             if not self.TRACE_ALL:
                 self.debug = lambda l: self.logger.debug(l)
                 self.info = lambda l: self.logger.info(l)
                 self.warning = lambda l: self.logger.warning(l)
-            else: self.debug = self.info = self.warning = self.error = lambda l: self.logger.warning(l)
+            else:
+                self.debug = self.info = self.warning = self.error = lambda l: self.logger.warning(
+                    l)
         except:
-            print 'Unable to initialize TaurusGraphicsSceneLogger: %s'%traceback.format_exc()
-            
+            print 'Unable to initialize TaurusGraphicsSceneLogger: %s' % traceback.format_exc()
+
         try:
             if parent and parent.panelClass() is not None:
                 defaultClass = parent.panelClass()
-                if defaultClass and isinstance(defaultClass,str):
+                if defaultClass and isinstance(defaultClass, str):
                     self.panel_launcher = self.getClass(defaultClass)
                     if self.panel_launcher is None:
-                        self.panel_launcher = ExternalAppAction(defaultClass.split())
+                        self.panel_launcher = ExternalAppAction(
+                            defaultClass.split())
                 else:
                     self.panel_launcher = defaultClass
             else:
@@ -185,298 +230,349 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         except:
             self.warning(traceback.format_exc())
             self.panel_launcher = None
-        
+
         self.setSelectionMark()
-        if strt:self.start()
-        
+        if strt:
+            self.start()
+
     def __del__(self):
         self.closeAllPanels()
         Qt.QGraphicsScene.__del__(self)
-        
-    def showNewPanel(self,args=None,standAlone=False):
+
+    def showNewPanel(self, args=None, standAlone=False):
         try:
-            if isinstance(args,TaurusGraphicsItem):
+            if isinstance(args, TaurusGraphicsItem):
                 objName = args._name
                 clName = args.getExtensions().get('className') or self.panel_launcher
-                #classParams extension overrides Model; if there's no extension then object name is used
+                # classParams extension overrides Model; if there's no
+                # extension then object name is used
                 clParam = args.getExtensions().get('classParams') or objName
                 standAlone = args.standAlone
             else:
-                clName,clParam,objName = self.panel_launcher,args,args
-            if not clName or clName == 'noPanel': 
+                clName, clParam, objName = self.panel_launcher, args, args
+            if not clName or clName == 'noPanel':
                 return
-            self.debug('TaurusGraphicsScene.showNewPanel(%s,%s,%s)'%(clName,clParam,objName))
-            if isinstance(clName,ExternalAppAction):
-                clName.actionTriggered(clParam if isinstance(clParam,(list,tuple)) else [clParam])
+            self.debug('TaurusGraphicsScene.showNewPanel(%s,%s,%s)' %
+                       (clName, clParam, objName))
+            if isinstance(clName, ExternalAppAction):
+                clName.actionTriggered(clParam if isinstance(
+                    clParam, (list, tuple)) else [clParam])
             else:
-                if isinstance(clName,str):
+                if isinstance(clName, str):
                     klass = self.getClass(clName)
-                    if klass is None: 
-                        self.warning("%s Class not found!"%clName)
+                    if klass is None:
+                        self.warning("%s Class not found!" % clName)
                         klass = self.getClass("TaurusDevicePanel")
                 else:
-                    klass,clName = clName,getattr(clName,'__name__',str(clName))
-                widget = klass() #self.parent())
-                #if isinstance(widget,taurus.qt.qtgui.panel.TaurusDevicePanel):
-                #    widget.setSpectraAtkMode(True) #Method renamed or deprecated
-                try:widget.setClasses(clParam)
-                except:pass
-                try:widget.setModel(clParam)
-                except:pass
-                try: widget.setTable(clParam)
-                except:pass
-                
-                #if isinstance(widget,Qt.QWidget):
-                    #if not standAlone:
+                    klass, clName = clName, getattr(
+                        clName, '__name__', str(clName))
+                widget = klass()  # self.parent())
+                # if isinstance(widget,taurus.qt.qtgui.panel.TaurusDevicePanel):
+                # widget.setSpectraAtkMode(True) #Method renamed or deprecated
+                try:
+                    widget.setClasses(clParam)
+                except:
+                    pass
+                try:
+                    widget.setModel(clParam)
+                except:
+                    pass
+                try:
+                    widget.setTable(clParam)
+                except:
+                    pass
+
+                # if isinstance(widget,Qt.QWidget):
+                    # if not standAlone:
                         #obj = newDialog(self.parent())
-                    #else:
+                    # else:
                         #obj = newDialog()
-                    #obj.initComponents(widget,objName,clName)
-                    #obj.setModal(False)
-                    #obj.setVisible(True)
-                    
-                widget.setWindowTitle('%s - %s'%(clName,objName))
+                    # obj.initComponents(widget,objName,clName)
+                    # obj.setModal(False)
+                    # obj.setVisible(True)
+
+                widget.setWindowTitle('%s - %s' % (clName, objName))
                 self.panels.append(widget)
-                widget.show() #exec_()
+                widget.show()  # exec_()
                 return widget
         except:
             self.warning(traceback.format_exc())
-        
+
     def closeAllPanels(self):
         """ This method replaces killProcess, using taurus.qt.qtgui.util.ExternalAppAction instead! """
         try:
-            self.debug('In closeAllPanels(%s,%s)'%(self.panel_launcher,self.panels))
-            if isinstance(self.panel_launcher,ExternalAppAction):
+            self.debug('In closeAllPanels(%s,%s)' %
+                       (self.panel_launcher, self.panels))
+            if isinstance(self.panel_launcher, ExternalAppAction):
                 self.panel_launcher.kill()
             for p in self.panels:
                 try:
-                    if hasattr(p,'setModel'): p.setModel(None)
+                    if hasattr(p, 'setModel'):
+                        p.setModel(None)
                     p.close()
-                except: pass
-            while self.panels: self.panels.pop(0)
+                except:
+                    pass
+            while self.panels:
+                self.panels.pop(0)
         except:
             self.warning(traceback.format_exc())
 
-    def addItem(self,item):
-        #self.debug('addItem(%s)'%item)
+    def addItem(self, item):
+        # self.debug('addItem(%s)'%item)
         def expand(i):
-            name = str(getattr(i,'_name','')).lower()
-            if name: 
+            name = str(getattr(i, '_name', '')).lower()
+            if name:
                 self._itemnames[name].add(i)
                 #self.debug('addItem(%s): %s'%(name,i))
-            if isinstance(i,Qt.QGraphicsItemGroup):
+            if isinstance(i, Qt.QGraphicsItemGroup):
                 for j in i.childItems():
                     expand(j)
         expand(item)
-        Qt.QGraphicsScene.addItem(self,item)
-            
-    def addWidget(self,item,flags=None):
-        self.debug('addWidget(%s)'%item)
-        name = str(getattr(item,'_name','')).lower()
-        if name: self._itemnames[name].add(item)
-        if flags is None: Qt.QGraphicsScene.addWidget(self,item)
-        else: Qt.QGraphicsScene.addWidget(self,item,flags)
-        
-    def getItemByName(self,item_name,strict=None):
+        Qt.QGraphicsScene.addItem(self, item)
+
+    def addWidget(self, item, flags=None):
+        self.debug('addWidget(%s)' % item)
+        name = str(getattr(item, '_name', '')).lower()
+        if name:
+            self._itemnames[name].add(item)
+        if flags is None:
+            Qt.QGraphicsScene.addWidget(self, item)
+        else:
+            Qt.QGraphicsScene.addWidget(self, item, flags)
+
+    def getItemByName(self, item_name, strict=None):
         """
         Returns a list with all items matching a given name.
-        
+
         :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
+        strict = (
+            not self.ANY_ATTRIBUTE_SELECTS_DEVICE) if strict is None else strict
         alnum = '(?:[a-zA-Z0-9-_\*]|(?:\.\*))(?:[a-zA-Z0-9-_\*]|(?:\.\*))*'
-        target = str(item_name).strip().split()[0].lower().replace('/state','') #If it has spaces only the first word is used
-        #Device names should match also its attributes or only state?
-        if not strict and AttributeNameValidator().getParams(target):
-            target = target.rsplit('/',1)[0]
-        if DeviceNameValidator().getParams(target): 
-            if strict: target+='(/state)?'
-            else: target+='(/'+alnum+')?'
-        if not target.endswith('$'): target+='$' 
+        target = str(item_name).strip().split()[0].lower().replace(
+            '/state', '')  # If it has spaces only the first word is used
+        # Device names should match also its attributes or only state?
+        if not strict and TangoAttributeNameValidator().getUriGroups(target):
+            target = target.rsplit('/', 1)[0]
+        if TangoDeviceNameValidator().getUriGroups(target):
+            if strict:
+                target += '(/state)?'
+            else:
+                target += '(/' + alnum + ')?'
+        if not target.endswith('$'):
+            target += '$'
         result = []
         for k in self._itemnames.keys():
-            if re.match(target.lower(),k.lower()):
+            if re.match(target.lower(), k.lower()):
                 #self.debug('getItemByName(%s): _itemnames[%s]: %s'%(target,k,self._itemnames[k]))
                 result.extend(self._itemnames[k])
         return result
-            
-    def getItemByPosition(self,x,y):
+
+    def getItemByPosition(self, x, y):
         """ This method will try first with named objects; if failed then with itemAt """
-        pos = Qt.QPointF(x,y)
+        pos = Qt.QPointF(x, y)
         itemsAtPos = []
-        for z,o in sorted((i.zValue(),i) for v in self._itemnames.values() for i in v if i.contains(pos) or i.isUnderMouse()):
-            if not hasattr(o,'getExtensions'):
-                self.debug('getItemByPosition(%d,%d): adding Qt primitive %s'%(x,y,o))
+        for z, o in sorted((i.zValue(), i) for v in self._itemnames.values() for i in v if i.contains(pos) or i.isUnderMouse()):
+            if not hasattr(o, 'getExtensions'):
+                self.debug(
+                    'getItemByPosition(%d,%d): adding Qt primitive %s' % (x, y, o))
                 itemsAtPos.append(o)
             elif not o.getExtensions().get('noSelect'):
-                self.debug('getItemByPosition(%d,%d): adding GraphicsItem %s'%(x,y,o))
+                self.debug(
+                    'getItemByPosition(%d,%d): adding GraphicsItem %s' % (x, y, o))
                 itemsAtPos.append(o)
-            else: self.debug('getItemByPosition(%d,%d): object ignored, %s'%(x,y,o))
+            else:
+                self.debug(
+                    'getItemByPosition(%d,%d): object ignored, %s' % (x, y, o))
         if itemsAtPos:
             obj = itemsAtPos[-1]
             return self.getTaurusParentItem(obj) or obj
-        else: 
-            #return self.itemAt(x,y)
-            self.debug('getItemByPosition(%d,%d): no items found!'%(x,y))
+        else:
+            # return self.itemAt(x,y)
+            self.debug('getItemByPosition(%d,%d): no items found!' % (x, y))
             return None
-            
-    def getItemClicked(self,mouseEvent):
+
+    def getItemClicked(self, mouseEvent):
         pos = mouseEvent.scenePos()
-        x,y = pos.x(),pos.y()
-        self.emit(Qt.SIGNAL("graphicSceneClicked(QPoint)"),Qt.QPoint(x,y))
-        obj = self.getItemByPosition(x,y)
+        x, y = pos.x(), pos.y()
+        self.graphicSceneClicked.emit(Qt.QPoint(x, y))
+        obj = self.getItemByPosition(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):
+    def mousePressEvent(self, mouseEvent):
         #self.debug('In TaurusGraphicsScene.mousePressEvent(%s,%s))'%(str(type(mouseEvent)),str(mouseEvent.button())))
-        try: 
+        try:
             obj = self.getItemClicked(mouseEvent)
-            obj_name = getattr(obj,'_name', '')
-            if not obj_name and isinstance(obj,QGraphicsTextBoxing): obj_name = obj.toPlainText()
+            obj_name = getattr(obj, '_name', '')
+            if not obj_name and isinstance(obj, QGraphicsTextBoxing):
+                obj_name = obj.toPlainText()
             if (mouseEvent.button() == Qt.Qt.LeftButton):
-                ## A null obj_name should deselect all, we don't send obj because we want all similar to be matched                
+                # A null obj_name should deselect all, we don't send obj
+                # because we want all similar to be matched
                 if self.selectGraphicItem(obj_name):
-                    self.debug(' => graphicItemSelected(QString)(%s)'%obj_name)
-                    self.emit(Qt.SIGNAL("graphicItemSelected(QString)"),obj_name)
+                    self.debug(
+                        ' => graphicItemSelected(QString)(%s)' % obj_name)
+                    self.graphicItemSelected.emit(obj_name)
                 else:
                     # It should send None but the signature do not allow it
-                    self.emit(Qt.SIGNAL("graphicItemSelected(QString)"), "")
-            def addMenuAction(menu,k,action,last_was_separator=False):
+                    self.graphicItemSelected.emit("")
+
+            def addMenuAction(menu, k, action, last_was_separator=False):
                 try:
                     if k:
                         configDialogAction = menu.addAction(k)
-                        if action: 
-                            self.connect(configDialogAction, Qt.SIGNAL("triggered()"), lambda dev=obj_name,act=action: act(dev))
-                        else: configDialogAction.setEnabled(False)
+                        if action:
+                            configDialogAction.triggered[()].connect(lambda dev=obj_name, act=action: act(dev))
+                        else:
+                            configDialogAction.setEnabled(False)
                         last_was_separator = False
-                    elif not last_was_separator: 
+                    elif not last_was_separator:
                         menu.addSeparator()
                         last_was_separator = True
-                except Exception,e: 
-                    self.warning('Unable to add Menu Action: %s:%s'%(k,e))                    
+                except Exception, e:
+                    self.warning('Unable to add Menu Action: %s:%s' % (k, e))
                 return last_was_separator
             if (mouseEvent.button() == Qt.Qt.RightButton):
                 ''' This function is called when right clicking on TaurusDevTree area. A pop up menu will be shown with the available options. '''
-                self.debug('RightButton Mouse Event on %s'%(obj_name))
-                if isinstance(obj,TaurusGraphicsItem) and (obj_name or obj.contextMenu() or obj.getExtensions()):
-                    menu = Qt.QMenu(None)#self.parent)    
+                self.debug('RightButton Mouse Event on %s' % (obj_name))
+                if isinstance(obj, TaurusGraphicsItem) and (obj_name or obj.contextMenu() or obj.getExtensions()):
+                    menu = Qt.QMenu(None)  # self.parent)
                     last_was_separator = False
                     extensions = obj.getExtensions()
-                    if obj_name and (not extensions or not extensions.get('className')): 
-                        #menu.addAction(obj_name)
-                        addMenuAction(menu,'Show %s panel'%obj_name,lambda x=obj_name: self.showNewPanel(x))
+                    if obj_name and (not extensions or not extensions.get('className')):
+                        # menu.addAction(obj_name)
+                        addMenuAction(menu, 'Show %s panel' % obj_name,
+                                      lambda x=obj_name: self.showNewPanel(x))
                     if obj.contextMenu():
-                        if obj_name: 
+                        if obj_name:
                             menu.addSeparator()
                             last_was_separator = True
-                        for t in obj.contextMenu(): #It must be a list of tuples (ActionName,ActionMethod)
-                            last_was_separator = addMenuAction(menu,t[0],t[1],last_was_separator)
+                        for t in obj.contextMenu():  # It must be a list of tuples (ActionName,ActionMethod)
+                            last_was_separator = addMenuAction(
+                                menu, t[0], t[1], last_was_separator)
                     if extensions:
-                        if not menu.isEmpty(): menu.addSeparator()
+                        if not menu.isEmpty():
+                            menu.addSeparator()
                         className = extensions.get('className')
-                        if className and className!='noPanel':
+                        if className and className != 'noPanel':
                             self.debug('launching className extension object')
-                            addMenuAction(menu,'Show %s'%className,lambda d,x=obj: self.showNewPanel(x))
+                            addMenuAction(menu, 'Show %s' % className,
+                                          lambda d, x=obj: self.showNewPanel(x))
                         if extensions.get('shellCommand'):
-                            addMenuAction(menu,'Execute',lambda d,x=obj: self.getShellCommand(x))
+                            addMenuAction(menu, 'Execute', lambda d,
+                                          x=obj: self.getShellCommand(x))
                     if not menu.isEmpty():
-                        menu.exec_(Qt.QPoint(mouseEvent.screenPos().x(),mouseEvent.screenPos().y()))
+                        menu.exec_(
+                            Qt.QPoint(mouseEvent.screenPos().x(), mouseEvent.screenPos().y()))
                     del menu
         except Exception:
-            self.warning( traceback.format_exc())
-            
-    def mouseDoubleClickEvent(self,event):
+            self.warning(traceback.format_exc())
+
+    def mouseDoubleClickEvent(self, event):
         try:
             obj = self.getItemClicked(event)
-            obj_name = getattr(obj,'_name', '')
+            obj_name = getattr(obj, '_name', '')
             try:
                 class_name = obj.getExtensions().get('className')
             except:
                 class_name = 'noPanel'
-            self.debug('Clicked (%s,%s,%s)'%(obj,obj_name,class_name))
+            self.debug('Clicked (%s,%s,%s)' % (obj, obj_name, class_name))
             if obj_name and class_name != 'noPanel':
                 self.showNewPanel(obj)
         except:
             self.warning(traceback.format_exc())
 
     def setSelectionStyle(self, selectionStyle):
-        # TODO We should test that selectionStyle is part of SynopticSelectionStyle but there is nothing about it
+        # TODO We should test that selectionStyle is part of
+        # SynopticSelectionStyle but there is nothing about it
         self._selectionStyle = selectionStyle
 
-    #@Qt.pyqtSignature("selectGraphicItem(const QString &)")
-    def selectGraphicItem(self,item_name):
+    def selectGraphicItem(self, item_name):
         """
         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)
-        selected = [str(getattr(item,'_name',item)) for item in self._selectedItems if item]
+        selected = [str(getattr(item, '_name', item))
+                    for item in self._selectedItems if item]
         if selected:
-            iname = str(getattr(item_name,'_name',item_name))
+            iname = str(getattr(item_name, '_name', item_name))
             #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): 
+            elif any(iname not in i for i in selected):
                 self.clearSelection()
-            else: 
-                self.debug('In TauGraphicsScene.selectGraphicItem(%s): already selected!'%item_name)
+            else:
+                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', ''): 
-                self.debug('In TauGraphicsScene.selectGraphicItem(%s): item name not found.'%item_name)
+        if any(isinstance(item_name, t) for t in (TaurusGraphicsItem, Qt.QGraphicsItem)):
+            if not getattr(item_name, '_name', ''):
+                self.debug(
+                    'In TauGraphicsScene.selectGraphicItem(%s): item name not found.' % item_name)
                 return False
             items = [item_name]
         else:
             from taurus.qt.qtgui.graphic import jdraw_parser
             if not item_name or (str(item_name).startswith('JD') and str(item_name) in jdraw_parser.reserved):
-                self.debug('In TauGraphicsScene.selectGraphicItem(%s): item name not found or name is a reserved keyword.'%item_name)
+                self.debug(
+                    'In TauGraphicsScene.selectGraphicItem(%s): item name not found or name is a reserved keyword.' % item_name)
                 return False
             items = self.getItemByName(item_name) or []
-            items = [i for i in items if self.getTaurusParentItem(i) not in (items+self._selectedItems)]
-            self.debug('In TaurusGraphicsScene.selectGraphicItem(%s)): matched %d items'%(item_name,len(items)))
+            items = [i for i in items if self.getTaurusParentItem(
+                i) not in (items + self._selectedItems)]
+            self.debug('In TaurusGraphicsScene.selectGraphicItem(%s)): matched %d items' % (
+                item_name, len(items)))
 
         if self._selectionStyle == SynopticSelectionStyle.ELLIPSE:
             displaySelection = self._displaySelectionAsEllipse
         elif self._selectionStyle == SynopticSelectionStyle.OUTLINE:
             displaySelection = self._displaySelectionAsOutline
         else:
-            raise Exception("Unexpected selectionStyle '%s'" % SynopticSelectionStyle.whatis(self._selectionStyle))
+            raise Exception("Unexpected selectionStyle '%s'" %
+                            SynopticSelectionStyle.whatis(self._selectionStyle))
         return displaySelection(items)
 
     def _displaySelectionAsEllipse(self, items):
         retval = False
         for item in items:
             try:
-                if ( (isinstance(item,TaurusGraphicsItem) and item.getExtensions().get('noSelect'))
-                    or (item in self._selection)
-                    #or (item in tangoGroup)
-                    ):
+                if ((isinstance(item, TaurusGraphicsItem) and item.getExtensions().get('noSelect'))
+                            or (item in self._selection)
+                            # or (item in tangoGroup)
+                        ):
                     continue
-                x,y = item.x(),item.y() 
+                x, y = item.x(), item.y()
                 rect = item.boundingRect()
                 srect = self.sceneRect()
-                if not (0<x<=self.sceneRect().width() and 0<y<=srect.height()): #0 has to be excluded to check grouped element
-                    rx,ry = rect.topLeft().x(),rect.topLeft().y()
-                    self.debug('\tposition not well mapped (%s,%s), using rect bound (%s,%s) instead'%(x,y,rx,ry))
-                    x,y =  rx,ry #If the object is in the corner it will be also 0
-                w,h= rect.width(),rect.height()
-                if x<0 or y<0: 
-                    self.debug('Cannot draw SelectionMark for %s(%s)(%s,%s) in a negative position (%f,%f)' % (type(item).__name__,item._name,w,h,x,y))
+                # 0 has to be excluded to check grouped element
+                if not (0 < x <= self.sceneRect().width() and 0 < y <= srect.height()):
+                    rx, ry = rect.topLeft().x(), rect.topLeft().y()
+                    self.debug('\tposition not well mapped (%s,%s), using rect bound (%s,%s) instead' % (
+                        x, y, rx, ry))
+                    x, y = rx, ry  # If the object is in the corner it will be also 0
+                w, h = rect.width(), rect.height()
+                if x < 0 or y < 0:
+                    self.debug('Cannot draw SelectionMark for %s(%s)(%s,%s) in a negative position (%f,%f)' % (
+                        type(item).__name__, item._name, w, h, x, y))
                 else:
-                    if type(item) in (TaurusTextAttributeItem,TaurusTextStateItem) and isinstance(self.getSelectionMark(),Qt.QGraphicsPixmapItem):
-                        x,y,w,h = x-20,y,20,20
-                    self.drawSelectionMark(x,y,w,h)
-                    self.debug('> Moved the SelectionMark to item %s(%s)(%s,%s) at %f,%f' % (type(item).__name__,item._name,w,h,x,y))
-                if item not in self._selectedItems: self._selectedItems.append(item)
+                    if type(item) in (TaurusTextAttributeItem, TaurusTextStateItem) and isinstance(self.getSelectionMark(), Qt.QGraphicsPixmapItem):
+                        x, y, w, h = x - 20, y, 20, 20
+                    self.drawSelectionMark(x, y, w, h)
+                    self.debug('> Moved the SelectionMark to item %s(%s)(%s,%s) at %f,%f' % (
+                        type(item).__name__, item._name, w, h, x, y))
+                if item not in self._selectedItems:
+                    self._selectedItems.append(item)
                 retval = True
-            except Exception,e:
-                self.warning('selectGraphicsItem(%s) failed! %s' % (getattr(item,'_name',item),str(e)))
+            except Exception, e:
+                self.warning('selectGraphicsItem(%s) failed! %s' %
+                             (getattr(item, '_name', item), str(e)))
                 self.warning(traceback.format_exc())
-                #return False           
+                # return False
         return retval
 
     def _displaySelectionAsOutline(self, items):
@@ -488,16 +584,16 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
                 # TODO we should skip text and things like that
                 if isinstance(s, TaurusGroupItem):
                     s = _outline(s.childItems())
-                    if s == None:
+                    if s is None:
                         continue
 
                 s = s.shape()
-                if shape != None:
+                if shape is not None:
                     shape = shape.united(s)
                 else:
                     shape = s
 
-            if shape == None:
+            if shape is None:
                 return None
 
             return Qt.QGraphicsPathItem(shape)
@@ -515,10 +611,11 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
             selectionShape.setPen(pen)
 
             for item in items:
-                if item not in self._selectedItems: self._selectedItems.append(item)
+                if item not in self._selectedItems:
+                    self._selectedItems.append(item)
 
             # TODO i dont think this function work... or i dont know how...
-            #self.setSelectionMark(picture=selectionShape)
+            # self.setSelectionMark(picture=selectionShape)
             # ... Then do it it with hands...
             # copy-paste from drawSelectionMark
             self._selection.append(selectionShape)
@@ -543,7 +640,7 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         self._selectedItems = []
         self.updateSceneViews()
 
-    def setSelectionMark(self,picture=None,w=10,h=10):
+    def setSelectionMark(self, picture=None, w=10, h=10):
         """This method allows to set a callable, graphic item or pixmap as selection mark (by default creates a blue circle).
         If picture is a callable, the object returned will be used as selection mark.
         If picture is a QGraphicsItem it will be used as selection mark.
@@ -552,11 +649,14 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
         h/w will be used for height/width of the drawn object.
         """
         #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))
+        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
-        
-    def getSelectionMark(self,picture=None,w=10,h=10):
+
+    def getSelectionMark(self, picture=None, w=10, h=10):
         if picture is None:
             if self.SelectionMark:
                 SelectionMark = self.SelectionMark()
@@ -569,135 +669,154 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
                 pen.setWidth(4)
                 pen.setColor(Qt.QColor(Qt.Qt.blue))
                 SelectionMark.setPen(pen)
-                SelectionMark.hide() #It's better to add it hidden to avoid resizings                
+                SelectionMark.hide()  # It's better to add it hidden to avoid resizings
         else:
             try:
-                if isinstance(picture,Qt.QGraphicsItem):
+                if isinstance(picture, Qt.QGraphicsItem):
                     SelectionMark = picture
-                    SelectionMark.setRect(0,0,w,h)
+                    SelectionMark.setRect(0, 0, w, h)
                     SelectionMark.hide()
                 elif operator.isCallable(picture):
                     SelectionMark = picture()
                 else:
-                    if isinstance(picture,Qt.QPixmap):
+                    if isinstance(picture, Qt.QPixmap):
                         pixmap = picture
-                    elif isinstance(picture,basestring) or isinstance(picture,Qt.QString):
+                    elif isinstance(picture, basestring) or isinstance(picture, Qt.QString):
                         picture = str(picture)
                         pixmap = Qt.QPixmap(os.path.realpath(picture))
                     SelectionMark = Qt.QGraphicsPixmapItem()
-                    SelectionMark.setPixmap(pixmap.scaled(w,h))
+                    SelectionMark.setPixmap(pixmap.scaled(w, h))
                     SelectionMark.hide()
             except:
-                self.debug('In setSelectionMark(%s): %s'%(picture,traceback.format_exc()))
+                self.debug('In setSelectionMark(%s): %s' %
+                           (picture, traceback.format_exc()))
                 picture = None
-        return SelectionMark        
-        
-    def drawSelectionMark(self,x,y,w,h,oversize=1):
+        return SelectionMark
+
+    def drawSelectionMark(self, x, y, w, h, oversize=1):
         """
         If h or w are None the mark is drawn at x,y
         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))
 
         mark = self.getSelectionMark()
         self._selection.append(mark)
-        srect =  self.itemsBoundingRect()
-        MAX_CIRCLE_SIZE = srect.width(),srect.height()#500,500 #20,20
-        LIMITS = (0,0,srect.width(),srect.height())
-        def bound(coords,bounds=LIMITS):
+        srect = self.itemsBoundingRect()
+        MAX_CIRCLE_SIZE = srect.width(), srect.height()  # 500,500 #20,20
+        LIMITS = (0, 0, srect.width(), srect.height())
+
+        def bound(coords, bounds=LIMITS):
             """ x,y,w,h """
-            x,y,w,h = coords
-            if x<bounds[0]: w,x = w-(bounds[0]-x),bounds[0]
-            if y<bounds[1]: h,y = h-(bounds[1]-y),bounds[1]
-            if x+w>bounds[2]: w,x = (bounds[2]-x),x
-            if y+h>bounds[3]: h,y = (bounds[3]-y),y
-            return x,y,w,h
-
-        if isinstance(mark,Qt.QGraphicsEllipseItem):
-            if None not in [w,h]: 
-                if w>MAX_CIRCLE_SIZE[0] or h>MAX_CIRCLE_SIZE[1]:
-                    #Applying correction if the file is too big, half max circle size around the center
-                    x,y = (x+w/2.)-.5*MAX_CIRCLE_SIZE[0],(y+h/2.)-.5*MAX_CIRCLE_SIZE[1],
-                    w,h = [.5*t for t in MAX_CIRCLE_SIZE]                
+            x, y, w, h = coords
+            if x < bounds[0]:
+                w, x = w - (bounds[0] - x), bounds[0]
+            if y < bounds[1]:
+                h, y = h - (bounds[1] - y), bounds[1]
+            if x + w > bounds[2]:
+                w, x = (bounds[2] - x), x
+            if y + h > bounds[3]:
+                h, y = (bounds[3] - y), y
+            return x, y, w, h
+
+        if isinstance(mark, Qt.QGraphicsEllipseItem):
+            if None not in [w, h]:
+                if w > MAX_CIRCLE_SIZE[0] or h > MAX_CIRCLE_SIZE[1]:
+                    # Applying correction if the file is too big, half max
+                    # circle size around the center
+                    x, y = (x + w / 2.) - .5 * \
+                        MAX_CIRCLE_SIZE[0], (y + h / 2.) - .5 * \
+                        MAX_CIRCLE_SIZE[1],
+                    w, h = [.5 * t for t in MAX_CIRCLE_SIZE]
                 else:
-                    x,y = x-.5*w,y-.5*h
-            else: 
-                w,h = [.5*t for t in MAX_CIRCLE_SIZE]
+                    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))
-            mark.setRect(*bound((x,y,w*2,h*2)))
-            #mark.setRect(x,y,w*2,h*2)
-        elif isinstance(mark,Qt.QGraphicsPixmapItem):
+            mark.setRect(*bound((x, y, w * 2, h * 2)))
+            # mark.setRect(x,y,w*2,h*2)
+        elif isinstance(mark, Qt.QGraphicsPixmapItem):
             rect = mark.boundingRect()
-            if None not in [w,h]: x,y = x+.5*w,y+.5*h
-            mark.setOffset(x-.5*rect.width(),y-.5*rect.height())
-        elif isinstance(mark,Qt.QGraphicsItem):
-            mark.setRect(x,y,w,h)
+            if None not in [w, h]:
+                x, y = x + .5 * w, y + .5 * h
+            mark.setOffset(x - .5 * rect.width(), y - .5 * rect.height())
+        elif isinstance(mark, Qt.QGraphicsItem):
+            mark.setRect(x, y, w, h)
 
-        mark.hide() #It's better to add it hidden to avoid resizings            
+        mark.hide()  # It's better to add it hidden to avoid resizings
         self.addItem(mark)
-        mark.setZValue(9999)  #Put on Top            
+        mark.setZValue(9999)  # Put on Top
         mark.show()
         self.updateSceneViews()
         return
 
-    def getShellCommand(self,obj,wait=False):
-        shellCom = obj.getExtensions().get('shellCommand').replace('$NAME',obj._name).replace('$MODEL',obj._name)
-        if not wait and not shellCom.endswith('&'): shellCom+=' &' 
+    def getShellCommand(self, obj, wait=False):
+        shellCom = obj.getExtensions().get('shellCommand').replace(
+            '$NAME', obj._name).replace('$MODEL', obj._name)
+        if not wait and not shellCom.endswith('&'):
+            shellCom += ' &'
         if obj.noPrompt:
-            subprocess.call(shellCom,shell=True)
+            subprocess.call(shellCom, shell=True)
         else:
             yes = Qt.QMessageBox.Ok
             no = Qt.QMessageBox.Cancel
-            result = Qt.QMessageBox.question(self.parent(),"Shell command","Would you like to call shell command '" +shellCom+ "' ?",yes, no)
+            result = Qt.QMessageBox.question(self.parent(
+            ), "Shell command", "Would you like to call shell command '" + shellCom + "' ?", yes, no)
             if result == yes:
-                    subprocess.call(shellCom,shell=True) 
+                subprocess.call(shellCom, shell=True)
         return
 
-    def getClass(self,clName):
-        if not clName or clName == 'noPanel': 
+    def getClass(self, clName):
+        if not clName or clName == 'noPanel':
             return None
-        elif clName in ('atkpanel.MainPanel','atkpanel'):
+        elif clName in ('atkpanel.MainPanel', 'atkpanel'):
             clName = 'TaurusDevicePanel'
-        #TODO: allow passing class names including module, e.g.: 'foo.Bar'
+        # TODO: allow passing class names including module, e.g.: 'foo.Bar'
         if clName in globals():
             return globals()[clName]
         elif clName in locals():
             return locals()[clName]
         elif clName in dir(Qt):
-            return getattr(Qt,clName)
+            return getattr(Qt, clName)
         else:
             wf = TaurusWidgetFactory()
             try:
                 return wf.getTaurusWidgetClass(clName)
             except:
                 return None
-    
+
     @staticmethod
-    def getTaurusParentItem(item,top=True):
-        """ Searches within a group hierarchy and returns a parent Taurus component or None if no parent TaurusBaseComponent 
+    def getTaurusParentItem(item, top=True):
+        """ Searches within a group hierarchy and returns a parent Taurus component or None if no parent TaurusBaseComponent
             is found."""
-        if item is None: return None
-        first,p= None,item.parentItem()
+        if item is None:
+            return None
+        first, p = None, item.parentItem()
         while p:
             if isinstance(p, TaurusGraphicsItem):
-                if first is None: 
+                if first is None:
                     first = p
-                    if not top: break
-                elif str(p.getModel())!=str(first.getModel()):
+                    if not top:
+                        break
+                elif str(p.getModel()) != str(first.getModel()):
                     break
-                else: first = p
+                else:
+                    first = p
             p = p.parentItem()
         return first
-        
-    def getAllChildren(self,item,klass=None):
+
+    def getAllChildren(self, item, klass=None):
         """ Returns all children elements, filtering by klass if wanted """
         result = []
-        try: 
+        try:
             children = item.childItems()
-            result.extend(c for c in children if not klass or isinstance(c,klass))
-            result.extend(c.childItems() for c in children if not klass or isinstance(c,klass))
-        except: pass
+            result.extend(
+                c for c in children if not klass or isinstance(c, klass))
+            result.extend(c.childItems()
+                          for c in children if not klass or isinstance(c, klass))
+        except:
+            pass
         return result
 
     def start(self):
@@ -705,11 +824,11 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
             return
         self.updateQueue = Queue.Queue()
         self.updateThread = TaurusGraphicsUpdateThread(self)
-        self.updateThread.start()#Qt.QThread.HighPriority)
-    
+        self.updateThread.start()  # Qt.QThread.HighPriority)
+
     def getQueue(self):
         return self.updateQueue
-    
+
     def updateSceneItem(self, item):
         self.updateQueue.put(item)
 
@@ -718,11 +837,11 @@ class TaurusGraphicsScene(Qt.QGraphicsScene):
 
     def updateScene(self):
         self.update()
-        
+
     def updateSceneViews(self):
-        for v in self.views(): 
+        for v in self.views():
             v.viewport().update()
-            #v.invalidateScene(self.SelectionCircle.boundingRect())
+            # v.invalidateScene(self.SelectionCircle.boundingRect())
         return
 
 
@@ -826,6 +945,7 @@ class QGraphicsTextBoxing(Qt.QGraphicsItemGroup):
         self._validateLayout()
         Qt.QGraphicsItemGroup.paint(self, painter, option, widget)
 
+
 class QSpline(Qt.QGraphicsPathItem):
 
     def __init__(self, parent=None, closed=False, control_points=None):
@@ -869,9 +989,10 @@ class QSpline(Qt.QGraphicsPathItem):
 
 class TaurusGraphicsItem(TaurusBaseComponent):
     """Base class for all Taurus Graphics Items"""
-    
-    def __init__(self, name = None, parent = None):
-        self.call__init__(TaurusBaseComponent, name, parent) #<- log created here
+
+    def __init__(self, name=None, parent=None):
+        self.call__init__(TaurusBaseComponent, name,
+                          parent)  # <- log created here
         #self.debug('TaurusGraphicsItem(%s,%s)' % (name,parent))
         self.ignoreRepaint = False
         self.setName(name)
@@ -882,67 +1003,74 @@ class TaurusGraphicsItem(TaurusBaseComponent):
         self._map = None
         self._default = None
         self._visible = None
-        #self.getExtensions() <= It must be called AFTER set_common_params() in getGraphicsItem()
+        # self.getExtensions() <= It must be called AFTER set_common_params()
+        # in getGraphicsItem()
         self._contextMenu = []
-        
-    def setName(self,name):
+
+    def setName(self, name):
         name = str(name or self.__class__.__name__)
-        self._name = name#srubio at cells.es: modified to store ._name since initialization (even if a model is not set)
-        
+        # srubio at cells.es: modified to store ._name since initialization (even
+        # if a model is not set)
+        self._name = name
+
     def getName(self):
         return self._name
-        
-    def setContextMenu(self,menu):
+
+    def setContextMenu(self, menu):
         '''Context Menu must be a list of tuples (ActionName,ActionMethod), empty tuples insert separators between options.'''
         self._contextMenu = menu
-        
+
     def contextMenu(self):
         return self._contextMenu
-        
+
     def getExtensions(self):
         """
         Any in
         ExtensionsList,noPrompt,standAlone,noTooltip,noSelect,ignoreRepaint,shellCommand,className,classParams
         """
-        self._extensions = getattr(self,'_extensions',{})
+        self._extensions = getattr(self, '_extensions', {})
         if 'ExtensionsList' in self._extensions:
-            self._extensions.update((k.strip(),True) for k in self._extensions['ExtensionsList'].split(','))
+            self._extensions.update((k.strip(), True) for k in self._extensions[
+                                    'ExtensionsList'].split(','))
             self._extensions.pop('ExtensionsList')
-        for k in ('noPrompt','standAlone','noTooltip','ignoreRepaint','noSelect'):
-            if self._extensions.get(k,None)=='': self._extensions[k] = True
-        self.noPrompt = self._extensions.get('noPrompt',False)
-        self.standAlone = self._extensions.get('standAlone',False)
-        self.noTooltip = self._extensions.get('noTooltip',False)
-        self.ignoreRepaint = self._extensions.get('ignoreRepaint', self.ignoreRepaint)
-        self.setName(self._extensions.get('name',self._name))
-        tooltip = '' if (self.noTooltip or self._name==self.__class__.__name__ or self._name is None) else str(self._name)
+        for k in ('noPrompt', 'standAlone', 'noTooltip', 'ignoreRepaint', 'noSelect'):
+            if self._extensions.get(k, None) == '':
+                self._extensions[k] = True
+        self.noPrompt = self._extensions.get('noPrompt', False)
+        self.standAlone = self._extensions.get('standAlone', False)
+        self.noTooltip = self._extensions.get('noTooltip', False)
+        self.ignoreRepaint = self._extensions.get(
+            'ignoreRepaint', self.ignoreRepaint)
+        self.setName(self._extensions.get('name', self._name))
+        tooltip = '' if (self.noTooltip or self._name ==
+                         self.__class__.__name__ or self._name is None) else str(self._name)
         #self.debug('setting %s.tooltip = %s'%(self._name,tooltip))
         self.setToolTip(tooltip)
         #self.debug('%s.getExtensions(): %s'%(self._name,self._extensions))
         return self._extensions
-            
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Mandatory methods to be implemented in any subclass of TaurusComponent
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    def setModel(self,model):
+    def setModel(self, model):
         #self.debug('In %s.setModel(%s)'%(type(self).__name__,model))
         self.setName(model)
-        
+
         if issubclass(Manager().findObjectClass(self._name), TaurusDevice):
-            model = self._name+'/state'
-        TaurusBaseComponent.setModel(self, model)        
-        
+            model = self._name + '/state'
+        TaurusBaseComponent.setModel(self, model)
+
     def getParentTaurusComponent(self):
-        """ Returns a parent Taurus component or None if no parent TaurusBaseComponent 
+        """ Returns a parent Taurus component or None if no parent TaurusBaseComponent
             is found."""
         p = self.parentItem()
         while p and not isinstance(p, TaurusGraphicsItem):
             p = self.parentItem()
         return p
 
-    #def fireEvent(self, type):
-    def fireEvent(self, evt_src = None, evt_type = None, evt_value = None):
+    # def fireEvent(self, type):
+    def fireEvent(self, evt_src=None, evt_type=None, evt_value=None):
         """fires a value changed event to all listeners"""
         self.updateStyle()
 
@@ -952,12 +1080,12 @@ class TaurusGraphicsItem(TaurusBaseComponent):
         if self.scene():
             self.scene().updateSceneItem(self)
 
-    #getDisplayValue is already (and better) implemented in TaurusBaseComponent
-    #def getDisplayValue(self):
+    # getDisplayValue is already (and better) implemented in TaurusBaseComponent
+    # def getDisplayValue(self):
         #attrvalue = self.getModelValueObj()
-        #if not attrvalue:
-            #return self.getNoneValue()
-        #return str(attrvalue.value)            
+        # if not attrvalue:
+            # return self.getNoneValue()
+        # return str(attrvalue.value)
 
     def isReadOnly(self):
         return True
@@ -968,12 +1096,14 @@ class TaurusGraphicsItem(TaurusBaseComponent):
     def getModelClass(self):
         return TaurusAttribute
 
+
 class TaurusGraphicsAttributeItem(TaurusGraphicsItem):
     """
     This class show value->text conversion in label widgets.
     Quality is shown in background
     """
-    def __init__(self, name = None, parent = None):
+
+    def __init__(self, name=None, parent=None):
         name = name or self.__class__.__name__
         self._unitVisible = True
         self._currValue = None
@@ -986,7 +1116,8 @@ class TaurusGraphicsAttributeItem(TaurusGraphicsItem):
         modelObj = self.getModelObj()
         if not modelObj is None:
             unit = modelObj.getUnit()
-            if not unit or unit == 'No unit': unit = '' 
+            if not unit or unit == 'No unit':
+                unit = ''
         return unit
 
     def updateStyle(self):
@@ -996,13 +1127,15 @@ class TaurusGraphicsAttributeItem(TaurusGraphicsItem):
                 quality = None
                 if v:
                     quality = v.quality
-                if quality == PyTango.AttrQuality.ATTR_VALID and self._validBackground:
+                if quality == AttrQuality.ATTR_VALID and self._validBackground:
                     background = self._validBackground
                 else:
-                    background, _ = QT_ATTRIBUTE_QUALITY_PALETTE.qcolor(quality)
+                    background, _ = QT_ATTRIBUTE_QUALITY_PALETTE.qcolor(
+                        quality)
                 self.setBrush(Qt.QBrush(background))
             except:
-                self.warning('In TaurusGraphicsAttributeItem(%s).updateStyle(%s): colors failed!'%(self._name,self._currText))
+                self.warning('In TaurusGraphicsAttributeItem(%s).updateStyle(%s): colors failed!' % (
+                    self._name, self._currText))
                 self.warning(traceback.format_exc())
 
         if v and self._userFormat:
@@ -1019,56 +1152,58 @@ class TaurusGraphicsAttributeItem(TaurusGraphicsItem):
     def setUserFormat(self, format):
         self._userFormat = format
 
-    def setUnitVisible(self,yesno):
+    def setUnitVisible(self, yesno):
         self._unitVisible = yesno
 
+
 class TaurusGraphicsStateItem(TaurusGraphicsItem):
     """
     In State Item the displayValue should not override the label
     This item will modify only foreground/background colors
-    """ 
+    """
 
-    def __init__(self, name = None, parent = None):
+    def __init__(self, name=None, parent=None):
         name = name or self.__class__.__name__
         self.call__init__(TaurusGraphicsItem, name, parent)
 
     def updateStyle(self):
         v = self.getModelValueObj()
-        
+
         self._currBrush = Qt.QBrush(Qt.Qt.NoBrush)
-        if v: # or self.getShowState():
+        if v:  # or self.getShowState():
             try:
-                import PyTango
-                bg_brush, fg_brush = None,None
-                if self.getModelObj().getType() == PyTango.ArgType.DevState:
-                    bg_brush, fg_brush = QT_DEVICE_STATE_PALETTE.qbrush(v.value)
-                elif self.getModelObj().getType() == PyTango.ArgType.DevBoolean:
-                    bg_brush, fg_brush = QT_DEVICE_STATE_PALETTE.qbrush((PyTango.DevState.FAULT,PyTango.DevState.ON)[v.value])
+                bg_brush, fg_brush = None, None
+                if self.getModelObj().getType() == DataType.DevState:
+                    bg_brush, fg_brush = QT_DEVICE_STATE_PALETTE.qbrush(
+                        v.value)
+                elif self.getModelObj().getType() == DataType.Boolean:
+                    bg_brush, fg_brush = QT_DEVICE_STATE_PALETTE.qbrush(
+                        (DevState.FAULT, DevState.ON)[v.value])
                 elif self.getShowQuality():
-                    bg_brush, fg_brush = QT_ATTRIBUTE_QUALITY_PALETTE.qbrush(v.quality)            
-                if None not in (bg_brush,fg_brush):
+                    bg_brush, fg_brush = QT_ATTRIBUTE_QUALITY_PALETTE.qbrush(
+                        v.quality)
+                if None not in (bg_brush, fg_brush):
                     self._currBgBrush = bg_brush
                     self._currFgBrush = fg_brush
-                    #If there's no filling, applying background brush to foreground
-                    if Qt.Qt.NoBrush!=getattr(self,'_fillStyle',Qt.Qt.NoBrush):
+                    # If there's no filling, applying background brush to
+                    # foreground
+                    if Qt.Qt.NoBrush != getattr(self, '_fillStyle', Qt.Qt.NoBrush):
                         #self.debug('In TaurusGraphicsStateItem(%s).updateStyle(%s): switching background to foreground'%(self._name,self._currText))
                         self._currFgBrush = bg_brush
-                    if self._currText: self._currHtmlText = '<p style="color:%s">%s</p>' % (self._currBgBrush.color().name(),self._currText)
+                    if self._currText:
+                        self._currHtmlText = '<p style="color:%s">%s</p>' % (
+                            self._currBgBrush.color().name(), self._currText)
             except:
-                self.warning('In TaurusGraphicsStateItem(%s).updateStyle(%s): colors failed!'%(self._name,self._currText))
+                self.warning('In TaurusGraphicsStateItem(%s).updateStyle(%s): colors failed!' % (
+                    self._name, self._currText))
                 self.warning(traceback.format_exc())
-                
-        states = {
-            'ON':0,'OFF':1,'CLOSE':2,'OPEN':3,
-            'INSERT':4,'EXTRACT':5,'MOVING':6,
-            'STANDBY':7,'FAULT':8,'INIT':9,
-            'RUNNING':10,'ALARM':11,'DISABLE':12,
-            'UNKNOWN':13
-            }
-        #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:
+
+        # 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 DevState.__members__):
             #self.debug('In TaurusGraphicsStateItem.updateStyle(): mapping %s'%self._currText)
-            if states[self._currText] == self._map[1]:
+            if DevState[self._currText] == self._map[1]:
                 self.setVisible(self._map[2])
                 self._visible = self._map[2]
             else:
@@ -1077,32 +1212,34 @@ class TaurusGraphicsStateItem(TaurusGraphicsItem):
 
         TaurusGraphicsItem.updateStyle(self)
 
+
 class TaurusEllipseStateItem(Qt.QGraphicsEllipseItem, TaurusGraphicsStateItem):
 
-    def __init__(self, name = None, parent = None, scene = None):
+    def __init__(self, name=None, parent=None, scene=None):
         name = name or self.__class__.__name__
         Qt.QGraphicsEllipseItem.__init__(self, parent, scene)
         self.call__init__(TaurusGraphicsStateItem, name, parent)
 
-    def paint(self,painter,option,widget = None):
+    def paint(self, painter, option, widget=None):
         if self._currBgBrush:
             self._currBgBrush.setStyle(self.brush().style())
             self.setBrush(self._currBgBrush)
-        Qt.QGraphicsEllipseItem.paint(self,painter,option,widget)
+        Qt.QGraphicsEllipseItem.paint(self, painter, option, widget)
 
 
 class TaurusRectStateItem(Qt.QGraphicsRectItem, TaurusGraphicsStateItem):
 
-    def __init__(self, name = None, parent = None, scene = None):
+    def __init__(self, name=None, parent=None, scene=None):
         name = name or self.__class__.__name__
         Qt.QGraphicsRectItem.__init__(self, parent, scene)
         self.call__init__(TaurusGraphicsStateItem, name, parent)
 
-    def paint(self,painter,option,widget):
+    def paint(self, painter, option, widget):
         if self._currBgBrush:
             self._currBgBrush.setStyle(self.brush().style())
             self.setBrush(self._currBgBrush)
-        Qt.QGraphicsRectItem.paint(self,painter,option,widget)
+        Qt.QGraphicsRectItem.paint(self, painter, option, widget)
+
 
 class TaurusSplineStateItem(QSpline, TaurusGraphicsStateItem):
 
@@ -1117,6 +1254,7 @@ class TaurusSplineStateItem(QSpline, TaurusGraphicsStateItem):
             self.setBrush(self._currBgBrush)
         QSpline.paint(self, painter, option, widget)
 
+
 class TaurusRoundRectItem(Qt.QGraphicsPathItem):
 
     def __init__(self, name=None, parent=None, scene=None):
@@ -1125,9 +1263,9 @@ class TaurusRoundRectItem(Qt.QGraphicsPathItem):
         self.setCornerWidth(0, 0)
 
     def __updatePath(self):
-        if self.__rect == None:
+        if self.__rect is None:
             return
-        if self.__corner == None:
+        if self.__corner is None:
             return
 
         path = Qt.QPainterPath()
@@ -1150,6 +1288,7 @@ class TaurusRoundRectItem(Qt.QGraphicsPathItem):
         self.__corner = width, nbPoints
         self.__updatePath()
 
+
 class TaurusRoundRectStateItem(TaurusRoundRectItem, TaurusGraphicsStateItem):
 
     def __init__(self, name=None, parent=None, scene=None):
@@ -1163,58 +1302,64 @@ class TaurusRoundRectStateItem(TaurusRoundRectItem, TaurusGraphicsStateItem):
             self.setBrush(self._currBgBrush)
         TaurusRoundRectItem.paint(self, painter, option, widget)
 
+
 class TaurusGroupItem(Qt.QGraphicsItemGroup):
 
-    def __init__(self, name = None, parent = None, scene = None):
+    def __init__(self, name=None, parent=None, scene=None):
         Qt.QGraphicsItemGroup.__init__(self, parent, scene)
 
+
 class TaurusGroupStateItem(TaurusGroupItem, TaurusGraphicsStateItem):
 
-    def __init__(self, name = None, parent = None, scene = None):
+    def __init__(self, name=None, parent=None, scene=None):
         name = name or self.__class__.__name__
         TaurusGroupItem.__init__(self, parent, scene)
         self.call__init__(TaurusGraphicsStateItem, name, parent)
 
-    def paint(self,painter,option,widget):
-        TaurusGroupItem.paint(self,painter,option,widget)
-        
-class TaurusPolygonStateItem(Qt.QGraphicsPolygonItem,TaurusGraphicsStateItem):
-    
-    def __init__(self, name = None, parent = None, scene = None):
+    def paint(self, painter, option, widget):
+        TaurusGroupItem.paint(self, painter, option, widget)
+
+
+class TaurusPolygonStateItem(Qt.QGraphicsPolygonItem, TaurusGraphicsStateItem):
+
+    def __init__(self, name=None, parent=None, scene=None):
         name = name or self.__class__.__name__
         #Qt.QGraphicsRectItem.__init__(self, parent, scene)
         Qt.QGraphicsPolygonItem.__init__(self, parent, scene)
         self.call__init__(TaurusGraphicsStateItem, name, parent)
-        
-    def paint(self,painter,option,widget):
+
+    def paint(self, painter, option, widget):
         if self._currBgBrush:
             self._currBgBrush.setStyle(self.brush().style())
             self.setBrush(self._currBgBrush)
-        Qt.QGraphicsPolygonItem.paint(self,painter,option,widget)
+        Qt.QGraphicsPolygonItem.paint(self, painter, option, widget)
 
-class TaurusLineStateItem(Qt.QGraphicsLineItem,TaurusGraphicsStateItem):
-    
-    def __init__(self, name = None, parent = None, scene = None):
+
+class TaurusLineStateItem(Qt.QGraphicsLineItem, TaurusGraphicsStateItem):
+
+    def __init__(self, name=None, parent=None, scene=None):
         name = name or self.__class__.__name__
         Qt.QGraphicsLineItem.__init__(self, parent, scene)
         self.call__init__(TaurusGraphicsStateItem, name, parent)
-        
-    def paint(self,painter,option,widget):
+
+    def paint(self, painter, option, widget):
         if self._currBgBrush:
             self._currBgBrush.setStyle(self.brush().style())
             self.setBrush(self._currBgBrush)
         Qt.QGraphicsLineItem.paint(self, painter, option, widget)
 
+
 class TaurusTextStateItem(QGraphicsTextBoxing, TaurusGraphicsStateItem):
     """
     A QGraphicsItem that represents a text related to a device state or attribute quality
-    """      
+    """
+
     def __init__(self, name=None, parent=None, scene=None):
         name = name or self.__class__.__name__
         QGraphicsTextBoxing.__init__(self, parent, scene)
         self.call__init__(TaurusGraphicsStateItem, name, parent)
-        
-    def paint(self,painter,option,widget):
+
+    def paint(self, painter, option, widget):
         if self._currHtmlText:
             self.setHtml(self._currHtmlText)
         else:
@@ -1226,13 +1371,14 @@ class TaurusTextAttributeItem(QGraphicsTextBoxing, TaurusGraphicsAttributeItem):
     """
     A QGraphicsItem that represents a text related to an attribute value
     """
+
     def __init__(self, name=None, parent=None, scene=None):
         name = name or self.__class__.__name__
         QGraphicsTextBoxing.__init__(self, parent, scene)
         self.call__init__(TaurusGraphicsAttributeItem, name, parent)
-        
-    def paint(self,painter,option,widget):
-        #self.debug('TaurusTextAttributeItem(%s,%s,%s)'%(self.getName(),self._currText,self._currHtmlText))
+
+    def paint(self, painter, option, widget):
+        # self.debug('TaurusTextAttributeItem(%s,%s,%s)'%(self.getName(),self._currText,self._currHtmlText))
         if self._currHtmlText:
             self.setHtml(self._currHtmlText)
         else:
@@ -1241,115 +1387,131 @@ class TaurusTextAttributeItem(QGraphicsTextBoxing, TaurusGraphicsAttributeItem):
 
 
 TYPE_TO_GRAPHICS = {
-    None : { "Rectangle"      : Qt.QGraphicsRectItem,
-             "RoundRectangle" : TaurusRoundRectItem,
-             "Ellipse"        : Qt.QGraphicsEllipseItem,
-             "Polyline"       : Qt.QGraphicsPolygonItem,
-             "Label"          : QGraphicsTextBoxing,
-             "Line"           : Qt.QGraphicsLineItem,
-             "Group"          : TaurusGroupItem,
-             "SwingObject"    : TaurusTextAttributeItem,
-             "Image"          : Qt.QGraphicsPixmapItem,
-             "Spline"         : QSpline, },
-
-    TaurusDevice : { "Rectangle"      : TaurusRectStateItem,
-                           "RoundRectangle" : TaurusRoundRectStateItem,
-                           "Ellipse"        : TaurusEllipseStateItem,
-                           "Polyline"       : TaurusPolygonStateItem,
-                           "Label"          : TaurusTextStateItem,
-                           "Line"           : Qt.QGraphicsLineItem,  #TaurusLineStateItem,
-                           "Group"          : TaurusGroupStateItem,
-                           "SwingObject"    : TaurusTextAttributeItem,
-                           "Image"          : Qt.QGraphicsPixmapItem,
-                           "Spline"         : TaurusSplineStateItem, },
-
-    TaurusAttribute : { "Rectangle"      : TaurusRectStateItem,
-                           "RoundRectangle" : TaurusRoundRectStateItem,
-                           "Ellipse"        : TaurusEllipseStateItem,
-                           "Polyline"       : TaurusPolygonStateItem,
-                           "Label"          : TaurusTextAttributeItem,
-                           "Line"           : Qt.QGraphicsLineItem,  #TaurusLineStateItem,
-                           "Group"          : TaurusGroupStateItem,
-                           "SwingObject"    : TaurusTextAttributeItem,
-                           "Image"          : Qt.QGraphicsPixmapItem,
-                           "Spline"         : TaurusSplineStateItem, },
+    None: {"Rectangle": Qt.QGraphicsRectItem,
+           "RoundRectangle": TaurusRoundRectItem,
+           "Ellipse": Qt.QGraphicsEllipseItem,
+           "Polyline": Qt.QGraphicsPolygonItem,
+           "Label": QGraphicsTextBoxing,
+           "Line": Qt.QGraphicsLineItem,
+           "Group": TaurusGroupItem,
+           "SwingObject": TaurusTextAttributeItem,
+           "Image": Qt.QGraphicsPixmapItem,
+           "Spline": QSpline, },
+
+    TaurusDevice: {"Rectangle": TaurusRectStateItem,
+                   "RoundRectangle": TaurusRoundRectStateItem,
+                   "Ellipse": TaurusEllipseStateItem,
+                   "Polyline": TaurusPolygonStateItem,
+                   "Label": TaurusTextStateItem,
+                   "Line": Qt.QGraphicsLineItem,  # TaurusLineStateItem,
+                   "Group": TaurusGroupStateItem,
+                   "SwingObject": TaurusTextAttributeItem,
+                   "Image": Qt.QGraphicsPixmapItem,
+                   "Spline": TaurusSplineStateItem, },
+
+    TaurusAttribute: {"Rectangle": TaurusRectStateItem,
+                      "RoundRectangle": TaurusRoundRectStateItem,
+                      "Ellipse": TaurusEllipseStateItem,
+                      "Polyline": TaurusPolygonStateItem,
+                      "Label": TaurusTextAttributeItem,
+                      "Line": Qt.QGraphicsLineItem,  # TaurusLineStateItem,
+                      "Group": TaurusGroupStateItem,
+                      "SwingObject": TaurusTextAttributeItem,
+                      "Image": Qt.QGraphicsPixmapItem,
+                      "Spline": TaurusSplineStateItem, },
 }
 
 
 class TaurusBaseGraphicsFactory:
-    
+
     def __init__(self):
         pass
-    
-    def getSceneObj(self):   
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getSceneObj()")
-    
-    def getObj(self,name,params):
+
+    def getSceneObj(self):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getSceneObj()")
+
+    def getObj(self, name, params):
         raise RuntimeError("Invalid call to AbstractGraphicsFactory::getObj()")
 
-    def getRectangleObj(self,params):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getRectangleObj()")
-
-    def getRoundRectangleObj(self,params):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getRoundRectangleObj()")
-
-    def getLineObj(self,params):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getLineObj()")
-    
-    def getEllipseObj(self,params):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getEllipseObj()")
-
-    def getPolylineObj(self,params):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getPolylineObj()")
-    
-    def getLabelObj(self,params):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getLabelObj()")
-    
-    def getGroupObj(self,params):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getGroupObj()")
-    
-    def getSwingObjectObj(self,params):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getSwingObjectObj()")
-    
-    def getImageObj(self,parms):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getImageObj()")
-    
+    def getRectangleObj(self, params):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getRectangleObj()")
+
+    def getRoundRectangleObj(self, params):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getRoundRectangleObj()")
+
+    def getLineObj(self, params):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getLineObj()")
+
+    def getEllipseObj(self, params):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getEllipseObj()")
+
+    def getPolylineObj(self, params):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getPolylineObj()")
+
+    def getLabelObj(self, params):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getLabelObj()")
+
+    def getGroupObj(self, params):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getGroupObj()")
+
+    def getSwingObjectObj(self, params):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getSwingObjectObj()")
+
+    def getImageObj(self, parms):
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getImageObj()")
+
     def getSplineObj(self, params):
-        raise RuntimeError("Invalid call to AbstractGraphicsFactory::getSplineObj()")
+        raise RuntimeError(
+            "Invalid call to AbstractGraphicsFactory::getSplineObj()")
 
-    def getGraphicsClassItem(self,cls,type_):
+    def getGraphicsClassItem(self, cls, type_):
         ncls = cls
         try:
-            if   issubclass(cls, TaurusDevice):    ncls = TaurusDevice
-            elif issubclass(cls, TaurusAttribute): ncls = 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_)
+        ncls = TYPE_TO_GRAPHICS.get(
+            ncls, TYPE_TO_GRAPHICS.get(None)).get(type_)
         return ncls
 
-    def getGraphicsItem(self,type_,params):
+    def getGraphicsItem(self, type_, params):
         name = params.get(self.getNameParam())
-        #applying alias
-        for k,v in getattr(self,'alias',{}).items():
+        # applying alias
+        for k, v in getattr(self, 'alias', {}).items():
             if k in name:
-                name = str(name).replace(k,v)
+                name = str(name).replace(k, v)
                 params[self.getNameParam()] = name
         cls = None
         if '/' in name:
-            #replacing Taco identifiers in %s'%name
-            if name.lower().startswith('tango:') and (name.count('/')==2 or not 'tango:/' in name.lower()): 
-                nname = name.split(':',1)[-1]
+            # replacing Taco identifiers in %s'%name
+            if name.lower().startswith('tango:') and (name.count('/') == 2 or not 'tango:/' in name.lower()):
+                nname = name.split(':', 1)[-1]
                 params[self.getNameParam()] = name = nname
-            if name.lower().endswith('/state'): name = name.rsplit('/',1)[0]
+            if name.lower().endswith('/state'):
+                name = name.rsplit('/', 1)[0]
             cls = Manager().findObjectClass(name)
-        else: 
-            if name: self.debug('%s does not match a tango name'%name)
+        else:
+            if name:
+                self.debug('%s does not match a tango name' % name)
         klass = self.getGraphicsClassItem(cls, type_)
         item = klass()
-        ## It's here were Attributes are subscribed
-        self.set_common_params(item,params)
-        if hasattr(item,'getExtensions'):
-            item.getExtensions() #<= must be called here to take extensions from params
+        # It's here were Attributes are subscribed
+        self.set_common_params(item, params)
+        if hasattr(item, 'getExtensions'):
+            item.getExtensions()  # <= must be called here to take extensions from params
         return item
 
     def getNameParam(self):
@@ -1357,9 +1519,8 @@ class TaurusBaseGraphicsFactory:
            Default implementation returns 'name'.
            Overwrite has necessary."""
         return 'name'
-    
-    def set_common_params(self,item,params):
+
+    def set_common_params(self, item, params):
         """Sets the common parameters. Default implementation does nothing.
            Overwrite has necessary."""
         pass
-    
diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphicview.py b/lib/taurus/qt/qtgui/graphic/taurusgraphicview.py
index 4d62414..4e84e60 100644
--- a/lib/taurus/qt/qtgui/graphic/taurusgraphicview.py
+++ b/lib/taurus/qt/qtgui/graphic/taurusgraphicview.py
@@ -2,32 +2,32 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-taurusgraphicview.py: 
+taurusgraphicview.py:
 """
 
-#__all__ = []
+__all__ = ['TaurusGraphicsView']
 
 __docformat__ = 'restructuredtext'
 
@@ -35,9 +35,10 @@ from taurus.external.qt import Qt
 
 from taurus.qt.qtgui.base import TaurusBaseWidget
 
+
 class TaurusGraphicsView(Qt.QGraphicsView, TaurusBaseWidget):
-    
-    def __init__(self, parent = None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QGraphicsView, parent)
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
@@ -61,5 +62,5 @@ class TaurusGraphicsView(Qt.QGraphicsView, TaurusBaseWidget):
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.graphic'
         ret['group'] = 'Taurus Display'
-        ret['icon'] = ":/designer/graphicsview.png"
+        ret['icon'] = "designer:graphicsview.png"
         return ret
diff --git a/lib/taurus/qt/qtgui/help/__init__.py b/lib/taurus/qt/qtgui/help/__init__.py
index e9cf2e4..0f137bb 100644
--- a/lib/taurus/qt/qtgui/help/__init__.py
+++ b/lib/taurus/qt/qtgui/help/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/help/aboutdialog.py b/lib/taurus/qt/qtgui/help/aboutdialog.py
index 5dfff2e..0e8d69b 100644
--- a/lib/taurus/qt/qtgui/help/aboutdialog.py
+++ b/lib/taurus/qt/qtgui/help/aboutdialog.py
@@ -2,24 +2,24 @@
 
 ##############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 ##############################################################################
 
@@ -98,7 +98,7 @@ class AboutDialog(Qt.QDialog):
         palette.setColor(Qt.QPalette.Base,
                          palette.color(Qt.QPalette.Background))
         self.text_browser.setPalette(palette)
-        self.logo_widget.setAlignment(Qt.Qt.AlignHCenter | \
+        self.logo_widget.setAlignment(Qt.Qt.AlignHCenter |
                                       Qt.Qt.AlignTop)
         name = Qt.qApp.applicationName()
         version = Qt.qApp.applicationVersion()
@@ -178,7 +178,7 @@ class AboutDialog(Qt.QDialog):
         :return: the current dialog pixmap
         :rtype: Qt.QPixmap
         """
-        pixmap = self.logo_widget.pixmap()
+        pixmap = self.logo_widget.getPixmap()
         if pixmap is None:
             pixmap = Qt.QPixmap()
         return pixmap
@@ -191,11 +191,10 @@ class AboutDialog(Qt.QDialog):
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        from taurus.qt.qtgui.resource import getThemeIcon
-        return { 'group'     : 'Taurus Help',
-                 'icon'      : getThemeIcon("help"),
-                 'module'    : 'taurus.qt.qtgui.help',
-                 'container' : False }
+        return {'group': 'Taurus Help',
+                'icon': Qt.QIcon.fromTheme("help"),
+                'module': 'taurus.qt.qtgui.help',
+                'container': False}
 
     #: This property holds the current dialog pixmap
     #:
@@ -235,8 +234,7 @@ def main():
     app.setOrganizationDomain("http://www.taurus-scada.org/")
     about_dialog = AboutDialog()
 #    about_dialog.setText(txt)
-    from taurus.qt.qtgui.resource import getThemeIcon
-    pixmap = getThemeIcon("folder-open").pixmap(64, 64)
+    pixmap = Qt.QIcon.fromTheme("folder-open").pixmap(64, 64)
     about_dialog.setPixmap(pixmap)
     about_dialog.exec_()
 
diff --git a/lib/taurus/qt/qtgui/help/assistant.py b/lib/taurus/qt/qtgui/help/assistant.py
index 30b1455..dbcc055 100644
--- a/lib/taurus/qt/qtgui/help/assistant.py
+++ b/lib/taurus/qt/qtgui/help/assistant.py
@@ -2,24 +2,24 @@
 
 ##############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 ##############################################################################
 
@@ -63,7 +63,7 @@ class _Assistant(Qt.QProcess):
         if self.isRunning():
             return
         args = ["-enableRemoteControl",
-                "-collectionFile", self.__collection_file]        
+                "-collectionFile", self.__collection_file]
         Qt.QProcess.start(self, "assistant", args)
 
     def isRunning(self):
@@ -106,6 +106,8 @@ class _Assistant(Qt.QProcess):
 
 
 __ASSISTANTS = {}
+
+
 def Assistant(collection_file, auto_create=True, parent=None):
     """
     The :func:`Assistant` will create a subprocess displaying the
@@ -131,13 +133,13 @@ def Assistant(collection_file, auto_create=True, parent=None):
                 del __ASSISTANTS[collection_file]
         assistant = _Assistant(collection_file, parent=parent)
         __ASSISTANTS[collection_file] = assistant
-        assistant.connect(assistant, Qt.SIGNAL('finished(int)'), finished)
+        assistant.finished.connect(finished)
     return assistant
 
 
 def main():
     import sys
-    
+
     app = Qt.QApplication([])
     window = Qt.QWidget()
     layout = Qt.QHBoxLayout(window)
@@ -147,20 +149,21 @@ def main():
     layout.addWidget(textEdit)
     layout.addWidget(goButton)
     layout.addWidget(terminateButton)
-    
+
     def go():
         assistant = Assistant(textEdit.text(), parent=window)
         assistant.start()
         assistant.waitForStarted()
         assistant.assistantShow(Widgets.bookmarks)
+
     def terminate():
-        assistant = Assistant(textEdit.text(), auto_create=False, parent=window)
+        assistant = Assistant(
+            textEdit.text(), auto_create=False, parent=window)
         if assistant:
             assistant.terminate()
-    
-    
-    goButton.connect(goButton, Qt.SIGNAL('clicked()'), go)
-    terminateButton.connect(terminateButton, Qt.SIGNAL('clicked()'), terminate)
+
+    goButton.clicked.connect(go)
+    terminateButton.clicked.connect(terminate)
     window.show()
     sys.exit(app.exec_())
 
diff --git a/lib/taurus/qt/qtgui/help/helppanel.py b/lib/taurus/qt/qtgui/help/helppanel.py
index 701f9c2..e90e822 100644
--- a/lib/taurus/qt/qtgui/help/helppanel.py
+++ b/lib/taurus/qt/qtgui/help/helppanel.py
@@ -2,27 +2,33 @@
 
 ##############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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 provides a simple HTML help browser.
+"""
+
+__all__ = ["HelpPanel"]
+
 from taurus.external.qt import Qt
 from taurus.external.qt import QtHelp
 
@@ -39,12 +45,8 @@ class _HelpBrowser(Qt.QTextBrowser):
         self.__help_engine = help_engine
         content_widget = help_engine.contentWidget()
         index_widget = help_engine.indexWidget()
-        content_widget.connect(content_widget, 
-                               Qt.SIGNAL('linkActivated (QUrl)'), 
-                               self.setSource)
-        index_widget.connect(index_widget, 
-                               Qt.SIGNAL('linkActivated (QUrl)'), 
-                               self.setSource)
+        content_widget.linkActivated.connect(self.setSource)
+        index_widget.linkActivated.connect(self.setSource)
 
     def loadResource(self, type, url):
         if url.scheme() == "qthelp":
@@ -142,11 +144,10 @@ class HelpPanel(Qt.QWidget):
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        from taurus.qt.qtgui.resource import getThemeIcon
-        return { 'group'     : 'Taurus Help',
-                 'icon'      : getThemeIcon("help"),
-                 'module'    : 'taurus.qt.qtgui.help',
-                 'container' : False }
+        return {'group': 'Taurus Help',
+                'icon': Qt.QIcon.fromTheme("help"),
+                'module': 'taurus.qt.qtgui.help',
+                'container': False}
 
 
 def main():
diff --git a/lib/taurus/qt/qtgui/icon/Tango/index.theme b/lib/taurus/qt/qtgui/icon/Tango/index.theme
new file mode 100644
index 0000000..e73ab43
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/Tango/index.theme
@@ -0,0 +1,72 @@
+[Icon Theme]
+Name=Tango
+Comment=Tango Icon Theme
+Inherits=gnome,crystalsvg
+Example=x-directory-normal
+
+
+# Directory list
+Directories=scalable/actions,scalable/apps,scalable/categories,scalable/devices,scalable/emblems,scalable/emotes,scalable/mimetypes,scalable/places,scalable/status
+
+[scalable/actions]
+Size=48
+Context=Actions
+Type=Scalable
+MinSize=32
+MaxSize=256
+
+[scalable/apps]
+Size=48
+Context=Applications
+Type=Scalable
+MinSize=32
+MaxSize=256
+
+[scalable/categories]
+Size=48
+Context=Categories
+Type=Scalable
+MinSize=32
+MaxSize=256
+
+[scalable/devices]
+Size=48
+Context=Devices
+Type=Scalable
+MinSize=32
+MaxSize=256
+
+[scalable/emblems]
+Size=96
+Context=Emblems
+Type=Scalable
+MinSize=1
+MaxSize=256
+
+[scalable/emotes]
+Size=48
+Context=Emotes
+Type=Scalable
+Minsize=32
+MaxSize=256
+
+[scalable/mimetypes]
+Size=48
+Context=MimeTypes
+Type=Scalable
+MinSize=32
+MaxSize=256
+
+[scalable/places]
+Size=48
+Context=Places
+Type=Scalable
+MinSize=32
+MaxSize=256
+
+[scalable/status]
+Size=48
+Context=Status
+Type=Scalable
+MinSize=32
+MaxSize=256
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/list-add.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/add.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/list-add.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/add.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/address-book-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/address-book-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/address-book-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/address-book-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/appointment-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/appointment-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/appointment-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/appointment-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/appointment-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/appointment.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/appointment-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/appointment.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/back.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/back.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bookmark-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bookmark-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bookmark_add.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bookmark_add.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bookmarks_list_add.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bookmarks_list_add.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-bottom.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bottom.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-bottom.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/bottom.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-center.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/centrejust.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-center.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/centrejust.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/contact-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/contact-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/contact-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/contact-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-open.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-open.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-open.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-open.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print-preview.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-print-preview.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print-preview.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-print-preview.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-print.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-print.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-properties.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-properties.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-properties.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-properties.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save-as.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-save-as.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save-as.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-save-as.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-save.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/document-save.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-down.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/down.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-down.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/down.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-clear.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-clear.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-clear.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-clear.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-copy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-copy.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-copy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-copy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-cut.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-cut.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-cut.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-cut.svg
diff --git a/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-delete.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-delete.svg
new file mode 100644
index 0000000..69281e4
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-delete.svg
@@ -0,0 +1,896 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg57"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+   sodipodi:docname="edit-delete.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective141" />
+    <linearGradient
+       id="linearGradient3241">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop3243" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop3245" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3229">
+      <stop
+         style="stop-color:#598bcb;stop-opacity:1;"
+         offset="0"
+         id="stop3231" />
+      <stop
+         id="stop3249"
+         offset="0.75675678"
+         style="stop-color:#2f5c96;stop-opacity:1;" />
+      <stop
+         style="stop-color:#203e65;stop-opacity:1;"
+         offset="1"
+         id="stop3233" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3175">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop3177" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop3179" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3159">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop3161" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop3163" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3141">
+      <stop
+         style="stop-color:#a40000;stop-opacity:1;"
+         offset="0"
+         id="stop3143" />
+      <stop
+         style="stop-color:#ffc4c4;stop-opacity:1;"
+         offset="1"
+         id="stop3145" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3008">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop3010" />
+      <stop
+         style="stop-color:#d3d3d3;stop-opacity:1;"
+         offset="1"
+         id="stop3012" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2978">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop2980" />
+      <stop
+         style="stop-color:#d5d5d5;stop-opacity:1;"
+         offset="1"
+         id="stop2982" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2964">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop2966" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2968" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5060">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop5062" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5064" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       id="linearGradient5048">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop5050" />
+      <stop
+         id="stop5056"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5052" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5048"
+       id="linearGradient6715"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507" />
+    <linearGradient
+       id="linearGradient381">
+      <stop
+         id="stop382"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop383"
+         offset="1"
+         style="stop-color:white;stop-opacity:0.84466022;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient368">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.10309278;"
+         offset="0.0000000"
+         id="stop369" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop372" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1065">
+      <stop
+         style="stop-color:#b5c051;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop1066" />
+      <stop
+         style="stop-color:#858e3f;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop1067" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient172">
+      <stop
+         id="stop173"
+         offset="0.0000000"
+         style="stop-color:#616c08;stop-opacity:1.0000000;" />
+      <stop
+         id="stop174"
+         offset="1.0000000"
+         style="stop-color:#495106;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient161">
+      <stop
+         id="stop162"
+         offset="0.0000000"
+         style="stop-color:#575955;stop-opacity:1.0000000;" />
+      <stop
+         id="stop163"
+         offset="1.0000000"
+         style="stop-color:#7c7e79;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient157">
+      <stop
+         id="stop158"
+         offset="0.0000000"
+         style="stop-color:#babdb6;stop-opacity:1.0000000;" />
+      <stop
+         id="stop159"
+         offset="1.0000000"
+         style="stop-color:#f1f5ec;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient149"
+       inkscape:collect="always">
+      <stop
+         id="stop150"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop151"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1869">
+      <stop
+         style="stop-color:#c9c9c9;stop-opacity:1;"
+         offset="0"
+         id="stop1870" />
+      <stop
+         style="stop-color:#787a7b;stop-opacity:1;"
+         offset="1"
+         id="stop1871" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="69.460503"
+       x2="7.5291119"
+       y1="27.376621"
+       x1="7.3738608"
+       gradientTransform="matrix(3.495016,0,0,0.344323,-2.972087,-3.408148e-2)"
+       id="linearGradient152"
+       xlink:href="#linearGradient149"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient149"
+       id="linearGradient2058"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.520411,0,0,0.348016,-3.037918,1.544257)"
+       x1="7.3738608"
+       y1="27.376621"
+       x2="7.5291119"
+       y2="69.460503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2964"
+       id="linearGradient2970"
+       x1="27.5"
+       y1="14"
+       x2="27.625"
+       y2="18.750015"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.799991,0,-1.199875)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2984"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-17.82887,-61.79699)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-16.18243,-61.79699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-14.33255,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2996"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-12.67991,-61.03155)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3000"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-10.78506,-60.99081)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3004"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-19.58362,-61.75172)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3008"
+       id="linearGradient3097"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.984533,0,0,1.203586,0.971903,-2.123191)"
+       x1="26.151339"
+       y1="-5.7401156"
+       x2="27.500387"
+       y2="13.351768" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3107"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-8.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3111"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-6.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3115"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-4.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3119"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-2.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-0.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3127"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,1.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3131"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,3.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3135"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,5.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3141"
+       id="linearGradient3147"
+       x1="40.5"
+       y1="13.822797"
+       x2="40.5"
+       y2="16.877842"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3159"
+       id="linearGradient3165"
+       x1="23.5"
+       y1="12"
+       x2="23.5"
+       y2="6.6875"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3175"
+       id="linearGradient3181"
+       x1="25"
+       y1="21"
+       x2="25"
+       y2="32.25"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3229"
+       id="linearGradient3239"
+       gradientUnits="userSpaceOnUse"
+       x1="24.000006"
+       y1="15.837313"
+       x2="24.000006"
+       y2="21" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3241"
+       id="linearGradient3247"
+       x1="21.67791"
+       y1="19.969507"
+       x2="22.333523"
+       y2="11.643976"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     showborder="true"
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666"
+     borderopacity="0.13333333"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="-117.40141"
+     inkscape:cy="39.043402"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="872"
+     inkscape:window-height="688"
+     inkscape:window-x="562"
+     inkscape:window-y="156"
+     inkscape:showpageshadow="false"
+     inkscape:object-nodes="true"
+     inkscape:object-points="false"
+     inkscape:object-bbox="false"
+     inkscape:guide-bbox="false"
+     inkscape:grid-points="true"
+     inkscape:object-paths="false">
+    <inkscape:grid
+       id="GridFromPre046Settings"
+       type="xygrid"
+       originx="0px"
+       originy="0px"
+       spacingx="1px"
+       spacingy="1px"
+       color="#0000ff"
+       empcolor="#0000ff"
+       opacity="0.2"
+       empopacity="0.4"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Delete</dc:title>
+        <dc:date />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>edit</rdf:li>
+            <rdf:li>delete</rdf:li>
+            <rdf:li>shredder</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>Novell, Inc.</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:contributor>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       style="display:inline"
+       transform="matrix(2.262383e-2,0,0,1.966248e-2,44.39519,41.98146)"
+       id="g6707">
+      <rect
+         style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         id="rect6709"
+         width="1339.6335"
+         height="478.35718"
+         x="-1559.2523"
+         y="-150.69685" />
+      <path
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+         id="path6711"
+         sodipodi:nodetypes="cccc" />
+      <path
+         sodipodi:nodetypes="cccc"
+         id="path6713"
+         d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <path
+       style="opacity:0.38659794;color:black;fill:url(#linearGradient3181);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 4.75,21 L 43.25,21 L 42.375,32.25 L 5.625,32.25 L 4.75,21 z "
+       id="path3173" />
+    <path
+       style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.5"
+       d="M 4.000805,16.500028 C 3.9568443,16.464574 5.7277298,42.005521 5.7282343,42.013263 C 5.8943636,44.563961 7.2889479,45.496198 8.8498899,45.499996 C 8.9056682,45.500127 38.133934,45.496713 38.756644,45.494055 C 41.385341,45.482836 42.029344,43.859472 42.202267,42.085776 C 42.216136,42.050805 43.986115,16.535 43.999982,16.500028 C 30.666924,16.500028 17.333866,16.500028 4.000805,16.500028 z "
+       id="path1751"
+       sodipodi:nodetypes="ccccccc"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="opacity:0.23711338;color:black;fill:url(#linearGradient2058);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block"
+       d="M 43.457954,20.712669 L 7.2079371,20.689264 C 34.519247,21.326592 39.885144,24.337412 43.214187,24.183575 L 43.457954,20.712669 z "
+       id="path1893"
+       sodipodi:nodetypes="cccc"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <g
+       id="g3199"
+       style="opacity:0.12886598;fill:black;fill-opacity:1;stroke:black;stroke-width:1.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       transform="translate(8.838865e-2,8.838865e-2)">
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3201"
+         d="M 29.163487,19.614074 C 29.163487,19.614074 30.279473,23.33545 29.517144,26.348054 C 28.754815,29.360658 29.269248,34.210167 29.269248,34.210167 L 30.884373,34.634373 C 30.884373,34.634373 30.117495,30.028639 30.931357,26.524831 C 31.745219,23.021023 30.577814,19.614988 30.577814,19.614988 L 29.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3203"
+         d="M 9.9124168,19.759341 C 9.9124168,19.759341 11.028404,23.480717 10.266074,26.493321 C 9.5037448,29.505925 10.018178,34.355434 10.018178,34.355434 L 11.456527,33.807368 C 11.456527,33.807368 10.866426,30.173906 11.680288,26.670098 C 12.49415,23.16629 11.326745,19.760255 11.326745,19.760255 L 9.9124168,19.759341 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 11.66716,19.714074 C 11.66716,19.714074 12.783146,23.43545 12.020817,26.448054 C 11.258488,29.460658 8.617841,31.76449 8.617841,31.76449 L 9.8260378,33.73022 C 9.8260378,33.73022 12.621168,30.128639 13.43503,26.624831 C 14.248892,23.121023 13.081487,19.714988 13.081487,19.714988 L 11.66716,19.714074 z "
+         id="path3205"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3207"
+         d="M 21.163487,19.614074 C 21.163487,19.614074 22.279473,23.33545 21.517144,26.348054 C 20.754815,29.360658 21.269248,34.210167 21.269248,34.210167 L 22.928567,34.766955 C 22.928567,34.766955 22.117495,30.028639 22.931357,26.524831 C 23.745219,23.021023 22.577814,19.614988 22.577814,19.614988 L 21.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 35.163487,19.614074 C 35.163487,19.614074 36.279473,23.33545 35.517144,26.348054 C 34.754815,29.360658 36.550879,33.50306 36.550879,33.50306 L 38.077615,32.292082 C 38.077615,32.292082 36.117495,30.028639 36.931357,26.524831 C 37.745219,23.021023 36.577814,19.614988 36.577814,19.614988 L 35.163487,19.614074 z "
+         id="path3209"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 31.163487,19.614074 C 31.163487,19.614074 32.279473,23.33545 31.517144,26.348054 C 30.754815,29.360658 31.269248,34.210167 31.269248,34.210167 L 32.795984,34.148237 C 32.795984,34.148237 32.117495,30.028639 32.931357,26.524831 C 33.745219,23.021023 32.577814,19.614988 32.577814,19.614988 L 31.163487,19.614074 z "
+         id="path3211"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3213"
+         d="M 33.163487,19.614074 C 33.163487,19.614074 34.279473,23.33545 33.517144,26.348054 C 32.754815,29.360658 32.473753,34.03339 32.473753,34.03339 L 34.265654,34.457596 C 34.265654,34.457596 34.117495,30.028639 34.931357,26.524831 C 35.745219,23.021023 34.577814,19.614988 34.577814,19.614988 L 33.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 27.163487,19.614074 C 27.163487,19.614074 28.279473,23.33545 27.517144,26.348054 C 26.754815,29.360658 28.064743,33.989196 28.064743,33.989196 L 29.724062,33.308548 C 29.724062,33.308548 28.117495,30.028639 28.931357,26.524831 C 29.745219,23.021023 28.577814,19.614988 28.577814,19.614988 L 27.163487,19.614074 z "
+         id="path3215"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3217"
+         d="M 25.163487,19.614074 C 25.163487,19.614074 26.279473,23.33545 25.517144,26.348054 C 24.754815,29.360658 24.164394,34.077584 24.164394,34.077584 L 25.69113,34.280819 C 25.69113,34.280819 26.117495,30.028639 26.931357,26.524831 C 27.745219,23.021023 26.577814,19.614988 26.577814,19.614988 L 25.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 23.163487,19.614074 C 23.163487,19.614074 24.279473,23.33545 23.517144,26.348054 C 22.754815,29.360658 23.269248,34.210167 23.269248,34.210167 L 24.707596,33.662101 C 24.707596,33.662101 24.117495,30.028639 24.931357,26.524831 C 25.745219,23.021023 24.577814,19.614988 24.577814,19.614988 L 23.163487,19.614074 z "
+         id="path3219"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3221"
+         d="M 13.313608,19.714074 C 13.313608,19.714074 14.429594,23.43545 13.667265,26.448054 C 12.904936,29.460658 13.419369,34.310167 13.419369,34.310167 L 14.999517,34.698426 C 14.999517,34.698426 14.267616,30.128639 15.081478,26.624831 C 15.89534,23.121023 14.727935,19.714988 14.727935,19.714988 L 13.313608,19.714074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 19.418083,20.520258 C 19.418083,20.520258 19.615714,24.129801 19.064633,27.254238 C 18.524861,30.31456 21.306417,34.496773 21.306417,34.496773 L 22.721163,33.86443 C 22.721163,33.86443 19.926762,31.248786 20.558759,27.078695 C 21.116432,23.399015 20.83241,20.521172 20.83241,20.521172 L 19.418083,20.520258 z "
+         id="path3223"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 15.163487,19.614074 C 15.163487,19.614074 16.279473,23.33545 15.517144,26.348054 C 14.754815,29.360658 15.269248,34.210167 15.269248,34.210167 L 16.707596,33.662101 C 16.707596,33.662101 16.117495,30.028639 16.931357,26.524831 C 17.745219,23.021023 16.577814,19.614988 16.577814,19.614988 L 15.163487,19.614074 z "
+         id="path3225"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3227"
+         d="M 16.816129,20.479515 C 16.816129,20.479515 17.932115,24.200891 17.169786,27.213495 C 16.407457,30.226099 14.726988,31.80438 14.726988,31.80438 L 15.964957,32.939804 C 15.964957,32.939804 17.770137,30.89408 18.583999,27.390272 C 19.397861,23.886464 18.230456,20.480429 18.230456,20.480429 L 16.816129,20.479515 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <g
+       id="g3183">
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3123);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 29.163487,19.614074 C 29.163487,19.614074 30.279473,23.33545 29.517144,26.348054 C 28.754815,29.360658 29.269248,34.210167 29.269248,34.210167 L 30.884373,34.634373 C 30.884373,34.634373 30.117495,30.028639 30.931357,26.524831 C 31.745219,23.021023 30.577814,19.614988 30.577814,19.614988 L 29.163487,19.614074 z "
+         id="path3121"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3004);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 9.9124168,19.759341 C 9.9124168,19.759341 11.028404,23.480717 10.266074,26.493321 C 9.5037448,29.505925 10.018178,34.355434 10.018178,34.355434 L 11.456527,33.807368 C 11.456527,33.807368 10.866426,30.173906 11.680288,26.670098 C 12.49415,23.16629 11.326745,19.760255 11.326745,19.760255 L 9.9124168,19.759341 z "
+         id="path3002"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2976"
+         d="M 11.66716,19.714074 C 11.66716,19.714074 12.783146,23.43545 12.020817,26.448054 C 11.258488,29.460658 8.617841,31.76449 8.617841,31.76449 L 9.8260378,33.73022 C 9.8260378,33.73022 12.621168,30.128639 13.43503,26.624831 C 14.248892,23.121023 13.081487,19.714988 13.081487,19.714988 L 11.66716,19.714074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient2984);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3107);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 21.163487,19.614074 C 21.163487,19.614074 22.279473,23.33545 21.517144,26.348054 C 20.754815,29.360658 21.269248,34.210167 21.269248,34.210167 L 22.928567,34.766955 C 22.928567,34.766955 22.117495,30.028639 22.931357,26.524831 C 23.745219,23.021023 22.577814,19.614988 22.577814,19.614988 L 21.163487,19.614074 z "
+         id="path3105"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3133"
+         d="M 35.163487,19.614074 C 35.163487,19.614074 36.279473,23.33545 35.517144,26.348054 C 34.754815,29.360658 36.550879,33.50306 36.550879,33.50306 L 38.077615,32.292082 C 38.077615,32.292082 36.117495,30.028639 36.931357,26.524831 C 37.745219,23.021023 36.577814,19.614988 36.577814,19.614988 L 35.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3135);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3125"
+         d="M 31.163487,19.614074 C 31.163487,19.614074 32.279473,23.33545 31.517144,26.348054 C 30.754815,29.360658 31.269248,34.210167 31.269248,34.210167 L 32.795984,34.148237 C 32.795984,34.148237 32.117495,30.028639 32.931357,26.524831 C 33.745219,23.021023 32.577814,19.614988 32.577814,19.614988 L 31.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3127);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3131);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 33.163487,19.614074 C 33.163487,19.614074 34.279473,23.33545 33.517144,26.348054 C 32.754815,29.360658 32.473753,34.03339 32.473753,34.03339 L 34.265654,34.457596 C 34.265654,34.457596 34.117495,30.028639 34.931357,26.524831 C 35.745219,23.021023 34.577814,19.614988 34.577814,19.614988 L 33.163487,19.614074 z "
+         id="path3129"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3117"
+         d="M 27.163487,19.614074 C 27.163487,19.614074 28.279473,23.33545 27.517144,26.348054 C 26.754815,29.360658 28.064743,33.989196 28.064743,33.989196 L 29.724062,33.308548 C 29.724062,33.308548 28.117495,30.028639 28.931357,26.524831 C 29.745219,23.021023 28.577814,19.614988 28.577814,19.614988 L 27.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3119);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3115);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 25.163487,19.614074 C 25.163487,19.614074 26.279473,23.33545 25.517144,26.348054 C 24.754815,29.360658 24.164394,34.077584 24.164394,34.077584 L 25.69113,34.280819 C 25.69113,34.280819 26.117495,30.028639 26.931357,26.524831 C 27.745219,23.021023 26.577814,19.614988 26.577814,19.614988 L 25.163487,19.614074 z "
+         id="path3113"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3109"
+         d="M 23.163487,19.614074 C 23.163487,19.614074 24.279473,23.33545 23.517144,26.348054 C 22.754815,29.360658 23.269248,34.210167 23.269248,34.210167 L 24.707596,33.662101 C 24.707596,33.662101 24.117495,30.028639 24.931357,26.524831 C 25.745219,23.021023 24.577814,19.614988 24.577814,19.614988 L 23.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3111);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient2988);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 13.313608,19.714074 C 13.313608,19.714074 14.429594,23.43545 13.667265,26.448054 C 12.904936,29.460658 13.419369,34.310167 13.419369,34.310167 L 14.999517,34.698426 C 14.999517,34.698426 14.267616,30.128639 15.081478,26.624831 C 15.89534,23.121023 14.727935,19.714988 14.727935,19.714988 L 13.313608,19.714074 z "
+         id="path2986"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2998"
+         d="M 19.418083,20.520258 C 19.418083,20.520258 19.615714,24.129801 19.064633,27.254238 C 18.524861,30.31456 21.306417,34.496773 21.306417,34.496773 L 22.721163,33.86443 C 22.721163,33.86443 19.926762,31.248786 20.558759,27.078695 C 21.116432,23.399015 20.83241,20.521172 20.83241,20.521172 L 19.418083,20.520258 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3000);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2990"
+         d="M 15.163487,19.614074 C 15.163487,19.614074 16.279473,23.33545 15.517144,26.348054 C 14.754815,29.360658 15.269248,34.210167 15.269248,34.210167 L 16.707596,33.662101 C 16.707596,33.662101 16.117495,30.028639 16.931357,26.524831 C 17.745219,23.021023 16.577814,19.614988 16.577814,19.614988 L 15.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient2992);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient2996);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 16.816129,20.479515 C 16.816129,20.479515 17.932115,24.200891 17.169786,27.213495 C 16.407457,30.226099 14.726988,31.80438 14.726988,31.80438 L 15.964957,32.939804 C 15.964957,32.939804 17.770137,30.89408 18.583999,27.390272 C 19.397861,23.886464 18.230456,20.480429 18.230456,20.480429 L 16.816129,20.479515 z "
+         id="path2994"
+         sodipodi:nodetypes="csccscc" />
+    </g>
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.62886598"
+       d="M 5.4146811,19.121548 C 5.3634244,19.121414 6.251433,31.93862 6.9569459,40.927803 C 7.1389508,43.235262 7.5088619,44.174409 8.9423077,44.174409 C 20.759131,44.174409 37.552947,44.260504 38.124794,44.258405 C 40.891299,44.248246 40.839524,43.220919 41.068645,41.038151 C 41.152053,40.243546 42.601147,19.210922 42.587323,19.210922 C 32.686245,19.210922 17.647791,19.153519 5.4146811,19.121548 z "
+       id="path375"
+       sodipodi:nodetypes="cssssss"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="fill:url(#linearGradient3239);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 7.1632325,6.56876 C 6.0964702,6.571197 5.2036739,6.59587 4.7173745,7.611591 C 4.6328517,7.788132 2.0564582,14.953189 1.9325929,15.226435 C 0.87218423,17.565665 1.8500978,20.512357 3.8982467,20.492628 C 4.2877543,20.488998 44.257346,20.510899 44.877144,20.492628 C 46.620636,20.442134 46.843746,17.029897 46.093184,15.494889 C 46.050663,15.407927 42.567223,7.513946 42.47838,7.374125 C 42.067463,6.749683 41.147252,6.476015 40.463708,6.501646 C 40.329055,6.506821 7.2964985,6.56845 [...]
+       id="path1841"
+       sodipodi:nodetypes="cssssscss"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="opacity:0.14948454;color:black;fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 4.79225,20.902176 L 7.2921692,20.902264 L 8.0580206,41.513138 L 7.2954771,44.586329 C 6.688538,44.099871 6.4168015,43.362011 6.2792295,42.523528 L 4.79225,20.902176 z "
+       id="path2956"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="opacity:0.42783505;color:black;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 8.0335688,41.611683 L 7.3212658,44.540568 C 7.7441291,44.765463 8.0570118,44.852829 8.5125475,45.007174 L 38.538428,44.978477 C 39.11735,44.938856 39.669098,44.912678 40.052766,44.806892 L 38.00699,41.370874 L 8.0335688,41.611683 z "
+       id="path2958"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.37113402;color:black;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 38.00699,41.370874 L 40.019489,44.815762 C 40.637691,44.552557 41.349831,44.091949 41.630912,42.961864 L 43.139311,20.94521 L 39.69211,20.942984 L 38.00699,41.370874 z "
+       id="path2960"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0454103"
+       inkscape:original="M 40.46875 6.5 C 40.334098 6.505175 7.289516 6.562197 7.15625 6.5625 C 6.0894879 6.5649371 5.2050494 6.609279 4.71875 7.625 C 4.6342274 7.8015411 2.0613653 14.945504 1.9375 15.21875 C 0.87709136 17.55798 1.8581011 20.519729 3.90625 20.5 C 4.2957575 20.49637 44.255202 20.518271 44.875 20.5 C 46.618492 20.449506 46.844312 17.035008 46.09375 15.5 C 46.051228 15.413038 42.557593 7.514821 42.46875 7.375 C 42.057835 6.750558 41.152294 6.474369 40.46875 6.5 z "
+       xlink:href="#path1841"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3247);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.38659794"
+       id="path3237"
+       inkscape:href="#path1841"
+       d="M 40.375,7.53125 C 40.307786,7.5315126 40.187424,7.5621485 40.0625,7.5625 C 39.812652,7.5632031 39.458456,7.5614722 39,7.5625 C 38.083088,7.5645555 36.778275,7.5594608 35.21875,7.5625 C 32.0997,7.5685785 27.959843,7.5862798 23.8125,7.59375 C 15.517814,7.6086903 7.1755291,7.5937062 7.15625,7.59375 C 6.6366936,7.594937 6.2615608,7.6524246 6.0625,7.71875 C 5.8634392,7.7850754 5.7953622,7.77194 5.65625,8.0625 C 5.7244234,7.9201072 5.6779783,8.0363852 5.65625,8.09375 C 5.6345217,8.1 [...]
+    <path
+       style="opacity:0.82989693;color:black;fill:url(#linearGradient2970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 8,10 L 7.375,12 L 39.375001,12 L 38.593148,10.07544 L 8,10 z "
+       id="path2962"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:black;fill:url(#linearGradient3097);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000083;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 9.8535488,1.5000014 L 37.167316,1.5000014 C 37.363184,1.5000014 37.520869,1.6576863 37.520869,1.853555 L 37.520869,11.500003 C 37.520869,11.500003 9.4999952,11.500003 9.4999952,11.500003 L 9.4999952,1.853555 C 9.4999952,1.6576863 9.6576801,1.5000014 9.8535488,1.5000014 z "
+       id="rect3006"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.62886598;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.00000024;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 10.499998,10.522594 L 10.499998,2.5000011 L 36.504381,2.5000011 L 36.504381,10.611733"
+       id="path3103" />
+    <path
+       transform="matrix(0.814384,0,0,0.796379,7.58372,3.212694)"
+       d="M 43 15 A 2.5 1.25 0 1 1  38,15 A 2.5 1.25 0 1 1  43 15 z"
+       sodipodi:ry="1.25"
+       sodipodi:rx="2.5"
+       sodipodi:cy="15"
+       sodipodi:cx="40.5"
+       id="path3139"
+       style="opacity:1;color:black;fill:#c00;fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1.24172473;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;color:black;fill:#ef2929;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3147);stroke-width:1.24172473;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="path3137"
+       sodipodi:cx="40.5"
+       sodipodi:cy="15"
+       sodipodi:rx="2.5"
+       sodipodi:ry="1.25"
+       d="M 43 15 A 2.5 1.25 0 1 1  38,15 A 2.5 1.25 0 1 1  43 15 z"
+       transform="matrix(0.814384,0,0,0.796379,7.58372,2.549784)" />
+    <rect
+       style="opacity:0.27319588;color:black;fill:url(#linearGradient3165);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3157"
+       width="29"
+       height="5.3125"
+       x="9"
+       y="6.6875" />
+    <rect
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3167"
+       width="23"
+       height="1"
+       x="12"
+       y="4"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       y="6"
+       x="12"
+       height="1"
+       width="15"
+       id="rect3169"
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3171"
+       width="19"
+       height="1"
+       x="12"
+       y="8"
+       rx="0.5"
+       ry="0.5" />
+  </g>
+</svg>
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find-replace.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-find-replace.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find-replace.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-find-replace.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-find.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-find.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-paste.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-paste.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-paste.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-paste.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-redo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-redo.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-redo.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-redo.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-select-all.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-select-all.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-select-all.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-select-all.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-undo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-undo.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-undo.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/edit-undo.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-clear.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editclear.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-clear.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editclear.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-copy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editcopy.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-copy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editcopy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-cut.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editcut.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-cut.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editcut.svg
diff --git a/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editdelete.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editdelete.svg
new file mode 100644
index 0000000..69281e4
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editdelete.svg
@@ -0,0 +1,896 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg57"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+   sodipodi:docname="edit-delete.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective141" />
+    <linearGradient
+       id="linearGradient3241">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop3243" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop3245" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3229">
+      <stop
+         style="stop-color:#598bcb;stop-opacity:1;"
+         offset="0"
+         id="stop3231" />
+      <stop
+         id="stop3249"
+         offset="0.75675678"
+         style="stop-color:#2f5c96;stop-opacity:1;" />
+      <stop
+         style="stop-color:#203e65;stop-opacity:1;"
+         offset="1"
+         id="stop3233" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3175">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop3177" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop3179" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3159">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop3161" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop3163" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3141">
+      <stop
+         style="stop-color:#a40000;stop-opacity:1;"
+         offset="0"
+         id="stop3143" />
+      <stop
+         style="stop-color:#ffc4c4;stop-opacity:1;"
+         offset="1"
+         id="stop3145" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3008">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop3010" />
+      <stop
+         style="stop-color:#d3d3d3;stop-opacity:1;"
+         offset="1"
+         id="stop3012" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2978">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop2980" />
+      <stop
+         style="stop-color:#d5d5d5;stop-opacity:1;"
+         offset="1"
+         id="stop2982" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2964">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop2966" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2968" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5060">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop5062" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5064" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       id="linearGradient5048">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop5050" />
+      <stop
+         id="stop5056"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5052" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5048"
+       id="linearGradient6715"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507" />
+    <linearGradient
+       id="linearGradient381">
+      <stop
+         id="stop382"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop383"
+         offset="1"
+         style="stop-color:white;stop-opacity:0.84466022;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient368">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.10309278;"
+         offset="0.0000000"
+         id="stop369" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop372" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1065">
+      <stop
+         style="stop-color:#b5c051;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop1066" />
+      <stop
+         style="stop-color:#858e3f;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop1067" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient172">
+      <stop
+         id="stop173"
+         offset="0.0000000"
+         style="stop-color:#616c08;stop-opacity:1.0000000;" />
+      <stop
+         id="stop174"
+         offset="1.0000000"
+         style="stop-color:#495106;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient161">
+      <stop
+         id="stop162"
+         offset="0.0000000"
+         style="stop-color:#575955;stop-opacity:1.0000000;" />
+      <stop
+         id="stop163"
+         offset="1.0000000"
+         style="stop-color:#7c7e79;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient157">
+      <stop
+         id="stop158"
+         offset="0.0000000"
+         style="stop-color:#babdb6;stop-opacity:1.0000000;" />
+      <stop
+         id="stop159"
+         offset="1.0000000"
+         style="stop-color:#f1f5ec;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient149"
+       inkscape:collect="always">
+      <stop
+         id="stop150"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop151"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1869">
+      <stop
+         style="stop-color:#c9c9c9;stop-opacity:1;"
+         offset="0"
+         id="stop1870" />
+      <stop
+         style="stop-color:#787a7b;stop-opacity:1;"
+         offset="1"
+         id="stop1871" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="69.460503"
+       x2="7.5291119"
+       y1="27.376621"
+       x1="7.3738608"
+       gradientTransform="matrix(3.495016,0,0,0.344323,-2.972087,-3.408148e-2)"
+       id="linearGradient152"
+       xlink:href="#linearGradient149"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient149"
+       id="linearGradient2058"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.520411,0,0,0.348016,-3.037918,1.544257)"
+       x1="7.3738608"
+       y1="27.376621"
+       x2="7.5291119"
+       y2="69.460503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2964"
+       id="linearGradient2970"
+       x1="27.5"
+       y1="14"
+       x2="27.625"
+       y2="18.750015"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.799991,0,-1.199875)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2984"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-17.82887,-61.79699)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-16.18243,-61.79699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-14.33255,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2996"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-12.67991,-61.03155)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3000"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-10.78506,-60.99081)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3004"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-19.58362,-61.75172)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3008"
+       id="linearGradient3097"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.984533,0,0,1.203586,0.971903,-2.123191)"
+       x1="26.151339"
+       y1="-5.7401156"
+       x2="27.500387"
+       y2="13.351768" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3107"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-8.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3111"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-6.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3115"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-4.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3119"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-2.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-0.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3127"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,1.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3131"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,3.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3135"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,5.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3141"
+       id="linearGradient3147"
+       x1="40.5"
+       y1="13.822797"
+       x2="40.5"
+       y2="16.877842"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3159"
+       id="linearGradient3165"
+       x1="23.5"
+       y1="12"
+       x2="23.5"
+       y2="6.6875"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3175"
+       id="linearGradient3181"
+       x1="25"
+       y1="21"
+       x2="25"
+       y2="32.25"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3229"
+       id="linearGradient3239"
+       gradientUnits="userSpaceOnUse"
+       x1="24.000006"
+       y1="15.837313"
+       x2="24.000006"
+       y2="21" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3241"
+       id="linearGradient3247"
+       x1="21.67791"
+       y1="19.969507"
+       x2="22.333523"
+       y2="11.643976"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     showborder="true"
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666"
+     borderopacity="0.13333333"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="-117.40141"
+     inkscape:cy="39.043402"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="872"
+     inkscape:window-height="688"
+     inkscape:window-x="562"
+     inkscape:window-y="156"
+     inkscape:showpageshadow="false"
+     inkscape:object-nodes="true"
+     inkscape:object-points="false"
+     inkscape:object-bbox="false"
+     inkscape:guide-bbox="false"
+     inkscape:grid-points="true"
+     inkscape:object-paths="false">
+    <inkscape:grid
+       id="GridFromPre046Settings"
+       type="xygrid"
+       originx="0px"
+       originy="0px"
+       spacingx="1px"
+       spacingy="1px"
+       color="#0000ff"
+       empcolor="#0000ff"
+       opacity="0.2"
+       empopacity="0.4"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Delete</dc:title>
+        <dc:date />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>edit</rdf:li>
+            <rdf:li>delete</rdf:li>
+            <rdf:li>shredder</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>Novell, Inc.</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:contributor>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       style="display:inline"
+       transform="matrix(2.262383e-2,0,0,1.966248e-2,44.39519,41.98146)"
+       id="g6707">
+      <rect
+         style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         id="rect6709"
+         width="1339.6335"
+         height="478.35718"
+         x="-1559.2523"
+         y="-150.69685" />
+      <path
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+         id="path6711"
+         sodipodi:nodetypes="cccc" />
+      <path
+         sodipodi:nodetypes="cccc"
+         id="path6713"
+         d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <path
+       style="opacity:0.38659794;color:black;fill:url(#linearGradient3181);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 4.75,21 L 43.25,21 L 42.375,32.25 L 5.625,32.25 L 4.75,21 z "
+       id="path3173" />
+    <path
+       style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.5"
+       d="M 4.000805,16.500028 C 3.9568443,16.464574 5.7277298,42.005521 5.7282343,42.013263 C 5.8943636,44.563961 7.2889479,45.496198 8.8498899,45.499996 C 8.9056682,45.500127 38.133934,45.496713 38.756644,45.494055 C 41.385341,45.482836 42.029344,43.859472 42.202267,42.085776 C 42.216136,42.050805 43.986115,16.535 43.999982,16.500028 C 30.666924,16.500028 17.333866,16.500028 4.000805,16.500028 z "
+       id="path1751"
+       sodipodi:nodetypes="ccccccc"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="opacity:0.23711338;color:black;fill:url(#linearGradient2058);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block"
+       d="M 43.457954,20.712669 L 7.2079371,20.689264 C 34.519247,21.326592 39.885144,24.337412 43.214187,24.183575 L 43.457954,20.712669 z "
+       id="path1893"
+       sodipodi:nodetypes="cccc"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <g
+       id="g3199"
+       style="opacity:0.12886598;fill:black;fill-opacity:1;stroke:black;stroke-width:1.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       transform="translate(8.838865e-2,8.838865e-2)">
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3201"
+         d="M 29.163487,19.614074 C 29.163487,19.614074 30.279473,23.33545 29.517144,26.348054 C 28.754815,29.360658 29.269248,34.210167 29.269248,34.210167 L 30.884373,34.634373 C 30.884373,34.634373 30.117495,30.028639 30.931357,26.524831 C 31.745219,23.021023 30.577814,19.614988 30.577814,19.614988 L 29.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3203"
+         d="M 9.9124168,19.759341 C 9.9124168,19.759341 11.028404,23.480717 10.266074,26.493321 C 9.5037448,29.505925 10.018178,34.355434 10.018178,34.355434 L 11.456527,33.807368 C 11.456527,33.807368 10.866426,30.173906 11.680288,26.670098 C 12.49415,23.16629 11.326745,19.760255 11.326745,19.760255 L 9.9124168,19.759341 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 11.66716,19.714074 C 11.66716,19.714074 12.783146,23.43545 12.020817,26.448054 C 11.258488,29.460658 8.617841,31.76449 8.617841,31.76449 L 9.8260378,33.73022 C 9.8260378,33.73022 12.621168,30.128639 13.43503,26.624831 C 14.248892,23.121023 13.081487,19.714988 13.081487,19.714988 L 11.66716,19.714074 z "
+         id="path3205"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3207"
+         d="M 21.163487,19.614074 C 21.163487,19.614074 22.279473,23.33545 21.517144,26.348054 C 20.754815,29.360658 21.269248,34.210167 21.269248,34.210167 L 22.928567,34.766955 C 22.928567,34.766955 22.117495,30.028639 22.931357,26.524831 C 23.745219,23.021023 22.577814,19.614988 22.577814,19.614988 L 21.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 35.163487,19.614074 C 35.163487,19.614074 36.279473,23.33545 35.517144,26.348054 C 34.754815,29.360658 36.550879,33.50306 36.550879,33.50306 L 38.077615,32.292082 C 38.077615,32.292082 36.117495,30.028639 36.931357,26.524831 C 37.745219,23.021023 36.577814,19.614988 36.577814,19.614988 L 35.163487,19.614074 z "
+         id="path3209"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 31.163487,19.614074 C 31.163487,19.614074 32.279473,23.33545 31.517144,26.348054 C 30.754815,29.360658 31.269248,34.210167 31.269248,34.210167 L 32.795984,34.148237 C 32.795984,34.148237 32.117495,30.028639 32.931357,26.524831 C 33.745219,23.021023 32.577814,19.614988 32.577814,19.614988 L 31.163487,19.614074 z "
+         id="path3211"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3213"
+         d="M 33.163487,19.614074 C 33.163487,19.614074 34.279473,23.33545 33.517144,26.348054 C 32.754815,29.360658 32.473753,34.03339 32.473753,34.03339 L 34.265654,34.457596 C 34.265654,34.457596 34.117495,30.028639 34.931357,26.524831 C 35.745219,23.021023 34.577814,19.614988 34.577814,19.614988 L 33.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 27.163487,19.614074 C 27.163487,19.614074 28.279473,23.33545 27.517144,26.348054 C 26.754815,29.360658 28.064743,33.989196 28.064743,33.989196 L 29.724062,33.308548 C 29.724062,33.308548 28.117495,30.028639 28.931357,26.524831 C 29.745219,23.021023 28.577814,19.614988 28.577814,19.614988 L 27.163487,19.614074 z "
+         id="path3215"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3217"
+         d="M 25.163487,19.614074 C 25.163487,19.614074 26.279473,23.33545 25.517144,26.348054 C 24.754815,29.360658 24.164394,34.077584 24.164394,34.077584 L 25.69113,34.280819 C 25.69113,34.280819 26.117495,30.028639 26.931357,26.524831 C 27.745219,23.021023 26.577814,19.614988 26.577814,19.614988 L 25.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 23.163487,19.614074 C 23.163487,19.614074 24.279473,23.33545 23.517144,26.348054 C 22.754815,29.360658 23.269248,34.210167 23.269248,34.210167 L 24.707596,33.662101 C 24.707596,33.662101 24.117495,30.028639 24.931357,26.524831 C 25.745219,23.021023 24.577814,19.614988 24.577814,19.614988 L 23.163487,19.614074 z "
+         id="path3219"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3221"
+         d="M 13.313608,19.714074 C 13.313608,19.714074 14.429594,23.43545 13.667265,26.448054 C 12.904936,29.460658 13.419369,34.310167 13.419369,34.310167 L 14.999517,34.698426 C 14.999517,34.698426 14.267616,30.128639 15.081478,26.624831 C 15.89534,23.121023 14.727935,19.714988 14.727935,19.714988 L 13.313608,19.714074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 19.418083,20.520258 C 19.418083,20.520258 19.615714,24.129801 19.064633,27.254238 C 18.524861,30.31456 21.306417,34.496773 21.306417,34.496773 L 22.721163,33.86443 C 22.721163,33.86443 19.926762,31.248786 20.558759,27.078695 C 21.116432,23.399015 20.83241,20.521172 20.83241,20.521172 L 19.418083,20.520258 z "
+         id="path3223"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 15.163487,19.614074 C 15.163487,19.614074 16.279473,23.33545 15.517144,26.348054 C 14.754815,29.360658 15.269248,34.210167 15.269248,34.210167 L 16.707596,33.662101 C 16.707596,33.662101 16.117495,30.028639 16.931357,26.524831 C 17.745219,23.021023 16.577814,19.614988 16.577814,19.614988 L 15.163487,19.614074 z "
+         id="path3225"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3227"
+         d="M 16.816129,20.479515 C 16.816129,20.479515 17.932115,24.200891 17.169786,27.213495 C 16.407457,30.226099 14.726988,31.80438 14.726988,31.80438 L 15.964957,32.939804 C 15.964957,32.939804 17.770137,30.89408 18.583999,27.390272 C 19.397861,23.886464 18.230456,20.480429 18.230456,20.480429 L 16.816129,20.479515 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <g
+       id="g3183">
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3123);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 29.163487,19.614074 C 29.163487,19.614074 30.279473,23.33545 29.517144,26.348054 C 28.754815,29.360658 29.269248,34.210167 29.269248,34.210167 L 30.884373,34.634373 C 30.884373,34.634373 30.117495,30.028639 30.931357,26.524831 C 31.745219,23.021023 30.577814,19.614988 30.577814,19.614988 L 29.163487,19.614074 z "
+         id="path3121"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3004);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 9.9124168,19.759341 C 9.9124168,19.759341 11.028404,23.480717 10.266074,26.493321 C 9.5037448,29.505925 10.018178,34.355434 10.018178,34.355434 L 11.456527,33.807368 C 11.456527,33.807368 10.866426,30.173906 11.680288,26.670098 C 12.49415,23.16629 11.326745,19.760255 11.326745,19.760255 L 9.9124168,19.759341 z "
+         id="path3002"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2976"
+         d="M 11.66716,19.714074 C 11.66716,19.714074 12.783146,23.43545 12.020817,26.448054 C 11.258488,29.460658 8.617841,31.76449 8.617841,31.76449 L 9.8260378,33.73022 C 9.8260378,33.73022 12.621168,30.128639 13.43503,26.624831 C 14.248892,23.121023 13.081487,19.714988 13.081487,19.714988 L 11.66716,19.714074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient2984);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3107);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 21.163487,19.614074 C 21.163487,19.614074 22.279473,23.33545 21.517144,26.348054 C 20.754815,29.360658 21.269248,34.210167 21.269248,34.210167 L 22.928567,34.766955 C 22.928567,34.766955 22.117495,30.028639 22.931357,26.524831 C 23.745219,23.021023 22.577814,19.614988 22.577814,19.614988 L 21.163487,19.614074 z "
+         id="path3105"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3133"
+         d="M 35.163487,19.614074 C 35.163487,19.614074 36.279473,23.33545 35.517144,26.348054 C 34.754815,29.360658 36.550879,33.50306 36.550879,33.50306 L 38.077615,32.292082 C 38.077615,32.292082 36.117495,30.028639 36.931357,26.524831 C 37.745219,23.021023 36.577814,19.614988 36.577814,19.614988 L 35.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3135);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3125"
+         d="M 31.163487,19.614074 C 31.163487,19.614074 32.279473,23.33545 31.517144,26.348054 C 30.754815,29.360658 31.269248,34.210167 31.269248,34.210167 L 32.795984,34.148237 C 32.795984,34.148237 32.117495,30.028639 32.931357,26.524831 C 33.745219,23.021023 32.577814,19.614988 32.577814,19.614988 L 31.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3127);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3131);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 33.163487,19.614074 C 33.163487,19.614074 34.279473,23.33545 33.517144,26.348054 C 32.754815,29.360658 32.473753,34.03339 32.473753,34.03339 L 34.265654,34.457596 C 34.265654,34.457596 34.117495,30.028639 34.931357,26.524831 C 35.745219,23.021023 34.577814,19.614988 34.577814,19.614988 L 33.163487,19.614074 z "
+         id="path3129"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3117"
+         d="M 27.163487,19.614074 C 27.163487,19.614074 28.279473,23.33545 27.517144,26.348054 C 26.754815,29.360658 28.064743,33.989196 28.064743,33.989196 L 29.724062,33.308548 C 29.724062,33.308548 28.117495,30.028639 28.931357,26.524831 C 29.745219,23.021023 28.577814,19.614988 28.577814,19.614988 L 27.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3119);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3115);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 25.163487,19.614074 C 25.163487,19.614074 26.279473,23.33545 25.517144,26.348054 C 24.754815,29.360658 24.164394,34.077584 24.164394,34.077584 L 25.69113,34.280819 C 25.69113,34.280819 26.117495,30.028639 26.931357,26.524831 C 27.745219,23.021023 26.577814,19.614988 26.577814,19.614988 L 25.163487,19.614074 z "
+         id="path3113"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3109"
+         d="M 23.163487,19.614074 C 23.163487,19.614074 24.279473,23.33545 23.517144,26.348054 C 22.754815,29.360658 23.269248,34.210167 23.269248,34.210167 L 24.707596,33.662101 C 24.707596,33.662101 24.117495,30.028639 24.931357,26.524831 C 25.745219,23.021023 24.577814,19.614988 24.577814,19.614988 L 23.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3111);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient2988);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 13.313608,19.714074 C 13.313608,19.714074 14.429594,23.43545 13.667265,26.448054 C 12.904936,29.460658 13.419369,34.310167 13.419369,34.310167 L 14.999517,34.698426 C 14.999517,34.698426 14.267616,30.128639 15.081478,26.624831 C 15.89534,23.121023 14.727935,19.714988 14.727935,19.714988 L 13.313608,19.714074 z "
+         id="path2986"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2998"
+         d="M 19.418083,20.520258 C 19.418083,20.520258 19.615714,24.129801 19.064633,27.254238 C 18.524861,30.31456 21.306417,34.496773 21.306417,34.496773 L 22.721163,33.86443 C 22.721163,33.86443 19.926762,31.248786 20.558759,27.078695 C 21.116432,23.399015 20.83241,20.521172 20.83241,20.521172 L 19.418083,20.520258 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3000);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2990"
+         d="M 15.163487,19.614074 C 15.163487,19.614074 16.279473,23.33545 15.517144,26.348054 C 14.754815,29.360658 15.269248,34.210167 15.269248,34.210167 L 16.707596,33.662101 C 16.707596,33.662101 16.117495,30.028639 16.931357,26.524831 C 17.745219,23.021023 16.577814,19.614988 16.577814,19.614988 L 15.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient2992);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient2996);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 16.816129,20.479515 C 16.816129,20.479515 17.932115,24.200891 17.169786,27.213495 C 16.407457,30.226099 14.726988,31.80438 14.726988,31.80438 L 15.964957,32.939804 C 15.964957,32.939804 17.770137,30.89408 18.583999,27.390272 C 19.397861,23.886464 18.230456,20.480429 18.230456,20.480429 L 16.816129,20.479515 z "
+         id="path2994"
+         sodipodi:nodetypes="csccscc" />
+    </g>
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.62886598"
+       d="M 5.4146811,19.121548 C 5.3634244,19.121414 6.251433,31.93862 6.9569459,40.927803 C 7.1389508,43.235262 7.5088619,44.174409 8.9423077,44.174409 C 20.759131,44.174409 37.552947,44.260504 38.124794,44.258405 C 40.891299,44.248246 40.839524,43.220919 41.068645,41.038151 C 41.152053,40.243546 42.601147,19.210922 42.587323,19.210922 C 32.686245,19.210922 17.647791,19.153519 5.4146811,19.121548 z "
+       id="path375"
+       sodipodi:nodetypes="cssssss"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="fill:url(#linearGradient3239);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 7.1632325,6.56876 C 6.0964702,6.571197 5.2036739,6.59587 4.7173745,7.611591 C 4.6328517,7.788132 2.0564582,14.953189 1.9325929,15.226435 C 0.87218423,17.565665 1.8500978,20.512357 3.8982467,20.492628 C 4.2877543,20.488998 44.257346,20.510899 44.877144,20.492628 C 46.620636,20.442134 46.843746,17.029897 46.093184,15.494889 C 46.050663,15.407927 42.567223,7.513946 42.47838,7.374125 C 42.067463,6.749683 41.147252,6.476015 40.463708,6.501646 C 40.329055,6.506821 7.2964985,6.56845 [...]
+       id="path1841"
+       sodipodi:nodetypes="cssssscss"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="opacity:0.14948454;color:black;fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 4.79225,20.902176 L 7.2921692,20.902264 L 8.0580206,41.513138 L 7.2954771,44.586329 C 6.688538,44.099871 6.4168015,43.362011 6.2792295,42.523528 L 4.79225,20.902176 z "
+       id="path2956"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="opacity:0.42783505;color:black;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 8.0335688,41.611683 L 7.3212658,44.540568 C 7.7441291,44.765463 8.0570118,44.852829 8.5125475,45.007174 L 38.538428,44.978477 C 39.11735,44.938856 39.669098,44.912678 40.052766,44.806892 L 38.00699,41.370874 L 8.0335688,41.611683 z "
+       id="path2958"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.37113402;color:black;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 38.00699,41.370874 L 40.019489,44.815762 C 40.637691,44.552557 41.349831,44.091949 41.630912,42.961864 L 43.139311,20.94521 L 39.69211,20.942984 L 38.00699,41.370874 z "
+       id="path2960"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0454103"
+       inkscape:original="M 40.46875 6.5 C 40.334098 6.505175 7.289516 6.562197 7.15625 6.5625 C 6.0894879 6.5649371 5.2050494 6.609279 4.71875 7.625 C 4.6342274 7.8015411 2.0613653 14.945504 1.9375 15.21875 C 0.87709136 17.55798 1.8581011 20.519729 3.90625 20.5 C 4.2957575 20.49637 44.255202 20.518271 44.875 20.5 C 46.618492 20.449506 46.844312 17.035008 46.09375 15.5 C 46.051228 15.413038 42.557593 7.514821 42.46875 7.375 C 42.057835 6.750558 41.152294 6.474369 40.46875 6.5 z "
+       xlink:href="#path1841"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3247);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.38659794"
+       id="path3237"
+       inkscape:href="#path1841"
+       d="M 40.375,7.53125 C 40.307786,7.5315126 40.187424,7.5621485 40.0625,7.5625 C 39.812652,7.5632031 39.458456,7.5614722 39,7.5625 C 38.083088,7.5645555 36.778275,7.5594608 35.21875,7.5625 C 32.0997,7.5685785 27.959843,7.5862798 23.8125,7.59375 C 15.517814,7.6086903 7.1755291,7.5937062 7.15625,7.59375 C 6.6366936,7.594937 6.2615608,7.6524246 6.0625,7.71875 C 5.8634392,7.7850754 5.7953622,7.77194 5.65625,8.0625 C 5.7244234,7.9201072 5.6779783,8.0363852 5.65625,8.09375 C 5.6345217,8.1 [...]
+    <path
+       style="opacity:0.82989693;color:black;fill:url(#linearGradient2970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 8,10 L 7.375,12 L 39.375001,12 L 38.593148,10.07544 L 8,10 z "
+       id="path2962"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:black;fill:url(#linearGradient3097);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000083;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 9.8535488,1.5000014 L 37.167316,1.5000014 C 37.363184,1.5000014 37.520869,1.6576863 37.520869,1.853555 L 37.520869,11.500003 C 37.520869,11.500003 9.4999952,11.500003 9.4999952,11.500003 L 9.4999952,1.853555 C 9.4999952,1.6576863 9.6576801,1.5000014 9.8535488,1.5000014 z "
+       id="rect3006"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.62886598;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.00000024;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 10.499998,10.522594 L 10.499998,2.5000011 L 36.504381,2.5000011 L 36.504381,10.611733"
+       id="path3103" />
+    <path
+       transform="matrix(0.814384,0,0,0.796379,7.58372,3.212694)"
+       d="M 43 15 A 2.5 1.25 0 1 1  38,15 A 2.5 1.25 0 1 1  43 15 z"
+       sodipodi:ry="1.25"
+       sodipodi:rx="2.5"
+       sodipodi:cy="15"
+       sodipodi:cx="40.5"
+       id="path3139"
+       style="opacity:1;color:black;fill:#c00;fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1.24172473;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;color:black;fill:#ef2929;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3147);stroke-width:1.24172473;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="path3137"
+       sodipodi:cx="40.5"
+       sodipodi:cy="15"
+       sodipodi:rx="2.5"
+       sodipodi:ry="1.25"
+       d="M 43 15 A 2.5 1.25 0 1 1  38,15 A 2.5 1.25 0 1 1  43 15 z"
+       transform="matrix(0.814384,0,0,0.796379,7.58372,2.549784)" />
+    <rect
+       style="opacity:0.27319588;color:black;fill:url(#linearGradient3165);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3157"
+       width="29"
+       height="5.3125"
+       x="9"
+       y="6.6875" />
+    <rect
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3167"
+       width="23"
+       height="1"
+       x="12"
+       y="4"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       y="6"
+       x="12"
+       height="1"
+       width="15"
+       id="rect3169"
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3171"
+       width="19"
+       height="1"
+       x="12"
+       y="8"
+       rx="0.5"
+       ry="0.5" />
+  </g>
+</svg>
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-paste.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editpaste.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-paste.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/editpaste.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-log-out.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/exit.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-log-out.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/exit.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filefind.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filefind.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filenew.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filenew.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-open.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/fileopen.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-open.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/fileopen.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/fileprint.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/fileprint.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print-preview.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filequickprint.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print-preview.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filequickprint.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filesave.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filesave.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save-as.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filesaveas.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save-as.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/filesaveas.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/find.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/find.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/finish.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/finish.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/folder-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/folder-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/folder-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/folder-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/folder-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/folder_new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/folder-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/folder_new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-indent-less.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-indent-less.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-indent-more.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-indent-more.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-center.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-center.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-center.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-center.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-fill.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-fill.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-fill.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-fill.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-left.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-left.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-left.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-left.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-right.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-right.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-right.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-justify-right.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-bold.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-bold.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-bold.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-bold.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-italic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-italic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-italic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-italic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-strikethrough.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-strikethrough.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-strikethrough.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-strikethrough.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-underline.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-underline.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-underline.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/format-text-underline.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/forward.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/forward.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-lock-screen.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-lockscreen.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-lock-screen.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-lockscreen.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-log-out.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-logout.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-log-out.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-logout.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-search.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-searchtool.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-search.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-searchtool.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-log-out.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-session-logout.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-log-out.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-session-logout.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-shutdown.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-shutdown.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-shutdown.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-shutdown.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-mail-fwd.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-mail-fwd.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-message-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-mail-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-message-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-mail-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-sender.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-mail-rpl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-sender.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-mail-rpl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-text-indent.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-text-indent.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-text-unindent.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gnome-stock-text-unindent.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-bottom.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-bottom.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-bottom.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-bottom.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-down.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-down.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-down.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-down.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-first.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-first.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-home.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-home.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-jump.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-jump.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-jump.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-jump.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-last.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-last.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-next.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-next.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-previous.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-previous.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-top.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-top.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-top.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-top.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-up.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-up.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-up.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/go-up.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gohome.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gohome.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/list-add.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-add.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/list-add.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-add.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-bold.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-bold.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-bold.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-bold.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-cancel.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-cancel.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-clear.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-clear.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-clear.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-clear.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-copy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-copy.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-copy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-copy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-cut.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-cut.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-cut.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-cut.svg
diff --git a/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-delete.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-delete.svg
new file mode 100644
index 0000000..69281e4
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-delete.svg
@@ -0,0 +1,896 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg57"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+   sodipodi:docname="edit-delete.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective141" />
+    <linearGradient
+       id="linearGradient3241">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop3243" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop3245" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3229">
+      <stop
+         style="stop-color:#598bcb;stop-opacity:1;"
+         offset="0"
+         id="stop3231" />
+      <stop
+         id="stop3249"
+         offset="0.75675678"
+         style="stop-color:#2f5c96;stop-opacity:1;" />
+      <stop
+         style="stop-color:#203e65;stop-opacity:1;"
+         offset="1"
+         id="stop3233" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3175">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop3177" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop3179" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3159">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop3161" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop3163" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3141">
+      <stop
+         style="stop-color:#a40000;stop-opacity:1;"
+         offset="0"
+         id="stop3143" />
+      <stop
+         style="stop-color:#ffc4c4;stop-opacity:1;"
+         offset="1"
+         id="stop3145" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3008">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop3010" />
+      <stop
+         style="stop-color:#d3d3d3;stop-opacity:1;"
+         offset="1"
+         id="stop3012" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2978">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop2980" />
+      <stop
+         style="stop-color:#d5d5d5;stop-opacity:1;"
+         offset="1"
+         id="stop2982" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2964">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop2966" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2968" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5060">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop5062" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5064" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       id="linearGradient5048">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop5050" />
+      <stop
+         id="stop5056"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5052" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5048"
+       id="linearGradient6715"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507" />
+    <linearGradient
+       id="linearGradient381">
+      <stop
+         id="stop382"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop383"
+         offset="1"
+         style="stop-color:white;stop-opacity:0.84466022;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient368">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.10309278;"
+         offset="0.0000000"
+         id="stop369" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop372" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1065">
+      <stop
+         style="stop-color:#b5c051;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop1066" />
+      <stop
+         style="stop-color:#858e3f;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop1067" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient172">
+      <stop
+         id="stop173"
+         offset="0.0000000"
+         style="stop-color:#616c08;stop-opacity:1.0000000;" />
+      <stop
+         id="stop174"
+         offset="1.0000000"
+         style="stop-color:#495106;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient161">
+      <stop
+         id="stop162"
+         offset="0.0000000"
+         style="stop-color:#575955;stop-opacity:1.0000000;" />
+      <stop
+         id="stop163"
+         offset="1.0000000"
+         style="stop-color:#7c7e79;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient157">
+      <stop
+         id="stop158"
+         offset="0.0000000"
+         style="stop-color:#babdb6;stop-opacity:1.0000000;" />
+      <stop
+         id="stop159"
+         offset="1.0000000"
+         style="stop-color:#f1f5ec;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient149"
+       inkscape:collect="always">
+      <stop
+         id="stop150"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop151"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1869">
+      <stop
+         style="stop-color:#c9c9c9;stop-opacity:1;"
+         offset="0"
+         id="stop1870" />
+      <stop
+         style="stop-color:#787a7b;stop-opacity:1;"
+         offset="1"
+         id="stop1871" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="69.460503"
+       x2="7.5291119"
+       y1="27.376621"
+       x1="7.3738608"
+       gradientTransform="matrix(3.495016,0,0,0.344323,-2.972087,-3.408148e-2)"
+       id="linearGradient152"
+       xlink:href="#linearGradient149"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient149"
+       id="linearGradient2058"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.520411,0,0,0.348016,-3.037918,1.544257)"
+       x1="7.3738608"
+       y1="27.376621"
+       x2="7.5291119"
+       y2="69.460503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2964"
+       id="linearGradient2970"
+       x1="27.5"
+       y1="14"
+       x2="27.625"
+       y2="18.750015"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.799991,0,-1.199875)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2984"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-17.82887,-61.79699)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-16.18243,-61.79699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-14.33255,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2996"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-12.67991,-61.03155)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3000"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-10.78506,-60.99081)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3004"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-19.58362,-61.75172)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3008"
+       id="linearGradient3097"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.984533,0,0,1.203586,0.971903,-2.123191)"
+       x1="26.151339"
+       y1="-5.7401156"
+       x2="27.500387"
+       y2="13.351768" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3107"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-8.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3111"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-6.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3115"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-4.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3119"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-2.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-0.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3127"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,1.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3131"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,3.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3135"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,5.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3141"
+       id="linearGradient3147"
+       x1="40.5"
+       y1="13.822797"
+       x2="40.5"
+       y2="16.877842"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3159"
+       id="linearGradient3165"
+       x1="23.5"
+       y1="12"
+       x2="23.5"
+       y2="6.6875"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3175"
+       id="linearGradient3181"
+       x1="25"
+       y1="21"
+       x2="25"
+       y2="32.25"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3229"
+       id="linearGradient3239"
+       gradientUnits="userSpaceOnUse"
+       x1="24.000006"
+       y1="15.837313"
+       x2="24.000006"
+       y2="21" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3241"
+       id="linearGradient3247"
+       x1="21.67791"
+       y1="19.969507"
+       x2="22.333523"
+       y2="11.643976"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     showborder="true"
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666"
+     borderopacity="0.13333333"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="-117.40141"
+     inkscape:cy="39.043402"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="872"
+     inkscape:window-height="688"
+     inkscape:window-x="562"
+     inkscape:window-y="156"
+     inkscape:showpageshadow="false"
+     inkscape:object-nodes="true"
+     inkscape:object-points="false"
+     inkscape:object-bbox="false"
+     inkscape:guide-bbox="false"
+     inkscape:grid-points="true"
+     inkscape:object-paths="false">
+    <inkscape:grid
+       id="GridFromPre046Settings"
+       type="xygrid"
+       originx="0px"
+       originy="0px"
+       spacingx="1px"
+       spacingy="1px"
+       color="#0000ff"
+       empcolor="#0000ff"
+       opacity="0.2"
+       empopacity="0.4"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Delete</dc:title>
+        <dc:date />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>edit</rdf:li>
+            <rdf:li>delete</rdf:li>
+            <rdf:li>shredder</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>Novell, Inc.</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:contributor>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       style="display:inline"
+       transform="matrix(2.262383e-2,0,0,1.966248e-2,44.39519,41.98146)"
+       id="g6707">
+      <rect
+         style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         id="rect6709"
+         width="1339.6335"
+         height="478.35718"
+         x="-1559.2523"
+         y="-150.69685" />
+      <path
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+         id="path6711"
+         sodipodi:nodetypes="cccc" />
+      <path
+         sodipodi:nodetypes="cccc"
+         id="path6713"
+         d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <path
+       style="opacity:0.38659794;color:black;fill:url(#linearGradient3181);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 4.75,21 L 43.25,21 L 42.375,32.25 L 5.625,32.25 L 4.75,21 z "
+       id="path3173" />
+    <path
+       style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.5"
+       d="M 4.000805,16.500028 C 3.9568443,16.464574 5.7277298,42.005521 5.7282343,42.013263 C 5.8943636,44.563961 7.2889479,45.496198 8.8498899,45.499996 C 8.9056682,45.500127 38.133934,45.496713 38.756644,45.494055 C 41.385341,45.482836 42.029344,43.859472 42.202267,42.085776 C 42.216136,42.050805 43.986115,16.535 43.999982,16.500028 C 30.666924,16.500028 17.333866,16.500028 4.000805,16.500028 z "
+       id="path1751"
+       sodipodi:nodetypes="ccccccc"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="opacity:0.23711338;color:black;fill:url(#linearGradient2058);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block"
+       d="M 43.457954,20.712669 L 7.2079371,20.689264 C 34.519247,21.326592 39.885144,24.337412 43.214187,24.183575 L 43.457954,20.712669 z "
+       id="path1893"
+       sodipodi:nodetypes="cccc"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <g
+       id="g3199"
+       style="opacity:0.12886598;fill:black;fill-opacity:1;stroke:black;stroke-width:1.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       transform="translate(8.838865e-2,8.838865e-2)">
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3201"
+         d="M 29.163487,19.614074 C 29.163487,19.614074 30.279473,23.33545 29.517144,26.348054 C 28.754815,29.360658 29.269248,34.210167 29.269248,34.210167 L 30.884373,34.634373 C 30.884373,34.634373 30.117495,30.028639 30.931357,26.524831 C 31.745219,23.021023 30.577814,19.614988 30.577814,19.614988 L 29.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3203"
+         d="M 9.9124168,19.759341 C 9.9124168,19.759341 11.028404,23.480717 10.266074,26.493321 C 9.5037448,29.505925 10.018178,34.355434 10.018178,34.355434 L 11.456527,33.807368 C 11.456527,33.807368 10.866426,30.173906 11.680288,26.670098 C 12.49415,23.16629 11.326745,19.760255 11.326745,19.760255 L 9.9124168,19.759341 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 11.66716,19.714074 C 11.66716,19.714074 12.783146,23.43545 12.020817,26.448054 C 11.258488,29.460658 8.617841,31.76449 8.617841,31.76449 L 9.8260378,33.73022 C 9.8260378,33.73022 12.621168,30.128639 13.43503,26.624831 C 14.248892,23.121023 13.081487,19.714988 13.081487,19.714988 L 11.66716,19.714074 z "
+         id="path3205"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3207"
+         d="M 21.163487,19.614074 C 21.163487,19.614074 22.279473,23.33545 21.517144,26.348054 C 20.754815,29.360658 21.269248,34.210167 21.269248,34.210167 L 22.928567,34.766955 C 22.928567,34.766955 22.117495,30.028639 22.931357,26.524831 C 23.745219,23.021023 22.577814,19.614988 22.577814,19.614988 L 21.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 35.163487,19.614074 C 35.163487,19.614074 36.279473,23.33545 35.517144,26.348054 C 34.754815,29.360658 36.550879,33.50306 36.550879,33.50306 L 38.077615,32.292082 C 38.077615,32.292082 36.117495,30.028639 36.931357,26.524831 C 37.745219,23.021023 36.577814,19.614988 36.577814,19.614988 L 35.163487,19.614074 z "
+         id="path3209"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 31.163487,19.614074 C 31.163487,19.614074 32.279473,23.33545 31.517144,26.348054 C 30.754815,29.360658 31.269248,34.210167 31.269248,34.210167 L 32.795984,34.148237 C 32.795984,34.148237 32.117495,30.028639 32.931357,26.524831 C 33.745219,23.021023 32.577814,19.614988 32.577814,19.614988 L 31.163487,19.614074 z "
+         id="path3211"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3213"
+         d="M 33.163487,19.614074 C 33.163487,19.614074 34.279473,23.33545 33.517144,26.348054 C 32.754815,29.360658 32.473753,34.03339 32.473753,34.03339 L 34.265654,34.457596 C 34.265654,34.457596 34.117495,30.028639 34.931357,26.524831 C 35.745219,23.021023 34.577814,19.614988 34.577814,19.614988 L 33.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 27.163487,19.614074 C 27.163487,19.614074 28.279473,23.33545 27.517144,26.348054 C 26.754815,29.360658 28.064743,33.989196 28.064743,33.989196 L 29.724062,33.308548 C 29.724062,33.308548 28.117495,30.028639 28.931357,26.524831 C 29.745219,23.021023 28.577814,19.614988 28.577814,19.614988 L 27.163487,19.614074 z "
+         id="path3215"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3217"
+         d="M 25.163487,19.614074 C 25.163487,19.614074 26.279473,23.33545 25.517144,26.348054 C 24.754815,29.360658 24.164394,34.077584 24.164394,34.077584 L 25.69113,34.280819 C 25.69113,34.280819 26.117495,30.028639 26.931357,26.524831 C 27.745219,23.021023 26.577814,19.614988 26.577814,19.614988 L 25.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 23.163487,19.614074 C 23.163487,19.614074 24.279473,23.33545 23.517144,26.348054 C 22.754815,29.360658 23.269248,34.210167 23.269248,34.210167 L 24.707596,33.662101 C 24.707596,33.662101 24.117495,30.028639 24.931357,26.524831 C 25.745219,23.021023 24.577814,19.614988 24.577814,19.614988 L 23.163487,19.614074 z "
+         id="path3219"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3221"
+         d="M 13.313608,19.714074 C 13.313608,19.714074 14.429594,23.43545 13.667265,26.448054 C 12.904936,29.460658 13.419369,34.310167 13.419369,34.310167 L 14.999517,34.698426 C 14.999517,34.698426 14.267616,30.128639 15.081478,26.624831 C 15.89534,23.121023 14.727935,19.714988 14.727935,19.714988 L 13.313608,19.714074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 19.418083,20.520258 C 19.418083,20.520258 19.615714,24.129801 19.064633,27.254238 C 18.524861,30.31456 21.306417,34.496773 21.306417,34.496773 L 22.721163,33.86443 C 22.721163,33.86443 19.926762,31.248786 20.558759,27.078695 C 21.116432,23.399015 20.83241,20.521172 20.83241,20.521172 L 19.418083,20.520258 z "
+         id="path3223"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 15.163487,19.614074 C 15.163487,19.614074 16.279473,23.33545 15.517144,26.348054 C 14.754815,29.360658 15.269248,34.210167 15.269248,34.210167 L 16.707596,33.662101 C 16.707596,33.662101 16.117495,30.028639 16.931357,26.524831 C 17.745219,23.021023 16.577814,19.614988 16.577814,19.614988 L 15.163487,19.614074 z "
+         id="path3225"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3227"
+         d="M 16.816129,20.479515 C 16.816129,20.479515 17.932115,24.200891 17.169786,27.213495 C 16.407457,30.226099 14.726988,31.80438 14.726988,31.80438 L 15.964957,32.939804 C 15.964957,32.939804 17.770137,30.89408 18.583999,27.390272 C 19.397861,23.886464 18.230456,20.480429 18.230456,20.480429 L 16.816129,20.479515 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <g
+       id="g3183">
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3123);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 29.163487,19.614074 C 29.163487,19.614074 30.279473,23.33545 29.517144,26.348054 C 28.754815,29.360658 29.269248,34.210167 29.269248,34.210167 L 30.884373,34.634373 C 30.884373,34.634373 30.117495,30.028639 30.931357,26.524831 C 31.745219,23.021023 30.577814,19.614988 30.577814,19.614988 L 29.163487,19.614074 z "
+         id="path3121"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3004);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 9.9124168,19.759341 C 9.9124168,19.759341 11.028404,23.480717 10.266074,26.493321 C 9.5037448,29.505925 10.018178,34.355434 10.018178,34.355434 L 11.456527,33.807368 C 11.456527,33.807368 10.866426,30.173906 11.680288,26.670098 C 12.49415,23.16629 11.326745,19.760255 11.326745,19.760255 L 9.9124168,19.759341 z "
+         id="path3002"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2976"
+         d="M 11.66716,19.714074 C 11.66716,19.714074 12.783146,23.43545 12.020817,26.448054 C 11.258488,29.460658 8.617841,31.76449 8.617841,31.76449 L 9.8260378,33.73022 C 9.8260378,33.73022 12.621168,30.128639 13.43503,26.624831 C 14.248892,23.121023 13.081487,19.714988 13.081487,19.714988 L 11.66716,19.714074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient2984);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3107);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 21.163487,19.614074 C 21.163487,19.614074 22.279473,23.33545 21.517144,26.348054 C 20.754815,29.360658 21.269248,34.210167 21.269248,34.210167 L 22.928567,34.766955 C 22.928567,34.766955 22.117495,30.028639 22.931357,26.524831 C 23.745219,23.021023 22.577814,19.614988 22.577814,19.614988 L 21.163487,19.614074 z "
+         id="path3105"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3133"
+         d="M 35.163487,19.614074 C 35.163487,19.614074 36.279473,23.33545 35.517144,26.348054 C 34.754815,29.360658 36.550879,33.50306 36.550879,33.50306 L 38.077615,32.292082 C 38.077615,32.292082 36.117495,30.028639 36.931357,26.524831 C 37.745219,23.021023 36.577814,19.614988 36.577814,19.614988 L 35.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3135);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3125"
+         d="M 31.163487,19.614074 C 31.163487,19.614074 32.279473,23.33545 31.517144,26.348054 C 30.754815,29.360658 31.269248,34.210167 31.269248,34.210167 L 32.795984,34.148237 C 32.795984,34.148237 32.117495,30.028639 32.931357,26.524831 C 33.745219,23.021023 32.577814,19.614988 32.577814,19.614988 L 31.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3127);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3131);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 33.163487,19.614074 C 33.163487,19.614074 34.279473,23.33545 33.517144,26.348054 C 32.754815,29.360658 32.473753,34.03339 32.473753,34.03339 L 34.265654,34.457596 C 34.265654,34.457596 34.117495,30.028639 34.931357,26.524831 C 35.745219,23.021023 34.577814,19.614988 34.577814,19.614988 L 33.163487,19.614074 z "
+         id="path3129"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3117"
+         d="M 27.163487,19.614074 C 27.163487,19.614074 28.279473,23.33545 27.517144,26.348054 C 26.754815,29.360658 28.064743,33.989196 28.064743,33.989196 L 29.724062,33.308548 C 29.724062,33.308548 28.117495,30.028639 28.931357,26.524831 C 29.745219,23.021023 28.577814,19.614988 28.577814,19.614988 L 27.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3119);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3115);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 25.163487,19.614074 C 25.163487,19.614074 26.279473,23.33545 25.517144,26.348054 C 24.754815,29.360658 24.164394,34.077584 24.164394,34.077584 L 25.69113,34.280819 C 25.69113,34.280819 26.117495,30.028639 26.931357,26.524831 C 27.745219,23.021023 26.577814,19.614988 26.577814,19.614988 L 25.163487,19.614074 z "
+         id="path3113"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3109"
+         d="M 23.163487,19.614074 C 23.163487,19.614074 24.279473,23.33545 23.517144,26.348054 C 22.754815,29.360658 23.269248,34.210167 23.269248,34.210167 L 24.707596,33.662101 C 24.707596,33.662101 24.117495,30.028639 24.931357,26.524831 C 25.745219,23.021023 24.577814,19.614988 24.577814,19.614988 L 23.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3111);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient2988);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 13.313608,19.714074 C 13.313608,19.714074 14.429594,23.43545 13.667265,26.448054 C 12.904936,29.460658 13.419369,34.310167 13.419369,34.310167 L 14.999517,34.698426 C 14.999517,34.698426 14.267616,30.128639 15.081478,26.624831 C 15.89534,23.121023 14.727935,19.714988 14.727935,19.714988 L 13.313608,19.714074 z "
+         id="path2986"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2998"
+         d="M 19.418083,20.520258 C 19.418083,20.520258 19.615714,24.129801 19.064633,27.254238 C 18.524861,30.31456 21.306417,34.496773 21.306417,34.496773 L 22.721163,33.86443 C 22.721163,33.86443 19.926762,31.248786 20.558759,27.078695 C 21.116432,23.399015 20.83241,20.521172 20.83241,20.521172 L 19.418083,20.520258 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3000);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2990"
+         d="M 15.163487,19.614074 C 15.163487,19.614074 16.279473,23.33545 15.517144,26.348054 C 14.754815,29.360658 15.269248,34.210167 15.269248,34.210167 L 16.707596,33.662101 C 16.707596,33.662101 16.117495,30.028639 16.931357,26.524831 C 17.745219,23.021023 16.577814,19.614988 16.577814,19.614988 L 15.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient2992);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient2996);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 16.816129,20.479515 C 16.816129,20.479515 17.932115,24.200891 17.169786,27.213495 C 16.407457,30.226099 14.726988,31.80438 14.726988,31.80438 L 15.964957,32.939804 C 15.964957,32.939804 17.770137,30.89408 18.583999,27.390272 C 19.397861,23.886464 18.230456,20.480429 18.230456,20.480429 L 16.816129,20.479515 z "
+         id="path2994"
+         sodipodi:nodetypes="csccscc" />
+    </g>
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.62886598"
+       d="M 5.4146811,19.121548 C 5.3634244,19.121414 6.251433,31.93862 6.9569459,40.927803 C 7.1389508,43.235262 7.5088619,44.174409 8.9423077,44.174409 C 20.759131,44.174409 37.552947,44.260504 38.124794,44.258405 C 40.891299,44.248246 40.839524,43.220919 41.068645,41.038151 C 41.152053,40.243546 42.601147,19.210922 42.587323,19.210922 C 32.686245,19.210922 17.647791,19.153519 5.4146811,19.121548 z "
+       id="path375"
+       sodipodi:nodetypes="cssssss"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="fill:url(#linearGradient3239);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 7.1632325,6.56876 C 6.0964702,6.571197 5.2036739,6.59587 4.7173745,7.611591 C 4.6328517,7.788132 2.0564582,14.953189 1.9325929,15.226435 C 0.87218423,17.565665 1.8500978,20.512357 3.8982467,20.492628 C 4.2877543,20.488998 44.257346,20.510899 44.877144,20.492628 C 46.620636,20.442134 46.843746,17.029897 46.093184,15.494889 C 46.050663,15.407927 42.567223,7.513946 42.47838,7.374125 C 42.067463,6.749683 41.147252,6.476015 40.463708,6.501646 C 40.329055,6.506821 7.2964985,6.56845 [...]
+       id="path1841"
+       sodipodi:nodetypes="cssssscss"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="opacity:0.14948454;color:black;fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 4.79225,20.902176 L 7.2921692,20.902264 L 8.0580206,41.513138 L 7.2954771,44.586329 C 6.688538,44.099871 6.4168015,43.362011 6.2792295,42.523528 L 4.79225,20.902176 z "
+       id="path2956"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="opacity:0.42783505;color:black;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 8.0335688,41.611683 L 7.3212658,44.540568 C 7.7441291,44.765463 8.0570118,44.852829 8.5125475,45.007174 L 38.538428,44.978477 C 39.11735,44.938856 39.669098,44.912678 40.052766,44.806892 L 38.00699,41.370874 L 8.0335688,41.611683 z "
+       id="path2958"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.37113402;color:black;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 38.00699,41.370874 L 40.019489,44.815762 C 40.637691,44.552557 41.349831,44.091949 41.630912,42.961864 L 43.139311,20.94521 L 39.69211,20.942984 L 38.00699,41.370874 z "
+       id="path2960"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0454103"
+       inkscape:original="M 40.46875 6.5 C 40.334098 6.505175 7.289516 6.562197 7.15625 6.5625 C 6.0894879 6.5649371 5.2050494 6.609279 4.71875 7.625 C 4.6342274 7.8015411 2.0613653 14.945504 1.9375 15.21875 C 0.87709136 17.55798 1.8581011 20.519729 3.90625 20.5 C 4.2957575 20.49637 44.255202 20.518271 44.875 20.5 C 46.618492 20.449506 46.844312 17.035008 46.09375 15.5 C 46.051228 15.413038 42.557593 7.514821 42.46875 7.375 C 42.057835 6.750558 41.152294 6.474369 40.46875 6.5 z "
+       xlink:href="#path1841"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3247);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.38659794"
+       id="path3237"
+       inkscape:href="#path1841"
+       d="M 40.375,7.53125 C 40.307786,7.5315126 40.187424,7.5621485 40.0625,7.5625 C 39.812652,7.5632031 39.458456,7.5614722 39,7.5625 C 38.083088,7.5645555 36.778275,7.5594608 35.21875,7.5625 C 32.0997,7.5685785 27.959843,7.5862798 23.8125,7.59375 C 15.517814,7.6086903 7.1755291,7.5937062 7.15625,7.59375 C 6.6366936,7.594937 6.2615608,7.6524246 6.0625,7.71875 C 5.8634392,7.7850754 5.7953622,7.77194 5.65625,8.0625 C 5.7244234,7.9201072 5.6779783,8.0363852 5.65625,8.09375 C 5.6345217,8.1 [...]
+    <path
+       style="opacity:0.82989693;color:black;fill:url(#linearGradient2970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 8,10 L 7.375,12 L 39.375001,12 L 38.593148,10.07544 L 8,10 z "
+       id="path2962"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:black;fill:url(#linearGradient3097);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000083;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 9.8535488,1.5000014 L 37.167316,1.5000014 C 37.363184,1.5000014 37.520869,1.6576863 37.520869,1.853555 L 37.520869,11.500003 C 37.520869,11.500003 9.4999952,11.500003 9.4999952,11.500003 L 9.4999952,1.853555 C 9.4999952,1.6576863 9.6576801,1.5000014 9.8535488,1.5000014 z "
+       id="rect3006"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.62886598;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.00000024;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 10.499998,10.522594 L 10.499998,2.5000011 L 36.504381,2.5000011 L 36.504381,10.611733"
+       id="path3103" />
+    <path
+       transform="matrix(0.814384,0,0,0.796379,7.58372,3.212694)"
+       d="M 43 15 A 2.5 1.25 0 1 1  38,15 A 2.5 1.25 0 1 1  43 15 z"
+       sodipodi:ry="1.25"
+       sodipodi:rx="2.5"
+       sodipodi:cy="15"
+       sodipodi:cx="40.5"
+       id="path3139"
+       style="opacity:1;color:black;fill:#c00;fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1.24172473;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;color:black;fill:#ef2929;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3147);stroke-width:1.24172473;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="path3137"
+       sodipodi:cx="40.5"
+       sodipodi:cy="15"
+       sodipodi:rx="2.5"
+       sodipodi:ry="1.25"
+       d="M 43 15 A 2.5 1.25 0 1 1  38,15 A 2.5 1.25 0 1 1  43 15 z"
+       transform="matrix(0.814384,0,0,0.796379,7.58372,2.549784)" />
+    <rect
+       style="opacity:0.27319588;color:black;fill:url(#linearGradient3165);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3157"
+       width="29"
+       height="5.3125"
+       x="9"
+       y="6.6875" />
+    <rect
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3167"
+       width="23"
+       height="1"
+       x="12"
+       y="4"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       y="6"
+       x="12"
+       height="1"
+       width="15"
+       id="rect3169"
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3171"
+       width="19"
+       height="1"
+       x="12"
+       y="8"
+       rx="0.5"
+       ry="0.5" />
+  </g>
+</svg>
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find-replace.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-find-and-replace.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find-replace.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-find-and-replace.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-find.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-find.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-fullscreen.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-fullscreen.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-fullscreen.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-fullscreen.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-back-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-back-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-back-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-back-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-down.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-down.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-down.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-down.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-forward-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-forward-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-forward-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-forward-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-up.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-up.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-up.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-go-up.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-bottom.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-bottom.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-bottom.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-bottom.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-first-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-first-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-first-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-first-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-last-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-last-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-last-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-last-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-top.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-top.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-top.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-goto-top.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-home.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-home.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-indent-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-indent-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-indent-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-indent-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-italic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-italic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-italic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-italic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-jump.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-jump-to-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-jump.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-jump-to-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-jump.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-jump-to-rtl.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-jump.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-jump-to-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-center.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-center.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-center.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-center.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-fill.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-fill.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-fill.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-fill.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-left.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-left.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-left.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-left.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-right.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-right.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-right.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-justify-right.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-forward-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-forward-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-forward-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-forward-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-next-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-next-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-next-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-next-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-pause.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-pause.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-pause.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-pause.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-start.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-play-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-start.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-play-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-previous-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-previous-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-previous-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-previous-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-record.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-record.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-record.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-record.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-rewind-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-rewind-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-rewind-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-rewind-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-stop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-stop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-stop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-media-stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-open.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-open.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-open.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-open.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-paste.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-paste.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-paste.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-paste.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print-preview.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-print-preview.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print-preview.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-print-preview.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-print.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-print.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-properties.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-properties.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-properties.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-properties.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-redo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-redo-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-redo.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-redo-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-refresh.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-refresh.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/list-remove.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-remove.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/list-remove.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-remove.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save-as.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-save-as.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save-as.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-save-as.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-save.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-save.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-select-all.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-select-all.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-select-all.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-select-all.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-stop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-strikethrough.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-strikethrough.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-strikethrough.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-strikethrough.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-underline.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-underline.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-underline.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-underline.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-undo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-undo-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-undo.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-undo-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-unindent-ltr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-unindent-ltr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-unindent-rtl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/gtk-unindent-rtl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-search.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/kfind.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-search.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/kfind.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/kfm_home.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/kfm_home.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-left.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/leftjust.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-left.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/leftjust.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/list-add.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/list-add.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/list-add.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/list-add.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/list-remove.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/list-remove.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/list-remove.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/list-remove.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-lock-screen.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/lock.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-lock-screen.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/lock.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-forward.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-forward.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-mark-junk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-mark-junk.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-mark-junk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-mark-junk.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-message-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-message-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-message-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-message-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-all.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-reply-all.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-all.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-reply-all.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-sender.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-reply-sender.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-sender.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-reply-sender.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-send-receive.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-send-receive.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-send-receive.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail-send-receive.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_forward.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_forward.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-message-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-message-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-sender.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_reply.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-sender.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_reply.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-all.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_replyall.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-all.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_replyall.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-mark-junk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_spam.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-mark-junk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/mail_spam.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-eject.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-eject.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-eject.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-eject.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-pause.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-playback-pause.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-pause.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-playback-pause.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-start.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-playback-start.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-start.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-playback-start.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-stop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-playback-stop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-stop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-playback-stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-record.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-record.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-record.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-record.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-seek-backward.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-seek-backward.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-seek-forward.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-seek-forward.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-skip-backward.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-skip-backward.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-skip-forward.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/media-skip-forward.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/next.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/next.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-eject.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_eject.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-eject.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_eject.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_end.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_end.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_fwd.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_fwd.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-pause.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_pause.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-pause.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_pause.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-start.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_play.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-start.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_play.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-record.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_record.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-record.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_record.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_rew.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_rew.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_start.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_start.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-stop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_stop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-stop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/player_stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/previous.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/previous.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/process-stop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/process-stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/redhat-home.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/redhat-home.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-redo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/redo.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-redo.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/redo.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload3.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload3.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload_all_tabs.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload_all_tabs.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload_page.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/reload_page.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/list-remove.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/remove.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/list-remove.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/remove.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-right.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/rightjust.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-right.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/rightjust.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-search.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/search.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-search.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/search.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/start.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/start.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_add-bookmark.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_add-bookmark.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-bottom.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_bottom.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-bottom.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_bottom.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-copy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_copy.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-copy.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_copy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-cut.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_cut.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-cut.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_cut.svg
diff --git a/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_delete.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_delete.svg
new file mode 100644
index 0000000..69281e4
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_delete.svg
@@ -0,0 +1,896 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg57"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+   sodipodi:docname="edit-delete.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective141" />
+    <linearGradient
+       id="linearGradient3241">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop3243" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop3245" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3229">
+      <stop
+         style="stop-color:#598bcb;stop-opacity:1;"
+         offset="0"
+         id="stop3231" />
+      <stop
+         id="stop3249"
+         offset="0.75675678"
+         style="stop-color:#2f5c96;stop-opacity:1;" />
+      <stop
+         style="stop-color:#203e65;stop-opacity:1;"
+         offset="1"
+         id="stop3233" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3175">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop3177" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop3179" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3159">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop3161" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop3163" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3141">
+      <stop
+         style="stop-color:#a40000;stop-opacity:1;"
+         offset="0"
+         id="stop3143" />
+      <stop
+         style="stop-color:#ffc4c4;stop-opacity:1;"
+         offset="1"
+         id="stop3145" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3008">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop3010" />
+      <stop
+         style="stop-color:#d3d3d3;stop-opacity:1;"
+         offset="1"
+         id="stop3012" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2978">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop2980" />
+      <stop
+         style="stop-color:#d5d5d5;stop-opacity:1;"
+         offset="1"
+         id="stop2982" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2964">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop2966" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2968" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5060">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop5062" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5064" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       id="linearGradient5048">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop5050" />
+      <stop
+         id="stop5056"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5052" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5048"
+       id="linearGradient6715"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507" />
+    <linearGradient
+       id="linearGradient381">
+      <stop
+         id="stop382"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop383"
+         offset="1"
+         style="stop-color:white;stop-opacity:0.84466022;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient368">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.10309278;"
+         offset="0.0000000"
+         id="stop369" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop372" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1065">
+      <stop
+         style="stop-color:#b5c051;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop1066" />
+      <stop
+         style="stop-color:#858e3f;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop1067" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient172">
+      <stop
+         id="stop173"
+         offset="0.0000000"
+         style="stop-color:#616c08;stop-opacity:1.0000000;" />
+      <stop
+         id="stop174"
+         offset="1.0000000"
+         style="stop-color:#495106;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient161">
+      <stop
+         id="stop162"
+         offset="0.0000000"
+         style="stop-color:#575955;stop-opacity:1.0000000;" />
+      <stop
+         id="stop163"
+         offset="1.0000000"
+         style="stop-color:#7c7e79;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient157">
+      <stop
+         id="stop158"
+         offset="0.0000000"
+         style="stop-color:#babdb6;stop-opacity:1.0000000;" />
+      <stop
+         id="stop159"
+         offset="1.0000000"
+         style="stop-color:#f1f5ec;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient149"
+       inkscape:collect="always">
+      <stop
+         id="stop150"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop151"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1869">
+      <stop
+         style="stop-color:#c9c9c9;stop-opacity:1;"
+         offset="0"
+         id="stop1870" />
+      <stop
+         style="stop-color:#787a7b;stop-opacity:1;"
+         offset="1"
+         id="stop1871" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="69.460503"
+       x2="7.5291119"
+       y1="27.376621"
+       x1="7.3738608"
+       gradientTransform="matrix(3.495016,0,0,0.344323,-2.972087,-3.408148e-2)"
+       id="linearGradient152"
+       xlink:href="#linearGradient149"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient149"
+       id="linearGradient2058"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.520411,0,0,0.348016,-3.037918,1.544257)"
+       x1="7.3738608"
+       y1="27.376621"
+       x2="7.5291119"
+       y2="69.460503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2964"
+       id="linearGradient2970"
+       x1="27.5"
+       y1="14"
+       x2="27.625"
+       y2="18.750015"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.799991,0,-1.199875)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2984"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-17.82887,-61.79699)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-16.18243,-61.79699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-14.33255,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient2996"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-12.67991,-61.03155)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3000"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-10.78506,-60.99081)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3004"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-19.58362,-61.75172)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3008"
+       id="linearGradient3097"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.984533,0,0,1.203586,0.971903,-2.123191)"
+       x1="26.151339"
+       y1="-5.7401156"
+       x2="27.500387"
+       y2="13.351768" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3107"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-8.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3111"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-6.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3115"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-4.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3119"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-2.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-0.332562,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3127"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,1.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3131"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,3.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2978"
+       id="radialGradient3135"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,5.667438,-61.89699)"
+       cx="9.5796242"
+       cy="33.588264"
+       fx="9.5796242"
+       fy="33.588264"
+       r="2.5527742" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3141"
+       id="linearGradient3147"
+       x1="40.5"
+       y1="13.822797"
+       x2="40.5"
+       y2="16.877842"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3159"
+       id="linearGradient3165"
+       x1="23.5"
+       y1="12"
+       x2="23.5"
+       y2="6.6875"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3175"
+       id="linearGradient3181"
+       x1="25"
+       y1="21"
+       x2="25"
+       y2="32.25"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3229"
+       id="linearGradient3239"
+       gradientUnits="userSpaceOnUse"
+       x1="24.000006"
+       y1="15.837313"
+       x2="24.000006"
+       y2="21" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3241"
+       id="linearGradient3247"
+       x1="21.67791"
+       y1="19.969507"
+       x2="22.333523"
+       y2="11.643976"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     showborder="true"
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666"
+     borderopacity="0.13333333"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="-117.40141"
+     inkscape:cy="39.043402"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="872"
+     inkscape:window-height="688"
+     inkscape:window-x="562"
+     inkscape:window-y="156"
+     inkscape:showpageshadow="false"
+     inkscape:object-nodes="true"
+     inkscape:object-points="false"
+     inkscape:object-bbox="false"
+     inkscape:guide-bbox="false"
+     inkscape:grid-points="true"
+     inkscape:object-paths="false">
+    <inkscape:grid
+       id="GridFromPre046Settings"
+       type="xygrid"
+       originx="0px"
+       originy="0px"
+       spacingx="1px"
+       spacingy="1px"
+       color="#0000ff"
+       empcolor="#0000ff"
+       opacity="0.2"
+       empopacity="0.4"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Delete</dc:title>
+        <dc:date />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>edit</rdf:li>
+            <rdf:li>delete</rdf:li>
+            <rdf:li>shredder</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>Novell, Inc.</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:contributor>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       style="display:inline"
+       transform="matrix(2.262383e-2,0,0,1.966248e-2,44.39519,41.98146)"
+       id="g6707">
+      <rect
+         style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         id="rect6709"
+         width="1339.6335"
+         height="478.35718"
+         x="-1559.2523"
+         y="-150.69685" />
+      <path
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+         id="path6711"
+         sodipodi:nodetypes="cccc" />
+      <path
+         sodipodi:nodetypes="cccc"
+         id="path6713"
+         d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <path
+       style="opacity:0.38659794;color:black;fill:url(#linearGradient3181);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 4.75,21 L 43.25,21 L 42.375,32.25 L 5.625,32.25 L 4.75,21 z "
+       id="path3173" />
+    <path
+       style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.5"
+       d="M 4.000805,16.500028 C 3.9568443,16.464574 5.7277298,42.005521 5.7282343,42.013263 C 5.8943636,44.563961 7.2889479,45.496198 8.8498899,45.499996 C 8.9056682,45.500127 38.133934,45.496713 38.756644,45.494055 C 41.385341,45.482836 42.029344,43.859472 42.202267,42.085776 C 42.216136,42.050805 43.986115,16.535 43.999982,16.500028 C 30.666924,16.500028 17.333866,16.500028 4.000805,16.500028 z "
+       id="path1751"
+       sodipodi:nodetypes="ccccccc"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="opacity:0.23711338;color:black;fill:url(#linearGradient2058);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block"
+       d="M 43.457954,20.712669 L 7.2079371,20.689264 C 34.519247,21.326592 39.885144,24.337412 43.214187,24.183575 L 43.457954,20.712669 z "
+       id="path1893"
+       sodipodi:nodetypes="cccc"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <g
+       id="g3199"
+       style="opacity:0.12886598;fill:black;fill-opacity:1;stroke:black;stroke-width:1.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       transform="translate(8.838865e-2,8.838865e-2)">
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3201"
+         d="M 29.163487,19.614074 C 29.163487,19.614074 30.279473,23.33545 29.517144,26.348054 C 28.754815,29.360658 29.269248,34.210167 29.269248,34.210167 L 30.884373,34.634373 C 30.884373,34.634373 30.117495,30.028639 30.931357,26.524831 C 31.745219,23.021023 30.577814,19.614988 30.577814,19.614988 L 29.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3203"
+         d="M 9.9124168,19.759341 C 9.9124168,19.759341 11.028404,23.480717 10.266074,26.493321 C 9.5037448,29.505925 10.018178,34.355434 10.018178,34.355434 L 11.456527,33.807368 C 11.456527,33.807368 10.866426,30.173906 11.680288,26.670098 C 12.49415,23.16629 11.326745,19.760255 11.326745,19.760255 L 9.9124168,19.759341 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 11.66716,19.714074 C 11.66716,19.714074 12.783146,23.43545 12.020817,26.448054 C 11.258488,29.460658 8.617841,31.76449 8.617841,31.76449 L 9.8260378,33.73022 C 9.8260378,33.73022 12.621168,30.128639 13.43503,26.624831 C 14.248892,23.121023 13.081487,19.714988 13.081487,19.714988 L 11.66716,19.714074 z "
+         id="path3205"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3207"
+         d="M 21.163487,19.614074 C 21.163487,19.614074 22.279473,23.33545 21.517144,26.348054 C 20.754815,29.360658 21.269248,34.210167 21.269248,34.210167 L 22.928567,34.766955 C 22.928567,34.766955 22.117495,30.028639 22.931357,26.524831 C 23.745219,23.021023 22.577814,19.614988 22.577814,19.614988 L 21.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 35.163487,19.614074 C 35.163487,19.614074 36.279473,23.33545 35.517144,26.348054 C 34.754815,29.360658 36.550879,33.50306 36.550879,33.50306 L 38.077615,32.292082 C 38.077615,32.292082 36.117495,30.028639 36.931357,26.524831 C 37.745219,23.021023 36.577814,19.614988 36.577814,19.614988 L 35.163487,19.614074 z "
+         id="path3209"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 31.163487,19.614074 C 31.163487,19.614074 32.279473,23.33545 31.517144,26.348054 C 30.754815,29.360658 31.269248,34.210167 31.269248,34.210167 L 32.795984,34.148237 C 32.795984,34.148237 32.117495,30.028639 32.931357,26.524831 C 33.745219,23.021023 32.577814,19.614988 32.577814,19.614988 L 31.163487,19.614074 z "
+         id="path3211"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3213"
+         d="M 33.163487,19.614074 C 33.163487,19.614074 34.279473,23.33545 33.517144,26.348054 C 32.754815,29.360658 32.473753,34.03339 32.473753,34.03339 L 34.265654,34.457596 C 34.265654,34.457596 34.117495,30.028639 34.931357,26.524831 C 35.745219,23.021023 34.577814,19.614988 34.577814,19.614988 L 33.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 27.163487,19.614074 C 27.163487,19.614074 28.279473,23.33545 27.517144,26.348054 C 26.754815,29.360658 28.064743,33.989196 28.064743,33.989196 L 29.724062,33.308548 C 29.724062,33.308548 28.117495,30.028639 28.931357,26.524831 C 29.745219,23.021023 28.577814,19.614988 28.577814,19.614988 L 27.163487,19.614074 z "
+         id="path3215"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3217"
+         d="M 25.163487,19.614074 C 25.163487,19.614074 26.279473,23.33545 25.517144,26.348054 C 24.754815,29.360658 24.164394,34.077584 24.164394,34.077584 L 25.69113,34.280819 C 25.69113,34.280819 26.117495,30.028639 26.931357,26.524831 C 27.745219,23.021023 26.577814,19.614988 26.577814,19.614988 L 25.163487,19.614074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 23.163487,19.614074 C 23.163487,19.614074 24.279473,23.33545 23.517144,26.348054 C 22.754815,29.360658 23.269248,34.210167 23.269248,34.210167 L 24.707596,33.662101 C 24.707596,33.662101 24.117495,30.028639 24.931357,26.524831 C 25.745219,23.021023 24.577814,19.614988 24.577814,19.614988 L 23.163487,19.614074 z "
+         id="path3219"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3221"
+         d="M 13.313608,19.714074 C 13.313608,19.714074 14.429594,23.43545 13.667265,26.448054 C 12.904936,29.460658 13.419369,34.310167 13.419369,34.310167 L 14.999517,34.698426 C 14.999517,34.698426 14.267616,30.128639 15.081478,26.624831 C 15.89534,23.121023 14.727935,19.714988 14.727935,19.714988 L 13.313608,19.714074 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 19.418083,20.520258 C 19.418083,20.520258 19.615714,24.129801 19.064633,27.254238 C 18.524861,30.31456 21.306417,34.496773 21.306417,34.496773 L 22.721163,33.86443 C 22.721163,33.86443 19.926762,31.248786 20.558759,27.078695 C 21.116432,23.399015 20.83241,20.521172 20.83241,20.521172 L 19.418083,20.520258 z "
+         id="path3223"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 15.163487,19.614074 C 15.163487,19.614074 16.279473,23.33545 15.517144,26.348054 C 14.754815,29.360658 15.269248,34.210167 15.269248,34.210167 L 16.707596,33.662101 C 16.707596,33.662101 16.117495,30.028639 16.931357,26.524831 C 17.745219,23.021023 16.577814,19.614988 16.577814,19.614988 L 15.163487,19.614074 z "
+         id="path3225"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3227"
+         d="M 16.816129,20.479515 C 16.816129,20.479515 17.932115,24.200891 17.169786,27.213495 C 16.407457,30.226099 14.726988,31.80438 14.726988,31.80438 L 15.964957,32.939804 C 15.964957,32.939804 17.770137,30.89408 18.583999,27.390272 C 19.397861,23.886464 18.230456,20.480429 18.230456,20.480429 L 16.816129,20.479515 z "
+         style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <g
+       id="g3183">
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3123);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 29.163487,19.614074 C 29.163487,19.614074 30.279473,23.33545 29.517144,26.348054 C 28.754815,29.360658 29.269248,34.210167 29.269248,34.210167 L 30.884373,34.634373 C 30.884373,34.634373 30.117495,30.028639 30.931357,26.524831 C 31.745219,23.021023 30.577814,19.614988 30.577814,19.614988 L 29.163487,19.614074 z "
+         id="path3121"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3004);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 9.9124168,19.759341 C 9.9124168,19.759341 11.028404,23.480717 10.266074,26.493321 C 9.5037448,29.505925 10.018178,34.355434 10.018178,34.355434 L 11.456527,33.807368 C 11.456527,33.807368 10.866426,30.173906 11.680288,26.670098 C 12.49415,23.16629 11.326745,19.760255 11.326745,19.760255 L 9.9124168,19.759341 z "
+         id="path3002"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2976"
+         d="M 11.66716,19.714074 C 11.66716,19.714074 12.783146,23.43545 12.020817,26.448054 C 11.258488,29.460658 8.617841,31.76449 8.617841,31.76449 L 9.8260378,33.73022 C 9.8260378,33.73022 12.621168,30.128639 13.43503,26.624831 C 14.248892,23.121023 13.081487,19.714988 13.081487,19.714988 L 11.66716,19.714074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient2984);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3107);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 21.163487,19.614074 C 21.163487,19.614074 22.279473,23.33545 21.517144,26.348054 C 20.754815,29.360658 21.269248,34.210167 21.269248,34.210167 L 22.928567,34.766955 C 22.928567,34.766955 22.117495,30.028639 22.931357,26.524831 C 23.745219,23.021023 22.577814,19.614988 22.577814,19.614988 L 21.163487,19.614074 z "
+         id="path3105"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3133"
+         d="M 35.163487,19.614074 C 35.163487,19.614074 36.279473,23.33545 35.517144,26.348054 C 34.754815,29.360658 36.550879,33.50306 36.550879,33.50306 L 38.077615,32.292082 C 38.077615,32.292082 36.117495,30.028639 36.931357,26.524831 C 37.745219,23.021023 36.577814,19.614988 36.577814,19.614988 L 35.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3135);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3125"
+         d="M 31.163487,19.614074 C 31.163487,19.614074 32.279473,23.33545 31.517144,26.348054 C 30.754815,29.360658 31.269248,34.210167 31.269248,34.210167 L 32.795984,34.148237 C 32.795984,34.148237 32.117495,30.028639 32.931357,26.524831 C 33.745219,23.021023 32.577814,19.614988 32.577814,19.614988 L 31.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3127);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3131);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 33.163487,19.614074 C 33.163487,19.614074 34.279473,23.33545 33.517144,26.348054 C 32.754815,29.360658 32.473753,34.03339 32.473753,34.03339 L 34.265654,34.457596 C 34.265654,34.457596 34.117495,30.028639 34.931357,26.524831 C 35.745219,23.021023 34.577814,19.614988 34.577814,19.614988 L 33.163487,19.614074 z "
+         id="path3129"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3117"
+         d="M 27.163487,19.614074 C 27.163487,19.614074 28.279473,23.33545 27.517144,26.348054 C 26.754815,29.360658 28.064743,33.989196 28.064743,33.989196 L 29.724062,33.308548 C 29.724062,33.308548 28.117495,30.028639 28.931357,26.524831 C 29.745219,23.021023 28.577814,19.614988 28.577814,19.614988 L 27.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3119);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient3115);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 25.163487,19.614074 C 25.163487,19.614074 26.279473,23.33545 25.517144,26.348054 C 24.754815,29.360658 24.164394,34.077584 24.164394,34.077584 L 25.69113,34.280819 C 25.69113,34.280819 26.117495,30.028639 26.931357,26.524831 C 27.745219,23.021023 26.577814,19.614988 26.577814,19.614988 L 25.163487,19.614074 z "
+         id="path3113"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path3109"
+         d="M 23.163487,19.614074 C 23.163487,19.614074 24.279473,23.33545 23.517144,26.348054 C 22.754815,29.360658 23.269248,34.210167 23.269248,34.210167 L 24.707596,33.662101 C 24.707596,33.662101 24.117495,30.028639 24.931357,26.524831 C 25.745219,23.021023 24.577814,19.614988 24.577814,19.614988 L 23.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3111);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient2988);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 13.313608,19.714074 C 13.313608,19.714074 14.429594,23.43545 13.667265,26.448054 C 12.904936,29.460658 13.419369,34.310167 13.419369,34.310167 L 14.999517,34.698426 C 14.999517,34.698426 14.267616,30.128639 15.081478,26.624831 C 15.89534,23.121023 14.727935,19.714988 14.727935,19.714988 L 13.313608,19.714074 z "
+         id="path2986"
+         sodipodi:nodetypes="csccscc" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2998"
+         d="M 19.418083,20.520258 C 19.418083,20.520258 19.615714,24.129801 19.064633,27.254238 C 18.524861,30.31456 21.306417,34.496773 21.306417,34.496773 L 22.721163,33.86443 C 22.721163,33.86443 19.926762,31.248786 20.558759,27.078695 C 21.116432,23.399015 20.83241,20.521172 20.83241,20.521172 L 19.418083,20.520258 z "
+         style="opacity:1;color:black;fill:url(#radialGradient3000);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         sodipodi:nodetypes="csccscc"
+         id="path2990"
+         d="M 15.163487,19.614074 C 15.163487,19.614074 16.279473,23.33545 15.517144,26.348054 C 14.754815,29.360658 15.269248,34.210167 15.269248,34.210167 L 16.707596,33.662101 C 16.707596,33.662101 16.117495,30.028639 16.931357,26.524831 C 17.745219,23.021023 16.577814,19.614988 16.577814,19.614988 L 15.163487,19.614074 z "
+         style="opacity:1;color:black;fill:url(#radialGradient2992);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1;color:black;fill:url(#radialGradient2996);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M 16.816129,20.479515 C 16.816129,20.479515 17.932115,24.200891 17.169786,27.213495 C 16.407457,30.226099 14.726988,31.80438 14.726988,31.80438 L 15.964957,32.939804 C 15.964957,32.939804 17.770137,30.89408 18.583999,27.390272 C 19.397861,23.886464 18.230456,20.480429 18.230456,20.480429 L 16.816129,20.479515 z "
+         id="path2994"
+         sodipodi:nodetypes="csccscc" />
+    </g>
+    <path
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.62886598"
+       d="M 5.4146811,19.121548 C 5.3634244,19.121414 6.251433,31.93862 6.9569459,40.927803 C 7.1389508,43.235262 7.5088619,44.174409 8.9423077,44.174409 C 20.759131,44.174409 37.552947,44.260504 38.124794,44.258405 C 40.891299,44.248246 40.839524,43.220919 41.068645,41.038151 C 41.152053,40.243546 42.601147,19.210922 42.587323,19.210922 C 32.686245,19.210922 17.647791,19.153519 5.4146811,19.121548 z "
+       id="path375"
+       sodipodi:nodetypes="cssssss"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="fill:url(#linearGradient3239);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 7.1632325,6.56876 C 6.0964702,6.571197 5.2036739,6.59587 4.7173745,7.611591 C 4.6328517,7.788132 2.0564582,14.953189 1.9325929,15.226435 C 0.87218423,17.565665 1.8500978,20.512357 3.8982467,20.492628 C 4.2877543,20.488998 44.257346,20.510899 44.877144,20.492628 C 46.620636,20.442134 46.843746,17.029897 46.093184,15.494889 C 46.050663,15.407927 42.567223,7.513946 42.47838,7.374125 C 42.067463,6.749683 41.147252,6.476015 40.463708,6.501646 C 40.329055,6.506821 7.2964985,6.56845 [...]
+       id="path1841"
+       sodipodi:nodetypes="cssssscss"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+    <path
+       style="opacity:0.14948454;color:black;fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 4.79225,20.902176 L 7.2921692,20.902264 L 8.0580206,41.513138 L 7.2954771,44.586329 C 6.688538,44.099871 6.4168015,43.362011 6.2792295,42.523528 L 4.79225,20.902176 z "
+       id="path2956"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="opacity:0.42783505;color:black;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 8.0335688,41.611683 L 7.3212658,44.540568 C 7.7441291,44.765463 8.0570118,44.852829 8.5125475,45.007174 L 38.538428,44.978477 C 39.11735,44.938856 39.669098,44.912678 40.052766,44.806892 L 38.00699,41.370874 L 8.0335688,41.611683 z "
+       id="path2958"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.37113402;color:black;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 38.00699,41.370874 L 40.019489,44.815762 C 40.637691,44.552557 41.349831,44.091949 41.630912,42.961864 L 43.139311,20.94521 L 39.69211,20.942984 L 38.00699,41.370874 z "
+       id="path2960"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0454103"
+       inkscape:original="M 40.46875 6.5 C 40.334098 6.505175 7.289516 6.562197 7.15625 6.5625 C 6.0894879 6.5649371 5.2050494 6.609279 4.71875 7.625 C 4.6342274 7.8015411 2.0613653 14.945504 1.9375 15.21875 C 0.87709136 17.55798 1.8581011 20.519729 3.90625 20.5 C 4.2957575 20.49637 44.255202 20.518271 44.875 20.5 C 46.618492 20.449506 46.844312 17.035008 46.09375 15.5 C 46.051228 15.413038 42.557593 7.514821 42.46875 7.375 C 42.057835 6.750558 41.152294 6.474369 40.46875 6.5 z "
+       xlink:href="#path1841"
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3247);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.38659794"
+       id="path3237"
+       inkscape:href="#path1841"
+       d="M 40.375,7.53125 C 40.307786,7.5315126 40.187424,7.5621485 40.0625,7.5625 C 39.812652,7.5632031 39.458456,7.5614722 39,7.5625 C 38.083088,7.5645555 36.778275,7.5594608 35.21875,7.5625 C 32.0997,7.5685785 27.959843,7.5862798 23.8125,7.59375 C 15.517814,7.6086903 7.1755291,7.5937062 7.15625,7.59375 C 6.6366936,7.594937 6.2615608,7.6524246 6.0625,7.71875 C 5.8634392,7.7850754 5.7953622,7.77194 5.65625,8.0625 C 5.7244234,7.9201072 5.6779783,8.0363852 5.65625,8.09375 C 5.6345217,8.1 [...]
+    <path
+       style="opacity:0.82989693;color:black;fill:url(#linearGradient2970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 8,10 L 7.375,12 L 39.375001,12 L 38.593148,10.07544 L 8,10 z "
+       id="path2962"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:black;fill:url(#linearGradient3097);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000083;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 9.8535488,1.5000014 L 37.167316,1.5000014 C 37.363184,1.5000014 37.520869,1.6576863 37.520869,1.853555 L 37.520869,11.500003 C 37.520869,11.500003 9.4999952,11.500003 9.4999952,11.500003 L 9.4999952,1.853555 C 9.4999952,1.6576863 9.6576801,1.5000014 9.8535488,1.5000014 z "
+       id="rect3006"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:0.62886598;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.00000024;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 10.499998,10.522594 L 10.499998,2.5000011 L 36.504381,2.5000011 L 36.504381,10.611733"
+       id="path3103" />
+    <path
+       transform="matrix(0.814384,0,0,0.796379,7.58372,3.212694)"
+       d="M 43 15 A 2.5 1.25 0 1 1  38,15 A 2.5 1.25 0 1 1  43 15 z"
+       sodipodi:ry="1.25"
+       sodipodi:rx="2.5"
+       sodipodi:cy="15"
+       sodipodi:cx="40.5"
+       id="path3139"
+       style="opacity:1;color:black;fill:#c00;fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1.24172473;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:1;color:black;fill:#ef2929;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3147);stroke-width:1.24172473;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="path3137"
+       sodipodi:cx="40.5"
+       sodipodi:cy="15"
+       sodipodi:rx="2.5"
+       sodipodi:ry="1.25"
+       d="M 43 15 A 2.5 1.25 0 1 1  38,15 A 2.5 1.25 0 1 1  43 15 z"
+       transform="matrix(0.814384,0,0,0.796379,7.58372,2.549784)" />
+    <rect
+       style="opacity:0.27319588;color:black;fill:url(#linearGradient3165);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3157"
+       width="29"
+       height="5.3125"
+       x="9"
+       y="6.6875" />
+    <rect
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3167"
+       width="23"
+       height="1"
+       x="12"
+       y="4"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       y="6"
+       x="12"
+       height="1"
+       width="15"
+       id="rect3169"
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       style="opacity:0.13917526;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect3171"
+       width="19"
+       height="1"
+       x="12"
+       y="8"
+       rx="0.5"
+       ry="0.5" />
+  </g>
+</svg>
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-down.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_down.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-down.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_down.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-properties.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_file-properites.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-properties.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_file-properites.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_first.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-first.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_first.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-fullscreen.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_fullscreen.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-fullscreen.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_fullscreen.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_help-add-bookmark.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/bookmark-new.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_help-add-bookmark.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_home.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-home.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_home.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_last.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-last.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_last.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_left.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-previous.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_left.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-message-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-compose.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-message-new.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-compose.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-forward.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-forward.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-forward.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-all.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-reply-to-all.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-all.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-reply-to-all.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-sender.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-reply.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-reply-sender.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-reply.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-send-receive.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-send-receive.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-send-receive.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_mail-send-receive.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-fwd.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-forward.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-fwd.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-next.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-forward.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-next.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-pause.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-pause.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-pause.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-pause.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-start.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-play.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-start.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-play.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-prev.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-skip-backward.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-prev.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-record.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-rec.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-record.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-rec.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-rew.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-seek-backward.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-rew.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-stop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-stop.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/media-playback-stop.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_media-stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/address-book-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-address-book.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/address-book-new.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-address-book.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/appointment-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-appointment.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/appointment-new.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-appointment.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/contact-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-bcard.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/contact-new.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-bcard.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/folder-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-dir.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/folder-new.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-dir.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/tab-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-tab.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/tab-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-tab.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-text.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-new.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-text.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/window-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-window.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/window-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_new-window.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-paste.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_paste.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-paste.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_paste.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print-preview.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_print-preview.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print-preview.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_print-preview.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_print.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-print.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_print.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-properties.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_properties.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-properties.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_properties.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-redo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_redo.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-redo.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_redo.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_refresh.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_refresh.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_right.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-next.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_right.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save-as.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_save-as.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save-as.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_save-as.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_save.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/document-save.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_save.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find-replace.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_search-and-replace.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find-replace.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_search-and-replace.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_search.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-find.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_search.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-select-all.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_select-all.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-select-all.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_select-all.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-mark-junk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_spam.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-mark-junk.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_spam.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_stop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-strikethrough.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text-strikethrough.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-strikethrough.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text-strikethrough.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-bold.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_bold.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-bold.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_bold.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-center.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_center.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-center.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_center.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_indent.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-more.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_indent.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-italic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_italic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-italic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_italic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-fill.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_justify.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-fill.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_justify.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-left.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_left.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-left.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_left.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-right.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_right.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-justify-right.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_right.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-underline.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_underlined.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-underline.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_underlined.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_unindent.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-indent-less.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_text_unindent.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-top.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_top.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-top.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_top.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-undo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_undo.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-undo.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_undo.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-up.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_up.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-up.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stock_up.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stop.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/process-stop.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-lock-screen.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-lock-screen.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-lock-screen.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-lock-screen.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-log-out.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-log-out.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-log-out.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-log-out.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-search.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-search.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-search.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-search.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-shutdown.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-shutdown.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-shutdown.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/system-shutdown.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/tab-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/tab-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/tab-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/tab-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/tab-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/tab_new.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/tab-new.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/tab_new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-bold.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_bold.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-bold.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_bold.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-italic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_italic.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-italic.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_italic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-strikethrough.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_strike.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-strikethrough.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_strike.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-underline.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_under.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/format-text-underline.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/text_under.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-top.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/top.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-top.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/top.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-undo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/undo.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-undo.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/undo.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/go-up.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/up.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/go-up.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/up.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-fullscreen.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/view-fullscreen.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-fullscreen.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/view-fullscreen.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/view-refresh.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-refresh.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/view-refresh.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/window-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/window-new.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/actions/window-new.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/window-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/view-fullscreen.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/window_fullscreen.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/view-fullscreen.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/window_fullscreen.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/window-new.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/window_new.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/window-new.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/window_new.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/system-lock-screen.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/actions/xfce-system-lock.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/actions/system-lock-screen.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/actions/xfce-system-lock.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-accessibility.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/access.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-accessibility.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/access.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-accessibility.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessibility-directory.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-accessibility.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessibility-directory.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-calculator.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessories-calculator.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-calculator.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessories-calculator.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-character-map.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessories-character-map.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-character-map.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessories-character-map.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-text-editor.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessories-text-editor.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-text-editor.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/accessories-text-editor.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/background.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/background.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-web-browser.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/browser.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-web-browser.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/browser.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-calculator.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/calc.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-calculator.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/calc.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-locale.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/config-language.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-locale.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/config-language.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-users.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/config-users.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-users.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/config-users.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/office-calendar.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/date.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/office-calendar.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/date.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/email.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/email.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/file-manager.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/file-manager.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-font.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/fonts.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-font.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/fonts.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-calculator.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-calculator.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-calculator.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-calculator.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-character-map.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-character-map.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-character-map.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-character-map.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-help.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-help.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-system-monitor.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-monitor.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-system-monitor.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-monitor.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-remote-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-remote-desktop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-remote-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-remote-desktop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-session.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-session.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-session.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-session.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-accessibility.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-accessibility-technologies.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-accessibility.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-accessibility-technologies.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-background.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-background.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-font.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-font.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-font.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-font.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-keyboard-shortcuts.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-keybindings.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-keyboard-shortcuts.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-keybindings.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-theme.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-theme.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-theme.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-settings-theme.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-terminal.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-terminal.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-window-manager.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gnome-window-manager.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-character-map.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gucharmap.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-character-map.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/gucharmap.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/help-browser.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/help-browser.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-group-chat.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-group-chat.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-group-chat.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-group-chat.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-mail.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-mail.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-news-reader.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-news-reader.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-news-reader.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-news-reader.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-web-browser.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-web-browser.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-web-browser.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/internet-web-browser.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-calculator.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kcalc.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-calculator.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kcalc.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-character-map.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kcharselect.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-character-map.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kcharselect.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kcmkwm.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kcmkwm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-text-editor.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kedit.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-text-editor.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kedit.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-keyboard-shortcuts.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/key_bindings.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-keyboard-shortcuts.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/key_bindings.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kfm.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kfm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/khelpcenter.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/khelpcenter.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/konsole.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/konsole.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-remote-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/krfb.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-remote-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/krfb.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-screensaver.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kscreensaver.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-screensaver.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kscreensaver.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-system-monitor.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/ksysguard.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-system-monitor.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/ksysguard.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-users.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kuser.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-users.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kuser.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kwin.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/kwin.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-locale.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/locale.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-locale.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/locale.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/mail_generic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/mail_generic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/office-calendar.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/office-calendar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/office-calendar.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/office-calendar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/openterm.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/openterm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-accessibility.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-accessibility.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-accessibility.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-accessibility.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-assistive-technology.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-assistive-technology.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-assistive-technology.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-assistive-technology.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-font.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-font.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-font.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-font.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-keyboard-shortcuts.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-keyboard-shortcuts.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-keyboard-shortcuts.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-keyboard-shortcuts.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-locale.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-locale.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-locale.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-locale.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-multimedia.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-multimedia.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-multimedia.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-multimedia.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-remote-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-remote-desktop.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-remote-desktop.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-remote-desktop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-screensaver.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-screensaver.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-screensaver.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-screensaver.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-theme.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-theme.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-theme.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-theme.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-wallpaper.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-desktop-wallpaper.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-network-proxy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-system-network-proxy.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-network-proxy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-system-network-proxy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-session.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-system-session.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-session.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-system-session.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-system-windows.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/preferences-system-windows.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-network-proxy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/proxy-config.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-network-proxy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/proxy-config.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-network-proxy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/proxy.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-network-proxy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/proxy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/redhat-email.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/redhat-email.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/redhat-filemanager.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/redhat-filemanager.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-web-browser.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/redhat-web-browser.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-web-browser.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/redhat-web-browser.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-screensaver.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/screensaver.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-screensaver.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/screensaver.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-network-proxy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/stock_proxy.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-network-proxy.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/stock_proxy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-theme.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/style.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-theme.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/style.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/susehelpcenter.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/susehelpcenter.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-users.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-config-users.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-users.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-config-users.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-file-manager.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-file-manager.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-installer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-installer.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-installer.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-installer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-software-update.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-software-update.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-software-update.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-software-update.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-users.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-users.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-users.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/system-users.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/terminal.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/terminal.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-text-editor.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/text-editor.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-text-editor.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/text-editor.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-software-update.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/update-manager.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-software-update.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/update-manager.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-system-monitor.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/utilities-system-monitor.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-system-monitor.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/utilities-system-monitor.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/utilities-terminal.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/utilities-terminal.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/wallpaper.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/wallpaper.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-web-browser.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/web-browser.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-web-browser.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/web-browser.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/office-calendar.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfcalendar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/apps/office-calendar.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfcalendar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-text-editor.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-edit.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/accessories-text-editor.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-edit.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-filemanager.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-file-manager.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-filemanager.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-mail.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/internet-mail.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-mail.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-man.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/help-browser.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-man.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-terminal.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/utilities-terminal.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce-terminal.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce4-backdrop.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-wallpaper.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce4-backdrop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-session.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce4-session.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-session.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce4-session.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-theme.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce4-ui.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-theme.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfce4-ui.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfwm4.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-system-windows.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xfwm4.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/office-calendar.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/ximian-evolution-calendar.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/office-calendar.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/ximian-evolution-calendar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-screensaver.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xscreensaver.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/preferences-desktop-screensaver.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/xscreensaver.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/apps/system-software-update.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/apps/zen-icon.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/apps/system-software-update.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/apps/zen-icon.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-accessories.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-accessories.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-development.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-development.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-games.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-games.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-graphics.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-graphics.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-internet.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-internet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-multimedia.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-multimedia.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-office.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-office.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-other.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-other.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-other.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-other.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-system.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/applications-system.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-applications.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-applications.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-control-center.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-control-center.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-devel.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-devel.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-globe.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-globe.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-graphics.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-graphics.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-joystick.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-joystick.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-multimedia.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-multimedia.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-other.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-other.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-other.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-other.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-settings.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-settings.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-system.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-system.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-util.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gnome-util.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gtk-preferences.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/gtk-preferences.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop-peripherals.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/input_devices_settings.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop-peripherals.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/input_devices_settings.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/kcontrol.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/kcontrol.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_development.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_development.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_games.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_games.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_graphics.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_graphics.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_multimedia.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_multimedia.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_network.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_network.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_office.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_office.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_settings.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-system.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_settings.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_system.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_system.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_utilities.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/package_utilities.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop-peripherals.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/preferences-desktop-peripherals.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop-peripherals.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/preferences-desktop-peripherals.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/preferences-desktop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/preferences-desktop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/preferences-system.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-system.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/preferences-system.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-accessories.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-accessories.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-games.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-games.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-graphics.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-graphics.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-internet.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-internet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-office.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-office.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-preferences.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-preferences.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-programming.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-programming.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-sound_video.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-sound_video.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-system_settings.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-system.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-system_settings.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-system_tools.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/redhat-system_tools.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/stock_internet.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/stock_internet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-devel.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-development.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-devel.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-games.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-games.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-games.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-graphics.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-graphics.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-graphics.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-internet.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-internet.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-internet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-multimedia.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-multimedia.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-multimedia.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-office.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-office.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-office.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-system-settings.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-system.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-system-settings.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-system.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-system.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-system.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-utils.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/applications-accessories.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce-utils.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce4-settings.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/categories/preferences-desktop.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/categories/xfce4-settings.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/3floppy_unmount.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/3floppy_unmount.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-card.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/audio-card.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-card.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/audio-card.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-input-microphone.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/audio-input-microphone.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-input-microphone.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/audio-input-microphone.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/battery.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/battery.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/battery.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/battery.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/camera-photo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera-photo.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/camera-photo.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera-photo.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/camera-video.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera-video.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/camera-video.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera-video.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/camera-photo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/camera-photo.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/camera-photo.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera_unmount.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/camera-photo.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/camera_unmount.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/cdrom_unmount.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/cdrom_unmount.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/cdwriter_unmount.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/cdwriter_unmount.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/video-display.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/chardevice.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/video-display.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/chardevice.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/computer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/computer.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/computer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/computer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/video-display.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/display.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/video-display.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/display.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-cdrom.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-cdrom.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-harddisk.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-harddisk.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-optical.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-optical.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-removable-media.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/drive-removable-media.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/dvd_unmount.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/dvd_unmount.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/battery.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-battery.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/battery.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-battery.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-cdrom-audio.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-cdrom-audio.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-cdrom.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-cdrom.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/computer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-computer.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/computer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-computer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-cdr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-cdr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-cdrw.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-cdrw.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdr-plus.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdr-plus.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdram.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdram.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdrom.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdrom.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdrw.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-disc-dvdrw.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-dvd.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-optical.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-dvd.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wired.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-ethernet.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wired.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-ethernet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-floppy.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-floppy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-harddisk-1394.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-harddisk-1394.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-harddisk-usb.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-harddisk-usb.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-harddisk.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-harddisk.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/multimedia-player.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-ipod.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/multimedia-player.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-ipod.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-keyboard.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-keyboard.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-cf.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-cf.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-ms.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-ms.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-sdmmc.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-sdmmc.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-sm.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-media-sm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-mouse-ball.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-mouse-ball.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-mouse-optical.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-mouse-optical.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-printer.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-printer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-removable-1394.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-removable-1394.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-removable-usb.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-removable-usb.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-removable.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-removable.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wireless.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-wavelan.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wireless.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-dev-wavelan.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/computer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-fs-client.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/computer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-fs-client.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-input-microphone.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-stock-mic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-input-microphone.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gnome-stock-mic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gtk-cdrom.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gtk-cdrom.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gtk-floppy.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gtk-floppy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gtk-harddisk.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/gtk-harddisk.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/harddrive.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/harddrive.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/hdd_unmount.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/hdd_unmount.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-gaming.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/input-gaming.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-gaming.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/input-gaming.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/input-keyboard.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/input-keyboard.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/input-mouse.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/input-mouse.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/multimedia-player.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/ipod_mount.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/multimedia-player.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/ipod_mount.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-gaming.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/joystick.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-gaming.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/joystick.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/keyboard.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/keyboard.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/kjobviewer.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/kjobviewer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/kxkb.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/kxkb.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-cdrom.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-cdrom.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-flash.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-flash.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-flash.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-floppy.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-floppy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-optical.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-optical.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/media-optical.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/mouse.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/mouse.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/multimedia-player.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/multimedia-player.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/multimedia-player.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/multimedia-player.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wired.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/network-wired.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wired.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/network-wired.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wireless.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/network-wireless.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wireless.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/network-wireless.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wireless.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/nm-adhoc.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wireless.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/nm-adhoc.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wired.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/nm-device-wired.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wired.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/nm-device-wired.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wireless.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/nm-device-wireless.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/network-wireless.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/nm-device-wireless.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printer-remote.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printer-remote.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printer.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printer1.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printer1.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printmgr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/printmgr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-input-microphone.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/stock_mic.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-input-microphone.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/stock_mic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/stock_printers.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/stock_printers.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/system-floppy.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/media-floppy.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/system-floppy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/computer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/system.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/computer.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/system.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/usbpendrive_unmount.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-removable-media.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/usbpendrive_unmount.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/video-display.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/video-display.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/video-display.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/video-display.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce-printer.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce-printer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/video-display.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce4-display.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/video-display.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce4-display.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce4-keyboard.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-keyboard.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce4-keyboard.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce4-mouse.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/xfce4-mouse.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_HD.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_HD.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_idetude.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/drive-harddisk.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_idetude.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-gaming.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_joystick.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-gaming.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_joystick.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_mouse.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/input-mouse.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_mouse.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_printer.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/printer.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_printer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-card.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_soundcard.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/devices/audio-card.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/devices/yast_soundcard.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-favorite.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-favorite.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-favorite.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-favorite.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-important.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-important.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-important.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-important.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-unreadable.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-noread.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-unreadable.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-noread.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-readonly.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-nowrite.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-readonly.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-nowrite.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-photos.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-photos.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-photos.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-photos.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-readonly.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-readonly.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-readonly.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-readonly.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-symbolic-link.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-symbolic-link.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-symbolic-link.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-symbolic-link.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-system.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-system.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-system.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-system.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-unreadable.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-unreadable.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emblems/emblem-unreadable.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emblems/emblem-unreadable.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-angel.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-angel.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-angel.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-angel.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-crying.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-crying.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-crying.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-crying.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-devilish.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-devilish.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-devilish.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-devilish.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-glasses.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-glasses.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-glasses.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-glasses.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-grin.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-grin.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-grin.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-grin.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-kiss.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-kiss.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-kiss.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-kiss.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-monkey.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-monkey.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-monkey.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-monkey.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-plain.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-plain.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-plain.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-plain.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-sad.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-sad.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-sad.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-sad.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile-big.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-smile-big.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile-big.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-smile-big.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-smile.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-smile.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-surprise.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-surprise.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-surprise.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-surprise.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-wink.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-wink.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-wink.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/face-wink.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-1.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-1.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-crying.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-11.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-crying.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-11.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-kiss.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-13.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-kiss.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-13.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-angel.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-18.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-angel.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-18.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-2.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-2.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-monkey.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-22.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-monkey.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-22.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-wink.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-3.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-wink.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-3.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-sad.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-4.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-sad.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-4.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-surprise.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-5.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-surprise.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-5.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile-big.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-6.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile-big.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-6.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-7.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-smile.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-7.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-plain.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-8.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-plain.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/emotes/stock_smiley-8.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-certificate.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-certificate.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-certificate.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-certificate.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.ms-excel.sheet.macroEnabled.12.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.ms-excel.sheet.macroEnabled.12.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.ms-powerpoint.presentation.macroEnabled.12.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.ms-powerpoint.presentation.macroEnabled.12.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.ms-word.document.macroEnabled.12.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.ms-word.document.macroEnabled.12.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.presentationml.presentation.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.presentationml.presentation.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.presentationml.template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.presentationml.template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.spreadsheetml.sheet.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.spreadsheetml.sheet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.spreadsheetml.template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.spreadsheetml.template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.wordprocessingml.template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-vnd.openxmlformats-officedocument.wordprocessingml.template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-x-executable.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/application-x-executable.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/ascii.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/ascii.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/audio-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/audio-x-generic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/audio-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/audio-x-generic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/binary.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/binary.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/contents2.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/contents2.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/deb.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/deb.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/document.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/document.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/empty.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/empty.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/exec.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/exec.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/folder_tar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/folder_tar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font-x-generic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font-x-generic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font_bitmap.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font_bitmap.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font_truetype.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font_truetype.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font_type1.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/font_type1.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-fs-executable.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-fs-executable.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-magicpoint.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-magicpoint.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-msword.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-msword.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/audio-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-ogg.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/audio-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-ogg.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-pdf.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-pdf.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-postscript.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-postscript.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-rtf.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-rtf.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.lotus-1-2-3.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.lotus-1-2-3.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.ms-excel.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.ms-excel.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.ms-powerpoint.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.ms-powerpoint.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.graphics-template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.graphics-template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.graphics.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.graphics.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.image.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.image.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.presentation-template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.presentation-template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.presentation.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.presentation.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.spreadsheet-template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.spreadsheet-template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.spreadsheet.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.spreadsheet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.text-template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.text-template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.text-web.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.text-web.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.text.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.oasis.opendocument.text.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.rn-realmedia-secure.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.rn-realmedia-secure.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.rn-realmedia-vbr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.rn-realmedia-vbr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.rn-realmedia.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.rn-realmedia.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.stardivision.calc.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.stardivision.calc.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.stardivision.impress.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.stardivision.impress.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.stardivision.writer.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.stardivision.writer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.calc.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.calc.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.calc.template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.calc.template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.draw.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.draw.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.draw.template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.draw.template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.impress.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.impress.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.impress.template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.impress.template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.writer.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.writer.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.writer.template.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-vnd.sun.xml.writer.template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-wordperfect.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-wordperfect.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-7z-compressed.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-7z-compressed.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-abiword.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-abiword.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-applix-spreadsheet.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-applix-spreadsheet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-applix-word.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-applix-word.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-archive.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-archive.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-arj.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-arj.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-bzip-compressed-tar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-bzip-compressed-tar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-bzip.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-bzip.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-compress.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-compress.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-compressed-tar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-compressed-tar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-cpio-compressed.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-cpio-compressed.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-cpio.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-cpio.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-deb.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-deb.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-dvi.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-dvi.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-executable.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-executable.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-afm.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-afm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-bdf.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-bdf.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-linux-psf.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-linux-psf.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-pcf.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-pcf.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-sunos-news.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-sunos-news.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-ttf.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-font-ttf.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-gnumeric.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-gnumeric.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-gzip.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-gzip.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-gzpostscript.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-gzpostscript.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-jar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-jar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/image-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-killustrator.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/image-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-killustrator.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-kpresenter.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-kpresenter.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-kspread.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-kspread.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-kword.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-kword.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lha.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lha.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lhz.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lhz.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lzma-compressed-tar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lzma-compressed-tar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lzma.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-lzma.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-ms-dos-executable.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-x-executable.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-ms-dos-executable.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-perl.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-perl.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-php.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-php.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-python-bytecode.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-python-bytecode.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-rar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-rar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-rpm.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-rpm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-scribus.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-scribus.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-shellscript.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-shellscript.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-shockwave-flash.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-shockwave-flash.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-stuffit.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-stuffit.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-tar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-tar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-tarz.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-tarz.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-tex.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-x-tex.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-xhtml+xml.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-xhtml+xml.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-zip.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-application-zip.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/audio-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-audio.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/audio-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-audio.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/image-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-image.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/image-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-image.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-html.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-html.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-vnd.wap.wml.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-vnd.wap.wml.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-csh.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-csh.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-python.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-python.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-sh.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-sh.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-vcalendar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-vcalendar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-vcard.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-vcard.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-zsh.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text-x-zsh.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-text.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-video.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-video.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-x-font-afm.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/font-x-generic.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-mime-x-font-afm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-package.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/gnome-package.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/html.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/html.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/image-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/image-x-generic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/image-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/image-x-generic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/image-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/image.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/image-x-generic.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/image.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/kpresenter_kpr.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/kpresenter_kpr.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/mime_ascii.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/mime_ascii.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/misc.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/misc.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package-x-generic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package-x-generic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package_editors.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package_editors.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package_wordprocessing.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/package_wordprocessing.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/plan.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/plan.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/rpm.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/rpm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/shellscript.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/shellscript.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/audio-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/sound.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/audio-x-generic.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/sound.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/spreadsheet.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/spreadsheet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_addressbook.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_addressbook.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_calendar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_calendar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-certificate.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_certificate.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/application-certificate.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_certificate.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_script.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/stock_script.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/tar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/tar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/template_source.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic-template.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/template_source.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-html.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-html.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-x-generic-template.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic-template.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-x-generic-template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-x-generic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-x-generic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-x-script.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-script.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/text-x-script.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/tgz.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/tgz.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/txt.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/txt.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/txt2.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/txt2.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/unknown.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-x-generic.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/unknown.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/vcalendar.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/vcalendar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/vcard.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/vcard.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/video-x-generic.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/video-x-generic.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/video.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/video-x-generic.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/video.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/wordprocessing.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/wordprocessing.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/www.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/text-html.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/www.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-address-book.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-address-book.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-address-book.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-calendar.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-calendar.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-calendar.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-document-template.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document-template.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-document-template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-document.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-document.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-document.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-drawing-template.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing-template.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-drawing-template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-drawing.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-drawing.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-drawing.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-presentation-template.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation-template.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-presentation-template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-presentation.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-presentation.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-presentation.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet-template.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-spreadsheet-template.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet-template.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-spreadsheet-template.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-spreadsheet.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/x-office-spreadsheet.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/x-office-spreadsheet.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/zip.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/mimetypes/package-x-generic.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/mimetypes/zip.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-saved-search.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/application-x-gnome-saved-search.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-saved-search.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/application-x-gnome-saved-search.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/desktop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/user-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/desktop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/start-here.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/distributor-logo.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/start-here.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/distributor-logo.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/emptytrash.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/emptytrash.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder-remote.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder-remote.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-saved-search.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder-saved-search.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-saved-search.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder-saved-search.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder.icon
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder.icon
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-home.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder_home.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/user-home.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/folder_home.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-desktop.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/user-desktop.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-desktop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-directory.icon
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-directory.icon
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-directory.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-directory.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-ftp.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-ftp.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-home.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-home.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/user-home.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-home.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-network.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-network.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-nfs.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-nfs.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-server.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-server.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-share.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-share.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-smb.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-smb.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-ssh.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-ssh.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-trash-empty.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-fs-trash-empty.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/start-here.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-main-menu.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/start-here.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-main-menu.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-nfs-server.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-nfs-server.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-smb-server.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-smb-server.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-smb-share.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-smb-share.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-smb-workgroup.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-mime-x-directory-smb-workgroup.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-stock-trash.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gnome-stock-trash.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gtk-directory.icon
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gtk-directory.icon
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gtk-directory.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gtk-directory.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/gtk-network.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/gtk-network.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/inode-directory.icon
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/inode-directory.icon
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/inode-directory.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/inode-directory.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/network-server.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/network-server.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/network-workgroup.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/network-workgroup.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/network.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/folder-remote.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/network.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/network_local.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/network-workgroup.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/network_local.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/start-here.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/novell-button.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/start-here.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/novell-button.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/redhat-network-server.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/redhat-network-server.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/server.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/network-server.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/server.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/start-here.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/start-here.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/start-here.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/start-here.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/stock_folder.icon
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.icon
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/stock_folder.icon
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/stock_folder.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/folder.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/stock_folder.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/trashcan_empty.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/trashcan_empty.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-desktop.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/user-desktop.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/user-desktop.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/user-desktop.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-home.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/user-home.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/user-home.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/user-home.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/user-trash.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/places/user-trash.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/places/xfce-trash_empty.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/places/user-trash.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/places/xfce-trash_empty.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-high.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-high.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-high.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-high.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-low.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-low.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-low.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-low.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-medium.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-medium.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-medium.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-medium.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-muted.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-muted.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-muted.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/audio-volume-muted.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/battery-caution.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/battery-caution.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/battery-caution.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/battery-caution.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit-receive.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/connect_creating.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit-receive.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/connect_creating.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-idle.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/connect_established.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-idle.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/connect_established.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-offline.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/connect_no.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-offline.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/connect_no.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/dialog-error.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/dialog-error.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/dialog-information.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/dialog-information.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/dialog-warning.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/dialog-warning.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/edittrash.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/edittrash.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/error.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/error.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.icon b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-drag-accept.icon
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.icon
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-drag-accept.icon
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-drag-accept.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-drag-accept.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-open.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-open.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-open.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-open.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-visiting.icon b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-visiting.icon
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-visiting.icon
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-visiting.icon
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-visiting.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-visiting.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-visiting.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder-visiting.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-open.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder_open.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-open.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/folder_open.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-wireless-encrypted.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-dev-wavelan-encrypted.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-wireless-encrypted.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-dev-wavelan-encrypted.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.icon b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-accept.icon
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.icon
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-accept.icon
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-accept.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-accept.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.icon b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-visiting.icon
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-drag-accept.icon
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-visiting.icon
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-visiting.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-visiting.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-visiting.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-directory-visiting.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/image-loading.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-loading-icon.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/image-loading.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-loading-icon.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-trash-full.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-fs-trash-full.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-offline.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-disconn.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-offline.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-disconn.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-error.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-error.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-error.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-error.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-idle.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-idle.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-idle.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-idle.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-receive.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-rx.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-receive.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-rx.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-tx.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-tx.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit-receive.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-txrx.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit-receive.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-netstatus-txrx.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-stock-trash-full.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gnome-stock-trash-full.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-dialog-error.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-dialog-error.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-dialog-info.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-dialog-info.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-dialog-warning.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-dialog-warning.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-open.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-directory.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-open.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-directory.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/image-missing.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-missing-image.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/image-missing.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/gtk-missing-image.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/image-loading.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/image-loading.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/image-loading.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/image-loading.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/image-missing.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/image-missing.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/image-missing.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/image-missing.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/important.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/important.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/info.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/info.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/mail-attachment.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/mail-attachment.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/mail-attachment.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/mail-attachment.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/messagebox_critical.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/messagebox_critical.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/messagebox_info.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/messagebox_info.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/messagebox_warning.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/messagebox_warning.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-error.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-error.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/network-error.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-error.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-idle.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-idle.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/network-idle.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-idle.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-offline.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-offline.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/network-offline.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-offline.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-receive.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-receive.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/network-receive.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-receive.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit-receive.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-transmit-receive.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit-receive.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-transmit-receive.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-transmit.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/network-transmit.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-transmit.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-wireless-encrypted.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-wireless-encrypted.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/network-wireless-encrypted.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/network-wireless-encrypted.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/network-offline.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/nm-no-connection.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/network-offline.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/nm-no-connection.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/printer-error.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/printer-error.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/printer-error.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/printer-error.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/software-update-available.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/software-update-available.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/software-update-available.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/software-update-available.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/software-update-urgent.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/software-update-urgent.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/software-update-urgent.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/software-update-urgent.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/mail-attachment.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_attach.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/mail-attachment.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_attach.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_dialog-error.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-error.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_dialog-error.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_dialog-info.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-information.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_dialog-info.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_dialog-warning.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/dialog-warning.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_dialog-warning.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/folder-open.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_open.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/folder-open.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_open.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_trash_full.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_trash_full.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-low.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-0.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-low.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-0.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-high.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-max.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-high.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-max.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-medium.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-med.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-medium.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-med.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-low.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-min.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-low.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-min.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-muted.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-mute.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-muted.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume-mute.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-high.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/audio-volume-high.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_volume.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-overcast.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-cloudy.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-overcast.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-cloudy.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-few-clouds.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-few-clouds.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-few-clouds.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-few-clouds.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear-night.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-night-clear.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear-night.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-night-clear.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-few-clouds-night.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-night-few-clouds.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-few-clouds-night.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-night-few-clouds.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-showers.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-showers.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-showers.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-showers.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-snow.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-snow.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-snow.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-snow.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-storm.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-storm.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-storm.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-storm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-sunny.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/stock_weather-sunny.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/sunny.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/sunny.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/trashcan_full.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/trashcan_full.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/user-trash-full.svg
similarity index 100%
copy from lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg
copy to lib/taurus/qt/qtgui/icon/Tango/scalable/status/user-trash-full.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear-night.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-clear-night.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear-night.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-clear-night.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-clear.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-clear.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-clear.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-few-clouds-night.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-few-clouds-night.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-few-clouds-night.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-few-clouds-night.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-few-clouds.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-few-clouds.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-few-clouds.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-few-clouds.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-overcast.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-overcast.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-overcast.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-overcast.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-severe-alert.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-severe-alert.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-severe-alert.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-severe-alert.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-showers-scattered.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-showers-scattered.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-showers-scattered.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-showers-scattered.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-showers.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-showers.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-showers.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-showers.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-snow.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-snow.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-snow.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-snow.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/weather-storm.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-storm.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/weather-storm.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/weather-storm.svg
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg b/lib/taurus/qt/qtgui/icon/Tango/scalable/status/xfce-trash_full.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tango-icons/status/user-trash-full.svg
rename to lib/taurus/qt/qtgui/icon/Tango/scalable/status/xfce-trash_full.svg
diff --git a/lib/taurus/qt/qtgui/icon/__init__.py b/lib/taurus/qt/qtgui/icon/__init__.py
new file mode 100644
index 0000000..d660f66
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/__init__.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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/>.
+##
+#############################################################################
+
+"""
+Utilities for using the bundled icons in Taurus and for registering external
+sources of icons.
+"""
+
+from icon import *
+from catalog import QIconCatalog
diff --git a/lib/taurus/qt/qtgui/icon/_rrze-icons.path b/lib/taurus/qt/qtgui/icon/_rrze-icons.path
new file mode 100644
index 0000000..f51868c
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/_rrze-icons.path
@@ -0,0 +1,9 @@
+[
+  ["actions", "rrze-icons/actions"],
+  ["categories", "rrze-icons/categories"],
+  ["devices", "rrze-icons/devices"],
+  ["emblems", "rrze-icons/emblems"],
+  ["mime_types", "rrze-icons/mime-types"],
+  ["places", "rrze-icons/places"],
+  ["status", "rrze-icons/status"]
+]
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/icon/_tango-icons.path b/lib/taurus/qt/qtgui/icon/_tango-icons.path
new file mode 100644
index 0000000..16789a1
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/_tango-icons.path
@@ -0,0 +1,11 @@
+[
+  ["actions", "Tango/scalable/actions"],
+  ["apps", "Tango/scalable/apps"],
+  ["categories", "Tango/scalable/categories"],
+  ["devices", "Tango/scalable/devices"],
+  ["emblems", "Tango/scalable/emblems"],
+  ["emotes", "Tango/scalable/emotes"],
+  ["mimetypes", "Tango/scalable/mimetypes"],
+  ["places", "Tango/scalable/places"],
+  ["status", "Tango/scalable/status"]
+]
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/icon/_taurus-icons.path b/lib/taurus/qt/qtgui/icon/_taurus-icons.path
new file mode 100644
index 0000000..db26d4f
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/_taurus-icons.path
@@ -0,0 +1,13 @@
+[
+  ["logos", "logos"],
+  ["external", "external"],
+  ["jive", "external/jive"],
+  ["extra_icons", "extra-icons"],
+  ["actions", "extra-icons/actions"],
+  ["designer", "extra-icons/designer"],
+  ["leds_images24", "extra-icons/leds/images24"],
+  ["leds_images48", "extra-icons/leds/images48"],
+  ["leds_images256", "extra-icons/leds/images256"],
+  ["large", "large"],
+  ["snapshot", "large/snapshot"]
+]
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/icon/catalog.py b/lib/taurus/qt/qtgui/icon/catalog.py
new file mode 100644
index 0000000..3d271b9
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/catalog.py
@@ -0,0 +1,170 @@
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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 provides an icon catalog widget
+"""
+
+import os
+import hashlib
+from taurus.qt.qtgui.application import TaurusApplication
+from taurus.qt.qtgui.input import GraphicalChoiceWidget
+from taurus.qt.qtgui.icon import REGISTERED_PREFIXES, getCachedPixmap
+from taurus.external.qt import Qt
+
+
+class QIconCatalogPage(GraphicalChoiceWidget):
+    """A widget that shows all icons available under a given searchPath preffix
+    """
+
+    def __init__(self, prefix, iconSize=24, columns=10):
+        choices, pixmaps = self.__build_catalog(prefix, columns=columns)
+        GraphicalChoiceWidget.__init__(self, choices=choices, pixmaps=pixmaps,
+                                       iconSize=iconSize, defaultPixmap=None)
+
+        spacer = Qt.QSpacerItem(0, 0, Qt.QSizePolicy.Expanding,
+                                Qt.QSizePolicy.Expanding)
+
+        self.gridLayout.addItem(spacer, self.gridLayout.rowCount(),
+                                self.gridLayout.columnCount())
+
+    def __build_catalog(self, prefix, columns=10):
+        """explores paths registered under the given prefix and selects unique
+        pixmaps (performs an md5 check to discard duplicated icon files)
+        """
+        pixmaps_hashed = {}
+        hashes = {}
+
+        for path in Qt.QDir.searchPaths(prefix):
+            if not os.path.exists(path):
+                print " %s not found. Skipping.!" % path
+                continue
+
+            for fname in os.listdir(path):
+                abs_fname = os.path.join(path, fname)
+                if not os.path.isfile(abs_fname):
+                    continue
+                md5 = self.__md5(abs_fname)
+                choice = '%s:%s' % (prefix, fname)
+
+                if md5 in hashes:
+                    hashes[md5] += '\n%s\t(%s)' % (choice, abs_fname)
+                else:
+                    hashes[md5] = '%s\t(%s)' % (choice, abs_fname)
+                    pixmap = getCachedPixmap(choice)
+                    if not pixmap.isNull():
+                        pixmaps_hashed[md5] = pixmap
+        pixmaps = {}
+        choices = []
+        row = []
+        for md5, choice in hashes.items():
+            try:
+                pixmaps[choice] = pixmaps_hashed[md5]
+            except KeyError:
+                continue
+            row.append(choice)
+            if len(row) > columns:
+                choices.append(row)
+                row = []
+        if len(row) > 0:
+            choices.append(row)
+
+        return choices, pixmaps
+
+    def __md5(self, fname):
+        """
+        Extracts md5 sum of a file
+
+        :param fname: (str) path to file
+        :return: md5 hash
+        """
+        hash_md5 = hashlib.md5()
+        with open(fname, "rb") as f:
+            for chunk in iter(lambda: f.read(4096), b""):
+                hash_md5.update(chunk)
+        return hash_md5.hexdigest()
+
+    def onClick(self):
+        """Reimplemented :class:`GraphicalChoiceWidget`
+        """
+        # From all alternatives, extract the one with the shortest name
+        chosen = self.sender().text()
+        alts = chosen.splitlines()
+        alts = sorted(alts, key=lambda s: len(s.split()[0]))
+        name, absname = alts[0].split()
+
+        # Store chosen name and emit signal using name
+        self._chosen = name
+        self.choiceMade.emit(name)
+
+        # show a message dialob with more info on the selected icon
+        dlg = Qt.QMessageBox()
+        dlg.setWindowTitle(name)
+        text = 'You can access the selected icon as:\n%s\n\n' % name
+        text += 'Or, by absolute name:\n%s\n\n' % absname
+        if len(alts) > 1:
+            text += 'Other alternative names:\n\n' + '\n\n'.join(alts[1:])
+        dlg.setText(text)
+        dlg.setIconPixmap(getCachedPixmap(name, size=128))
+        dlg.exec_()
+
+class QIconCatalog(Qt.QTabWidget):
+    """
+    A widget that shows a tab for each registered search path prefix.
+    In each tab, all icons available for the corresponding prefix are displayed.
+    Clicking on an icon provides info on how to use it from a taurus
+    application.
+    """
+
+    iconSelected = Qt.pyqtSignal(str)
+
+    def __init__(self, parent=None):
+        Qt.QTabWidget.__init__(self)
+        nprefix = len(REGISTERED_PREFIXES)
+        progress = Qt.QProgressDialog('Building icon catalog...', None,
+                                      0, nprefix, self)
+
+        progress.setWindowModality(Qt.Qt.WindowModal)
+
+        for i, prefix in enumerate(sorted(REGISTERED_PREFIXES)):
+            progress.setValue(i)
+            page = QIconCatalogPage(prefix)
+            page.choiceMade.connect(self.iconSelected)
+
+            self.addTab(page, prefix)
+        progress.setValue(nprefix)
+
+
+def main():
+    """launcher of QIconCatalog"""
+    import sys
+    from taurus import Release
+    app = TaurusApplication(app_version=Release.version)
+    w = QIconCatalog()
+    w.setWindowTitle('Taurus Icon Catalog')
+    w.show()
+    sys.exit(app.exec_())
+
+
+if __name__ == "__main__":
+    main()
diff --git a/lib/taurus/qt/qtgui/resource/external/class.png b/lib/taurus/qt/qtgui/icon/external/class.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/class.png
rename to lib/taurus/qt/qtgui/icon/external/class.png
diff --git a/lib/taurus/qt/qtgui/resource/external/function.png b/lib/taurus/qt/qtgui/icon/external/function.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/function.png
rename to lib/taurus/qt/qtgui/icon/external/function.png
diff --git a/lib/taurus/qt/qtgui/resource/external/ipython.png b/lib/taurus/qt/qtgui/icon/external/ipython.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/ipython.png
rename to lib/taurus/qt/qtgui/icon/external/ipython.png
diff --git a/lib/taurus/qt/qtgui/resource/external/jive/class.png b/lib/taurus/qt/qtgui/icon/external/jive/class.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/jive/class.png
rename to lib/taurus/qt/qtgui/icon/external/jive/class.png
diff --git a/lib/taurus/qt/qtgui/resource/external/jive/device.png b/lib/taurus/qt/qtgui/icon/external/jive/device.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/jive/device.png
rename to lib/taurus/qt/qtgui/icon/external/jive/device.png
diff --git a/lib/taurus/qt/qtgui/resource/external/jive/server.png b/lib/taurus/qt/qtgui/icon/external/jive/server.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/jive/server.png
rename to lib/taurus/qt/qtgui/icon/external/jive/server.png
diff --git a/lib/taurus/qt/qtgui/resource/external/python-console.png b/lib/taurus/qt/qtgui/icon/external/python-console.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/python-console.png
rename to lib/taurus/qt/qtgui/icon/external/python-console.png
diff --git a/lib/taurus/qt/qtgui/resource/external/python-file.png b/lib/taurus/qt/qtgui/icon/external/python-file.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/python-file.png
rename to lib/taurus/qt/qtgui/icon/external/python-file.png
diff --git a/lib/taurus/qt/qtgui/resource/external/python-module.png b/lib/taurus/qt/qtgui/icon/external/python-module.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/python-module.png
rename to lib/taurus/qt/qtgui/icon/external/python-module.png
diff --git a/lib/taurus/qt/qtgui/resource/external/python-package.png b/lib/taurus/qt/qtgui/icon/external/python-package.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/python-package.png
rename to lib/taurus/qt/qtgui/icon/external/python-package.png
diff --git a/lib/taurus/qt/qtgui/resource/external/python.png b/lib/taurus/qt/qtgui/icon/external/python.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/python.png
rename to lib/taurus/qt/qtgui/icon/external/python.png
diff --git a/lib/taurus/qt/qtgui/resource/external/pythonw-console.png b/lib/taurus/qt/qtgui/icon/external/pythonw-console.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/pythonw-console.png
rename to lib/taurus/qt/qtgui/icon/external/pythonw-console.png
diff --git a/lib/taurus/qt/qtgui/resource/external/tango.png b/lib/taurus/qt/qtgui/icon/external/tango.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/external/tango.png
rename to lib/taurus/qt/qtgui/icon/external/tango.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/collapse-all.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/collapse-all.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/collapse-all.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/collapse-all.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/collapse-selection.png b/lib/taurus/qt/qtgui/icon/extra-icons/actions/collapse-selection.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/collapse-selection.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/collapse-selection.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/collapse.png b/lib/taurus/qt/qtgui/icon/extra-icons/actions/collapse.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/collapse.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/collapse.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/expand-all.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/expand-all.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/expand-all.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/expand-all.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/expand-selection.png b/lib/taurus/qt/qtgui/icon/extra-icons/actions/expand-selection.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/expand-selection.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/expand-selection.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/expand.png b/lib/taurus/qt/qtgui/icon/extra-icons/actions/expand.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/expand.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/expand.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/go-backward.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/go-backward.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/go-backward.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/go-backward.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/go-forward.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/go-forward.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/go-forward.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/go-forward.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media-seek-backward-green.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media-seek-backward-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media-seek-backward-green.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media-seek-backward-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media-seek-forward-green.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media-seek-forward-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media-seek-forward-green.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media-seek-forward-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_backward.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_backward.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_backward.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_backward.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_pause.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_pause.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_pause.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_pause.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_start.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_start.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_start.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_start.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_stop.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_stop.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_stop.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_stop_green.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_stop_green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media_playback_stop_green.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media_playback_stop_green.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media_seek_backward.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media_seek_backward.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media_seek_backward.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media_seek_backward.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media_seek_forward.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media_seek_forward.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media_seek_forward.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media_seek_forward.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media_skip_backward.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media_skip_backward.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media_skip_backward.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media_skip_backward.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/media_skip_forward.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/media_skip_forward.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/media_skip_forward.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/media_skip_forward.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/actions/stop.svg b/lib/taurus/qt/qtgui/icon/extra-icons/actions/stop.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/actions/stop.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/actions/stop.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/arrow01.svg b/lib/taurus/qt/qtgui/icon/extra-icons/arrow01.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/arrow01.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/arrow01.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/color-fill.svg b/lib/taurus/qt/qtgui/icon/extra-icons/color-fill.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/color-fill.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/color-fill.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/arrayedit.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/arrayedit.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/arrayedit.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/arrayedit.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/back.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/back.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/back.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/back.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/calendarwidget.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/calendarwidget.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/calendarwidget.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/calendarwidget.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/checkbox.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/checkbox.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/checkbox.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/checkbox.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/circular_gauge.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/circular_gauge.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/circular_gauge.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/circular_gauge.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/columnview.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/columnview.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/columnview.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/columnview.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/combobox.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/combobox.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/combobox.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/combobox.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/commandlinkbutton.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/commandlinkbutton.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/commandlinkbutton.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/commandlinkbutton.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/compression.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/compression.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/compression.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/compression.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/dateedit.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/dateedit.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/dateedit.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/dateedit.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/datetimeedit.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/datetimeedit.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/datetimeedit.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/datetimeedit.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/devs_table.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/devs_table.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/devs_table.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/devs_table.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/devs_tree.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/devs_tree.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/devs_tree.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/devs_tree.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/dial.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/dial.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/dial.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/dial.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/dialogbuttonbox.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/dialogbuttonbox.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/dialogbuttonbox.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/dialogbuttonbox.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/dockwidget.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/dockwidget.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/dockwidget.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/dockwidget.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/doublespinbox.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/doublespinbox.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/doublespinbox.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/doublespinbox.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/down.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/down.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/down.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/down.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/editdelete.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/editdelete.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/editdelete.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/editdelete.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/extra_motor.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/extra_motor.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/extra_motor.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/extra_motor.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/filereader.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/filereader.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/filereader.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/filereader.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/fontcombobox.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/fontcombobox.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/fontcombobox.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/fontcombobox.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/forward.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/forward.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/forward.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/forward.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/frame.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/frame.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/frame.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/frame.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/graphicsview.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/graphicsview.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/graphicsview.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/graphicsview.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/grid.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/grid.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/grid.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/grid.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/groupbox.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/groupbox.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/groupbox.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/groupbox.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/groupboxcollapsible.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/groupboxcollapsible.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/groupboxcollapsible.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/groupboxcollapsible.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/groupwidget.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/groupwidget.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/groupwidget.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/groupwidget.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/horizontal_linear_gauge.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/horizontal_linear_gauge.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/horizontal_linear_gauge.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/horizontal_linear_gauge.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/hscrollbar.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/hscrollbar.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/hscrollbar.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/hscrollbar.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/hslider.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/hslider.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/hslider.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/hslider.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/hsplit.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/hsplit.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/hsplit.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/hsplit.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/label.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/label.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/label.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/label.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/lcdnumber.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/lcdnumber.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/lcdnumber.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/lcdnumber.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/ledgreen.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/ledgreen.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/ledgreen.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/ledgreen.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/ledred.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/ledred.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/ledred.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/ledred.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/line.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/line.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/line.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/line.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/lineedit.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/lineedit.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/lineedit.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/lineedit.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/listbox.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/listbox.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/listbox.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/listbox.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/listview.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/listview.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/listview.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/listview.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/macroserver.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/macroserver.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/macroserver.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/macroserver.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/mdiarea.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/mdiarea.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/mdiarea.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/mdiarea.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/minus.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/minus.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/minus.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/minus.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/plaintextedit.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/plaintextedit.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/plaintextedit.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/plaintextedit.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/plus.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/plus.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/plus.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/plus.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/progress.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/progress.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/progress.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/progress.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/props_table.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/props_table.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/props_table.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/props_table.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/pushbutton.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/pushbutton.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/pushbutton.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/pushbutton.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/qwtplot.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/qwtplot.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/qwtplot.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/qwtplot.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/radiobutton.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/radiobutton.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/radiobutton.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/radiobutton.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/scheduler.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/scheduler.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/scheduler.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/scheduler.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/scrollarea.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/scrollarea.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/scrollarea.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/scrollarea.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/spacer.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/spacer.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/spacer.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/spacer.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/spinbox.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/spinbox.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/spinbox.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/spinbox.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/state.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/state.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/state.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/state.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/tabbar.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/tabbar.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/tabbar.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/tabbar.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/table.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/table.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/table.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/table.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/tabwidget.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/tabwidget.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/tabwidget.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/tabwidget.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/tau.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/tau.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/tau.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/tau.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/taurus.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/taurus.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/taurus.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/taurus.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/textedit.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/textedit.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/textedit.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/textedit.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/timeedit.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/timeedit.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/timeedit.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/timeedit.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/toolbox.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/toolbox.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/toolbox.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/toolbox.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/toolbutton.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/toolbutton.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/toolbutton.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/toolbutton.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/up.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/up.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/up.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/up.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/vertical_linear_gauge.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/vertical_linear_gauge.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/vertical_linear_gauge.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/vertical_linear_gauge.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/vline.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/vline.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/vline.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/vline.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/vscrollbar.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/vscrollbar.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/vscrollbar.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/vscrollbar.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/vslider.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/vslider.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/vslider.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/vslider.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/vspacer.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/vspacer.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/vspacer.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/vspacer.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/wheeledit.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/wheeledit.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/wheeledit.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/wheeledit.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/widget.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/widget.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/widget.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/widget.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/widgetstack.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/widgetstack.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/widgetstack.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/widgetstack.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/wizard.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/wizard.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/wizard.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/wizard.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/zoomin.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/zoomin.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/zoomin.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/zoomin.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/designer/zoomout.png b/lib/taurus/qt/qtgui/icon/extra-icons/designer/zoomout.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/designer/zoomout.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/designer/zoomout.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledblue.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledblue.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledblue.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledblue.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledblueoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledblueoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledblueoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledblueoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledgreen.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledgreen.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledgreen.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledgreen.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledgreenoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledgreenoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledgreenoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledgreenoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledorange.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledorange.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledorange.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledorange.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledorangeoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledorangeoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledorangeoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledorangeoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledred.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledred.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledred.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledred.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledredoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledredoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledredoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledredoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledyellow.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledyellow.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledyellow.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledyellow.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledyellowoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledyellowoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images24/ledyellowoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images24/ledyellowoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_black_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_black_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_black_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_black_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_black_on.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_black_on.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_black_on.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_black_on.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_blue_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_blue_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_blue_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_blue_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_blue_on.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_blue_on.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_blue_on.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_blue_on.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_green_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_green_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_green_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_green_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_green_on.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_green_on.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_green_on.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_green_on.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_grenoble_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_grenoble_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_grenoble_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_grenoble_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_grenoble_on.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_grenoble_on.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_grenoble_on.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_grenoble_on.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_magenta_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_magenta_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_magenta_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_magenta_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_magenta_on.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_magenta_on.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_magenta_on.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_magenta_on.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_orange_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_orange_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_orange_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_orange_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_orange_on.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_orange_on.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_orange_on.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_orange_on.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_red_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_red_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_red_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_red_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_red_on.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_red_on.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_red_on.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_red_on.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_white_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_white_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_white_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_white_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_white_on.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_white_on.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_white_on.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_white_on.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_yellow_off.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_yellow_off.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_yellow_off.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_yellow_off.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_yellow_on.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_yellow_on.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images256/led_yellow_on.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images256/led_yellow_on.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledblue.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledblue.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledblue.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledblue.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledblueoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledblueoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledblueoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledblueoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledgreen.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledgreen.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledgreen.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledgreen.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledgreenoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledgreenoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledgreenoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledgreenoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledorange.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledorange.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledorange.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledorange.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledorangeoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledorangeoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledorangeoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledorangeoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledred.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledred.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledred.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledred.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledredoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledredoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledredoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledredoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledyellow.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledyellow.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledyellow.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledyellow.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledyellowoff.png b/lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledyellowoff.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/leds/images48/ledyellowoff.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/leds/images48/ledyellowoff.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/lock_locked.svg b/lib/taurus/qt/qtgui/icon/extra-icons/lock_locked.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/lock_locked.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/lock_locked.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/lock_locked_unpreviledged.svg b/lib/taurus/qt/qtgui/icon/extra-icons/lock_locked_unpreviledged.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/lock_locked_unpreviledged.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/lock_locked_unpreviledged.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/lock_unknown.svg b/lib/taurus/qt/qtgui/icon/extra-icons/lock_unknown.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/lock_unknown.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/lock_unknown.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/lock_unlocked.svg b/lib/taurus/qt/qtgui/icon/extra-icons/lock_unlocked.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/lock_unlocked.svg
rename to lib/taurus/qt/qtgui/icon/extra-icons/lock_unlocked.svg
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/titlebar_close.png b/lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/titlebar_close.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/titlebar_close_black.png b/lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close_black.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/titlebar_close_black.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close_black.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/titlebar_close_gray.png b/lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close_gray.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/titlebar_close_gray.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close_gray.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/titlebar_close_white.png b/lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close_white.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/titlebar_close_white.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/titlebar_close_white.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/titlebar_undock.png b/lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/titlebar_undock.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/titlebar_undock_black.png b/lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock_black.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/titlebar_undock_black.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock_black.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/titlebar_undock_gray.png b/lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock_gray.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/titlebar_undock_gray.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock_gray.png
diff --git a/lib/taurus/qt/qtgui/resource/extra-icons/titlebar_undock_white.png b/lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock_white.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/extra-icons/titlebar_undock_white.png
rename to lib/taurus/qt/qtgui/icon/extra-icons/titlebar_undock_white.png
diff --git a/lib/taurus/qt/qtgui/icon/icon.py b/lib/taurus/qt/qtgui/icon/icon.py
new file mode 100644
index 0000000..d7ead72
--- /dev/null
+++ b/lib/taurus/qt/qtgui/icon/icon.py
@@ -0,0 +1,361 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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 provides taurus-specific functions related to icons"""
+
+__all__ = [
+    'sanitizePrefix',
+    'registerPathFiles',
+    'registerTheme',
+    'getCachedPixmap',
+    'getStandardIcon',
+    'getElementTypeToolTip',
+    'getElementTypeSize',
+    'getElementTypeIcon',
+    'getElementTypeIconName',
+    'getElementTypePixmap',
+    'getDevStateToolTip',
+    'getDevStateIcon',
+    'getDevStatePixmap',
+    'REGISTERED_PREFIXES',
+]
+
+__docformat__ = 'restructuredtext'
+
+import os
+import re
+import sys
+import json
+
+from taurus.external.qt import Qt
+
+from taurus.core.taurusbasetypes import TaurusElementType, TaurusDevState
+from taurus.core.util.log import Logger
+
+__LOGGER = Logger(__name__)
+
+__INITIALIZED = False
+
+# Default width, height and QSize constants
+__DW = 70
+__DH = 24
+
+__DQS = Qt.QSize(__DW, __DH)
+__1DQS = __DQS
+__2DQS = Qt.QSize(2 * __DW, __DH)
+__3DQS = Qt.QSize(3 * __DW, __DH)
+
+# Indexes for the map below
+__IDX_ELEM_TYPE_ICON, __IDX_ELEM_TYPE_SIZE, __IDX_ELEM_TYPE_TOOLTIP = range(3)
+
+# New default role map
+# Elements are: icon theme, preferred size, description/tooltip
+_ELEM_TYPE_MAP = {
+    TaurusElementType.Name: ("folder", __3DQS, None),
+    TaurusElementType.Device: ("applications-system", Qt.QSize(210, __DH),
+                               "Tango device name"),
+    TaurusElementType.DeviceAlias: ("applications-system", Qt.QSize(140, __DH),
+                                    "Tango device alias"),
+    TaurusElementType.Domain: ("folder", Qt.QSize(80, __DH),
+                               "Tango device domain"),
+    TaurusElementType.Family: ("folder", Qt.QSize(80, __DH),
+                               "Tango device family"),
+    TaurusElementType.Member: ("applications-system", Qt.QSize(80, __DH),
+                               "Tango device member"),
+    TaurusElementType.Server: ("application-x-executable", Qt.QSize(190, __DH),
+                               "Tango server"),
+    TaurusElementType.ServerName: ("application-x-executable",
+                                   Qt.QSize(80, __DH), "Tango server name"),
+    TaurusElementType.ServerInstance: ("application-x-executable",
+                                       Qt.QSize(80, __DH),
+                                       "Tango server instance"),
+    TaurusElementType.DeviceClass: ("text-x-script", Qt.QSize(140, __DH),
+                                    "Tango class name"),
+    TaurusElementType.Exported: ("start-here", Qt.QSize(60, __DH),
+                                 "Alive/not alive"),
+    TaurusElementType.Host: ("network-server", Qt.QSize(100, __DH),
+                             "Host machine were last ran"),
+    TaurusElementType.Attribute: (":/actions/format-text-bold.svg",
+                                  Qt.QSize(100, __DH), "Attribute name"),
+}
+
+# Indexes for the map below
+__IDX_STATE_ICON, __IDX_STATE_TOOLTIP = range(2)
+
+_STATE_MAP = {
+    TaurusDevState.Ready: ("status:available.svg", "Element ready"),
+    TaurusDevState.NotReady: ("status:not-available.svg", "Element not ready"),
+    TaurusDevState.Undefined: ("status:not-known.svg",
+                               "Element state undefined")
+}
+
+# set of registered prefixes (updated by registerPathFiles() )
+REGISTERED_PREFIXES = set()
+
+
+def sanitizePrefix(prefix):
+    """strips any leading '/' and substitutes non alphanumeric characters by '_'
+    """
+    prefix = prefix.lstrip('/')
+    return re.sub('[^0-9a-zA-Z]+', '_', prefix)
+
+
+def registerPathFiles(pathfilenames):
+    """
+    Use given .path files to update Qt's search path
+    Each path file contains a json-encoded list of (prefix,path) tuples.
+    This function will call Qt.QDir.addSearchPath with each of the tuples
+    from the path files (prefix values will be sanitized first, and relative
+    path values will be made relative to the dir containing the .path file)
+
+    :param pathfilenames: (list<str>) list of .path file names
+    """
+    for filename in pathfilenames:
+        try:
+            pathmap = json.load(open(filename))
+        except Exception, e:
+            __LOGGER.error('Error registering "%s": %r', filename, e)
+            pathmap = []
+
+        base_dir = os.path.abspath(os.path.dirname(filename))
+        for prefix, path in pathmap:
+            prefix = sanitizePrefix(prefix)
+            path = os.path.join(base_dir, path)  # no effect if path is absolute
+            Qt.QDir.addSearchPath(prefix, path)
+            REGISTERED_PREFIXES.add(prefix)
+
+
+def registerTheme(name='Tango', path='', force=False):
+    """Use bundled them if OS does not define a theme (non-X11 systems)
+
+    :param name: (str) icon theme name (default=Tango)
+    :param path: (str) path to dir containing the theme (absolute or relative
+                 to dir of taurus.qt.qtgui.icon). Default = ''
+    :param force: (bool) Force to set path even if a theme is already set
+    """
+    if force or not sys.platform.startswith('linux'):
+        base_dir = os.path.abspath(os.path.dirname(__file__))
+        path = os.path.join(base_dir, path)
+        Qt.QIcon.setThemeSearchPaths([path])
+        Qt.QIcon.setThemeName(name)
+        __LOGGER.info('Setting %s icon theme (from %s)', name, path)
+
+
+def getCachedPixmap(key, size=None):
+    """Returns a PyQt4.QtGui.QPixmap object for the given key and size.
+    The key argument supports QDir's searchPath prefixes (see
+    :meth:`QDir.setSearchPaths`).
+
+    :param key: (str) the pixmap key., e.g.: 'status:folder-open.svg'
+    :param size: (int) the pixmap size in pixels (will get a square pixmap).
+                If None is passed it will return the original size
+
+    :return: (PyQt4.QtGui.QPixmap)"""
+
+    name = key
+    if size is not None:
+        key += "_%sx%s" % (size, size)
+    pm = Qt.QPixmapCache.find(key)
+    if pm is None:
+        pm = Qt.QPixmap(name)
+        if size is not None:
+            pm = pm.scaled(size, size, Qt.Qt.KeepAspectRatio,
+                           Qt.Qt.SmoothTransformation)
+        Qt.QPixmapCache.insert(key, pm)
+    return Qt.QPixmap(pm)
+
+
+def getStandardIcon(key, widget=None):
+    """Returns a PyQt4.QtGui.QIcon object for the given key. Key should be a
+    QStyle.StandardPixmap enumeration member. The widget argument is optional
+    and can also be used to aid the determination of the icon.
+
+    :param key: (QStyle.StandardPixmap) a standard pixmap which can follow some
+                existing GUI style or guideline
+    :param widget: (Qt.QWidget) the widget argument (optional) can also be used
+                   to aid the determination of the icon.
+
+    :return: (PyQt4.QtGui.QIcon)"""
+    styleOption = None
+    if widget is not None:
+        styleOption = Qt.QStyleOption()
+        styleOption.initFrom(widget)
+    style = Qt.QApplication.instance().style()
+    return style.standardIcon(key, styleOption, widget)
+
+
+def getElementTypeToolTip(elemType):
+    data = _ELEM_TYPE_MAP.get(elemType)
+    if data is None:
+        return
+    return data[__IDX_ELEM_TYPE_TOOLTIP]
+
+
+def getElementTypeSize(elemType):
+    data = _ELEM_TYPE_MAP.get(elemType)
+    if data is None:
+        return
+    return data[__IDX_ELEM_TYPE_SIZE]
+
+
+def getElementTypeIconName(elemType):
+    """Gets an icon name string for the given
+    :class:`taurus.core.taurusbasetypes.TaurusElementType`.
+
+    If an icon name cannot be found for elemType, None is returned.
+
+    :param elemType: (TaurusElementType) the taurus element type
+
+    :return: (str) a string representing the icon name for the given
+             :class:`taurus.core.taurusbasetypes.TaurusElementType`"""
+    if elemType is None:
+        return
+    data = _ELEM_TYPE_MAP.get(elemType)
+    if data is None:
+        return
+    return data[__IDX_ELEM_TYPE_ICON]
+
+
+def getElementTypeIcon(elemType, fallback=None):
+    """Gets a PyQt4.QtGui.QIcon object for the given
+    :class:`taurus.core.taurusbasetypes.TaurusElementType`.
+
+    If an icon cannot be found for the given 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)"""
+
+    themeIconName = getElementTypeIconName(elemType)
+    icon = Qt.QIcon.fromTheme(themeIconName)
+    if icon.isNull() and fallback is not None:
+        icon = fallback
+    return icon
+
+
+def getElementTypePixmap(elemType, size=None):
+    """Gets a PyQt4.QtGui.QPixmap object for the given
+    :class:`taurus.core.taurusbasetypes.TaurusElementType`.
+
+    :param elemType: (TaurusElementType) the taurus element type
+    :param size: (int) the pixmap size in pixels (will get a square pixmap).
+                 Default is None meaning it will return the original size.
+
+    :return: (PyQt4.QtGui.QPixmap or None)"""
+
+    if elemType is None:
+        return
+    data = _ELEM_TYPE_MAP.get(elemType)
+    if data is None:
+        return
+    themeKey = data[__IDX_ELEM_TYPE_ICON]
+    return Qt.QIcon.fromTheme(themeKey, size).pixmap(size, size)
+
+
+def getDevStateToolTip(state):
+    data = _STATE_MAP.get(state)
+    if data is None:
+        return
+    return data[__IDX_STATE_TOOLTIP]
+
+
+def getDevStateIcon(state, fallback=None):
+    """Gets a PyQt4.QtGui.QIcon object for the given
+    :class:`taurus.core.taurusbasetypes.TaurusDevState`.
+
+    If an icon cannot be found for the given state, fallback is returned.
+
+    :param state: (TaurusDevState) the taurus device state
+    :param fallback: (PyQt4.QtGui.QIcon) the fallback icon. Default is None.
+
+    :return: (PyQt4.QtGui.QIcon or None)"""
+    if state is None:
+        return
+    data = _STATE_MAP.get(state)
+    if data is None:
+        return
+    name = data[__IDX_STATE_ICON]
+
+    icon = Qt.QIcon(name)
+    if icon.isNull() and fallback is not None:
+        icon = fallback
+    return icon
+
+
+def getDevStatePixmap(state, size=None):
+    """Gets a PyQt4.QtGui.QPixmap object for the given
+    :class:`taurus.core.taurusbasetypes.TaurusDevState`.
+
+    :param state: (TaurusDevState) the taurus software device state
+    :param size: (int) the pixmap size in pixels (will get a square pixmap).
+                 Default is None meaning it will return the original size.
+
+    :return: (PyQt4.QtGui.QPixmap or None)
+    """
+    if state is None:
+        return None
+    data = _STATE_MAP.get(state)
+    if data is None:
+        return None
+    name = data[__IDX_STATE_ICON]
+    return getCachedPixmap(name, size)
+
+if __name__ == '__main__':
+    from taurus.qt.qtgui.application import TaurusApplication
+
+    app = TaurusApplication()
+
+    icons = [
+        # null because of non-existent path
+        Qt.QIcon('NONEXISTENT/PATH'),
+        # null because of resource-style key (and no resources defined)
+        Qt.QIcon(':/actions/edit-cut.svg'),
+        # abs path
+        Qt.QIcon(os.path.abspath('Tango/scalable/actions/edit-cut.svg')),
+        # rel path
+        Qt.QIcon('Tango/scalable/actions/edit-cut.svg'),
+        # New-style (using prefix)
+        Qt.QIcon('actions:edit-cut.svg'),
+        Qt.QIcon("apps:preferences-system-session.svg"),
+        Qt.QIcon("designer:devs_tree.png"),
+        Qt.QIcon("actions:process-stop.svg"),  # from tango-icons/actions
+        Qt.QIcon("actions:add.svg"), # from rrze-icons/actions
+        Qt.QIcon("actions:stop.svg"), # from extra-icons/actions
+        Qt.QIcon("logos:taurus.svg"), # uses the "general",
+        Qt.QIcon.fromTheme('computer')
+        ]
+
+    w = Qt.QWidget()
+    l = Qt.QVBoxLayout()
+    w.setLayout(l)
+    for icon in icons:
+        button = Qt.QPushButton(icon, 'kk')
+        l.addWidget(button)
+
+    w.show()
+
+    sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/resource/large/TaurusSplash.png b/lib/taurus/qt/qtgui/icon/large/TaurusSplash.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/TaurusSplash.png
rename to lib/taurus/qt/qtgui/icon/large/TaurusSplash.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/SardanaEditor.png b/lib/taurus/qt/qtgui/icon/large/snapshot/SardanaEditor.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/SardanaEditor.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/SardanaEditor.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusArrayEditor.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusArrayEditor.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusArrayEditor.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusArrayEditor.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusDbTreeWidget.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusDbTreeWidget.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusDbTreeWidget.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusDbTreeWidget.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusDevicePanel.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusDevicePanel.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusDevicePanel.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusDevicePanel.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusForm.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusForm.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusForm.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusForm.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusImageDialog.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusImageDialog.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusImageDialog.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusImageDialog.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusJDrawSynopticsView.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusJDrawSynopticsView.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusJDrawSynopticsView.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusJDrawSynopticsView.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusNeXusBrowser.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusNeXusBrowser.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusNeXusBrowser.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusNeXusBrowser.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusPlot.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusPlot.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusPlot.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusPlot.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusQubDataImageDisplay.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusQubDataImageDisplay.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusQubDataImageDisplay.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusQubDataImageDisplay.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusShell.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusShell.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusShell.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusShell.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusTrend.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusTrend.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusTrend.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusTrend.png
diff --git a/lib/taurus/qt/qtgui/resource/large/snapshot/TaurusTrend2DDialog.png b/lib/taurus/qt/qtgui/icon/large/snapshot/TaurusTrend2DDialog.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/large/snapshot/TaurusTrend2DDialog.png
rename to lib/taurus/qt/qtgui/icon/large/snapshot/TaurusTrend2DDialog.png
diff --git a/lib/taurus/qt/qtgui/resource/tau.png b/lib/taurus/qt/qtgui/icon/logos/tau.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/tau.png
rename to lib/taurus/qt/qtgui/icon/logos/tau.png
diff --git a/lib/taurus/qt/qtgui/resource/taurus.png b/lib/taurus/qt/qtgui/icon/logos/taurus.png
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/taurus.png
rename to lib/taurus/qt/qtgui/icon/logos/taurus.png
diff --git a/lib/taurus/qt/qtgui/resource/taurus.svg b/lib/taurus/qt/qtgui/icon/logos/taurus.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/taurus.svg
rename to lib/taurus/qt/qtgui/icon/logos/taurus.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/action-undo.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/action-undo.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/action-undo.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/action-undo.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/add-participant.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/add-participant.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/add-participant.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/add-participant.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/add.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/add.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/add.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/add.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/approval.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/approval.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/approval.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/approval.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/arrange-boxes.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/arrange-boxes.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/arrange-boxes.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/arrange-boxes.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/back-to-ou.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/back-to-ou.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/back-to-ou.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/back-to-ou.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/data-transfer.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/data-transfer.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/data-transfer.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/data-transfer.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/delete-all-participants.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/delete-all-participants.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/delete-all-participants.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/delete-all-participants.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/dial-in.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/dial-in.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/dial-in.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/dial-in.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/down-grey.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/down-grey.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/down-grey.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/down-grey.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/down.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/down.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/down.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/down.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/download.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/download.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/download.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/download.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/dynamic-blue-down.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-down.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/dynamic-blue-down.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-down.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/dynamic-blue-left.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-left.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/dynamic-blue-left.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-left.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/dynamic-blue-right.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-right.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/dynamic-blue-right.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-right.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/dynamic-blue-up.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-up.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/dynamic-blue-up.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/dynamic-blue-up.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/email-not-available.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/email-not-available.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/email-not-available.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/email-not-available.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/filter.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/filter.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/filter.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/filter.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/go-bottom.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/go-bottom.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/go-bottom.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/go-bottom.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/go-top.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/go-top.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/go-top.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/go-top.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/hide.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/hide.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/hide.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/hide.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/left-grey.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/left-grey.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/left-grey.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/left-grey.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/left.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/left.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/left.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/left.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/list-all-participants.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/list-all-participants.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/list-all-participants.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/list-all-participants.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/load-settings.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/load-settings.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/load-settings.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/load-settings.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/log-in.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/log-in.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/log-in.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/log-in.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/log-out.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/log-out.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/log-out.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/log-out.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/manage-settings.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/manage-settings.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/manage-settings.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/manage-settings.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/merge-affiliation.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/merge-affiliation.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/merge-affiliation.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/merge-affiliation.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/monitoring.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/monitoring.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/monitoring.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/monitoring.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-participant-to-waiting-red-grey.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-participant-to-waiting-red-grey.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-participant-to-waiting-red-grey.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-participant-to-waiting-red-grey.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-participant-to-waiting-red.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-participant-to-waiting-red.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-participant-to-waiting-red.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-participant-to-waiting-red.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-down-grey.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-down-grey.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-down-grey.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-down-grey.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-down.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-down.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-down.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-down.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-to-participant-green-arrow.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-to-participant-green-arrow.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-to-participant-green-arrow.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-to-participant-green-arrow.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-up-grey.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-up-grey.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-up-grey.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-up-grey.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-up.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-up.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/move-waiting-up.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/move-waiting-up.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/print.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/print.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/print.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/print.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/refuse.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/refuse.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/refuse.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/refuse.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/right-grey.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/right-grey.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/right-grey.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/right-grey.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/right.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/right.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/right.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/right.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/run.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/run.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/run.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/run.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/send-email-group.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email-group.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/send-email-group.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email-group.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/send-email-user-other.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email-user-other.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/send-email-user-other.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email-user-other.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/send-email-user.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email-user.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/send-email-user.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email-user.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/send-email.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/send-email.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/send-email.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/show.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/show.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/show.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/show.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-down-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-down-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-down-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-down-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-down-red.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-down-red.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-down-red.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-down-red.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-down.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-down.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-down.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-down.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-neutral-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-neutral-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-neutral-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-neutral-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-neutral-red.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-neutral-red.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-neutral-red.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-neutral-red.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-neutral.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-neutral.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-neutral.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-neutral.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-up-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-up-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-up-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-up-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-up-red.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-up-red.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-up-red.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-up-red.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-up.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-up.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/sort-up.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/sort-up.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/split-affiliation.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/split-affiliation.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/split-affiliation.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/split-affiliation.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/switch-course-book-grey.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course-book-grey.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/switch-course-book-grey.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course-book-grey.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/switch-course-book.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course-book.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/switch-course-book.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course-book.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/switch-course-grey.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course-grey.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/switch-course-grey.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course-grey.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/switch-course.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/switch-course.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/switch-course.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/transfer-down_up.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-down_up.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/transfer-down_up.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-down_up.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/transfer-left_right.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-left_right.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/transfer-left_right.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-left_right.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/transfer-right_left.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-right_left.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/transfer-right_left.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-right_left.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/transfer-up_down.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-up_down.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/transfer-up_down.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/transfer-up_down.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/up-grey.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/up-grey.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/up-grey.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/up-grey.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/up.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/up.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/up.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/up.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/upload.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/upload.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/upload.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/upload.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/view.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/view.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/view.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/view.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/actions/workflow.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/actions/workflow.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/actions/workflow.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/actions/workflow.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/affiliation-employee.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/affiliation-employee.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/affiliation-employee.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/affiliation-employee.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/affiliation-guest.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/affiliation-guest.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/affiliation-guest.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/affiliation-guest.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/affiliation-student.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/affiliation-student.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/affiliation-student.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/affiliation-student.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/alumni-group.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/alumni-group.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/alumni-group.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/alumni-group.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/book-marks.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/book-marks.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/book-marks.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/book-marks.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/book.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/book.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/book.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/book.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/bookmark.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/bookmark.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/bookmark.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/bookmark.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/icon-inspector.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/icon-inspector.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/icon-inspector.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/icon-inspector.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/magnifying-glass.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/magnifying-glass.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/magnifying-glass.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/magnifying-glass.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/mood-level-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/mood-level-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/mood-level-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/mood-level-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/mood-level-red.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/mood-level-red.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/mood-level-red.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/mood-level-red.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/mood-level-yellow.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/mood-level-yellow.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/mood-level-yellow.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/mood-level-yellow.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-admin-gear.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-admin-gear.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-admin-gear.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-admin-gear.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-admin.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-admin.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-admin.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-admin.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-business.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-business.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-business.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-business.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-customer.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-customer.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-customer.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-customer.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-digital-person.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-digital-person.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-digital-person.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-digital-person.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-disabled.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-disabled.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-disabled.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-disabled.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-employee.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-employee.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-employee.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-employee.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-endcustomer.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-endcustomer.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-endcustomer.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-endcustomer.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-enrolee.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-enrolee.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-enrolee.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-enrolee.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-examiner-group.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-examiner-group.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-examiner-group.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-examiner-group.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-examiner.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-examiner.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-examiner.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-examiner.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-expert.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-expert.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-expert.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-expert.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-group.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-group.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-group.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-group.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-helpdesk-faq.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-helpdesk-faq.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-helpdesk-faq.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-helpdesk-faq.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-helpdesk.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-helpdesk.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-helpdesk.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-helpdesk.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-library.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-library.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-library.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-library.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-manager.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-manager.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-manager.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-manager.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-other-business.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other-business.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-other-business.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other-business.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-other-female.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other-female.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-other-female.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other-female.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-other-new.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other-new.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-other-new.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-other.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-other.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-other.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-partner.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-partner.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-partner.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-partner.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-phd-group.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-phd-group.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-phd-group.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-phd-group.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-phd.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-phd.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-phd.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-phd.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-real-person.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-real-person.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-real-person.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-real-person.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-student-assistant.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-student-assistant.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-student-assistant.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-student-assistant.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-student.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-student.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-student.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-student.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-unknown.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-unknown.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/categories/user-unknown.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/categories/user-unknown.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/database-locked.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/database-locked.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/database-locked.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/database-locked.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/modem.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/modem.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/modem.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/modem.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/router.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/router.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/router.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/router.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-access.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-access.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-access.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-access.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-accounting.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-accounting.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-accounting.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-accounting.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-blades.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-blades.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-blades.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-blades.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-book.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-book.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-book.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-book.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-firebird.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-firebird.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-firebird.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-firebird.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-mysql.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-mysql.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-mysql.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-mysql.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-otrs.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-otrs.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-otrs.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-otrs.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-postgres.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-postgres.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-postgres.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-postgres.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-yellow.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-yellow.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database-yellow.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database-yellow.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-database.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-database.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-directory-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-directory-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-directory-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-directory-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-directory-yellow.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-directory-yellow.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-directory-yellow.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-directory-yellow.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-directory.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-directory.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-directory.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-directory.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-email-relay.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-email-relay.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-email-relay.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-email-relay.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-email.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-email.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-email.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-email.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-file.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-file.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-file.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-file.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-firewall.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-firewall.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-firewall.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-firewall.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-monitoring.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-monitoring.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-monitoring.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-monitoring.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-multiple.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-multiple.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-multiple.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-multiple.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-print.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-print.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-print.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-print.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-radius.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-radius.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-radius.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-radius.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-red.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-red.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-red.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-red.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-subversion.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-subversion.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-subversion.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-subversion.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-user.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-user.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-user.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-user.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-vpn.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-vpn.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-vpn.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-vpn.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-web-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-web-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-web-secure.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web-secure.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-web-secure.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web-secure.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-web-yellow.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web-yellow.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-web-yellow.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web-yellow.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-web.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-web.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-web.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-yellow.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-yellow.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server-yellow.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server-yellow.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/server.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/server.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/server.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/server.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/switch.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/switch.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/switch.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/switch.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/wlan-access-point.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/wlan-access-point.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/wlan-access-point.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/wlan-access-point.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/wlan-controller.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/wlan-controller.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/wlan-controller.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/wlan-controller.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/devices/workstation.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/devices/workstation.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/devices/workstation.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/devices/workstation.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/account-delete.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/account-delete.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/account-delete.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/account-delete.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/account-edit.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/account-edit.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/account-edit.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/account-edit.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/account-new.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/account-new.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/account-new.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/account-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/affiliation-abstract.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/affiliation-abstract.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/affiliation-abstract.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/affiliation-abstract.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/affiliation.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/affiliation.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/affiliation.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/affiliation.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/affirmation.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/affirmation.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/affirmation.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/affirmation.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/all-per-page.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/all-per-page.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/all-per-page.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/all-per-page.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/at.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/at.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/at.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/at.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/audio-itunes-u.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/audio-itunes-u.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/audio-itunes-u.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/audio-itunes-u.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/audio-itunes.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/audio-itunes.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/audio-itunes.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/audio-itunes.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/audio-visual-slide.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/audio-visual-slide.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/audio-visual-slide.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/audio-visual-slide.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/bridge-stone-delete.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/bridge-stone-delete.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/bridge-stone-delete.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/bridge-stone-delete.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/bridge-stone-new.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/bridge-stone-new.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/bridge-stone-new.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/bridge-stone-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/bridge-stone.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/bridge-stone.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/bridge-stone.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/bridge-stone.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-firebird.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-firebird.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-firebird.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-firebird.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-mysql.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-mysql.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-mysql.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-mysql.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-openldap.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-openldap.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-openldap.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-openldap.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-otrs.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-otrs.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-otrs.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-otrs.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-postgres.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-postgres.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-postgres.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-postgres.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-vcs-subversion.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-vcs-subversion.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database-vcs-subversion.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database-vcs-subversion.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/database.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/database.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-attribute.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-attribute.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-attribute.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-attribute.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-object-class.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-object-class.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-object-class.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-object-class.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-object.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-object.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-object.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-object.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-schema.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-schema.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-schema.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-schema.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-syntax.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-syntax.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory-syntax.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory-syntax.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/directory.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/directory.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/doctoral-cap.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/doctoral-cap.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/doctoral-cap.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/doctoral-cap.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/email.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/email.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/email.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/email.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/entitlement.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/entitlement.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/entitlement.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/entitlement.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/export.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/export.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/export.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/export.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/fifty-per-page.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/fifty-per-page.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/fifty-per-page.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/fifty-per-page.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/firewall.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/firewall.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/firewall.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/firewall.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/floppy-disc-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/floppy-disc-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/floppy-disc-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/floppy-disc-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/folder.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/folder.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/folder.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/folder.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/footnote-delete.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote-delete.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/footnote-delete.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote-delete.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/footnote-edit.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote-edit.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/footnote-edit.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote-edit.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/footnote-new.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote-new.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/footnote-new.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/footnote.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/footnote.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/footnote.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/for-free.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/for-free.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/for-free.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/for-free.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/geo-id.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/geo-id.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/geo-id.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/geo-id.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/globe.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/globe.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/globe.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/globe.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/id.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/id.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/id.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/id.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/index.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/index.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/index.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/index.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/information.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/information.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/information.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/information.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/inspector-hat.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/inspector-hat.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/inspector-hat.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/inspector-hat.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/lock.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/lock.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/lock.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/lock.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/mailbox.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/mailbox.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/mailbox.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/mailbox.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/media-film.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/media-film.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/media-film.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/media-film.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/media-floppy-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/media-floppy-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/media-floppy-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/media-floppy-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/message-new.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/message-new.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/message-new.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/message-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/money.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/money.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/money.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/money.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/movie-audio.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/movie-audio.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/movie-audio.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/movie-audio.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/network-cloud.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/network-cloud.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/network-cloud.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/network-cloud.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/note.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/note.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/note.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/note.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/office-excel.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/office-excel.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/office-excel.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/office-excel.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/office-word.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/office-word.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/office-word.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/office-word.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/organisational-unit-tree.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/organisational-unit-tree.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/organisational-unit-tree.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/organisational-unit-tree.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/organizational-unit.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/organizational-unit.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/organizational-unit.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/organizational-unit.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/page-25.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/page-25.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/page-25.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/page-25.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/page-50.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/page-50.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/page-50.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/page-50.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/page-all.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/page-all.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/page-all.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/page-all.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/peace-sign.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/peace-sign.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/peace-sign.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/peace-sign.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/pen.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/pen.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/pen.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/pen.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/phone.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/phone.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/phone.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/phone.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/promotion-data.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/promotion-data.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/promotion-data.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/promotion-data.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/relay.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/relay.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/relay.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/relay.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-delete.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-delete.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-delete.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-delete.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-edit.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-edit.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-edit.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-edit.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-new.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-new.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-new.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-run.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-run.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-run.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-run.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-upload.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-upload.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report-upload.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report-upload.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/report.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/report.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/rss-feed.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/rss-feed.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/rss-feed.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/rss-feed.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/single-sign-on.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/single-sign-on.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/single-sign-on.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/single-sign-on.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/slide-audio.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/slide-audio.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/slide-audio.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/slide-audio.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/slide.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/slide.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/slide.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/slide.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/statistic.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/statistic.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/statistic.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/statistic.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/structured-program-stay-abroad.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/structured-program-stay-abroad.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/structured-program-stay-abroad.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/structured-program-stay-abroad.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/subversion-logo b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/subversion-logo
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/subversion-logo
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/subversion-logo
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/subversion-logo.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/subversion-logo.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/subversion-logo.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/subversion-logo.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/subversion.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/subversion.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/subversion.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/subversion.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/table.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/table.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/table.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/table.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/task.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/task.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/task.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/task.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/template.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/template.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/template.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/template.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/ten-per-page.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/ten-per-page.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/ten-per-page.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/ten-per-page.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tomcat.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tomcat.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tomcat.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tomcat.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tree-diagramm-delete.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm-delete.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tree-diagramm-delete.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm-delete.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tree-diagramm-move.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm-move.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tree-diagramm-move.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm-move.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tree-diagramm-new.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm-new.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tree-diagramm-new.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm-new.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tree-diagramm.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/tree-diagramm.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/tree-diagramm.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/twenty-five-per-page.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/twenty-five-per-page.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/twenty-five-per-page.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/twenty-five-per-page.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/unix.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/unix.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/unix.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/unix.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/video-film.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/video-film.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/video-film.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/video-film.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/webview.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/webview.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/webview.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/webview.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/wide-area-network-connection.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/wide-area-network-connection.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/wide-area-network-connection.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/wide-area-network-connection.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/wide-area-network-link.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/wide-area-network-link.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/wide-area-network-link.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/wide-area-network-link.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/wifi.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/wifi.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/wifi.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/wifi.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/emblems/zipper.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/emblems/zipper.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/emblems/zipper.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/emblems/zipper.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/audio-mp3.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/audio-mp3.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/audio-mp3.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/audio-mp3.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/audio-mp4.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/audio-mp4.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/audio-mp4.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/audio-mp4.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/document-pdf.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/document-pdf.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/document-pdf.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/document-pdf.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-audio-itunes-u.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-audio-itunes-u.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-audio-itunes-u.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-audio-itunes-u.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-audio-itunes.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-audio-itunes.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-audio-itunes.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-audio-itunes.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-audio-visual-slide.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-audio-visual-slide.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-audio-visual-slide.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-audio-visual-slide.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-movie-audio.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-movie-audio.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-movie-audio.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-movie-audio.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-movie.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-movie.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-movie.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-movie.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-slide-audio.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-slide-audio.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-slide-audio.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-slide-audio.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-video-film.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-video-film.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/media-video-film.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/media-video-film.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/office-ms-excel.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/office-ms-excel.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/office-ms-excel.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/office-ms-excel.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/office-ms-word.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/office-ms-word.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/office-ms-word.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/office-ms-word.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/text-csv-text.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/text-csv-text.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/text-csv-text.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/text-csv-text.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/video-m4v.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/video-m4v.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/video-m4v.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/video-m4v.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/video-mov.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/video-mov.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/mime-types/video-mov.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/mime-types/video-mov.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/available.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/available.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/available.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/available.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/awaiting-plus.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/awaiting-plus.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/awaiting-plus.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/awaiting-plus.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/awaiting.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/awaiting.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/awaiting.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/awaiting.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/binational.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/binational.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/binational.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/binational.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/error.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/error.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/error.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/error.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/exclamation-mark.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/exclamation-mark.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/exclamation-mark.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/exclamation-mark.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/expired.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/expired.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/expired.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/expired.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/false.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/false.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/false.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/false.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/female.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/female.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/female.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/female.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-green-clock.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-green-clock.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-green-clock.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-green-clock.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-green-mail.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-green-mail.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-green-mail.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-green-mail.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-green.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-green.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-green.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-green.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-red-clock.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-red-clock.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-red-clock.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-red-clock.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-red-mail.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-red-mail.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-red-mail.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-red-mail.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-red.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-red.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-red.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-red.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-yellow-clock.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-yellow-clock.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-yellow-clock.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-yellow-clock.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-yellow-mail.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-yellow-mail.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-yellow-mail.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-yellow-mail.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-yellow.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-yellow.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/flag-yellow.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/flag-yellow.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/hourglass.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/hourglass.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/hourglass.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/hourglass.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/important.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/important.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/important.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/important.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/maintenance-time.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/maintenance-time.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/maintenance-time.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/maintenance-time.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/male.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/male.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/male.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/male.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/not-available.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/not-available.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/not-available.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/not-available.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/not-known.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/not-known.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/not-known.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/not-known.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/not-specified.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/not-specified.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/not-specified.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/not-specified.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/not-synchronized.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/not-synchronized.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/not-synchronized.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/not-synchronized.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/synchronized.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/synchronized.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/synchronized.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/synchronized.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/temporarily-not-available-clock.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/temporarily-not-available-clock.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/temporarily-not-available-clock.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/temporarily-not-available-clock.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/temporarily-not-available.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/temporarily-not-available.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/temporarily-not-available.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/temporarily-not-available.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/true-orange.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/true-orange.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/true-orange.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/true-orange.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/true.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/true.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/true.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/true.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/unlocked.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/unlocked.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/unlocked.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/unlocked.svg
diff --git a/lib/taurus/qt/qtgui/resource/rrze-icons/status/warning.svg b/lib/taurus/qt/qtgui/icon/rrze-icons/status/warning.svg
similarity index 100%
rename from lib/taurus/qt/qtgui/resource/rrze-icons/status/warning.svg
rename to lib/taurus/qt/qtgui/icon/rrze-icons/status/warning.svg
diff --git a/lib/taurus/qt/qtgui/image/__init__.py b/lib/taurus/qt/qtgui/image/__init__.py
deleted file mode 100644
index 994241a..0000000
--- a/lib/taurus/qt/qtgui/image/__init__.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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 package contains a collection of Qt designed to present 2D data"""
-
-__docformat__ = 'restructuredtext'
-
-try:
-    from .taurusqub import *
-except:
-    from taurus.qt.qtgui.display import create_fallback as __create
-    TaurusQubDataImageDisplay = __create("TaurusQubDataImageDisplay")
-    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
deleted file mode 100644
index 22d8b7a..0000000
--- a/lib/taurus/qt/qtgui/image/taurusqub.py
+++ /dev/null
@@ -1,205 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""taurus wrapping of Qub image visualization widget"""
-
-import weakref
-
-from taurus.external.qt import Qt
-
-from Qub.Widget.DataDisplay.QubDataImageDisplay import QubDataImageDisplay
-from Qub.Widget.QubActionSet import QubToolbarToggleButtonAction
-from Qub.Widget.QubActionSet import QubOpenDialogAction
-
-from taurus.qt.qtgui.base import TaurusBaseWidget
-import taurus
-
-try:
-    import EdfFile
-except ImportError:
-    EdfFile = None
-
-class _EDFFileSavePlug:
-    def setData(self,data) :
-        if data is not None:
-            self._data = weakref.ref(data)
-        else:
-            self._data = None
-            
-class TaurusQubDataImageDisplay(QubDataImageDisplay, TaurusBaseWidget):
-    
-    def __init__(self, parent=None, **kwargs):
-        designMode = kwargs.get('designMode', False)
-        kwargs['forcePopupSubWindow'] = True
-        kwargs['parent'] = parent
-        self.call__init__(QubDataImageDisplay, **kwargs)
-        name = self.__class__.__name__
-        self._image_attr_name = ''
-        self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-        self.statusBar().setSizeGripEnabled(False)
-        self.setModifiableByUser(True) #to allow drop of models
-        self.__addActions()
-        
-    def __addActions(self):
-        updateAction = QubToolbarToggleButtonAction(name = 'update', iconName = 'update',
-                                                    initState = True, group='image',
-                                                    tooltip='Start/Stop image refresh')
-        Qt.QObject.connect(updateAction, Qt.SIGNAL('StateChanged'), self.__setRefresh)
-        self.addAction(updateAction)
-        # a bug in Qub forces to set the state after adding the action
-        updateAction.setState(True)
-        self._updateAction = updateAction
-        
-        if EdfFile:
-            saveAction = QubOpenDialogAction(name='save edf', iconName='save',
-                                             label='Save data', group='admin',
-                                             tooltip='Save image data in EDF format')
-            
-            saveDialog = Qt.QFileDialog(self, 'Save image as EDF')
-            saveDialog.setAcceptMode(Qt.QFileDialog.AcceptSave)
-            saveDialog.setDefaultSuffix('edf')
-            nameFilters = list(saveDialog.nameFilters())
-            nameFilters.insert(0, 'EDF Files (*.edf)')
-            saveDialog.setNameFilters(nameFilters)
-            Qt.QObject.connect(saveDialog, Qt.SIGNAL('fileSelected(const QString &)'),
-                               self.__saveEDF)
-            Qt.QObject.connect(saveDialog, Qt.SIGNAL('filesSelected(const QStringList &)'),
-                               self.__saveEDFs)
-            saveAction.setDialog(saveDialog)
-            self._saveDataAction = saveAction
-            
-            plug = _EDFFileSavePlug()
-            self.addDataAction(saveAction, plug)
-            self._saveEDFPlug = plug
-        
-    def __saveEDF(self, fileSelected):
-        if not fileSelected: return
-        fileSelected = str(fileSelected)
-        data = self._saveEDFPlug._data()
-        edf_file = EdfFile.EdfFile(fileSelected)
-        edf_file.WriteImage({}, data)
-
-    def __saveEDFs(self, filesSelected):
-        nb = len(filesSelected)
-        if nb == 0: return
-        fname = filesSelected[0]
-        if nb > 1:
-            print "WARNING: Multiple files selected. The image will be saved as:", fname
-        self.__saveEDF(fname)
-
-    def __setRefresh(self, onOff):
-        self._refreshEnabled = onOff
-    
-    def _save_dialog_new(self,openDialogAction,aQubGraphicsView):
-        QubDataImageDisplay._save_dialog_new(self,openDialogAction,aQubGraphicsView)
-    
-    def isReadOnly(self):
-        return True
-    
-    def getModelClass(self):
-        return taurus.core.taurusdevice.TaurusDevice
-    
-    def handleEvent(self, evt_src, evt_type, evt_value):
-        if self._updateAction.state():
-            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]
-                    try:
-                        dim_x, dim_y = data.dim_x, data.dim_y #this is tango-centric. dim_x does not exist in TaurusConfiguration
-                    except AttributeError:
-                        try:
-                            dim_x,dim_y = data.value.shape
-                        except AttributeError:
-                            dim_x,dim_y = numpy.array(data.value).shape
-                    self.setData(data.value)
-                    self.setInfo({
-                        'name'     : data.name,
-                        'width'    : dim_x, 
-                        'height'   : dim_y, 
-                        'quality'  : data.quality,
-                        'type'     : data.type,
-                        'timestamp': data.time
-                    })
-
-    def sizeHint(self):
-        return Qt.QSize(640, 480)
-    
-    def setModel(self, model):
-        dev_name, self._image_attr_name = model.rsplit('/', 1)
-        obj = self.getTaurusFactory().getDevice(dev_name)
-        if obj is not None:
-            obj.addImageAttrName(self._image_attr_name)        
-        TaurusBaseWidget.setModel(self, dev_name)
-        self.setWindowTitle(self.getModel())
-    
-    def getModel(self):
-        return '%s/%s' % (TaurusBaseWidget.getModel(self), self._image_attr_name)
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-        ret['module'] = 'taurus.qt.qtgui.image'
-        ret['group'] = 'Taurus Display'
-        ret['icon'] = ":/designer/camera_photo.png"
-        return ret
-    
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT property definition
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, setModel,
-                            TaurusBaseWidget.resetModel)
-    
-    useParentModel = Qt.pyqtProperty("bool",
-                                     TaurusBaseWidget.getUseParentModel,
-                                     TaurusBaseWidget.setUseParentModel,
-                                     TaurusBaseWidget.resetUseParentModel)
-
-def main():
-    import sys
-    import taurus.core.tango.img
-    taurus.core.tango.img.registerExtensions()
-
-    app = Qt.QApplication(sys.argv)
-    models=sys.argv[1:]
-    panel = Qt.QWidget()
-    l = Qt.QHBoxLayout()
-    panel.setLayout(l)
-    if not models:
-        from taurus.qt.qtgui.panel import TaurusModelChooser
-        models, ok = TaurusModelChooser.modelChooserDlg(panel, [taurus.core.taurusbasetypes.TaurusElementType.Attribute])
-        if not ok:
-            models = []
-    for model in models:
-        w = TaurusQubDataImageDisplay()
-        w.setModel(model)
-        l.addWidget(w)
-  
-    panel.setVisible(True)
-    sys.exit(app.exec_())
-    
-if __name__ == "__main__":
-    main()
diff --git a/lib/taurus/qt/qtgui/input/__init__.py b/lib/taurus/qt/qtgui/input/__init__.py
index cc5c7b0..7cd06d4 100644
--- a/lib/taurus/qt/qtgui/input/__init__.py
+++ b/lib/taurus/qt/qtgui/input/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,4 +34,4 @@ from .tauruscombobox import *
 from .tauruslineedit import *
 from .taurusspinbox import *
 from .tauruswheel import *
-from .choicedlg import *
\ No newline at end of file
+from .choicedlg import *
diff --git a/lib/taurus/qt/qtgui/input/choicedlg.py b/lib/taurus/qt/qtgui/input/choicedlg.py
index e72ebb6..839e724 100644
--- a/lib/taurus/qt/qtgui/input/choicedlg.py
+++ b/lib/taurus/qt/qtgui/input/choicedlg.py
@@ -2,101 +2,102 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 package provides a dialog for graphically choosing a Taurus class"""
 
-__all__ = ["GraphicalChoiceDlg","GraphicalChoiceWidget"]
+__all__ = ["GraphicalChoiceDlg", "GraphicalChoiceWidget"]
 
 __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 
+
 class GraphicalChoiceDlg(Qt.QDialog):
     '''
     A generic dialog for choosing among a set of choices which are presented as
     an array of, each with a given pixmap.
-    
+
     The :meth:`getChoice` static method is provided for convenience so that the
     dialog can be invoked wit a single line::
-    
+
         chosen,ok = GraphicalChoiceDlg.getChoice(parent, title, msg, choices, pixmaps, size, defpixmap, horizontalScrollBarPolicy, verticalScrollBarPolicy)
-    ''' 
+    '''
+
     def __init__(self, parent=None, designMode=False, choices=None, pixmaps=None, iconSize=128, defaultPixmap=None, horizontalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded, verticalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded):
         Qt.QDialog.__init__(self, parent)
         self._chosen = None
-        self.setLayout(Qt.QVBoxLayout())    
-        self.label=Qt.QLabel('Click on your choice:')
-        self.layout().addWidget(self.label)  
-        self._iconsArea = GraphicalChoiceWidget(parent=parent, designMode=designMode, choices=choices, 
+        self.setLayout(Qt.QVBoxLayout())
+        self.label = Qt.QLabel('Click on your choice:')
+        self.layout().addWidget(self.label)
+        self._iconsArea = GraphicalChoiceWidget(parent=parent, designMode=designMode, choices=choices,
                                                 pixmaps=pixmaps, iconSize=iconSize, defaultPixmap=defaultPixmap,
-                                                horizontalScrollBarPolicy=horizontalScrollBarPolicy, 
+                                                horizontalScrollBarPolicy=horizontalScrollBarPolicy,
                                                 verticalScrollBarPolicy=verticalScrollBarPolicy)
         self.layout().addWidget(self._iconsArea)
-        self.connect(self._iconsArea, Qt.SIGNAL('choiceMade'), self.onChoiceMade)
-    
-        
+        self._iconsArea.choiceMade.connect(self.onChoiceMade)
+
     def setHorizontalScrollBarPolicy(self, policy):
         '''sets horizontal scrollbar policy of scrollArea'''
         return self._iconsArea.setHorizontalScrollBarPolicy(policy)
-    
+
     def setVerticalScrollBarPolicy(self, policy):
         '''sets vertical scrollbar policy of scrollArea'''
         return self._iconsArea.setVerticalScrollBarPolicy(policy)
-        
+
     def setMessage(self, msg):
         '''sets the text which is shown to the user in the dialog'''
         self.label.setText(msg)
-    
+
     def onChoiceMade(self, chosen):
         '''slot called when the user chooses an option'''
         self.accept()
-        
+
     def getChosen(self):
         '''
         returns the choice
         :return: (str)
         '''
         return self._iconsArea.getChosen()
-    
-    @staticmethod    
-    def getChoice(parent=None, title= '', msg='', choices=None, pixmaps=None, iconSize=128, defaultPixmap=None, horizontalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded, verticalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded):
+
+    @staticmethod
+    def getChoice(parent=None, title='', msg='', choices=None, pixmaps=None, iconSize=128, defaultPixmap=None, horizontalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded, verticalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded):
         '''
         Static method which launches a GraphicalChoiceDlg with the given options
         and returns the result
-        
+
         :param parent: (QWidget) The parent of the dialog (it will be centered on it)
         :param title: (str) the text which is displayed in the title bar of the dialog
-        :param msg: (str) the text which is shown to the user in the dialog, 
+        :param msg: (str) the text which is shown to the user in the dialog,
                     above the choices.
-        :param choices: (list<list>) a list of lists of strings to be used as 
+        :param choices: (list<list>) a list of lists of strings to be used as
                         choices names. The (possibly sparse) 2D array defined by
                         the nested lists will be used to present the choices in
                         a grid. The choice names will be used as keys for pixmaps
-        :param pixmaps: (dict<str,QPixmap>) dictionary mapping the choices text to 
+        :param pixmaps: (dict<str,QPixmap>) dictionary mapping the choices text to
                         corresponding pixmap. If no valid pixmap is provided for
                         a given choice, the defaultPixmap will be used
         :param iconSize: (int) size of the icons to be displayed (128px by default)
-        :param defaultPixmap: (QPixmap) Default Pixmap to use if none passed for a 
+        :param defaultPixmap: (QPixmap) Default Pixmap to use if none passed for a
                               given choice. No Pixmap will be used if None passed.
         :param horizontalScrollBarPolicy: (enum Qt.ScrollBarPolicy) defines the mode of the horizontal scroll bar.
                                           The default mode is ScrollBarAsNeeded.
@@ -106,68 +107,73 @@ class GraphicalChoiceDlg(Qt.QDialog):
                  the chosen option. ok is true if the user pressed OK and false
                  if the user pressed Cancel.
         '''
-        dlg = GraphicalChoiceDlg(parent=parent, choices=choices, pixmaps=pixmaps, iconSize=iconSize, 
-                                 defaultPixmap=defaultPixmap, horizontalScrollBarPolicy=horizontalScrollBarPolicy, 
+        dlg = GraphicalChoiceDlg(parent=parent, choices=choices, pixmaps=pixmaps, iconSize=iconSize,
+                                 defaultPixmap=defaultPixmap, horizontalScrollBarPolicy=horizontalScrollBarPolicy,
                                  verticalScrollBarPolicy=verticalScrollBarPolicy)
         dlg.setWindowTitle(title)
         dlg.setMessage(msg)
         dlg.exec_()
         return dlg.getChosen(), (dlg.result() == dlg.Accepted)
-        
-        
+
 
 class GraphicalChoiceWidget(Qt.QScrollArea):
     '''A widget that presents a 2D grid of buttons'''
-    def __init__(self, parent=None, designMode=False, choices=None, pixmaps=None, iconSize=128, 
-                 defaultPixmap=None, horizontalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded, 
+
+    choiceMade = Qt.pyqtSignal(str)
+
+    def __init__(self, parent=None, designMode=False, choices=None, pixmaps=None, iconSize=128,
+                 defaultPixmap=None, horizontalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded,
                  verticalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded):
         Qt.QScrollArea.__init__(self, parent)
 
         self._chosen = None
         self._iconSize = iconSize
-        if defaultPixmap is None: defaultPixmap = Qt.QPixmap()
+        if defaultPixmap is None:
+            defaultPixmap = Qt.QPixmap()
         self._defaultPixmap = defaultPixmap
-        
+
         self.setFrameShape(Qt.QFrame.NoFrame)
         self.setWidgetResizable(True)
         self.setHorizontalScrollBarPolicy(horizontalScrollBarPolicy)
         self.setVerticalScrollBarPolicy(verticalScrollBarPolicy)
-        
+
         w = Qt.QWidget()
         self.gridLayout = Qt.QGridLayout()
         w.setLayout(self.gridLayout)
-        self.setWidget(w)        
-        
+        self.setWidget(w)
 
-        if choices is not None: 
+        if choices is not None:
             self.setChoices(choices, pixmaps)
         elif designMode:
-            import taurus.qt.qtgui.resource
-            pm=taurus.qt.qtgui.resource.getPixmap(':/taurus.png')
-            self.setChoices([['choice1','choice2'],['choice3','choice4']], dict(choice1=pm,choice2=pm,choice3=pm,choice4=pm))
-            
+            from taurus.qt.qtgui.icon import getCachedPixmap
+            pm = getCachedPixmap('logos:taurus.png')
+            self.setChoices([['choice1', 'choice2'], ['choice3', 'choice4']],
+                            dict(choice1=pm, choice2=pm, choice3=pm,
+                                 choice4=pm))
 
     def setChoices(self, choices, pixmaps=None):
-        '''        
+        '''
         sets the available options
-        
-        :param choices: (list<list>) a list of lists of strings to be used as 
+
+        :param choices: (list<list>) a list of lists of strings to be used as
                         choices names. The (possibly sparse) 2D array defined by
                         the nested lists will be used to present the choices in
                         a grid. The choice names will be used as keys for pixmaps
-        :param pixmaps: (dict<str,QPixmap>) dictionary mapping the choices text to 
+        :param pixmaps: (dict<str,QPixmap>) dictionary mapping the choices text to
                         corresponding pixmap. If no valid pixmap is provided for
                         a given choice, a default pixmap will be used
         '''
-        if pixmaps is None: pixmaps={}
-        for i,rowlist in enumerate(choices):
-            for j,choice in enumerate(rowlist):
-                self.setChoice(i, j, str(choice), pixmap=pixmaps.get(choice,None))
-            
+        if pixmaps is None:
+            pixmaps = {}
+        for i, rowlist in enumerate(choices):
+            for j, choice in enumerate(rowlist):
+                self.setChoice(i, j, str(choice),
+                               pixmap=pixmaps.get(choice, None))
+
     def setChoice(self, row, col, text, pixmap=None, tooltip=None):
-        ''' 
+        '''
         sets the option for a given row,column coordinate in the grid
-        
+
         :param row: (int) row in the grid for this option
         :param col: (int) column in the grid for this option
         :param text: (str) name for this option
@@ -182,16 +188,15 @@ class GraphicalChoiceWidget(Qt.QScrollArea):
         button = Qt.QToolButton()
         button.setText(text)
         button.setIcon(Qt.QIcon(pixmap))
-        button.setIconSize(Qt.QSize(self._iconSize,self._iconSize))
+        button.setIconSize(Qt.QSize(self._iconSize, self._iconSize))
         button.setToolTip(tooltip)
-        self.connect(button,Qt.SIGNAL("clicked()"),self.onClick)
-        self.gridLayout.addWidget(button,row,col, Qt.Qt.AlignCenter)
-        
+        button.clicked.connect(self.onClick)
+        self.gridLayout.addWidget(button, row, col, Qt.Qt.AlignCenter)
+
     def onClick(self):
         '''slot called when a button is clicked'''
         self._chosen = unicode(self.sender().text())
-        self.emit(Qt.SIGNAL('choiceMade'),self._chosen)
-        
+        self.choiceMade.emit(self._chosen)
 
     def getChosen(self):
         '''
@@ -199,60 +204,58 @@ class GraphicalChoiceWidget(Qt.QScrollArea):
         :return: (str)
         '''
         return self._chosen
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         """Returns pertinent information in order to be able to build a valid
         QtDesigner widget plugin
-        
-        The dictionary returned by this method should contain *at least* the 
+
+        The dictionary returned by this method should contain *at least* the
         following keys and values:
         - 'module' : a string representing the full python module name (ex.: 'taurus.qt.qtgui.base')
-        - 'icon' : a string representing valid resource icon (ex.: ':/designer/combobox.png')
+        - 'icon' : a string representing valid resource icon (ex.: 'designer:combobox.png')
         - 'container' : a bool telling if this widget is a container widget or not.
-        
+
         This default implementation returns the following dictionary::
-        
+
             { 'group'     : 'Taurus Widgets',
-              'icon'      : ':/designer/taurus.png',
+              'icon'      : 'logos:taurus.png',
               'container' : False }
-        
+
         :return: (dict) a map with pertinent designer information"""
         return {
-            'module'    : 'taurus.qt.qtgui.input',     
-            'group'     : 'Taurus Input',
-            'icon'      : ':/designer/taurus.png',
-            'container' : False }
+            'module': 'taurus.qt.qtgui.input',
+            'group': 'Taurus Input',
+            'icon': 'logos:taurus.png',
+            'container': False}
 
 
-
-#------------------------------------------------------------------------------ 
+#------------------------------------------------------------------------------
 
 def testWidget():
     import sys
     app = Qt.QApplication(sys.argv)
-    w = GraphicalChoiceWidget(None,True)
+    w = GraphicalChoiceWidget(None, True)
     w.show()
     sys.exit(app.exec_())
 
+
 def main():
     import sys
-    import taurus.qt.qtgui.resource 
+    from taurus.qt.qtgui.icon import getCachedPixmap
     app = Qt.QApplication(sys.argv)
-    
-    pixmaps={}
-    choices=[['TaurusForm','TaurusTrend'],['TaurusPlot', 'Qub']]
+
+    pixmaps = {}
+    choices = [['TaurusForm', 'TaurusTrend'], ['TaurusPlot', 'Qub']]
     for row in choices:
         for k in row:
-            pixmaps[k] = taurus.qt.qtgui.resource.getPixmap(':/snapshot/%s.png'%k)
+            pixmaps[k] = getCachedPixmap('snapshot:%s.png' % k)
+
+    print GraphicalChoiceDlg.getChoice(parent=None, title='Panel chooser', msg='Choose the type of Panel:', choices=choices, pixmaps=pixmaps)
 
-    print GraphicalChoiceDlg.getChoice(parent=None, title= 'Panel chooser', msg='Choose the type of Panel:', choices=choices, pixmaps=pixmaps)
-        
     sys.exit()
 
 
 if __name__ == "__main__":
-    main()    
-    #testWidget()
-        
-        
+    main()
+    # testWidget()
diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py
old mode 100644
new mode 100755
index 54c56ff..32752fe
--- a/lib/taurus/qt/qtgui/input/qwheel.py
+++ b/lib/taurus/qt/qtgui/input/qwheel.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,21 +34,23 @@ import math
 import numpy
 
 from taurus.external.qt import Qt
+from taurus.external.pint import Q_
 
 class _ArrowButton(Qt.QPushButton):
     """Private class to be used by QWheelEdit for an arrow button"""
 
-    ArrowPixmapName = ":/arrow01.svg"
+    ArrowPixmapName = "extra_icons:arrow01.svg"
 
     ButtonSize = 14
-    IconSize = ButtonSize-2
-    
-    def __init__(self, id, parent = None):
+    IconSize = ButtonSize - 2
+
+    def __init__(self, id, parent=None):
         Qt.QPushButton.__init__(self, parent)
         self.setAutoDefault(False)
         pixmap = self.getPixmap()
         self.setIcon(Qt.QIcon(pixmap))
-        self.setIconSize(Qt.QSize(_ArrowButton.IconSize, _ArrowButton.IconSize))
+        self.setIconSize(
+            Qt.QSize(_ArrowButton.IconSize, _ArrowButton.IconSize))
         self.setFocusPolicy(Qt.Qt.ClickFocus)
         self.setFlat(True)
         self.setStyleSheet('_ArrowButton { border: 0px; }')
@@ -60,16 +62,16 @@ class _ArrowButton(Qt.QPushButton):
 
 class _UpArrowButton(_ArrowButton):
     """Private class to be used by QWheelEdit for an up arrow button"""
-    
+
     ArrowPixmapKey = "upArrow01"
-    
-    def __init__(self, id, parent = None):
+
+    def __init__(self, id, parent=None):
         _ArrowButton.__init__(self, id, parent)
-        
+
     def getPixmap(self):
         pm = Qt.QPixmapCache.find(_UpArrowButton.ArrowPixmapKey)
         if pm is None:
-            pm = Qt.QPixmap(_UpArrowButton.ArrowPixmapName)
+            pm = Qt.QPixmap(self.ArrowPixmapName)
             Qt.QPixmapCache.insert(_UpArrowButton.ArrowPixmapKey, pm)
         return pm
 
@@ -78,39 +80,39 @@ class _DownArrowButton(_ArrowButton):
     """Private class to be used by QWheelEdit for a down arrow button"""
 
     ArrowPixmapKey = "downArrow01"
-    
-    def __init__(self, id, parent = None):
+
+    def __init__(self, id, parent=None):
         _ArrowButton.__init__(self, id, parent)
         self._inc = -self._inc
 
     def getPixmap(self):
         pm = Qt.QPixmapCache.find(_DownArrowButton.ArrowPixmapKey)
         if pm is None:
-            pm = Qt.QPixmap(_DownArrowButton.ArrowPixmapName)
+            pm = Qt.QPixmap(self.ArrowPixmapName)
             pm = pm.transformed(Qt.QMatrix().rotate(180))
             Qt.QPixmapCache.insert(_DownArrowButton.ArrowPixmapKey, pm)
         return pm
 
-
 class _DigitLabel(Qt.QLabel):
     """A private single digit label to be used by QWheelEdit widget"""
-    
-    PixmapKeys  = map(str,xrange(10)) + ['blank','minus','point']
-    
-    def __init__(self, lbl, parent = None):
+
+    PixmapKeys = map(str, xrange(10)) + ['blank', 'minus', 'point']
+
+    def __init__(self, lbl, parent=None):
         Qt.QLabel.__init__(self, parent)
         self.setAlignment(Qt.Qt.AlignCenter)
         self.setFocusPolicy(Qt.Qt.StrongFocus)
-        self.setStyleSheet("""QLabel:focus {background-color: rgb(180,180,255); border-width: 1px; border-style: solid; border-color: rgb(200,200,255);}""")
+        self.setStyleSheet(
+            """QLabel:focus {background-color: rgb(180,180,255); border-width: 1px; border-style: solid; border-color: rgb(200,200,255);}""")
         self.resetSkin()
         self.setText(lbl)
         self._upButton = None
         self._downButton = None
-    
+
     def setButtons(self, up, down):
         self._upButton = up
         self._downButton = down
-    
+
     def keyPressEvent(self, key_event):
         if key_event.key() == Qt.Qt.Key_Up:
             self._upButton.click()
@@ -124,7 +126,7 @@ class _DigitLabel(Qt.QLabel):
 
     def _update_skin_cache(self):
         skin = os.path.join('digits', self.getSkin())
-        
+
         for i, d in enumerate(self.PixmapKeys):
             full_name = os.path.join(skin, d)
             pm = Qt.QPixmapCache.find(full_name)
@@ -135,7 +137,6 @@ class _DigitLabel(Qt.QLabel):
                     continue
                 if not pm.isNull():
                     Qt.QPixmapCache.insert(full_name, pm)
-        
 
     def setSkin(self, skin_name):
         self._skin = skin_name
@@ -150,10 +151,13 @@ class _DigitLabel(Qt.QLabel):
 
     def setText(self, t):
         k = t
-        if k == '.': k = 'point'
-        elif k == '-' : k = 'minus'
-        elif k is None or k == '+': k = 'blank'
-        
+        if k == '.':
+            k = 'point'
+        elif k == '-':
+            k = 'minus'
+        elif k is None or k == '+':
+            k = 'blank'
+
         k = os.path.join('digits', self.getSkin(), k)
         pm = Qt.QPixmapCache.find(k)
         if pm is None:
@@ -161,14 +165,14 @@ class _DigitLabel(Qt.QLabel):
             return
         Qt.QLabel.setText(self, '')
         self.setPixmap(pm)
-        
+
     skin = Qt.pyqtProperty('QString', getSkin, setSkin, resetSkin)
 
-    
+
 class _NumericEditor(Qt.QLineEdit):
     """A private editor to be used by QWheelEdit widget"""
-    
-    def __init__(self, parent = None):
+
+    def __init__(self, parent=None):
         Qt.QLineEdit.__init__(self, parent)
         self.setValidator(Qt.QDoubleValidator(self))
         self.setFrame(False)
@@ -177,20 +181,19 @@ class _NumericEditor(Qt.QLineEdit):
 class QWheelEdit(Qt.QFrame):
     """A widget designed to handle numeric scalar values. It allows interaction
     based on single digit as well as normal value edition."""
-    
-    NumberChangedStr = 'numberChanged(double)'
-    NumberEditedStr  = 'numberEdited(double)'
-    
+
+    numberChanged = Qt.pyqtSignal(float)
+    numberEdited = Qt.pyqtSignal(float)
+    returnPressed = Qt.pyqtSignal()
+
     DefaultIntDigitCount = 6
     DefaultDecDigitCount = 2
 
-    __pyqtSignals__ = (NumberChangedStr, NumberEditedStr)
-    
-    def __init__(self, parent = None):
+    def __init__(self, parent=None):
         """__init__(self, parent = None) -> QWheelEdit
-        
+
         Constructor
-        
+
         @param[in] parent (QWidget) the parent widget (optional, default is None
                           meaning there is no parent
         """
@@ -200,74 +203,78 @@ class QWheelEdit(Qt.QFrame):
         self._previous_value = 0
         self._value = 0
         self._value_str = '0'
-        self._minValue = numpy.finfo('d').min # -inf
-        self._maxValue = numpy.finfo('d').max # inf
+        self._minValue = numpy.finfo('d').min  # -inf
+        self._maxValue = numpy.finfo('d').max  # inf
         self._editor = None
         self._editing = False
         self._showArrowButtons = True
-        self._setDigits(QWheelEdit.DefaultIntDigitCount, QWheelEdit.DefaultDecDigitCount)
+        self._setDigits(QWheelEdit.DefaultIntDigitCount,
+                        QWheelEdit.DefaultDecDigitCount)
         self._setValue(0)
-        
+
         self._build()
-    
+
     def _getMinPossibleValue(self):
         """_getMinPossibleValue(self) -> None
-        
+
         Determines which is the minimum possible value that can be represented
         with the current total number of digits.
-        
+
         @return (float) the minimum possible value
         """
         decmax = 0
-        for i in xrange(self.getDecDigitCount()): decmax += 9*math.pow(10,-(i+1))
+        for i in xrange(self.getDecDigitCount()):
+            decmax += 9 * math.pow(10, -(i + 1))
         return -math.pow(10.0, self.getIntDigitCount()) + 1 - decmax
 
     def _getMaxPossibleValue(self):
         """_getMaxPossibleValue(self) -> None
-        
+
         Determines which is the maximum possible value that can be represented
         with the current total number of digits.
-        
+
         @return (float) the maximum possible value
         """
         decmax = 0
-        for i in xrange(self.getDecDigitCount()): decmax += 9*math.pow(10,-(i+1))
-        return math.pow(10.0, self.getIntDigitCount())- 1 + decmax
-    
+        for i in xrange(self.getDecDigitCount()):
+            decmax += 9 * math.pow(10, -(i + 1))
+        return math.pow(10.0, self.getIntDigitCount()) - 1 + decmax
+
     def _build(self):
         """_build(self) -> None
-        
+
         Builds this widget sub-items"""
-        
+
         l = self.layout()
         l.setSpacing(0)
         l.setMargin(0)
-        
+
         id = self.getIntDigitCount()
         dd = self.getDecDigitCount()
         digits = self.getDigitCount()
 
-        self._upButtons   = Qt.QButtonGroup()
+        self._upButtons = Qt.QButtonGroup()
         self._downButtons = Qt.QButtonGroup()
         self._digitLabels = []
-        for l in self._digitLabels: l.setAlignment(Qt.AlignCenter)
-        
+        for l in self._digitLabels:
+            l.setAlignment(Qt.AlignCenter)
+
         showDot = self.getDecDigitCount() > 0
-        
+
         signLabel = _DigitLabel('+')
         signLabel.setFocusPolicy(Qt.Qt.NoFocus)
-        signLabel.setAlignment(Qt.Qt.AlignRight|Qt.Qt.AlignVCenter)
+        signLabel.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter)
         self._digitLabels.append(signLabel)
         l.addWidget(signLabel, 1, 0)
         l.setRowMinimumHeight(1, signLabel.minimumSizeHint().height())
         l.setColumnMinimumWidth(0, _ArrowButton.ButtonSize)
-        l.setColumnStretch(0,1)
-            
+        l.setColumnStretch(0, 1)
+
         for i in xrange(id):
             col = i + 1
             d = _DigitLabel('0')
-            up   = _UpArrowButton(id-i-1)
-            down = _DownArrowButton(id-i-1)
+            up = _UpArrowButton(id - i - 1)
+            down = _DownArrowButton(id - i - 1)
             d.setButtons(up, down)
             up.setFocusProxy(d)
             down.setFocusProxy(d)
@@ -285,13 +292,14 @@ class QWheelEdit(Qt.QFrame):
             dotLabel.setAlignment(Qt.Qt.AlignCenter)
             self._digitLabels.append(dotLabel)
             l.addWidget(dotLabel, 1, id + 1)
-            
+
         for i in xrange(id, digits):
             col = i + 1
-            if showDot: col += 1
+            if showDot:
+                col += 1
             d = _DigitLabel('0')
-            up   = _UpArrowButton(id-i-1)
-            down = _DownArrowButton(id-i-1)
+            up = _UpArrowButton(id - i - 1)
+            down = _DownArrowButton(id - i - 1)
             d.setButtons(up, down)
             up.setFocusProxy(d)
             down.setFocusProxy(d)
@@ -302,40 +310,32 @@ class QWheelEdit(Qt.QFrame):
                 l.addWidget(up, 0, col)
                 l.addWidget(down, 2, col)
             l.addWidget(d, 1, col)
-            
-        self.connect(self._upButtons, 
-                     Qt.SIGNAL('buttonClicked(QAbstractButton *)'),
-                     self.buttonPressed)
-        self.connect(self._downButtons, 
-                     Qt.SIGNAL('buttonClicked(QAbstractButton *)'),
-                     self.buttonPressed)
-        
+
+        self._upButtons.buttonClicked.connect(self.buttonPressed)
+        self._downButtons.buttonClicked.connect(self.buttonPressed)
+
         ed = _NumericEditor(self)
-        self.connect(ed, Qt.SIGNAL('returnPressed()'), self.editingFinished)
-        self.connect(ed, Qt.SIGNAL('lostFocus()'), ed.hide)
+        ed.returnPressed.connect(self.editingFinished)
+        ed.lostFocus.connect(ed.hide)
         rect = Qt.QRect(l.cellRect(1, 0).topLeft(), l.cellRect(1,
-                            l.columnCount() - 1).bottomRight())
+                                                               l.columnCount() - 1).bottomRight())
         ed.setGeometry(rect)
         ed.setAlignment(Qt.Qt.AlignRight)
-        ed.validator().setRange(self.getMinValue(), self.getMaxValue(), 
+        ed.validator().setRange(self.getMinValue(), self.getMaxValue(),
                                 self.getDecDigitCount())
         ed.setVisible(False)
         self._editor = ed
         self.clearWarning()
-        
+
     def _clear(self):
         """_clear(self) -> None
-        
+
         Clears this widget sub-items"""
-        
-        self.disconnect(self._upButtons,
-                        Qt.SIGNAL('buttonClicked(QAbstractButton *)'),
-                        self.buttonPressed)
-        self.disconnect(self._downButtons,
-                        Qt.SIGNAL('buttonClicked(QAbstractButton *)'),
-                        self.buttonPressed)
-        
-        for b in self._upButtons.buttons(): 
+
+        self._upButtons.buttonClicked.disconnect(self.buttonPressed)
+        self._downButtons.buttonClicked.disconnect(self.buttonPressed)
+
+        for b in self._upButtons.buttons():
             self._upButtons.removeButton(b)
             b.setParent(None)
             b.destroy()
@@ -357,15 +357,15 @@ class QWheelEdit(Qt.QFrame):
 
     def _setMinMax(self, min, max):
         """_setMinMax(self, min, max) -> None
-        
+
         Sets the minimum and maximum values for this widget
-        
+
         @param[in] min(float) minimum value
         @param[in] max(float) maximum value
         """
         self._minValue = min
         self._maxValue = max
-    
+
     def _setDigits(self, int_nb=None, dec_nb=None):
         """_setDigits(self, int_nb=None, dec_nb=None) -> None
 
@@ -389,23 +389,23 @@ class QWheelEdit(Qt.QFrame):
 
         self._digitCount = self._intDigitCount + self._decDigitCount
         total_chars = self._digitCount
-        total_chars += 1 # for sign
+        total_chars += 1  # for sign
         if self._decDigitCount > 0:
-            total_chars += 1 # for dot
+            total_chars += 1  # for dot
         self._valueFormat = '%%+0%d.%df' % (total_chars, self._decDigitCount)
-        self._setMinMax( self._getMinPossibleValue(),
-                         self._getMaxPossibleValue())
+        self._setMinMax(self._getMinPossibleValue(),
+                        self._getMaxPossibleValue())
         # we call setValue to update the self._value_str
         self._setValue(self.getValue())
-        
+
     def _buildValueStr(self, v):
         """_buildValueStr(self, v) -> str
-        
+
         Builds a string representation of the given value according to the
         number of digits this widget can currently represent
-        
+
         @param[in] v (float) the value to be translated
-        
+
         @return (str) a proper string representation of the given value
         """
         if v is None:
@@ -413,32 +413,32 @@ class QWheelEdit(Qt.QFrame):
         else:
             ret = self._valueFormat % v
             if ret.endswith('nan'):
-                ret = ret.replace('0',' ')
+                ret = ret.replace('0', ' ')
         self._value_str = ret
         return ret
-    
+
     def _updateDigits(self):
         """_updateDigits(self) -> None
-        
-        Updates this widget contents (sub-widgets) according to the current 
+
+        Updates this widget contents (sub-widgets) according to the current
         widget configuration
         """
         self._clear()
         self._build()
         self._updateValue(False, False)
-        
+
     def _updateValue(self, trigValueChanged=True, trigValueEdited=True):
         """_updateValue(self, trigValueChanged=True, trigValueEdited=True) -> None
-        
+
         Updates this widget displayed value and potentially send signal(s)
-        
+
         @param[in] trigValueChanged (bool) (optional, default is True) wheather or
                    not to send signal 'valueChanged(double)'
         @param[in] trigValueEdited (bool) (optional, default is True) wheather or
                    not to send signal 'valueEdit(double)'
         """
         v, v_str = self.getValue(), self.getValueStr()
-        
+
         if len(v_str) > len(self._digitLabels):
             # do auto adjust
             if '.' in v_str:
@@ -452,16 +452,16 @@ class QWheelEdit(Qt.QFrame):
 
         for i, c in enumerate(v_str):
             self._digitLabels[i].setText(c)
-        
+
         if trigValueChanged:
-            self.emit(Qt.SIGNAL(QWheelEdit.NumberChangedStr), v)
-            
+            self.numberChanged.emit(v)
+
         if trigValueEdited:
-            self.emit(Qt.SIGNAL(QWheelEdit.NumberEditedStr), v)
+            self.numberEdited.emit(v)
 
     def setRoundFunc(self, roundFunc):
         """setRoundFunc(self, roundFunc) -> None
-        
+
         Sets the rounding function to use when calling _setValue(). This allows you to
         filter invalid user input
 
@@ -471,17 +471,17 @@ class QWheelEdit(Qt.QFrame):
 
     def getPreviousValue(self):
         """getPreviousValue(self) -> float
-        
+
         Gives the previous value of this widget
-        
+
         @return (float) the previous value of this widget
         """
         return self._previous_value
-    
+
     def _setValue(self, v):
         """_setValue(self, v) -> None
-        
-        Sets value of this widget. If the given value exceeds any limit, the 
+
+        Sets value of this widget. If the given value exceeds any limit, the
         value is NOT set.
         """
         if self._roundFunc:
@@ -491,96 +491,98 @@ class QWheelEdit(Qt.QFrame):
         self._previous_value = self._value
         self._value = v
         self._buildValueStr(v)
-    
+
     def setWarning(self, msg):
         """setWarning(self, msg) -> None
-        
+
         Activates the warning style for this widget. This means a violet border
         and a tooltip with the given message.
-        
+
         @param[in] msg (str) the message to be displayed as tooltip
         """
-        self.setStyleSheet('QWheelEdit {border: 1px solid; border-radius: 4px; border-color: violet}')
+        self.setStyleSheet(
+            'QWheelEdit {border: 1px solid; border-radius: 4px; border-color: violet}')
         self.setToolTip(msg)
-        
+
     def clearWarning(self):
         """clearWarning(self) -> None
-        
+
         Clears the warning style. If not in warning mode, nothing is done.
         """
-        self.setStyleSheet('QWheelEdit {border: 1px solid; border-radius: 4px; border-color: rgba(0,0,0,0)}')
+        self.setStyleSheet(
+            'QWheelEdit {border: 1px solid; border-radius: 4px; border-color: rgba(0,0,0,0)}')
         self.setToolTip('')
-    
+
     def buttonPressed(self, b):
         """buttonPressed(self, b) -> None
-        
+
         Slot executed when an arrow button is pressed from the button group
-        
+
         @param[in] b (_ArrowButton) the button which was pressed
         """
         self._setValue(self.getValue() + b._inc)
         self._updateValue()
-    
+
     def setDigitCount(self, int_nb, dec_nb):
         """setDigitCount(self, int_nb, dec_nb) -> None
-        
+
         Updates the displayed digits.
-        
+
         @param[in] int_nb(int) number of integer digits
         @param[in] dec_nb(int) number of decimal digits
         """
         self._setDigits(int_nb=int_nb, dec_nb=dec_nb)
         self._updateDigits()
-    
+
     def getDigitCount(self):
         """getDigitCount(self) -> int
-        
+
         Gets the total number of digits this widget displays
-        
+
         @return (int) the total number of digits this widget displays
         """
         return self._digitCount
-    
+
     def getIntDigitCount(self):
         """getIntDigitCount(self) -> int
-        
+
         Gets the number of integer digits this widget displays
-        
+
         @return (int) the number of integer digits this widget displays
         """
         return self._intDigitCount
-    
+
     def setIntDigitCount(self, n):
         """setIntDigitCount(self, n) -> None
-        
+
         Sets the number of integer digits this widget displays
-        
+
         @param[in] n (int) the number of integer digits to display
         """
         self._setDigits(int_nb=n)
         self._updateDigits()
-    
+
     def resetIntDigitCount(self):
         """resetIntDigitCount(self) -> None
-        
+
         Resets the number of integer digits this widget displays to DefaultIntDigitCount
         """
         self.setIntDigitCount(QWheelEdit.DefaultIntDigitCount)
-        
+
     def getDecDigitCount(self):
         """getDecDigitCount(self) -> int
-        
+
         Gets the number of decimal digits this widget displays
-        
+
         @return (int) the number of decimal digits this widget displays
         """
         return self._decDigitCount
 
     def setDecDigitCount(self, n):
         """setDecDigitCount(self, n) -> None
-        
+
         Sets the number of decimal digits this widget displays
-        
+
         @param[in] n (int) the number of decimal digits to display
         """
 
@@ -589,101 +591,103 @@ class QWheelEdit(Qt.QFrame):
 
     def resetDecDigitCount(self):
         """resetDecDigitCount(self) -> None
-        
+
         Resets the number of decimal digits this widget displays to DefaultDecDigitCount
         """
         self.setDecDigitCount(QWheelEdit.DefaultDecDigitCount)
-    
+
     def setValue(self, v):
         """setValue(self, v) -> None
-        
+
         Sets the value of this widget.
         Send a 'valueChanged(double)' Qt signal
-        
-        @param[in] v (float) the value to be set
+
+        @param[in] v (float/Quantity) the value to be set
         """
+        if isinstance(v, Q_):
+            v = v.magnitude
         self._setValue(v)
         self._updateValue(trigValueEdited=False)
 
     def resetValue(self):
         """resetValue(self) -> None
-        
+
         Resets the value of this widget to 0.0
         """
         self.setValue(0.0)
-    
+
     def getValue(self):
         """getValue(self) -> float
-        
+
         Gets the current value of this widget
-        
+
         @return (float) the value currently displayed by the widget
         """
         return self._value
-    
+
     def getValueStr(self):
         """getValueStr(self) -> str
-        
+
         Gets the current value string of this widget
-        
+
         @return (str) the value currently displayed by the widget
         """
         return self._value_str
-    
+
     def getMinValue(self):
         """getMinValue(self) -> float
-        
+
         Gets the minimum allowed value
-        
+
         @return (float) the minimum allowed value
-        """ 
+        """
         return self._minValue
-    
+
     def setMinValue(self, v):
         """setMinValue(self, v) -> None
-        
+
         Sets the minimum allowed value for the widget
-        
+
         @param[in] v (float) the new minimum allowed value
         """
         self._minValue = v
         w = self.getEditWidget()
         if not w is None:
             w.validator().setRange(self._minValue, self._maxValue, self._decDigitCount)
-    
+
     def resetMinValue(self):
         """resetMinValue(self) -> None
-        
-        Resets the minimum allowed value to the minimum possible according to 
+
+        Resets the minimum allowed value to the minimum possible according to
         the current total number of digits
         """
         self.setMinValue(self._getMinPossibleValue())
-        
+
     def getMaxValue(self):
         """getMaxValue(self) -> float
-        
+
         Gets the maximum allowed value
-        
+
         @return (float) the maximum allowed value
-        """ 
+        """
         return self._maxValue
-    
+
     def setMaxValue(self, v):
         """setMaxValue(self, v) -> None
-        
+
         Sets the maximum allowed value for the widget
-        
+
         @param[in] v (float) the new maximum allowed value
         """
         self._maxValue = v
         w = self.getEditWidget()
         if not w is None:
             w.validator().setRange(self._minValue, self._maxValue, self._decDigitCount)
-    
+
     def resetMaxValue(self):
         """resetMaxValue(self) -> None
-        
-        Resets the maximum allowed value to the maximum possible according to 
+
+        Resets the maximum allowed value to the maximum possible according to
         the current total number of digits
         """
         self.setMaxValue(self._getMaxPossibleValue())
@@ -696,10 +700,10 @@ class QWheelEdit(Qt.QFrame):
             b.setAutoRepeat(v)
         for b in self._downButtons.buttons():
             b.setAutoRepeat(v)
-    
+
     def resetAutoRepeat(self):
         self.setAutoRepeat(False)
-    
+
     def getAutoRepeatDelay(self):
         return self._upButtons.buttons()[0].autoRepeatDelay()
 
@@ -708,7 +712,7 @@ class QWheelEdit(Qt.QFrame):
             b.setAutoRepeatDelay(milisecs)
         for b in self._downButtons.buttons():
             b.setAutoRepeatDelay(milisecs)
-    
+
     def getAutoRepeatInterval(self):
         return self._upButtons.buttons()[0].autoRepeatInterval()
 
@@ -717,34 +721,34 @@ class QWheelEdit(Qt.QFrame):
             b.setAutoRepeatInterval(milisecs)
         for b in self._downButtons.buttons():
             b.setAutoRepeatInterval(milisecs)
-    
+
     def getEditWidget(self):
         """getEditWidget(self) -> QWidget
-        
+
         Gets the widget object used when the user manually sets the value
-        
+
         @return (QWidget) the widget used for editing
         """
         return self._editor
-    
+
     def editingFinished(self):
         """editingFinished(self) -> None
-        
+
         Slot called when the user finishes editing
         """
         ed = self.getEditWidget()
         v = float(ed.text())
         self._setValue(v)
         self._updateValue()
-        
+
     def showEditWidget(self):
         """showEditWidget(self) -> None
-        
+
         Forces the edition widget to be displayed
         """
         ed, l = self.getEditWidget(), self.layout()
         rect = Qt.QRect(l.cellRect(1, 0).topLeft(), l.cellRect(1,
-                            l.columnCount() - 1).bottomRight())
+                                                               l.columnCount() - 1).bottomRight())
         ed.setGeometry(rect)
         ed.setAlignment(Qt.Qt.AlignRight)
         ed.setMaxLength(self.getDigitCount() + 2)
@@ -752,16 +756,16 @@ class QWheelEdit(Qt.QFrame):
         ed.selectAll()
         ed.setFocus()
         ed.setVisible(True)
-    
+
     def hideEditWidget(self):
         """hideEditWidget(self) -> None
-        
+
         Forces the edition widget to be hidden
         """
         ed = self.getEditWidget()
         ed.setVisible(False)
         self.setFocus()
-    
+
     def wheelEvent(self, evt):
         numDegrees = evt.delta() / 8
         numSteps = numDegrees / 15
@@ -769,7 +773,7 @@ class QWheelEdit(Qt.QFrame):
         w = self.focusWidget()
         if not isinstance(w, _DigitLabel):
             return Qt.QFrame.wheelEvent(self, evt)
-        
+
         if numSteps > 0:
             inc = w._upButton._inc
         else:
@@ -777,23 +781,23 @@ class QWheelEdit(Qt.QFrame):
         numSteps *= inc
         self.setValue(self.getValue() + numSteps)
         evt.accept()
-        
+
     def mouseDoubleClickEvent(self, mouse_event):
         """mouseDoubleClickEvent(self, mouse_event)
-        
+
         Executed when user presses double click. This widget shows the edition
         widget when this happens
         """
         self.showEditWidget()
         self._editing = True
-        
+
     def keyPressEvent(self, key_event):
         """keyPressEvent(self, key_event) -> None
-        
+
         Exectuted when the user presses a key.
         F2 enters/leaves edition mode. ESC leaves edition mode
         """
-        k = key_event.key() 
+        k = key_event.key()
         if k == Qt.Qt.Key_F2:
             if self._editing:
                 self.hideEditWidget()
@@ -812,28 +816,28 @@ class QWheelEdit(Qt.QFrame):
                 self.hideEditWidget()
                 self._editing = False
             else:
-                self.emit(Qt.SIGNAL('returnPressed()'))
-        
-        #TODO Decide when to emit editingFinished for completeness
+                self.returnPressed.emit()
+
+        # TODO Decide when to emit editingFinished for completeness
         Qt.QWidget.keyPressEvent(self, key_event)
-    
+
     def getShowArrowButtons(self):
         return self._showArrowButtons
-    
+
     def setShowArrowButtons(self, yesno):
         self._showArrowButtons = yesno
         self._updateDigits()
-    
+
     def resetShowArrowButtons(self):
         self.setShowArrowButtons(True)
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     showArrowButtons = Qt.pyqtProperty("bool", getShowArrowButtons,
-                                       setShowArrowButtons, 
+                                       setShowArrowButtons,
                                        resetShowArrowButtons)
-                                    
+
     integerDigits = Qt.pyqtProperty("int", getIntDigitCount,
                                     setIntDigitCount, resetIntDigitCount)
 
@@ -857,17 +861,21 @@ class QWheelEdit(Qt.QFrame):
 
     autoRepeatInterval = Qt.pyqtProperty("int", getAutoRepeatInterval,
                                          setAutoRepeatInterval)
-                                        
+
+
 def main():
     global arrowWidget
+
     def resetAll():
         arrowWidget.resetIntDigitCount()
         arrowWidget.resetDecDigitCount()
         arrowWidget.resetMinValue()
         arrowWidget.resetMaxValue()
         arrowWidget.resetValue()
+
     def setNAN():
         arrowWidget.setValue(float('nan'))
+
     def setNone():
         arrowWidget.setValue(None)
     a = Qt.QApplication([])
@@ -876,13 +884,13 @@ def main():
     button_layout = Qt.QVBoxLayout()
     arrowWidget = QWheelEdit(panel)
     isb, dsb = Qt.QSpinBox(panel), Qt.QSpinBox(panel)
-    minv,maxv = Qt.QDoubleSpinBox(panel), Qt.QDoubleSpinBox(panel)
+    minv, maxv = Qt.QDoubleSpinBox(panel), Qt.QDoubleSpinBox(panel)
     resetbutton = Qt.QPushButton("Reset", panel)
     resetbutton.setDefault(True)
     nanbutton = Qt.QPushButton("Set NAN", panel)
     nonebutton = Qt.QPushButton("Set None", panel)
     showarrowbutton = Qt.QCheckBox("", panel)
-    
+
     l.addRow("Value", arrowWidget)
     l.addRow("Integer digits:", isb)
     l.addRow("Decimal digits:", dsb)
@@ -900,15 +908,15 @@ def main():
     minv.setValue(arrowWidget.getMinValue())
     maxv.setValue(arrowWidget.getMaxValue())
     showarrowbutton.setChecked(arrowWidget.getShowArrowButtons())
-    Qt.QObject.connect(isb, Qt.SIGNAL("valueChanged(int)"), arrowWidget.setIntDigitCount)
-    Qt.QObject.connect(dsb, Qt.SIGNAL("valueChanged(int)"), arrowWidget.setDecDigitCount)
-    Qt.QObject.connect(minv, Qt.SIGNAL("valueChanged(double)"), arrowWidget.setMinValue)
-    Qt.QObject.connect(showarrowbutton, Qt.SIGNAL("stateChanged(int)"), arrowWidget.setShowArrowButtons)
-    Qt.QObject.connect(nanbutton, Qt.SIGNAL("clicked()"), setNAN)
-    Qt.QObject.connect(nonebutton, Qt.SIGNAL("clicked()"), setNone)
-    Qt.QObject.connect(resetbutton, Qt.SIGNAL("clicked()"), resetAll)
+    isb.valueChanged.connect(arrowWidget.setIntDigitCount)
+    dsb.valueChanged.connect(arrowWidget.setDecDigitCount)
+    minv.valueChanged.connect(arrowWidget.setMinValue)
+    showarrowbutton.stateChanged.connect(arrowWidget.setShowArrowButtons)
+    nanbutton.clicked.connect(setNAN)
+    nonebutton.clicked.connect(setNone)
+    resetbutton.clicked.connect(resetAll)
     panel.setVisible(True)
     a.exec_()
-    
+
 if __name__ == "__main__":
     main()
diff --git a/lib/taurus/qt/qtgui/input/tauruscheckbox.py b/lib/taurus/qt/qtgui/input/tauruscheckbox.py
index ba7c3e1..923100c 100644
--- a/lib/taurus/qt/qtgui/input/tauruscheckbox.py
+++ b/lib/taurus/qt/qtgui/input/tauruscheckbox.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -36,23 +36,22 @@ from taurus.qt.qtgui.base import TaurusBaseWritableWidget
 class TaurusValueCheckBox(Qt.QCheckBox, TaurusBaseWritableWidget):
     """A QCheckBox connected to a boolean writable attribute model"""
 
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-
-    def __init__(self, qt_parent = None, designMode = False):
+    def __init__(self, qt_parent=None, designMode=False):
         name = "TaurusValueCheckBox"
         self.call__init__wo_kw(Qt.QCheckBox, qt_parent)
-        self.call__init__(TaurusBaseWritableWidget, name, designMode=designMode)
+        self.call__init__(TaurusBaseWritableWidget,
+                          name, designMode=designMode)
 
         self.setObjectName(name)
         self.updateStyle()
-        self.connect(self, Qt.SIGNAL('stateChanged(int)'),self.valueChanged)
+        self.stateChanged.connect(self.notifyValueChanged)
 
     def keyPressEvent(self, event):
         if event.key() in (Qt.Qt.Key_Return, Qt.Qt.Key_Enter):
             self.writeValue()
             event.accept()
         else:
-            Qt.QCheckBox.keyPressEvent(self,event)
+            Qt.QCheckBox.keyPressEvent(self, event)
             event.ignore()
 
     def minimumSizeHint(self):
@@ -72,14 +71,15 @@ class TaurusValueCheckBox(Qt.QCheckBox, TaurusBaseWritableWidget):
                 self.setText('----')
         else:
             self.setText('')
-        #Update pending operations style
+        # Update pending operations style
         if self.hasPendingOperations():
             txt = str(self.text()).strip()
             if len(txt) == 0:
                 self.setText("!")
             self.setStyleSheet('TaurusValueCheckBox {color: blue;}')
         else:
-            if str(self.text()) == "!": self.setText(" ")
+            if str(self.text()) == "!":
+                self.setText(" ")
             self.setStyleSheet('TaurusValueCheckBox {}')
         self.update()
 
@@ -93,7 +93,7 @@ class TaurusValueCheckBox(Qt.QCheckBox, TaurusBaseWritableWidget):
     def getQtDesignerPluginInfo(cls):
         ret = TaurusBaseWritableWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.input'
-        ret['icon'] = ":/designer/checkbox.png"
+        ret['icon'] = "designer:checkbox.png"
         return ret
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
diff --git a/lib/taurus/qt/qtgui/input/tauruscombobox.py b/lib/taurus/qt/qtgui/input/tauruscombobox.py
index efe5810..f742165 100644
--- a/lib/taurus/qt/qtgui/input/tauruscombobox.py
+++ b/lib/taurus/qt/qtgui/input/tauruscombobox.py
@@ -3,24 +3,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -32,8 +32,8 @@ __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 
-import PyTango
-import taurus.core
+from taurus.core import DataType, TaurusEventType
+from taurus.core.taurusattribute import TaurusAttribute
 from taurus.qt.qtgui.base import TaurusBaseWidget, TaurusBaseWritableWidget
 from taurus.core.util import eventfilters
 
@@ -41,16 +41,15 @@ from taurus.core.util import eventfilters
 class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
     '''This widget shows a combobox that offers a limited choice of values that
     can be set on an attribute.'''
-    
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
 
-    def __init__(self, parent = None, designMode = False):
+    def __init__(self, parent=None, designMode=False):
         self._previousModelName = None
         self._lastValueByUser = None
-        
+
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QComboBox, parent)
-        self.call__init__(TaurusBaseWritableWidget, name, designMode=designMode)
+        self.call__init__(TaurusBaseWritableWidget,
+                          name, designMode=designMode)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Helper methods
@@ -70,18 +69,19 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
     def preAttach(self):
         '''reimplemented from :class:`TaurusBaseWritableWidget`'''
         TaurusBaseWritableWidget.preAttach(self)
-        Qt.QObject.connect(self, Qt.SIGNAL("currentIndexChanged(int)"),
-                               self.writeIndexValue)
-        Qt.QObject.connect(self, Qt.SIGNAL("applied()"),
-                               self.writeValue)
+        self.currentIndexChanged.connect(self.writeIndexValue)
+        self.applied.connect(self.writeValue)
 
     def postDetach(self):
         '''reimplemented from :class:`TaurusBaseWritableWidget`'''
         TaurusBaseWritableWidget.postDetach(self)
-        Qt.QObject.disconnect(self, Qt.SIGNAL("currentIndexChanged(int)"),
-                                  self.writeIndexValue)
-        Qt.QObject.disconnect(self, Qt.SIGNAL("applied()"),
-                                  self.writeValue)
+        try:
+            self.currentIndexChanged.disconnect(self.writeIndexValue)
+            self.applied.disconnect(self.writeValue)
+        except TypeError:
+            # In new style-signal if a signal is disconnected without
+            # previously was connected it, it raises a TypeError
+            pass
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWritableWidget overwriting / Pending operations
@@ -95,18 +95,18 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
         model = self.getModelObj()
         if model is None:
             return None
-
+        dtype = model.type
         new_value = self.itemData(self.currentIndex())
         if new_value is None:
             return None
 
-        if PyTango.is_int_type(model.data_type):
+        if dtype == DataType.Integer:
             func = int
-        elif PyTango.is_float_type(model.data_type):
+        elif dtype == DataType.Float:
             func = float
-        elif model.data_type in (PyTango.DevString,):
+        elif dtype == DataType.String:
             func = str
-        elif model.data_type in (PyTango.DevBoolean,):
+        elif dtype == DataType.Boolean:
             func = bool
         else:
             return None
@@ -120,7 +120,7 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
         """
         index = self.findData(Qt.QVariant(value))
         self._setCurrentIndex(index)
-    
+
     def updateStyle(self):
         '''reimplemented from :class:`TaurusBaseWritableWidget`'''
         if self.hasPendingOperations():
@@ -133,21 +133,21 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
     # signals, gui events... things related to "write" in the end
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    @Qt.pyqtSignature("currentIndexChanged(int)")
+    @Qt.pyqtSlot(int, name='currentIndexChanged')
     def writeIndexValue(self, index):
         '''slot called to emit a valueChanged signal when the currentIndex is changed'''
         self.emitValueChanged()
         if self.getAutoApply():
-            self.emit(Qt.SIGNAL("applied()"))
+            self.applied.emit()
 
     def keyPressEvent(self, event):
-        '''reimplemented to emit an 'applied()' signal when Enter (or Return) 
+        '''reimplemented to emit an 'applied()' signal when Enter (or Return)
         key is pressed'''
-        if event.key() in [Qt.Qt.Key_Return,Qt.Qt.Key_Enter]:
-            self.emit(Qt.SIGNAL("applied()"))
+        if event.key() in [Qt.Qt.Key_Return, Qt.Qt.Key_Enter]:
+            self.applied.emit()
             event.accept()
         else:
-            return Qt.QComboBox.keyPressEvent(self,event)
+            return Qt.QComboBox.keyPressEvent(self, event)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusValueComboBox own interface
@@ -155,24 +155,24 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
 
     def setValueNames(self, names):
         '''
-        Sets the correspondence between the values to be applied and their 
+        Sets the correspondence between the values to be applied and their
         associated text to show in the combobox.
-        
-        :param names: (sequence<tuple>) A sequence of (name,value) tuples, 
+
+        :param names: (sequence<tuple>) A sequence of (name,value) tuples,
                       where each attribute value gets a name for display
         '''
         bs = self.blockSignals(True)
         self.clear()
         self.blockSignals(bs)
         self.addValueNames(names)
-        
+
     def addValueNames(self, names):
         '''
         Add new value-name associations to the combobox.
-        
+
         ... seealso: :meth:`setValueNames`
-        
-        :param names: (sequence<tuple>) A sequence of (name,value) tuples, 
+
+        :param names: (sequence<tuple>) A sequence of (name,value) tuples,
                       where each attribute value gets a name for display
         '''
         bs = self.blockSignals(True)
@@ -184,20 +184,20 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
             # of the newly added names. This is kinda a refresh:
             mv = self.getModelValueObj()
             if mv is not None:
-                self.setValue(mv.w_value)
+                self.setValue(mv.wvalue)
         finally:
             self.blockSignals(bs)
-            
+
         self.emitValueChanged()
-        
+
     def getValueString(self, value, default='UNKNOWN(%s)'):
-        """Returns the corresponding name in the combobox out of a value 
+        """Returns the corresponding name in the combobox out of a value
         (or a default value if not found).
-        
+
         :param value: value to look up
-        :param default: (str) value in case it is not found. It accepts 
+        :param default: (str) value in case it is not found. It accepts
                         a '%s' placeholder which will be substituted with
-                        str(value). It defaults to 'UNKNOWN(%s)'.        
+                        str(value). It defaults to 'UNKNOWN(%s)'.
         """
         item = self.findData(Qt.QVariant(value))
         if item < 0:
@@ -206,7 +206,7 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
             else:
                 return default
         return str(self.itemText(item))
-        
+
     def teachDisplayTranslationToWidget(self, widget, default='UNKNOWN(%s)'):
         """
         Makes a label object change the displayed text by the corresponding
@@ -223,14 +223,12 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
         # the default, not modified by us
         model = widget.getModelObj()
         if model:
-            widget.fireEvent( model,
-                             taurus.core.taurusbasetypes.TaurusEventType.Periodic,
-                             model.getValueObj()
-            )
+            widget.fireEvent(model, TaurusEventType.Periodic,
+                             model.getValueObj())
 
     def setQModel(self, *args, **kwargs):
         '''access to :meth:`QCombobox.setModel`
-        
+
         .. seealso: :meth:`setModel`
         '''
         Qt.QComboBox.setModel(self, *args, **kwargs)
@@ -238,7 +236,8 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
     def setModel(self, m):
         '''Reimplemented from :meth:`TaurusBaseWritableWidget.setModel` '''
         if isinstance(m, Qt.QAbstractItemModel):
-            self.warning("Deprecation warning: use setQModel() if you want to set a Qt Item Model. The setModel() method is reserved for Taurus models")
+            self.warning(
+                "Deprecation warning: use setQModel() if you want to set a Qt Item Model. The setModel() method is reserved for Taurus models")
             return Qt.QComboBox.setModel(self, m)
         ret = TaurusBaseWritableWidget.setModel(self, m)
         self.emitValueChanged()
@@ -249,142 +248,154 @@ class TaurusValueComboBox(Qt.QComboBox, TaurusBaseWritableWidget):
         '''reimplemented from :class:`TaurusBaseWritableWidget`'''
         ret = TaurusBaseWritableWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.input'
-        ret['icon'] = ":/designer/combobox.png"
+        ret['icon'] = "designer:combobox.png"
         return ret
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     model = Qt.pyqtProperty("QString",
-                                TaurusBaseWidget.getModel,
-                                TaurusBaseWidget.setModel,
-                                TaurusBaseWidget.resetModel)
+                            TaurusBaseWidget.getModel,
+                            TaurusBaseWidget.setModel,
+                            TaurusBaseWidget.resetModel)
 
     useParentModel = Qt.pyqtProperty("bool",
-                                         TaurusBaseWidget.getUseParentModel,
-                                         TaurusBaseWidget.setUseParentModel,
-                                         TaurusBaseWidget.resetUseParentModel)
+                                     TaurusBaseWidget.getUseParentModel,
+                                     TaurusBaseWidget.setUseParentModel,
+                                     TaurusBaseWidget.resetUseParentModel)
 
     autoApply = Qt.pyqtProperty("bool",
-                                    TaurusBaseWritableWidget.getAutoApply,
-                                    TaurusBaseWritableWidget.setAutoApply,
-                                    TaurusBaseWritableWidget.resetAutoApply)
-    
+                                TaurusBaseWritableWidget.getAutoApply,
+                                TaurusBaseWritableWidget.setAutoApply,
+                                TaurusBaseWritableWidget.resetAutoApply)
+
     forcedApply = Qt.pyqtProperty("bool", TaurusBaseWritableWidget.getForcedApply,
-                                 TaurusBaseWritableWidget.setForcedApply,
-                                 TaurusBaseWritableWidget.resetForcedApply)
+                                  TaurusBaseWritableWidget.setForcedApply,
+                                  TaurusBaseWritableWidget.resetForcedApply)
+
 
-    
 class TaurusAttrListComboBox(Qt.QComboBox, TaurusBaseWidget):
-    
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-    
-    def __init__(self, parent = None, designMode = False):
+    """Combobox whose items reflect the items read from a 1D attribute of dtype
+    str
+    """
+
+    def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QComboBox, parent)
         self.call__init__(TaurusBaseWidget, name)
         self.insertEventFilter(eventfilters.IGNORE_CONFIG)
         self.setSizeAdjustPolicy(Qt.QComboBox.AdjustToContents)
         self.defineStyle()
-    
+        self._lastAttrList = None
+
     def defineStyle(self):
-        """ Defines the initial style for the widget """
+        """Defines the initial style for the widget """
         self.updateStyle()
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget over writing
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getModelClass(self):
-        '''reimplemented from :class:`TaurusBaseWidget`'''
-        return taurus.core.taurusattribute.TaurusAttribute
-            
+        """reimplemented from :class:`TaurusBaseWidget`"""
+        return TaurusAttribute
+
     def handleEvent(self, evt_src, evt_type, evt_value):
-        '''reimplemented from :class:`TaurusBaseWidget`'''
-        self.clear()
-        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)
+        """reimplemented from :class:`TaurusBaseWidget`"""
+        if evt_type == TaurusEventType.Error:
+            attrList = []
+        elif evt_src is None or evt_value is None:
+            attrList = []
+        else:
+            attrList = list(evt_value.rvalue)
             attrList.sort()
+        if attrList != self._lastAttrList:
+            self._lastAttrList = attrList
+            self.clear()
             self.addItems(attrList)
             self.updateStyle()
-    
+
     def updateStyle(self):
-        '''reimplemented from :class:`TaurusBaseWidget`'''
+        """reimplemented from :class:`TaurusBaseWidget`"""
         self.update()
-    
+
     def setQModel(self, *args, **kwargs):
-        '''access to :meth:`QAbstractItemView.setModel`
-        
+        """access to :meth:`QAbstractItemView.setModel`
+
         .. seealso: :meth:`setModel`
-        '''
+        """
         return Qt.QAbstractItemView.setModel(self, *args, **kwargs)
-    
+
     def setModel(self, m):
-        '''reimplemented from :class:`TaurusBaseWidget`'''
+        """reimplemented from :class:`TaurusBaseWidget`"""
         if isinstance(m, Qt.QAbstractItemModel):
-            self.warning("Deprecation warning: use setQModel() if you want to set a Qt Item Model. The setModel() method is reserved for Taurus models")
+            self.warning(("Deprecation warning: use setQModel() if you" +
+                          " want to set a Qt Item Model. The setModel()" +
+                          " method is reserved for Taurus models"))
             return Qt.QAbstractItemView.setQModel(self, m)
         return TaurusBaseWidget.setModel(self, m)
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        '''reimplemented from :class:`TaurusBaseWidget`'''
+        """reimplemented from :class:`TaurusBaseWidget`"""
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['group'] = 'Taurus Input'
         ret['module'] = 'taurus.qt.qtgui.input'
-        ret['icon'] = ":/designer/combobox.png"
+        ret['icon'] = "designer:combobox.png"
         return ret
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, 
-                                           TaurusBaseWidget.setModel,
-                                           TaurusBaseWidget.resetModel)
-                                
+    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
+                            TaurusBaseWidget.setModel,
+                            TaurusBaseWidget.resetModel)
+
     useParentModel = Qt.pyqtProperty("bool",
-                                         TaurusBaseWidget.getUseParentModel, 
-                                         TaurusBaseWidget.setUseParentModel,
-                                         TaurusBaseWidget.resetUseParentModel)
+                                     TaurusBaseWidget.getUseParentModel,
+                                     TaurusBaseWidget.setUseParentModel,
+                                     TaurusBaseWidget.resetUseParentModel)
 
 
 #####################################################################
-## Testing
+# Testing
 #####################################################################
-def taurusAttrListTest():
-    '''tests taurusAttrList. Model: an attribute containing a list of strings'''
-    model = sys.argv[1]
-    a = Qt.QApplication([])
+def _taurusAttrListTest():
+    """tests taurusAttrList. Model: an attribute containing a list of strings"""
+    from taurus.qt.qtgui.application import TaurusApplication
+    a = TaurusApplication()
+    # model = sys.argv[1]
+    # model = "eval:['foo','bar']"
+    model = "sys/tg_test/1/string_spectrum"
     w = TaurusAttrListComboBox()
-    w.setModel(model) 
+    w.setModel(model)
     w.show()
     return a.exec_()
-        
-        
-def TaurusValueComboboxTest():
-    '''tests TaurusValueCombobox '''
-    model = sys.argv[1]
+
+
+def _taurusValueComboboxTest():
+    from taurus.qt.qtgui.application import TaurusApplication
+    """tests TaurusValueCombobox """
+    # model = sys.argv[1]
+    model = 'sys/tg_test/1/short_scalar'
     names = [
         ('name0', 0),
         ('name1', 1),
         ('name2', 2),
         ('name3', 3)
     ]
-    a = Qt.QApplication([])
+    a = TaurusApplication()
     w = TaurusValueComboBox()
     w.setModel(model)
     w.addValueNames(names)
-    #w.setModel(model)
     #w.autoApply = True
     w.show()
     return a.exec_()
 
 if __name__ == '__main__':
     import sys
-    #main = TaurusValueComboboxTest #uncomment to test TaurusValueCombobox
-    main = taurusAttrListTest #uncomment to testtaurusAttrList
+    # main = _taurusValueComboboxTest #uncomment to test TaurusValueCombobox
+    main = _taurusAttrListTest  # uncomment to testtaurusAttrList
     sys.exit(main())
diff --git a/lib/taurus/qt/qtgui/input/tauruslineedit.py b/lib/taurus/qt/qtgui/input/tauruslineedit.py
old mode 100644
new mode 100755
index b677776..aa2c47c
--- a/lib/taurus/qt/qtgui/input/tauruslineedit.py
+++ b/lib/taurus/qt/qtgui/input/tauruslineedit.py
@@ -2,95 +2,86 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides a set of basic taurus widgets based on QLineEdit"""
 
-__all__ = ["TaurusValueLineEdit", "TaurusConfigLineEdit"]
+__all__ = ["TaurusValueLineEdit"]
 
 __docformat__ = 'restructuredtext'
 
-import sys, PyTango, taurus.core
+import sys
+import numpy
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.base import TaurusBaseWidget, TaurusBaseWritableWidget
+from taurus.external.pint import Quantity
+from taurus.qt.qtgui.base import TaurusBaseWritableWidget
+from taurus.qt.qtgui.util import PintValidator
+from taurus.core import DataType, DataFormat, TaurusEventType
 
-_String = str
-try:
-    _String = Qt.QString
-except AttributeError:
-    _String = str
 
 class TaurusValueLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
 
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-
-    def __init__(self, qt_parent = None, designMode = False):
+    def __init__(self, qt_parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QLineEdit, qt_parent)
-        self.call__init__(TaurusBaseWritableWidget, name, designMode=designMode)
+        self.call__init__(TaurusBaseWritableWidget,
+                          name, designMode=designMode)
         self._enableWheelEvent = False
-        self.__minAlarm = -float("inf")
-        self.__maxAlarm = float("inf")
-        self.__minLimit = -float("inf")
-        self.__maxLimit = float("inf")
 
         self.setAlignment(Qt.Qt.AlignRight)
         self.setValidator(None)
 
-        self.connect(self, Qt.SIGNAL('textChanged(const QString &)'), self.valueChanged)
-        self.connect(self, Qt.SIGNAL('returnPressed()'), self.writeValue)
-        self.connect(self, Qt.SIGNAL('valueChanged'), self.updatePendingOperations)
-        self.connect(self, Qt.SIGNAL('editingFinished()'), self._onEditingFinished)
-
-    def _updateValidator(self, attrinfo):
-        '''This method sets a validator depending on the data type
-        attrinfo is an AttributeInfoEx object'''
-        if PyTango.is_int_type(attrinfo.data_type):
-            validator = Qt.QIntValidator(self) #initial range is -2147483648 to 2147483647 (and cannot be set larger)
-            if validator.bottom() < self.__minLimit < validator.top():
-                validator.setBottom(int(self.__minLimit))
-            if validator.bottom() < self.__maxLimit < validator.top():
-                validator.setTop(int(self.__maxLimit))
-            self.setValidator(validator)
-            self.debug("IntValidator set with limits=[%d,%d]"%(validator.bottom(), validator.top()))
-        elif PyTango.is_float_type(attrinfo.data_type):
-            validator= Qt.QDoubleValidator(self)
-            validator.setBottom(self.__minLimit)
-            validator.setTop(self.__maxLimit)
-            #I removed the validation of decimal digits because it was not practical when editing values
-#            decimalDigits = self.__decimalDigits(attrinfo.format) 
-#            if decimalDigits is not None:
-#                validator.setDecimals(decimalDigits)
-            self.setValidator(validator)
-            self.debug("DoubleValidator set with limits=[%f,%f]"%(self.__minLimit, self.__maxLimit))
-        else: #@TODO Other validators can be configured for other types (e.g. with string lengths, tango names,...)
+        self.textChanged.connect(self.notifyValueChanged)
+        self.returnPressed.connect(self.writeValue)
+        self.valueChangedSignal.connect(self.updatePendingOperations)
+        self.editingFinished.connect(self._onEditingFinished)
+
+    def _updateValidator(self, value):
+        '''This method sets a validator depending on the data type'''
+        if isinstance(value.wvalue, Quantity):
+            val = self.validator()
+            if not isinstance(val, PintValidator):
+                val = PintValidator(self)
+                self.setValidator(val)
+            attr = self.getModelObj()
+            bottom, top = attr.range
+            if bottom != val.bottom:
+                val.setBottom(bottom)
+            if top != val.top:
+                val.setTop(top)
+            units = value.wvalue.units
+            if units != val.units:
+                val.setUnits(units)
+
+        # @TODO Other validators can be configured for other types (e.g. with string lengths, tango names,...)
+        else:
             self.setValidator(None)
             self.debug("Validator disabled")
 
     def __decimalDigits(self, fmt):
         '''returns the number of decimal digits from a format string
-        (or None if they are not defined)''' 
+        (or None if they are not defined)'''
         try:
-            if fmt[-1].lower() in ['f','g'] and '.' in fmt:
+            if fmt[-1].lower() in ['f', 'g'] and '.' in fmt:
                 return int(fmt[:-1].split('.')[-1])
             else:
                 return None
@@ -105,57 +96,39 @@ class TaurusValueLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWritableWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    def valueChanged(self, *args):
+    def notifyValueChanged(self, *args):
         '''reimplement to avoid autoapply on every partial edition'''
         self.emitValueChanged()
 
     def handleEvent(self, evt_src, evt_type, evt_value):
-        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.TaurusConfiguration.no_max_alarm:
-                self.__maxAlarm = float(evt_value.max_alarm)
-            else:
-                self.__maxAlarm = float("inf")
-            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.TaurusConfiguration.no_max_value:
-                self.__maxLimit = float(evt_value.max_value)
-            else:
-                self.__maxLimit = float("inf")
-
+        if evt_type in (TaurusEventType.Change, TaurusEventType.Periodic):
             self._updateValidator(evt_value)
-        TaurusBaseWritableWidget.handleEvent(self, evt_src, evt_type, evt_value)
-
-    def _inAlarm(self, v):
-        try: return not(self.__minAlarm < float(v) < self.__maxAlarm)
-        except: return False #this will return false for non-numerical values
-
-    def _outOfRange(self, v):
-        validator = self.validator()
-        if validator:
-            return validator.validate(_String(str(v)), 0)[0] != validator.Acceptable
-        else: #fallback, only for numeric typess (returns False for other types)
-            try: return not(self.__minLimit <= float(v) <=  self.__maxLimit)
-            except: return False
+        TaurusBaseWritableWidget.handleEvent(
+            self, evt_src, evt_type, evt_value)
 
     def updateStyle(self):
         TaurusBaseWritableWidget.updateStyle(self)
-        color, weight = 'black', 'normal' #default case: the value is in normal range with no pending changes
-        v = self.getValue()
-        if self._outOfRange(v): #the value is invalid and can't be applied
-            color = 'gray'
-        elif self._inAlarm(v): #the value is valid but in alarm range...
-            color = 'orange'
-            if self.hasPendingOperations(): #...and some change is pending
-                weight = 'bold'
-        elif self.hasPendingOperations(): #the value is in valid range with pending changes
-            color, weight= 'blue','bold'
-        self.setStyleSheet('TaurusValueLineEdit {color: %s; font-weight: %s}'%(color,weight))
+
+        value = self.getValue()
+        if value is None:
+            # invalid value
+            color, weight = 'gray', 'normal'
+        else:
+            # check if there are pending operations
+            if self.hasPendingOperations():
+                color, weight = 'blue', 'bold'
+            else:
+                color, weight = 'black', 'normal'
+            # also check alarms (if applicable)
+            modelObj = self.getModelObj()
+            if modelObj and modelObj.type in [DataType.Integer, DataType.Float]:
+                min_, max_ = modelObj.alarms
+                if value < min_ or value > max_:
+                    color = 'orange'
+        # apply style
+        style = 'TaurusValueLineEdit {color: %s; font-weight: %s}' %\
+                (color, weight)
+        self.setStyleSheet(style)
 
     def wheelEvent(self, evt):
         if not self.getEnableWheelEvent() or Qt.QLineEdit.isReadOnly(self):
@@ -170,7 +143,7 @@ class TaurusValueLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
         modifiers = evt.modifiers()
         if modifiers & Qt.Qt.ControlModifier:
             numSteps *= 10
-        elif (modifiers & Qt.Qt.AltModifier) and model.isFloat():
+        elif (modifiers & Qt.Qt.AltModifier) and model.type == DataType.Float:
             numSteps *= .1
         self._stepBy(numSteps)
 
@@ -185,36 +158,68 @@ class TaurusValueLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
         if model is None or not model.isNumeric():
             return Qt.QLineEdit.keyPressEvent(self, evt)
 
-        if evt.key() == Qt.Qt.Key_Up:     numSteps = 1
-        elif evt.key() == Qt.Qt.Key_Down: numSteps = -1
-        else: return Qt.QLineEdit.keyPressEvent(self, evt)
+        if evt.key() == Qt.Qt.Key_Up:
+            numSteps = 1
+        elif evt.key() == Qt.Qt.Key_Down:
+            numSteps = -1
+        else:
+            return Qt.QLineEdit.keyPressEvent(self, evt)
 
         evt.accept()
         modifiers = evt.modifiers()
         if modifiers & Qt.Qt.ControlModifier:
             numSteps *= 10
-        elif (modifiers & Qt.Qt.AltModifier) and model.isFloat():
+        elif (modifiers & Qt.Qt.AltModifier) and model.type == DataType.Float:
             numSteps *= .1
         self._stepBy(numSteps)
 
     def _stepBy(self, v):
-        self.setValue(self.getValue() + v)
+        value = self.getValue()
+        self.setValue(value + Quantity(v, value.units))
 
     def setValue(self, v):
         model = self.getModelObj()
         if model is None:
             v_str = str(v)
         else:
-            v_str = str(model.displayValue(v))
+            v_str = str(self.displayValue(v))
         v_str = v_str.strip()
         self.setText(v_str)
 
     def getValue(self):
-        v_qstr = self.text()
-        model = self.getModelObj()
+        text = self.text()
+        model_obj = self.getModelObj()
+        if model_obj is None:
+            return None
+        val = self.validator()
         try:
-            return model.encode(v_qstr)
-        except:
+            model_type = model_obj.type
+            model_format = model_obj.data_format
+            if model_type in [DataType.Integer, DataType.Float]:
+                if val is None or \
+                        val.validate(str(text), 0)[0] != val.Acceptable:
+                    return None
+                q = Quantity(text)
+                # allow implicit units (assume wvalue.units implicitly)
+                if q.dimensionless:
+                    q = Quantity(q.magnitude, val.units)
+                return q
+            elif model_type == DataType.Boolean:
+                if model_format == DataFormat._0D:
+                    return bool(int(eval(text)))
+                else:
+                    return numpy.array(eval(text), dtype=int).astype(bool)
+            elif model_type == DataType.String:
+                if model_format == DataFormat._0D:
+                    return str(text)
+                else:
+                    return numpy.array(eval(text), dtype=str).tolist()
+            elif model_type == DataType.Bytes:
+                return bytes(text)
+            else:
+                raise TypeError('Unsupported model type "%s"', model_type)
+        except Exception, e:
+            self.warning('Cannot return value for "%s". Reason: %r', text, e)
             return None
 
     def setEnableWheelEvent(self, b):
@@ -230,7 +235,7 @@ class TaurusValueLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
     def getQtDesignerPluginInfo(cls):
         ret = TaurusBaseWritableWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.input'
-        ret['icon'] = ":/designer/lineedit.png"
+        ret['icon'] = "designer:lineedit.png"
         return ret
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
@@ -258,100 +263,23 @@ class TaurusValueLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
                                        resetEnableWheelEvent)
 
 
-
-class TaurusConfigLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
-    def __init__(self, qt_parent = None, designMode = False):
-        name = self.__class__.__name__
-        self.call__init__wo_kw(Qt.QLineEdit, qt_parent)
-        self.call__init__(TaurusBaseWritableWidget, name, designMode=designMode)
-
-        self.connect(self, Qt.SIGNAL('textChanged(const QString &)'), self.valueChanged)
-        self.connect(self, Qt.SIGNAL('returnPressed()'), self.writeValue)
-        self.connect(self, Qt.SIGNAL('editingFinished()'), self._onEditingFinished)
-
-    def _onEditingFinished(self):
-        if self._autoApply: self.writeValue()
-
-    def handleEvent(self, evt_src, evt_type, evt_value):
-        self.valueChanged()
-
-    def getModelClass(self):
-        return taurus.core.taurusconfiguration.TaurusConfiguration
-
-    def setValue(self, v):
-        model = self.getModelObj()
-        cfg = self._configParam
-        if model is None or not cfg:
-            v_str = str(v)
-        else:
-            v_str = str(model.getParam(cfg))
-        self.blockSignals(True)
-        self.setText(v_str.strip())
-        self.blockSignals(False)
-
-    def getValue(self):
-        v_qstr = self.text()
-        model = self.getModelObj()
-        try:
-            return model.encode(v_qstr)
-        except:
-            return None
-
-    def setModel(self, model):
-        model = str(model)
-        try:
-            self._configParam = model[model.rfind('=')+1:].lower()
-        except:
-            self._configParam = ''
-        TaurusBaseWritableWidget.setModel(self,model)
-
-    def valueChanged(self):
-        model = self.getModelObj()
-        if self.getValue() != str(model.getParam(self._configParam)):
-            self.setStyleSheet('TaurusConfigLineEdit {color: %s; font-weight: %s}'%('blue','bold'))
-        else:
-            self.setStyleSheet('TaurusConfigLineEdit {color: %s; font-weight: %s}'%('black','normal'))
-
-    def writeValue(self):
-        model = self.getModelObj()
-        model.setParam(str(self._configParam), str(self.text()))
-        self.setStyleSheet('TaurusConfigLineEdit {color: %s; font-weight: %s}'%('black','normal'))
-
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        ret = TaurusBaseWritableWidget.getQtDesignerPluginInfo()
-        ret['module'] = 'taurus.qt.qtgui.input'
-        ret['icon'] = ":/designer/lineedit.png"
-        return ret
-
-#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties
-#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    model = Qt.pyqtProperty("QString", TaurusBaseWritableWidget.getModel,
-                            setModel, TaurusBaseWritableWidget.resetModel)
-
-    autoApply = Qt.pyqtProperty("bool", TaurusBaseWritableWidget.getAutoApply,
-                                TaurusBaseWritableWidget.setAutoApply,
-                                TaurusBaseWritableWidget.resetAutoApply)
-
-    forcedApply = Qt.pyqtProperty("bool", TaurusBaseWritableWidget.getForcedApply,
-                                  TaurusBaseWritableWidget.setForcedApply,
-                                  TaurusBaseWritableWidget.resetForcedApply)
-
 def main():
     import sys
-    attr_name = sys.argv[1]
-    a = Qt.QApplication([])
-    panel = Qt.QWidget()
-    l = Qt.QGridLayout()
-    w1 = TaurusConfigLineEdit()
-    #w1 = TaurusValueLineEdit()
-    w1.setModel(attr_name)
-    l.addWidget(w1,0,0)
-    panel.setLayout(l)
-    panel.setVisible(True)
-    return a.exec_()
+    from taurus.qt.qtgui.application import TaurusApplication
+
+    app = TaurusApplication()
+
+    form = Qt.QWidget()
+    layout = Qt.QVBoxLayout()
+    form.setLayout(layout)
+    for m in ('sys/tg_test/1/double_scalar',
+              'sys/tg_test/1/double_scalar'
+              ):
+        w = TaurusValueLineEdit()
+        w.setModel(m)
+        layout.addWidget(w)
+    form.show()
+    sys.exit(app.exec_())
 
 if __name__ == "__main__":
     sys.exit(main())
diff --git a/lib/taurus/qt/qtgui/input/taurusspinbox.py b/lib/taurus/qt/qtgui/input/taurusspinbox.py
index 15c509b..d53b6e0 100644
--- a/lib/taurus/qt/qtgui/input/taurusspinbox.py
+++ b/lib/taurus/qt/qtgui/input/taurusspinbox.py
@@ -2,30 +2,30 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides a set of basic taurus widgets based on QAbstractSpinBox"""
 
-__all__ = ["TaurusValueSpinBox", "TaurusValueSpinBoxEx" ]
+__all__ = ["TaurusValueSpinBox", "TaurusValueSpinBoxEx"]
 
 __docformat__ = 'restructuredtext'
 
@@ -33,25 +33,25 @@ from taurus.external.qt import Qt
 
 from taurus.qt.qtgui.base import TaurusBaseWritableWidget
 from tauruslineedit import TaurusValueLineEdit
-from taurus.qt.qtgui.resource import getStandardIcon
+from taurus.qt.qtgui.icon import getStandardIcon
+
 
 class TaurusValueSpinBox(Qt.QAbstractSpinBox):
 
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
+    modelChanged = Qt.pyqtSignal('const QString &')
 
-    def __init__(self, qt_parent = None, designMode = False):
+    def __init__(self, qt_parent=None, designMode=False):
         Qt.QAbstractSpinBox.__init__(self, qt_parent)
-        
+
         # Overwrite not to show quality by default
         self._showQuality = False
-        
+
         self._singleStep = 1.0
 
         lineEdit = TaurusValueLineEdit(designMode=designMode)
         self.setLineEdit(lineEdit)
         self.setAccelerated(True)
-        self.connect(self, Qt.SIGNAL("editingFinished()"),
-                     self.writeValue)
+        self.editingFinished.connect(self.writeValue)
 
     def __getattr__(self, name):
         return getattr(self.lineEdit(), name)
@@ -61,33 +61,33 @@ class TaurusValueSpinBox(Qt.QAbstractSpinBox):
 
     def getValue(self):
         return self.lineEdit().getValue()
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Mandatory overload from QAbstractSpinBox
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def stepBy(self, steps):
         #validator = self.lineEdit().validator()
-        self.setValue(self.getValue() + self.getSingleStep()*steps)
+        self.setValue(self.getValue() + self.getSingleStep() * steps)
 
         if self.lineEdit().getAutoApply():
-            self.lineEdit().emit(Qt.SIGNAL('editingFinished()'))
+            self.lineEdit().editingFinished.emit()
         else:
             kmods = Qt.QCoreApplication.instance().keyboardModifiers()
-            controlpressed = bool(kmods&Qt.Qt.ControlModifier)
+            controlpressed = bool(kmods & Qt.Qt.ControlModifier)
             if controlpressed:
                 self.lineEdit().writeValue(forceApply=True)
-    
+
     def stepEnabled(self):
         ret = Qt.QAbstractSpinBox.StepEnabled(Qt.QAbstractSpinBox.StepNone)
-        if self.getModelObj() == None:
+        if self.getModelObj() is None:
             return ret
-        if self.getModelObj().getValueObj() == None:
+        if self.getModelObj().getValueObj() is None:
             return ret
 
         le, curr_val, ss = self.lineEdit(), self.getValue(), self.getSingleStep()
 
-        if curr_val == None:
+        if curr_val is None:
             return ret
 
         if not le._outOfRange(curr_val + ss):
@@ -95,78 +95,78 @@ class TaurusValueSpinBox(Qt.QAbstractSpinBox):
         if not le._outOfRange(curr_val - ss):
             ret |= Qt.QAbstractSpinBox.StepDownEnabled
         return ret
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Model related methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def setModel(self, model):
         self.lineEdit().setModel(model)
-    
+
     def getModel(self):
         return self.lineEdit().getModel()
-    
+
     def resetModel(self):
         return self.lineEdit().resetModel()
 
     def setUseParentModel(self, model):
         self.lineEdit().setUseParentModel(model)
-    
+
     def getUseParentModel(self):
         return self.lineEdit().getUseParentModel()
-    
+
     def resetUseParentModel(self):
         return self.lineEdit().resetUseParentModel()
 
     def setAutoApply(self, model):
         self.lineEdit().setAutoApply(model)
-    
+
     def getAutoApply(self):
         return self.lineEdit().getAutoApply()
-    
+
     def resetAutoApply(self):
         return self.lineEdit().resetAutoApply()
-        
+
     def setForcedApply(self, model):
         self.lineEdit().setForcedApply(model)
-    
+
     def getForcedApply(self):
         return self.lineEdit().getForcedApply()
-    
+
     def resetForcedApply(self):
         return self.lineEdit().resetForcedApply()
-    
+
     def getSingleStep(self):
         return self._singleStep
-    
-    @Qt.pyqtSignature("setSingleStep(double)")
+
+    @Qt.pyqtSlot(float)
     def setSingleStep(self, step):
         self._singleStep = step
-    
+
     def resetSingleStep(self):
         self.setSingleStep(1.0)
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        return { 
-            'group'     : 'Taurus Input',
-            'icon'      : ':/designer/spinbox.png',
-            'module'    : 'taurus.qt.qtgui.input',
-            'container' : False }
-    
+        return {
+            'group': 'Taurus Input',
+            'icon': 'designer:spinbox.png',
+            'module': 'taurus.qt.qtgui.input',
+            'container': False}
+
     singleStep = Qt.pyqtProperty("double", getSingleStep, setSingleStep,
-                                     resetSingleStep)
-    
+                                 resetSingleStep)
+
     model = Qt.pyqtProperty("QString", getModel, setModel, resetModel)
-                                
+
     useParentModel = Qt.pyqtProperty("bool", getUseParentModel,
-                                         setUseParentModel, resetUseParentModel)
+                                     setUseParentModel, resetUseParentModel)
 
     autoApply = Qt.pyqtProperty("bool", getAutoApply, setAutoApply,
-                                    resetAutoApply)
+                                resetAutoApply)
 
     forcedApply = Qt.pyqtProperty("bool", getForcedApply, setForcedApply,
-                                    resetForcedApply)
+                                  resetForcedApply)
 
 _S = """
 QSpinBox::up-button {
@@ -184,18 +184,20 @@ QPushButton {
     padding: 0px;
 }
 """
-    
+
+
 class TaurusValueSpinBoxEx(Qt.QWidget):
 
-    def __init__(self, qt_parent = None, designMode = False):
+    def __init__(self, qt_parent=None, designMode=False):
         Qt.QWidget.__init__(self, qt_parent)
         layout = Qt.QGridLayout()
         layout.setMargin(0)
-        layout.setContentsMargins(0,0,0,0)
+        layout.setContentsMargins(0, 0, 0, 0)
         layout.setSpacing(0)
         self.setLayout(layout)
         self.setStyleSheet(_S)
-        self.__dict__['spinBox'] = spin = TaurusValueSpinBox(qt_parent=self, designMode=designMode)
+        self.__dict__['spinBox'] = spin = TaurusValueSpinBox(
+            qt_parent=self, designMode=designMode)
         self.__dict__['sliderButton1'] = b1 = Qt.QToolButton(self)
         self.__dict__['sliderButton2'] = b2 = Qt.QToolButton(self)
         b1.setIcon(getStandardIcon(Qt.QStyle.SP_TitleBarShadeButton, b1))
@@ -205,14 +207,14 @@ class TaurusValueSpinBoxEx(Qt.QWidget):
         layout.addWidget(b2, 1, 1, 1, 1, Qt.Qt.AlignTop)
         layout.setColumnStretch(0, 1)
         layout.setColumnStretch(1, 0)
-        
+
         policy = self.sizePolicy()
         policy.setHorizontalPolicy(Qt.QSizePolicy.Minimum)
         policy.setVerticalPolicy(Qt.QSizePolicy.Fixed)
         self.setSizePolicy(policy)
-        
+
     def __getattr__(self, name):
         return getattr(self.spinBox, name)
-    
+
     def __setattr__(self, name, value):
         setattr(self.spinBox, name, value)
diff --git a/lib/taurus/qt/qtgui/input/tauruswheel.py b/lib/taurus/qt/qtgui/input/tauruswheel.py
index 6495961..a400734 100644
--- a/lib/taurus/qt/qtgui/input/tauruswheel.py
+++ b/lib/taurus/qt/qtgui/input/tauruswheel.py
@@ -2,55 +2,56 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides a set of basic taurus widgets based on QWheelEdit"""
 
-__all__ = ["TaurusWheelEdit" ]
+__all__ = ["TaurusWheelEdit"]
 
 __docformat__ = 'restructuredtext'
 
 import taurus
 from taurus.external.qt import Qt
 
-from  taurus.core.taurusbasetypes import TaurusEventType
+from taurus.core.taurusbasetypes import TaurusEventType
 from taurus.qt.qtgui.base import TaurusBaseWritableWidget
 from qwheel import QWheelEdit
 
+
 class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget):
-    __pyqtSignals__ = ('modelChanged(const QString &)',)
 
-    def __init__(self, qt_parent = None, designMode = False):
+    def __init__(self, qt_parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(QWheelEdit, qt_parent)
-        self.call__init__(TaurusBaseWritableWidget, name, designMode=designMode)
-        self.connect(self, Qt.SIGNAL(QWheelEdit.NumberChangedStr), self.valueChanged)
-        self.connect(self, Qt.SIGNAL('returnPressed()'), self.writeValue)
-        self.connect(self, Qt.SIGNAL('valueChanged'), self.updatePendingOperations)
+        self.call__init__(TaurusBaseWritableWidget,
+                          name, designMode=designMode)
+        self.numberChanged.connect(self.notifyValueChanged)
+        self.returnPressed.connect(self.writeValue)
+        self.valueChangedSignal.connect(self.updatePendingOperations)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-        
+
     def handleEvent(self, evt_src, evt_type, evt_value):
         if evt_type == TaurusEventType.Config and evt_value is not None:
             import re
@@ -63,7 +64,7 @@ class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget):
 
             if width is None:
                 width = self.DefaultIntDigitCount + \
-                        self.DefaultDecDigitCount + 1
+                    self.DefaultDecDigitCount + 1
             else:
                 width = int(width)
 
@@ -77,7 +78,7 @@ class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget):
             if dec_nb == 0 or f_type == 'd':
                 int_nb = width
             else:
-                int_nb = width - dec_nb - 1 # account for decimal sep
+                int_nb = width - dec_nb - 1  # account for decimal sep
 
             self.setDigitCount(int_nb=int_nb, dec_nb=dec_nb)
             try:
@@ -88,30 +89,33 @@ class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget):
                 self.setMaxValue(float(evt_value.max_value))
             except:
                 pass
-        TaurusBaseWritableWidget.handleEvent(self, evt_src, evt_type, evt_value)
+        TaurusBaseWritableWidget.handleEvent(
+            self, evt_src, evt_type, evt_value)
 
     def updateStyle(self):
         TaurusBaseWritableWidget.updateStyle(self)
         if self.hasPendingOperations():
-            self.setStyleSheet('QWheelEdit {border: 2px solid; border-radius: 4px; border-color: blue}')
+            self.setStyleSheet(
+                'QWheelEdit {border: 2px solid; border-radius: 4px; border-color: blue}')
         else:
-            self.setStyleSheet('QWheelEdit {border: 2px solid; border-radius: 4px; border-color: rgba(0,0,255,0)}')
+            self.setStyleSheet(
+                'QWheelEdit {border: 2px solid; border-radius: 4px; border-color: rgba(0,0,255,0)}')
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
         ret = TaurusBaseWritableWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.input'
-        ret['icon'] = ":/designer/wheeledit.png"
+        ret['icon'] = "designer:wheeledit.png"
         return ret
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
+
     model = Qt.pyqtProperty("QString", TaurusBaseWritableWidget.getModel,
                             TaurusBaseWritableWidget.setModel,
                             TaurusBaseWritableWidget.resetModel)
-                                
+
     useParentModel = Qt.pyqtProperty("bool", TaurusBaseWritableWidget.getUseParentModel,
                                      TaurusBaseWritableWidget.setUseParentModel,
                                      TaurusBaseWritableWidget.resetUseParentModel)
@@ -119,8 +123,7 @@ class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget):
     autoApply = Qt.pyqtProperty("bool", TaurusBaseWritableWidget.getAutoApply,
                                 TaurusBaseWritableWidget.setAutoApply,
                                 TaurusBaseWritableWidget.resetAutoApply)
-    
+
     forcedApply = Qt.pyqtProperty("bool", TaurusBaseWritableWidget.getForcedApply,
                                   TaurusBaseWritableWidget.setForcedApply,
                                   TaurusBaseWritableWidget.resetForcedApply)
-    
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/model/__init__.py b/lib/taurus/qt/qtgui/model/__init__.py
index 19f1b59..38aec7f 100644
--- a/lib/taurus/qt/qtgui/model/__init__.py
+++ b/lib/taurus/qt/qtgui/model/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -27,4 +27,4 @@
 
 __docformat__ = 'restructuredtext'
 
-from .qbasemodel import *
\ No newline at end of file
+from .qbasemodel import *
diff --git a/lib/taurus/qt/qtgui/model/qbasemodel.py b/lib/taurus/qt/qtgui/model/qbasemodel.py
index 3812009..9b8c2da 100644
--- a/lib/taurus/qt/qtgui/model/qbasemodel.py
+++ b/lib/taurus/qt/qtgui/model/qbasemodel.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -35,9 +35,9 @@ __docformat__ = 'restructuredtext'
 from taurus.external.qt import Qt
 
 from taurus.qt.qtgui.util import ActionFactory
-from taurus.qt.qtgui.resource import getIcon, getThemeIcon
 from taurus.qt.qtgui.base import TaurusBaseWidget
 
+
 class BaseToolBar(Qt.QToolBar):
 
     def __init__(self, name=None, view=None, parent=None, designMode=False):
@@ -56,6 +56,10 @@ class BaseToolBar(Qt.QToolBar):
 class FilterToolBar(BaseToolBar):
     """Internal widget providing quick filter to be placed in a _QToolArea"""
 
+    filterEdited = Qt.pyqtSignal('const QString &')
+    filterChanged = Qt.pyqtSignal('const QString &')
+    clearFilterTriggered = Qt.pyqtSignal()
+
     def __init__(self, view=None, parent=None, designMode=False):
         BaseToolBar.__init__(self, name="Taurus filter toolbar", view=view,
                              parent=parent, designMode=designMode)
@@ -63,19 +67,16 @@ class FilterToolBar(BaseToolBar):
         filterLineEdit.setSizePolicy(Qt.QSizePolicy(Qt.QSizePolicy.Preferred,
                                                     Qt.QSizePolicy.Preferred))
         filterLineEdit.setToolTip("Quick filter")
-        Qt.QObject.connect(filterLineEdit,
-                           Qt.SIGNAL("textChanged(const QString &)"),
-                           self.onFilterChanged)
-        Qt.QObject.connect(filterLineEdit,
-                           Qt.SIGNAL("textEdited(const QString &)"),
-                           self.onFilterEdited)
+        filterLineEdit.textChanged.connect(self.onFilterChanged)
+        filterLineEdit.textEdited.connect(self.onFilterEdited)
         self.addWidget(filterLineEdit)
 
         af = ActionFactory()
         self._clearFilterAction = af.createAction(self, "Clear",
-                                          icon=getThemeIcon("edit-clear"),
-                                          tip="Clears the filter",
-                                          triggered=self.onClearFilter)
+                                                  icon=Qt.QIcon.fromTheme(
+                                                      "edit-clear"),
+                                                  tip="Clears the filter",
+                                                  triggered=self.onClearFilter)
         self.addAction(self._clearFilterAction)
 
     def getFilterLineEdit(self):
@@ -83,16 +84,16 @@ class FilterToolBar(BaseToolBar):
 
     def onClearFilter(self):
         self.getFilterLineEdit().setText("")
-        self.emit(Qt.SIGNAL("clearFilterTriggered"))
+        self.clearFilterTriggered.emit()
 
     def onFilterChanged(self, text=None):
         text = text or self.getFilterLineEdit().text()
-        self.emit(Qt.SIGNAL("filterChanged"), text)
+        self.filterChanged.emit(text)
 
     def onFilterEdited(self, text=None):
         text = text or self.getFilterLineEdit().text()
-        self.emit(Qt.SIGNAL("filterEdited"), text)
-    
+        self.filterEdited.emit(text)
+
     def setFilterText(self, text):
         self.getFilterLineEdit().setText(text)
 
@@ -101,33 +102,43 @@ class EditorToolBar(BaseToolBar):
     """Internal widget to be placed in a _QToolArea providing buttons for
     moving, adding and removing items from a view based widget"""
 
+    addTriggered = Qt.pyqtSignal()
+    removeTriggered  = Qt.pyqtSignal()
+    moveTopTriggered = Qt.pyqtSignal()
+    moveDownTriggered = Qt.pyqtSignal()
+    moveUpTriggered = Qt.pyqtSignal()
+    moveBottomTriggered = Qt.pyqtSignal()
+
     def __init__(self, view=None, parent=None, designMode=False):
         BaseToolBar.__init__(self, name="Taurus editor toolbar", view=view,
                              parent=parent, designMode=designMode)
 
         af = ActionFactory()
         self._addAction = af.createAction(self, "New item",
-                                          icon=getThemeIcon("list-add"),
+                                          icon=Qt.QIcon.fromTheme("list-add"),
                                           tip="Add new item",
                                           triggered=self.onAdd)
         self._removeAction = af.createAction(self, "Remove item",
-                                             icon=getThemeIcon("list-remove"),
+                                             icon=Qt.QIcon.fromTheme(
+                                                 "list-remove"),
                                              tip="Remove item",
                                              triggered=self.onRemove)
         self._moveTopAction = af.createAction(self, "To top",
-                                              icon=getThemeIcon("go-top"),
+                                              icon=Qt.QIcon.fromTheme("go-top"),
                                               tip="Move selected item to top",
                                               triggered=self.onMoveTop)
         self._moveUpAction = af.createAction(self, "Move up",
-                                             icon=getThemeIcon("go-up"),
+                                             icon=Qt.QIcon.fromTheme("go-up"),
                                              tip="Move selected item up one level",
                                              triggered=self.onMoveUp)
         self._moveDownAction = af.createAction(self, "Move down",
-                                               icon=getThemeIcon("go-down"),
+                                               icon=Qt.QIcon.fromTheme(
+                                                   "go-down"),
                                                tip="Move selected item down one level",
                                                triggered=self.onMoveDown)
         self._moveBottomAction = af.createAction(self, "To bottom",
-                                                 icon=getThemeIcon("go-bottom"),
+                                                 icon=Qt.QIcon.fromTheme(
+                                                     "go-bottom"),
                                                  tip="Move selected item to bottom",
                                                  triggered=self.onMoveBottom)
         self.addAction(self._addAction)
@@ -139,37 +150,42 @@ class EditorToolBar(BaseToolBar):
         #self.setStyleSheet("QWidget {background : red; }")
 
     def onAdd(self):
-        self.emit(Qt.SIGNAL("addTriggered"))
+        self.addTriggered.emit()
 
     def onRemove(self):
-        self.emit(Qt.SIGNAL("removeTriggered"))
+        self.removeTriggered.emit()
 
     def onMoveTop(self):
-        self.emit(Qt.SIGNAL("moveTopTriggered"))
+        self.moveTopTriggered.emit()
 
     def onMoveUp(self):
-        self.emit(Qt.SIGNAL("moveUpTriggered"))
+        self.moveUpTriggered.emit()
 
     def onMoveDown(self):
-        self.emit(Qt.SIGNAL("moveDownTriggered"))
+        self.moveDownTriggered.emit()
 
     def onMoveBottom(self):
-        self.emit(Qt.SIGNAL("moveBottomTriggered"))
+        self.moveBottomTriggered.emit()
 
 
 class SelectionToolBar(BaseToolBar):
 
+    selectAllTriggered = Qt.pyqtSignal()
+    clearSelectionTriggered = Qt.pyqtSignal()
+
     def __init__(self, view=None, parent=None, designMode=False):
         BaseToolBar.__init__(self, name="Taurus selection toolbar", view=view,
                              parent=parent, designMode=designMode)
 
         af = ActionFactory()
         self._selectAllAction = af.createAction(self, "Select All",
-                                                icon=getThemeIcon("edit-select-all"),
+                                                icon=Qt.QIcon.fromTheme(
+                                                    "edit-select-all"),
                                                 tip="Select all items",
                                                 triggered=self.onSelectAll)
         self._clearSelectionAction = af.createAction(self, "Clear selection",
-                                                     icon=getThemeIcon("edit-clear"),
+                                                     icon=Qt.QIcon.fromTheme(
+                                                         "edit-clear"),
                                                      tip="Clears current selection",
                                                      triggered=self.onclearSelection)
 
@@ -177,31 +193,36 @@ class SelectionToolBar(BaseToolBar):
         self.addAction(self._clearSelectionAction)
 
     def onSelectAll(self):
-        self.emit(Qt.SIGNAL("selectAllTriggered"))
+        self.selectAllTriggered.emit()
 
     def onclearSelection(self):
-        self.emit(Qt.SIGNAL("clearSelectionTriggered"))
+        self.clearSelectionTriggered.emit()
 
 
 class RefreshToolBar(BaseToolBar):
 
+    refreshTriggered = Qt.pyqtSignal()
+
     def __init__(self, view=None, parent=None, designMode=False):
         BaseToolBar.__init__(self, name="Taurus refresh toolbar", view=view,
                              parent=parent, designMode=designMode)
 
         af = ActionFactory()
         self._refreshAction = af.createAction(self, "Refresh",
-                                              icon=getThemeIcon("view-refresh"),
+                                              icon=Qt.QIcon.fromTheme(
+                                                  "view-refresh"),
                                               tip="Refresh view",
                                               triggered=self.onRefresh)
         self.addAction(self._refreshAction)
 
     def onRefresh(self):
-        self.emit(Qt.SIGNAL("refreshTriggered"))
+        self.refreshTriggered.emit()
 
 
 class PerspectiveToolBar(BaseToolBar):
 
+    perspectiveChanged = Qt.pyqtSignal(str)
+
     def __init__(self, perspective, view=None, parent=None, designMode=False):
         BaseToolBar.__init__(self, name="Taurus refresh toolbar", view=view,
                              parent=parent, designMode=designMode)
@@ -217,7 +238,7 @@ class PerspectiveToolBar(BaseToolBar):
         af = ActionFactory()
         for persp, persp_data in view.KnownPerspectives.items():
             label = persp_data["label"]
-            icon = getIcon(persp_data["icon"])
+            icon = Qt.QIcon.fromTheme(persp_data["icon"])
             tip = persp_data["tooltip"]
             action = af.createAction(self, label, icon=icon, tip=tip,
                                      triggered=self.onSwitchPerspective)
@@ -239,7 +260,7 @@ class PerspectiveToolBar(BaseToolBar):
         action = self.sender()
         self._perspective = action.perspective
         self._perspective_button.setDefaultAction(action)
-        self.emit(Qt.SIGNAL("perspectiveChanged"), action.perspective)
+        self.perspectiveChanged.emit(action.perspective)
 
     def perspective(self):
         return self._perspective
@@ -251,9 +272,14 @@ class QBaseModelWidget(Qt.QMainWindow):
     The Qt model associated with the internal Qt view widget should be a
     :class:`taurus.qt.qtcore.model.TaurusBaseModel`"""
 
-    KnownPerspectives = { }
+    KnownPerspectives = {}
     DftPerspective = None
 
+    itemClicked = Qt.pyqtSignal(object, int)
+    itemDoubleClicked = Qt.pyqtSignal(object, int)
+    itemSelectionChanged = Qt.pyqtSignal()
+    currentItemChanged = Qt.pyqtSignal(object, object)
+
     def __init__(self, parent=None, designMode=False, with_filter_widget=True,
                  with_selection_widget=True, with_refresh_widget=True,
                  perspective=None, proxy=None):
@@ -285,7 +311,7 @@ class QBaseModelWidget(Qt.QMainWindow):
                 self._with_refresh_widget = with_refresh_widget
         else:
             self._with_refresh_widget = None
-            
+
         self._proxyModel = proxy
 
         toolBars = self.createToolArea()
@@ -293,7 +319,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)
@@ -303,8 +329,9 @@ class QBaseModelWidget(Qt.QMainWindow):
             perspective = self.DftPerspective
 
         if len(self.KnownPerspectives) > 1:
-            p_bar = self._perspectiveBar = PerspectiveToolBar(perspective, view=self, parent=self)
-            self.connect(p_bar, Qt.SIGNAL("perspectiveChanged"), self.onSwitchPerspective)
+            p_bar = self._perspectiveBar = PerspectiveToolBar(
+                perspective, view=self, parent=self)
+            p_bar.perspectiveChanged.connect(self.onSwitchPerspective)
             self.addToolBar(p_bar)
         else:
             self._perspectiveBar = None
@@ -319,44 +346,43 @@ class QBaseModelWidget(Qt.QMainWindow):
         return sb
 
     def createToolArea(self):
-        tb = [] # tb = self._toolArea = QToolArea(self)
+        tb = []  # tb = self._toolArea = QToolArea(self)
         if self._with_filter_widget:
-            f_bar = self._filterBar = self._with_filter_widget(view=self, parent=self)
-            Qt.QObject.connect(f_bar, Qt.SIGNAL("filterChanged"),
-                               self.onFilterChanged)
+            f_bar = self._filterBar = self._with_filter_widget(
+                view=self, parent=self)
+            f_bar.filterChanged.connect(self.onFilterChanged)
             tb.append(f_bar)
         else:
             self._filterBar = None
-        
+
         if self._with_selection_widget:
-            s_bar = self._selectionBar = self._with_selection_widget(view=self, parent=self)
-            Qt.QObject.connect(s_bar, Qt.SIGNAL("selectAllTriggered"),
-                               self.onSelectAll)
-            Qt.QObject.connect(s_bar, Qt.SIGNAL("clearSelectionTriggered"),
-                               self.onClearSelection)
+            s_bar = self._selectionBar = self._with_selection_widget(
+                view=self, parent=self)
+            s_bar.selectAllTriggered.connect(self.onSelectAll)
+            s_bar.clearSelectionTriggered.connect(self.onClearSelection)
             tb.append(s_bar)
         else:
             self._selectionBar = None
-        
+
         if self._with_refresh_widget:
-            r_bar = self._refreshBar = self._with_refresh_widget(view=self, parent=self)
-            Qt.QObject.connect(r_bar, Qt.SIGNAL("refreshTriggered"),
-                               self.onRefreshModel)
+            r_bar = self._refreshBar = self._with_refresh_widget(
+                view=self, parent=self)
+            r_bar.refreshTriggered.connect(self.onRefreshModel)
             tb.append(r_bar)
         else:
             self._refreshBar = None
 
         return tb
-    
+
     def getPerspectiveBar(self):
         return self._perspectiveBar
-    
+
     def getFilterBar(self):
         return self._filterBar
-    
+
     def getSelectionBar(self):
         return self._selectionBar
-    
+
     def getRefreshBar(self):
         return self._refreshBar
 
@@ -371,17 +397,17 @@ class QBaseModelWidget(Qt.QMainWindow):
         view = self.viewWidget()
         view.clearSelection()
 
-    def _onClicked (self, index):
+    def _onClicked(self, index):
         '''Emits an "itemClicked" signal with with the clicked item and column
         as arguments'''
         item = self._mapToSource(index).internalPointer()
-        self.emit(Qt.SIGNAL('itemClicked'),item, index.column())
+        self.itemClicked.emit(item, index.column())
 
-    def _onDoubleClicked (self, index):
+    def _onDoubleClicked(self, index):
         '''Emits an "itemDoubleClicked" signal with the clicked item and column
         as arguments'''
         item = self._mapToSource(index).internalPointer()
-        self.emit(Qt.SIGNAL('itemDoubleClicked'),item, index.column())
+        self.itemDoubleClicked.emit(item, index.column())
 
     def viewWidget(self):
         return self._viewWidget
@@ -415,22 +441,22 @@ class QBaseModelWidget(Qt.QMainWindow):
         CC = 'currentChanged(const QModelIndex &,const QModelIndex &)'
         SC = 'selectionChanged(QItemSelection &, QItemSelection &)'
         if old_selection_model is not None:
-            Qt.QObject.disconnect(old_selection_model, Qt.SIGNAL(CC),
+            old_selection_model.currentChanged.disconnect(
                                   self.viewCurrentIndexChanged)
-            Qt.QObject.disconnect(old_selection_model, Qt.SIGNAL(SC),
+            old_selection_model.selectionChanged.disconnect(
                                   self.viewSelectionChanged)
         view.setModel(qmodel)
         new_selection_model = view.selectionModel()
         if new_selection_model is not None:
-            Qt.QObject.connect(new_selection_model, Qt.SIGNAL(CC),
+            new_selection_model.currentChanged.connect(
                                self.viewCurrentIndexChanged)
-            Qt.QObject.connect(new_selection_model, Qt.SIGNAL(SC),
+            new_selection_model.selectionChanged.connect(
                                self.viewSelectionChanged)
         view.setCurrentIndex(view.rootIndex())
         self._updateToolBar()
 
     def viewSelectionChanged(self, selected, deselected):
-        self.emit(Qt.SIGNAL("itemSelectionChanged"))
+        self.itemSelectionChanged.emit()
 
     def viewCurrentIndexChanged(self, current, previous):
         # if there is a proxy model we have to translate the selection
@@ -448,7 +474,7 @@ class QBaseModelWidget(Qt.QMainWindow):
             previousTaurusTreeItem = base_previous.internalPointer()
         else:
             previousTaurusTreeItem = None
-        self.emit(Qt.SIGNAL("currentItemChanged"), currentTaurusTreeItem,
+        self.currentItemChanged.emit(currentTaurusTreeItem,
                   previousTaurusTreeItem)
 
     def _updateToolBar(self, current=None, previous=None):
@@ -469,9 +495,9 @@ class QBaseModelWidget(Qt.QMainWindow):
         if len(filter) > 0 and filter[0] != '^':
             filter = '^' + filter
         proxy_model.setFilterRegExp(filter)
-        #proxy_model.setFilterFixedString(filter)
-        #proxy_model.setFilterWildcard(filter)
-        #self.update()
+        # proxy_model.setFilterFixedString(filter)
+        # proxy_model.setFilterWildcard(filter)
+        # self.update()
 
     def refresh(self):
         self.getQModel().refresh()
@@ -484,25 +510,27 @@ class QBaseModelWidget(Qt.QMainWindow):
         return self._perspectiveBar.perspective()
 
     def onSwitchPerspective(self, perspective):
-        old_qmodel =  self.getQModel()
+        old_qmodel = self.getQModel()
         self._setPerspective(perspective)
-        
-        #set the selectables as they where in the previous model
+
+        # set the selectables as they where in the previous model
         if hasattr(old_qmodel, "selectables"):
             self.getQModel().setSelectables(old_qmodel.selectables())
-        
-        #set the taurus model (if any) to the qmodel
-        if hasattr(self,'getModelObj'):
-            taurusModel =  self.getModelObj()
+
+        # set the taurus model (if any) to the qmodel
+        if hasattr(self, 'getModelObj'):
+            taurusModel = self.getModelObj()
             if taurusModel is not None:
                 self.getQModel().setDataSource(taurusModel)
 
     def _setPerspective(self, perspective):
         qmodel_classes = self.KnownPerspectives[perspective]["model"]
-        qmodel_class, qmodel_proxy_classes = qmodel_classes[-1], qmodel_classes[-2::-1] #reversed
+        # reversed
+        qmodel_class, qmodel_proxy_classes = qmodel_classes[
+            -1], qmodel_classes[-2::-1]
         qmodel = qmodel_class(self)
         qmodel_source = qmodel
-        if self._proxyModel is None: #applies the chain of proxies
+        if self._proxyModel is None:  # applies the chain of proxies
             for qmodel_proxy_class in qmodel_proxy_classes:
                 qproxy = qmodel_proxy_class(self)
                 qproxy.setSourceModel(qmodel_source)
@@ -535,7 +563,7 @@ class TaurusBaseModelWidget(TaurusBaseWidget):
     taurus model. It must be used together with
     class:`~taurus.qt.qtgui.base.QBaseModelWidget`"""
 
-    def __init__(self, designMode=False):#, perspective=None, proxy=None):
+    def __init__(self, designMode=False):  # , perspective=None, proxy=None):
         name = self.__class__.__name__
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
 
diff --git a/lib/taurus/qt/qtgui/panel/__init__.py b/lib/taurus/qt/qtgui/panel/__init__.py
index 4d326b2..5c11e8d 100644
--- a/lib/taurus/qt/qtgui/panel/__init__.py
+++ b/lib/taurus/qt/qtgui/panel/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -32,13 +32,11 @@ from .qrawdatachooser import *
 from .qdataexportdialog import *
 from .taurusmessagepanel import *
 from .taurusinputpanel import *
-from .taurusattributechooser import TaurusAttributeChooser as TaurusAttributeChooserOLD
 from .taurusmodelchooser import *
-TaurusAttributeChooser = TaurusModelChooser #for backwards compatibility
 from .taurusvalue import *
 from .taurusform import *
 from .taurusmodellist import *
 from .taurusconfigeditor import *
 from .qdoublelist import *
 from .taurusdevicepanel import *
-
+from .taurusconfigurationpanel import *
diff --git a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py
old mode 100644
new mode 100755
index dccc991..b163f14
--- a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py
+++ b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py
@@ -2,30 +2,32 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """DataExportDlg.py: A Qt dialog for showing and exporting x-y Ascii data from
 one or more curves"""
 
+__all__ = ["QDataExportDialog"]
+
 import os.path
 from datetime import datetime
 
@@ -36,46 +38,46 @@ from taurus.qt.qtgui.util.ui import UILoadable
 @UILoadable
 class QDataExportDialog(Qt.QDialog):
     """
-    This creates a Qt dialog for showing and exporting x-y Ascii data from one or more curves 
+    This creates a Qt dialog for showing and exporting x-y Ascii data from one or more curves
     The data sets are passed (by calling setDataSets() or at instantiation time) as a dictionary::
-    
+
         datadict={name:(x,y),...}
-        
+
     where name is the curve name and
     x,y are iterable containers (e.g., lists, tuple, arrays...) of data to be exported
-     
+
     @TODO: It would be nice if the textedit scrolled to the start ***also for the first set loaded***"""
 
-    #constants
+    # constants
     allInSingleFile = "All sets in a single file (table like)"
     allInMultipleFiles = "All set in multiple files"
 
     def __init__(self, parent=None, datadict=None, sortedNames=None):
-        super(QDataExportDialog,self).__init__(parent)
+        super(QDataExportDialog, self).__init__(parent)
         self.loadUi()
         self._xIsTime = False
-        
-        #connections
-        Qt.QObject.connect(self.exportBT,Qt.SIGNAL("clicked()"),self.exportData)
-        Qt.QObject.connect(self.dataSetCB,Qt.SIGNAL("currentIndexChanged(const QString&)"),self.onDataSetCBChange)
-        
-        self.setDataSets(datadict, sortedNames)
-        
 
+        # connections
+        self.exportBT.clicked.connect(self.exportData)
+        self.dataSetCB.currentIndexChanged[str].connect(self.onDataSetCBChange)
+
+        self.setDataSets(datadict, sortedNames)
 
     def setDataSets(self, datadict, sortedNames=None):
         """Used to set the sets that are to be offered for exporting. It overwrites previous values.
         """
-        if datadict is None: return
+        if datadict is None:
+            return
         if sortedNames is None:
             sortedNames = sorted(self.datadict.keys())
         self.sortedNames = sortedNames
-        self.datatime=datetime.now()
-        self.datadict=datadict
+        self.datatime = datetime.now()
+        self.datadict = datadict
         self.dataSetCB.clear()
         self.dataSetCB.insertItems(0, sortedNames)
         if len(self.datadict.keys()) > 1:
-            self.dataSetCB.insertItems(0,[self.allInSingleFile, self.allInMultipleFiles])
+            self.dataSetCB.insertItems(
+                0, [self.allInSingleFile, self.allInMultipleFiles])
 
     def exportData(self):
         if self.dataSetCB.currentText() == self.allInMultipleFiles:
@@ -83,104 +85,142 @@ class QDataExportDialog(Qt.QDialog):
         else:
             self.exportCurrentData()
 
-    def exportCurrentData(self,set=None,ofile=None, verbose=True, AllowCloseAfter=True):
+    def exportCurrentData(self, set=None, ofile=None, verbose=True, AllowCloseAfter=True):
         """Exports data
         Arguments:
         set: the curve name. If none is passed, it uses the one selected by dataSetCB
         ofile: output file name or file handle. It will prompt if not provided
         verbose: set this to False to disable information popups
         AllowCloseAfter: set this to false if you want to ignore the checkbox in the dialog
-        
+
         """
-        if set is None: set=str(self.dataSetCB.currentText())
+        if set is None:
+            set = str(self.dataSetCB.currentText())
 
         if ofile is None:
             if set == self.allInSingleFile:
                 name = "all.dat"
             else:
-                name=set.replace('*','').replace('/','_').replace('\\','_')+".dat" #**lazy** sanitising of the set to *suggest* it as a filename
-            ofile = Qt.QFileDialog.getSaveFileName( self, 'Export File Name', name, 'All Files (*)')
-            if not ofile: return False
+                #**lazy** sanitising of the set to *suggest* it as a filename
+                name = set.replace('*', '').replace('/', '_').replace('\\', '_')
+                name += ".dat"
+            ofile = Qt.QFileDialog.getSaveFileName( self, 'Export File Name',
+                                                    name, 'All Files (*)')
+            if not ofile:
+                return False
         try:
-            if not isinstance(ofile,file):
-                ofile=open(str(ofile),"w")
-            print >>ofile, str(self.dataTE.toPlainText())
-            ofile.close()
+            if not isinstance(ofile, file):
+                ofile = open(str(ofile), "w")
+            if self.dataSetCB.currentText() == self.allInMultipleFiles:
+                # 1  file per curve
+                text = "# DATASET= %s" % set
+                text += "\n# SNAPSHOT_TIME= %s\n" % self.datatime.isoformat('_')
+                xdata, ydata = self.datadict[set]
+                if self.xIsTime():
+                    for x,y in zip(xdata, ydata):
+                        t = datetime.fromtimestamp(x)
+                        text += "%s\t%r\n" % (t.isoformat('_'), y)
+                else:
+                    for x,y in zip(xdata, ydata):
+                        text+="%r\t%r\n" % (x, y)
+                print >> ofile, str(text)
+            else:
+                print >> ofile, str(self.dataTE.toPlainText())
         except:
-            Qt.QMessageBox.warning(self, "File saving failed","Failed to save file '%s'"%str(ofile.name),Qt.QMessageBox.Ok)
+            Qt.QMessageBox.warning(self,
+                                   "File saving failed",
+                                   "Failed to save file '%s'" % str(ofile.name),
+                                   Qt.QMessageBox.Ok)
             raise
-        if verbose: Qt.QMessageBox.information(self, "Set exported","Set saved to '%s'"%str(ofile.name),Qt.QMessageBox.Ok)
+        finally:
+            ofile.close()
+        if verbose:
+            msg = "Set saved to '%s'" % str(ofile.name)
+            Qt.QMessageBox.information(self, "Set exported", msg,
+                                       Qt.QMessageBox.Ok)
         if AllowCloseAfter and self.closeAfterCB.isChecked(): 
             self.accept() #closes the ExportData dialog with Accept state
         return True
-        
-    def exportAllData(self,preffix=None):
+
+    def exportAllData(self, preffix=None):
         """Exports all sets using a common preffix and appending 'XXX.dat', where XXX is a number starting at 001
         if preffix is not given, the user is prompted for a directory path"""
         if preffix is None:
-            outputdir=Qt.QFileDialog.getExistingDirectory (self, 'Export Directory', Qt.QString())
-            if not outputdir:return False
-            preffix=os.path.join(str(outputdir),"set")
-        for i,k in zip(range(len(self.datadict)), self.sortedNames):
-            ofile="%s%03i.dat"%(preffix,i+1)
+            outputdir = Qt.QFileDialog.getExistingDirectory(
+                self, 'Export Directory', Qt.QString())
+            if not outputdir:
+                return False
+            preffix = os.path.join(str(outputdir), "set")
+        for i, k in zip(range(len(self.datadict)), self.sortedNames):
+            ofile = "%s%03i.dat" % (preffix, i + 1)
             try:
-                self.exportCurrentData(set=k,ofile=ofile,verbose=False,AllowCloseAfter=False)
+                self.exportCurrentData(
+                    set=k, ofile=ofile, verbose=False, AllowCloseAfter=False)
             except:
                 return False
-        #mend undesired side effect of updateText in the for loop
+        # mend undesired side effect of updateText in the for loop
         self.updateText(self.allInMultipleFiles)
-        Qt.QMessageBox.information(self, "All sets exported","%i set(s) exported to:\n%sXXX.dat"%(len(self.datadict),preffix),Qt.QMessageBox.Ok)
-        if self.closeAfterCB.isChecked(): 
-            self.accept() #closes the ExportData dialog with Accept state
+        Qt.QMessageBox.information(self, "All sets exported", "%i set(s) exported to:\n%sXXX.dat" % (
+            len(self.datadict), preffix), Qt.QMessageBox.Ok)
+        if self.closeAfterCB.isChecked():
+            self.accept()  # closes the ExportData dialog with Accept state
         return True
-    
-    def onDataSetCBChange(self,key):
-        key=str(key)
+
+    def onDataSetCBChange(self, key):
+        key = str(key)
         self.updateText(key)
-        
+
     def updateText(self, key=None):
         '''update the text edit that shows the preview of the data'''
-        if key is None: key = str(self.dataSetCB.currentText())
+        if key is None:
+            key = str(self.dataSetCB.currentText())
         if key in (self.allInMultipleFiles, self.allInSingleFile):
-            #check that all arrays have the same length and the same xdata and update header section
-            header = "# DATASET= " 
+            # check that all arrays have the same length and the same xdata and
+            # update header section
+            header = "# DATASET= "
             body = ""
             previous = None
             for curve_name in self.sortedNames:
                 xdata, ydata = self.datadict[curve_name]
                 if previous is None:
                     previous = xdata
-                    header +=' "abscissa"'
+                    header += ' "abscissa"'
                 elif previous != xdata:
-                    if (key==self.allInSingleFile):
+                    if (key == self.allInSingleFile):
                         self.dataTE.clear()
-                        Qt.QMessageBox.critical(self,\
-                                    "Unable to display",\
-                                    "X axes of all sets in the plot must be exactly the same for saving in a single file!",\
+                        Qt.QMessageBox.critical(self,
+                                    "Unable to display",
+                                    "X axes of all sets in the plot must be " +
+                                    "exactly the same for saving in a single " +
+                                    "file!. Curves will be saved each one in " +
+                                    "its own file",
                                     Qt.QMessageBox.Ok)
+                        index = self.dataSetCB.findText(self.allInMultipleFiles)
+                        self.dataSetCB.setCurrentIndex(index)
                         return
                     else:
                         self.dataTE.clear()
-                        self.dataTE.insertPlainText("Unable to display because abscissas are different.\n"\
+                        self.dataTE.insertPlainText("Unable to display because abscissas are different.\n"
                                                     "Curves will be saved each one in its own file")
                         return
-                header +=' , "%s"' % curve_name
-            
-            header+="\n# SNAPSHOT_TIME= %s\n"%self.datatime.isoformat('_')
-            #if we reached this point x axes are equal, so fill the editor with the data
+                header += ' , "%s"' % curve_name
+
+            header += "\n# SNAPSHOT_TIME= %s\n" % self.datatime.isoformat('_')
+            # if we reached this point x axes are equal, so fill the editor
+            # with the data
             for i, x in enumerate(previous):
                 if self.xIsTime():
-                    t=datetime.fromtimestamp(x)
+                    t = datetime.fromtimestamp(x)
                     body += "%s" % t.isoformat('_')
                 else:
-                    body += "%g" % x
+                    body += "%r" % x
                 for curve_name in self.sortedNames:
                     xdata, ydata = self.datadict[curve_name]
-                    body += ("\t%g" % ydata[i])
-                body+="\n"
-            #fill text editor
+                    body += ("\t%r" % ydata[i])
+                body += "\n"
+            # fill text editor
             self.dataTE.clear()
-            self.dataTE.insertPlainText(header+body)
+            self.dataTE.insertPlainText(header + body)
             self.dataTE.moveCursor(Qt.QTextCursor.Start)
             if key == self.allInMultipleFiles:
                 self.dataTE.setReadOnly(True)
@@ -188,30 +228,30 @@ class QDataExportDialog(Qt.QDialog):
                 self.dataTE.setReadOnly(False)
         else:
             self.dataTE.setReadOnly(False)
-            xdata,ydata=self.datadict[key]
-            text='# DATASET= "%s"\n'%key
-            text+="# SNAPSHOT_TIME= %s\n"%self.datatime.isoformat('_')
+            xdata, ydata = self.datadict[key]
+            text = '# DATASET= "%s"\n' % key
+            text += "# SNAPSHOT_TIME= %s\n" % self.datatime.isoformat('_')
             if self.xIsTime():
-                for x,y in zip(xdata, ydata):
-                    t=datetime.fromtimestamp(x)
-                    text+="%s\t%g\n"%(t.isoformat('_'),y)
+                for x, y in zip(xdata, ydata):
+                    t = datetime.fromtimestamp(x)
+                    text += "%s\t%r\n"%(t.isoformat('_'), y)
             else:
-                for x,y in zip(xdata, ydata):
-                    text+="%g\t%g\n"%(x,y)
+                for x, y in zip(xdata, ydata):
+                    text += "%r\t%r\n" %(x, y)
             self.dataTE.clear()
             self.dataTE.insertPlainText(text)
             self.dataTE.moveCursor(Qt.QTextCursor.Start)
-    
+
     def setXIsTime(self, xIsTime):
         self._xIsTime = xIsTime
-        self.updateText() 
-        
+        self.updateText()
+
     def xIsTime(self):
         return self._xIsTime
-        
-        
+
+
 if __name__ == "__main__":
-    import sys 
+    import sys
     app = Qt.QApplication(sys.argv)
     form = QDataExportDialog()
     form.show()
diff --git a/lib/taurus/qt/qtgui/panel/qdoublelist.py b/lib/taurus/qt/qtgui/panel/qdoublelist.py
index be50e7a..e2b90df 100644
--- a/lib/taurus/qt/qtgui/panel/qdoublelist.py
+++ b/lib/taurus/qt/qtgui/panel/qdoublelist.py
@@ -2,31 +2,31 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
 
 """
-qdoublelist.py: Provides a generic dialog containing two list which can move 
-items from one to the other 
+qdoublelist.py: Provides a generic dialog containing two list which can move
+items from one to the other
 """
 
 __all__ = ["QDoubleListDlg"]
@@ -37,57 +37,57 @@ from taurus.external.qt import Qt
 from taurus.qt.qtgui.util.ui import UILoadable
 
 
-
 @UILoadable(with_ui='ui')
 class QDoubleListDlg(Qt.QDialog):
     '''Generic dialog providing two lists. Items can be moved from one to the other
     '''
-    #@todo: drag&drop is disabled because Qt<4.6 does not have QList.setDefaultDragAndDropMode() 
-    def __init__(self, parent=None, designMode=False, winTitle='', mainLabel='', 
+    #@todo: drag&drop is disabled because Qt<4.6 does not have QList.setDefaultDragAndDropMode()
+
+    def __init__(self, parent=None, designMode=False, winTitle='', mainLabel='',
                  label1='', label2='', list1=None, list2=None):
-        
+
         if list1 is None:
-            list1=[]
+            list1 = []
         if list2 is None:
-            list2=[]
-        
-        super(QDoubleListDlg,self).__init__(parent)
+            list2 = []
+
+        super(QDoubleListDlg, self).__init__(parent)
         self.loadUi()
-        
+
         if winTitle:
             self.setWindowTitle(winTitle)
         self.ui.mainLabel.setText(mainLabel)
         self.ui.group1.setTitle(label1)
         self.ui.group2.setTitle(label2)
-        
+
         self.setList1(list1)
         self.setList2(list2)
-        
-        self.connect(self.ui.to1BT, Qt.SIGNAL('clicked(bool)'), self.onTo1)
-        self.connect(self.ui.to2BT, Qt.SIGNAL('clicked(bool)'), self.onTo2)
-        
+
+        self.ui.to1BT.clicked.connect(self.onTo1)
+        self.ui.to2BT.clicked.connect(self.onTo2)
+
     def _moveItem(self, fromlist, tolist):
         selected = fromlist.selectedItems()
         for item in selected:
             fromlist.takeItem(fromlist.row(item))
             tolist.addItem(item)
-            
+
     def setList1(self, list1):
         '''sets the items to be present in the first list
-        
+
         :param list2: (seq<str>) a sequence of strings
         '''
         self.ui.list1.clear()
         self.ui.list1.addItems(list1)
-    
+
     def setList2(self, list2):
         '''sets the items to be present in the second list
-        
+
         :param list2: (seq<str>) a sequence of strings
         '''
         self.ui.list2.clear()
-        self.ui.list2.addItems(list2)    
-        
+        self.ui.list2.addItems(list2)
+
     def onTo1(self, *args):
         '''slot to be called when the "To1" button is pressed'''
         self._moveItem(self.ui.list2, self.ui.list1)
@@ -95,49 +95,46 @@ class QDoubleListDlg(Qt.QDialog):
     def onTo2(self, *args):
         '''slot to be called when the "To2" button is pressed'''
         self._moveItem(self.ui.list1, self.ui.list2)
-        
+
     def getAll1(self):
         '''returns a copy the items in the first list
-        
+
         :return: (list<str>)
         '''
         return [unicode(self.ui.list1.item(row).text()) for row in xrange(self.ui.list1.count())]
-    
+
     def getAll2(self):
         '''returns a copy the items in the second list
-        
+
         :return: (list<str>)
         '''
         return [unicode(self.ui.list2.item(row).text()) for row in xrange(self.ui.list2.count())]
 
-    # note, for the moment we do not make it available in designer because it does not 
+    # note, for the moment we do not make it available in designer because it does not
     # behave well as a widget (only as a dialog) (e.g., it closes if ESC is pressed
 #    @classmethod
 #    def getQtDesignerPluginInfo(cls):
 #        return {
 #            'module' : 'taurus.qt.qtgui.panel',
 #            'group' : 'Taurus Input',
-#            #'icon' : ":/designer/ledred.png",
+#            #'icon' : "designer:ledred.png",
 #            'container' : False,
 #        }
-#------------------------------------------------------------------------------ 
+#------------------------------------------------------------------------------
+
 
 def main():
     app = Qt.QApplication(sys.argv)
-    
-    
-    dlg = QDoubleListDlg(winTitle='foo', mainLabel='bla, bla',label1='1', label2='2', 
-                         list1=['11','22'], list2=['123','33'] )
+
+    dlg = QDoubleListDlg(winTitle='foo', mainLabel='bla, bla', label1='1', label2='2',
+                         list1=['11', '22'], list2=['123', '33'])
     result = dlg.exec_()
-    
-    print "Result", result 
+
+    print "Result", result
     print "list1", dlg.getAll1()
     print "list2", dlg.getAll2()
-    
 
 
 if __name__ == "__main__":
     import sys
-    main()    
-        
-        
+    main()
diff --git a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py
index 5d8d15d..1ca26d3 100644
--- a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py
+++ b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -27,6 +27,8 @@
 RawDataChooser.py:  widget for importing RawData (from file or from a function)
 """
 
+__all__ = ["QRawDataWidget"]
+
 import numpy
 
 from taurus.external.qt import Qt
@@ -36,50 +38,52 @@ from taurus.qt.qtgui.util.ui import UILoadable
 
 @UILoadable
 class QRawDataWidget(Qt.QWidget):
-    
+
+    ReadFromFiles = Qt.pyqtSignal(int, int)
+    AddCurve = Qt.pyqtSignal(dict)
+
     def __init__(self, parent=None):
-        super(QRawDataWidget,self).__init__(parent)
+        super(QRawDataWidget, self).__init__(parent)
         self.loadUi()
 
-        #connecttions
-        self.connect(self.openFilesBT,Qt.SIGNAL( "clicked()"), self.onOpenFilesButtonClicked)
-        self.connect(self.addCurveBT,Qt.SIGNAL( "clicked()"), self.onAddCurveButtonClicked)
-                
-        #set validators in LE's
+        # connecttions
+        self.openFilesBT.clicked.connect(self.onOpenFilesButtonClicked)
+        self.addCurveBT.clicked.connect(self.onAddCurveButtonClicked)
+
+        # set validators in LE's
         self.xFromLE.setValidator(Qt.QDoubleValidator(self))
         self.xToLE.setValidator(Qt.QDoubleValidator(self))
         self.xStepLE.setValidator(Qt.QDoubleValidator(self))
-        
-        
+
     def onOpenFilesButtonClicked(self):
         """ Emit a ReadFromFiles signal with the selected xcol and skiprows as parameters"""
         xcol = self.xcolSB.value()
-        if xcol == self.xcolSB.minimum(): xcol = None
+        if xcol == self.xcolSB.minimum():
+            xcol = None
         skiprows = self.headerSB.value()
-        self.emit(Qt.SIGNAL("ReadFromFiles"),xcol, skiprows)
-        
+        self.ReadFromFiles.emit(xcol, skiprows)
+
     def onAddCurveButtonClicked(self):
         """ Emit a AddCurve signal with a rawdata dictionary as a parameter.
         The rawdata dictionary is prepared from the from the GUI's selection."""
         rawdata = {}
         if self.xRangeRB.isChecked():
-            rawdata['x']=numpy.arange(float(self.xFromLE.text()), float(self.xToLE.text()), float(self.xStepLE.text()) )
+            rawdata['x'] = numpy.arange(float(self.xFromLE.text()), float(
+                self.xToLE.text()), float(self.xStepLE.text()))
         else:
-            sev=SafeEvaluator() 
-            try: 
-                rawdata['x']=sev.eval(str(self.xValuesLE.text()))
+            sev = SafeEvaluator()
+            try:
+                rawdata['x'] = sev.eval(str(self.xValuesLE.text()))
             except:
-                Qt.QMessageBox.warning(self, 'Invalid x values' 'Cannot interpret the x values.\n Use Python expressions like "[1, 3 , 67]" or "arange(100)")')
+                Qt.QMessageBox.warning(
+                    self, 'Invalid x values' 'Cannot interpret the x values.\n Use Python expressions like "[1, 3 , 67]" or "arange(100)")')
                 return
-        rawdata['f(x)']=str(self.f_xLE.text())
-        self.emit(Qt.SIGNAL("AddCurve"),rawdata)
-        
+        rawdata['f(x)'] = str(self.f_xLE.text())
+        self.AddCurve.emit(rawdata)
+
 if __name__ == "__main__":
-    import sys 
+    import sys
     app = Qt.QApplication(sys.argv)
     form = QRawDataWidget()
     form.show()
     sys.exit(app.exec_())
-
-
-
diff --git a/lib/taurus/qt/qtgui/panel/report/__init__.py b/lib/taurus/qt/qtgui/panel/report/__init__.py
index 369b6eb..92ad88e 100644
--- a/lib/taurus/qt/qtgui/panel/report/__init__.py
+++ b/lib/taurus/qt/qtgui/panel/report/__init__.py
@@ -2,28 +2,27 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-__init__.py: 
+__init__.py:
 """
-
diff --git a/lib/taurus/qt/qtgui/panel/report/albareport.py b/lib/taurus/qt/qtgui/panel/report/albareport.py
index ef0fe12..6e5591a 100644
--- a/lib/taurus/qt/qtgui/panel/report/albareport.py
+++ b/lib/taurus/qt/qtgui/panel/report/albareport.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/panel/report/basicreport.py b/lib/taurus/qt/qtgui/panel/report/basicreport.py
index 43d0665..0bb51dc 100644
--- a/lib/taurus/qt/qtgui/panel/report/basicreport.py
+++ b/lib/taurus/qt/qtgui/panel/report/basicreport.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -45,7 +45,7 @@ class ClipboardReportHandler(TaurusMessageReportHandler):
         clipboard.setText(message)
 
         Qt.QMessageBox.information(None, "Done!",
-            "Message Copied to clipboard")
+                                   "Message Copied to clipboard")
 
 
 @UILoadable(with_ui='ui')
@@ -54,8 +54,8 @@ class SendMailDialog(Qt.QDialog):
     def __init__(self, parent=None):
         Qt.QDialog.__init__(self, parent)
         self.loadUi(filename="SendMailForm.ui")
-        self.connect(self.ui.buttonBox, Qt.SIGNAL("accepted()"), self.accept)
-        self.connect(self.ui.buttonBox, Qt.SIGNAL("rejected()"), self.reject)
+        self.ui.buttonBox.accepted.connect(self.accept)
+        self.ui.buttonBox.rejected.connect(self.reject)
         self.ui.editMessage.setFont(Qt.QFont("Monospace"))
 
     def setFrom(self, efrom):
@@ -84,7 +84,7 @@ class SendMailDialog(Qt.QDialog):
 
     def getMailInfo(self):
         return self.getFrom(), self.getTo(), self.getSubject(), \
-               self.getMessage()
+            self.getMessage()
 
 
 class SMTPReportHandler(TaurusMessageReportHandler):
@@ -107,14 +107,14 @@ class SMTPReportHandler(TaurusMessageReportHandler):
         try:
             self.sendMail(*mail_info)
             Qt.QMessageBox.information(None, "Done!",
-                "Email has been sent!")
+                                       "Email has been sent!")
         except:
             import sys
             import traceback
             einfo = sys.exc_info()[:2]
             msg = "".join(traceback.format_exception_only(*einfo))
             Qt.QMessageBox.warning(None, "Failed to send email",
-                "Failed to send email. Reason:\n\n" + msg)
+                                   "Failed to send email. Reason:\n\n" + msg)
 
     def sendMail(self, efrom, eto, subject, message):
         import smtplib
diff --git a/lib/taurus/qt/qtgui/panel/taurusattributechooser.py b/lib/taurus/qt/qtgui/panel/taurusattributechooser.py
deleted file mode 100644
index 3fdcdeb..0000000
--- a/lib/taurus/qt/qtgui/panel/taurusattributechooser.py
+++ /dev/null
@@ -1,215 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-AttributeChooser.py: widget for choosing (a list of) attributes from a tango DB
-"""
-
-__all__ = ["TaurusAttributeChooser"]
-
-__docformat__ = 'restructuredtext'
-
-from taurus.external.qt import Qt
-
-from taurus.qt.qtgui.base import TaurusBaseWidget
-from taurus.core.util.containers import CaselessList
-from taurus.qt.qtgui.util.ui import UILoadable
-
-
- at UILoadable(with_ui='ui')
-class TaurusAttributeChooser(Qt.QWidget, TaurusBaseWidget):
-    
-    __pyqtSignals__ = ("modelChanged(const QString &)",) ##
-    
-    def __init__(self, parent = None, designMode = False):
-        """Initialize the MainWindow"""
-        ##
-        self.call__init__wo_kw(Qt.QWidget, parent)
-        self.call__init__(TaurusBaseWidget, str(self.objectName()))
-        ##
-        self.loadUi()
-        #Create global variables
-        self.dev_name = ""
-        self.selectedItems = CaselessList([])
-        self.selectedItemsComplete = CaselessList([])
-        #self.ui.attrList.setSortingEnabled(True)
-        self._singleAttrMode = False
-        
-        #set icons
-        self.ui.addButton.setIcon(Qt.QIcon(":/actions/go-down.svg"))
-        self.ui.removeButton.setIcon(Qt.QIcon(":/actions/go-up.svg"))
-        self.ui.cancelButton.setIcon(Qt.QIcon(":/actions/edit-clear.svg"))
-        self.ui.updateButton.setIcon(Qt.QIcon(":/actions/view-refresh.svg"))
-        
-        #Connect the ui.lineEdit
-        self.connect(self.ui.lineEdit, Qt.SIGNAL("returnPressed () "), self.setDevName)
-        self.connect(self.ui.lineEdit, Qt.SIGNAL("textChanged (const QString&)"), self.setDevName_new)
-
-        #Connect the addButton
-        self.connect(self.ui.addButton,Qt.SIGNAL( "clicked()"), self.addButtonClicked)
-        
-        #Select an attribute with double click
-        self.connect(self.ui.attrList,Qt.SIGNAL( "itemDoubleClicked (QListWidgetItem *)"), self.addButtonClicked)
-
-        #Connect the button to cancel the selection
-        self.connect(self.ui.cancelButton,Qt.SIGNAL( "clicked()"), self.cancelButtonClicked)
-
-        #Connect the removeButton
-        self.connect(self.ui.removeButton,Qt.SIGNAL( "clicked()"), self.removeButtonClicked)
-        
-        #Connect the updateButton
-        self.connect(self.ui.updateButton,Qt.SIGNAL( "clicked()"), self.updateButtonClicked)
-        
-        self.setDevName_new()
-    
-    def setSingleAttrMode(self, single):
-        '''sets whether the selection should be limited to just one attribute
-        (single=True) or not (single=False)'''
-        if single == self._singleAttrMode: return
-        self._singleAttrMode = single
-        
-        if single:
-            self.ui.attrList.setSelectionMode(Qt.QAbstractItemView.SingleSelection)
-        else:
-            self.ui.attrList.setSelectionMode(Qt.QAbstractItemView.ExtendedSelection)
-        
-    def isSingleAttrMode(self):
-        return self._singleAttrMode
-    
-    def resetSingleAttrMode(self):
-        self.setSingleAttrMode(self, False)
-    
-        
-    def updateList(self, attrList ):
-        self.selectedItemsComplete=CaselessList(attrList)
-        self.ui.final_List.clear()
-        self.ui.final_List.addItems(self.selectedItemsComplete)
-
-    def getDb(self):
-        return self.getTaurusFactory().getDatabase()
-
-    def setDevName(self):
-        """Fill the devices list"""
-
-        device= str(self.ui.lineEdit.text())
-        
-        try:
-            items = list(self.getDb().get_device_exported(device))
-
-        except Exception,e:
-            self.warning('Unable to contact with device %s: %s'%(device,str(e)))
-            items=[]
-
-        self.ui.devList.clear()
-        self.ui.devList.addItems(items)
-        #self.connect(self.ui.devList, Qt.SIGNAL("itemClicked ( QListWidgetItem * )"), self.setAttributes)
-        self.connect(self.ui.devList, Qt.SIGNAL("itemSelectionChanged ()"), self.setAttributes)
-
-    def setDevName_new(self):
-        """Fill the devices list"""
-
-        device= str(self.ui.lineEdit.text())
-        device += '*'
-        
-        try:
-            items = list(self.getDb().get_device_exported(device))
-
-        except Exception,e:
-            self.warning('Unable to contact with device %s: %s'%(device,str(e)))
-            items=[]
-
-        self.ui.devList.clear()
-        self.ui.devList.addItems(items)
-        #self.connect(self.ui.devList, Qt.SIGNAL("itemClicked ( QListWidgetItem * )"), self.setAttributes)
-        self.connect(self.ui.devList, Qt.SIGNAL("itemSelectionChanged ()"), self.setAttributes)
-
-    def setAttributes(self):
-        """Fill the attributes list"""
-        import PyTango
-        
-        self.ui.attrList.clear()
-        self.dev_name = str(self.ui.devList.currentItem().text())
-        
-        try:
-            items=[str(a.name) for a in PyTango.DeviceProxy(self.dev_name).attribute_list_query()]
-            
-        except Exception,e:
-            self.warning('Unable to contact with device %s: %s'%(self.dev_name,str(e)))
-            items=[]
-        
-        items.sort(key=lambda x:x.lower()) #sort the attributes (case insensitive!)
-        
-        for i in range(len(items)):
-            self.ui.attrList.addItem(items[i])
-
-    def addButtonClicked(self):
-        """Put all the items in the selectedItems list into the selectedItemsComplete list, with the device name"""
-        
-        if self.isSingleAttrMode():  #if we are in single attr mode, we want to replace instead of adding attributes
-            self.selectedItemsComplete = CaselessList([])
-            self.ui.final_List.clear()
-            
-        #print self.ui.attrList.selectedItems()
-        self.selectedItems = self.ui.attrList.selectedItems()
-        for i in range(len(self.selectedItems)):
-            aux = str(self.dev_name) + "/" + str(self.selectedItems[i].text())
-            if (aux not in self.selectedItemsComplete):
-                self.selectedItemsComplete.append(aux)
-
-        self.updateList(self.selectedItemsComplete)
-
-
-    def cancelButtonClicked(self):
-        """Cancel all the selected items and clear all the lists"""
-
-        self.selectedItemsComplete = CaselessList([])
-        self.selectedItems = CaselessList([])
-        self.ui.attrList.clearSelection()
-        self.ui.final_List.clear()
-
-    def removeButtonClicked(self):
-        """Remove selected items of the final list """
-        for item in self.ui.final_List.selectedItems():
-            self.selectedItemsComplete.remove(str(item.text()))
-        self.updateList(self.selectedItemsComplete)
-        
-
-    def updateButtonClicked(self):
-        """Return the final Attributes list """
-        
-        self.emit(Qt.SIGNAL("UpdateAttrs"), self.selectedItemsComplete)
-        
-        
-def main(args):
-    app=Qt.QApplication(args)
-    win=TaurusAttributeChooser()
-    win.show()
-    app.connect(app, Qt.SIGNAL("lastWindowClosed()"),app,Qt.SLOT("quit()"))
-
-    return app.exec_()
-
-if __name__=="__main__":
-    import sys
-    sys.exit(main(sys.argv))
diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigbrowser.py b/lib/taurus/qt/qtgui/panel/taurusconfigbrowser.py
deleted file mode 100644
index 521d750..0000000
--- a/lib/taurus/qt/qtgui/panel/taurusconfigbrowser.py
+++ /dev/null
@@ -1,156 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-configbrowser.py: 
-"""
-
-__all__ = ["QConfigViewer"]
-
-__docformat__ = 'restructuredtext'
-
-raise DeprecationWarning("QConfigViewer is deprecated. Use QConfigEditor instead")
-
-from taurus.external.qt import Qt
-import cPickle as pickle
-import os
-from taurus.qt.qtcore.configuration import BaseConfigurableClass
-import taurus.qt.qtgui.resource
-
-getThemeIcon = taurus.qt.qtgui.resource.getThemeIcon
-
-class QConfigViewer(Qt.QWidget):
-    '''A widget that shows a tree view of the contents of Taurus 
-    configuration files saved by TaurusMainWindow'''
-    def __init__(self, parent=None, designerMode=False):
-        Qt.QWidget.__init__(self, parent)
-        self.setLayout(Qt.QVBoxLayout())
-        self.tree = Qt.QTreeWidget()
-        self.tree.setColumnCount(3)
-        self.tree.setHeaderLabels(['Configuration key', 'type', 'value'])
-        self.layout().addWidget(self.tree)
-        self.currentFile = None
-        self._toolbar = Qt.QToolBar("QConfigViewer Main toolBar")
-        self.layout().setMenuBar(self._toolbar)
-        self._toolbar.addAction(getThemeIcon("document-open"), "Open File", self.loadFile)
-        self._toolbar.addAction(getThemeIcon("view-refresh"), "Reload File", self.reloadFile)
-        self.setWindowTitle('TaurusConfigBrowser')
-
-    def reloadFile(self):
-        self.loadFile(self.currentFile)
-        
-    def loadFile(self, iniFileName=None):
-        if iniFileName is None:
-            if self.currentFile is None: path = Qt.QDir.homePath()
-            else: path = self.currentFile
-            iniFileName = Qt.QFileDialog.getOpenFileName ( self, 'Select a settings file', path, 'Ini Files (*.ini)')
-        self.currentFile = unicode(iniFileName)
-        self.settings = Qt.QSettings(iniFileName, Qt.QSettings.IniFormat)
-        self.fillTopLevel()
-        self.setWindowTitle('TaurusConfigBrowser - %s'%os.path.basename(self.currentFile))
-               
-    def fillTopLevel(self):
-        self.tree.clear()
-        item = Qt.QTreeWidgetItem(['LAST'])
-        self.tree.addTopLevelItem(item)
-        configdict = self.getTaurusConfigFromSettings()
-        if configdict is not None:  self.fillTaurusConfig(item, configdict)
-        
-        self.settings.beginGroup("Perspectives")
-        self.perspectives = self.settings.childGroups()
-        for name in self.perspectives:
-            item = Qt.QTreeWidgetItem([name])
-            self.tree.addTopLevelItem(item)
-            self.settings.beginGroup(name)
-            configdict = self.getTaurusConfigFromSettings()
-            if configdict is not None:  self.fillTaurusConfig(item, configdict)
-            self.settings.endGroup()
-        self.settings.endGroup()
-
-    def getTaurusConfigFromSettings(self, key='TaurusConfig'):
-        result = None
-        qstate = Qt.from_qvariant(self.settings.value(key), 'toByteArray')
-        if not qstate.isNull(): 
-            try: result = pickle.loads(qstate.data())
-            except Exception,e: 
-                msg = 'problems loading TaurusConfig: \n%s'%repr(e)
-                print msg
-                Qt.QMessageBox.critical(self, 'Error loading settings', msg)
-        return result
-    
-    def fillTaurusConfig(self, item, configdict):
-        if not BaseConfigurableClass.isTaurusConfig(configdict): return
-        #fill the registered keys
-        registeredkeys = configdict.get('__orderedConfigNames__',[])
-        valuesdict = configdict.get('__itemConfigurations__',{})
-        for k in registeredkeys:
-            value = valuesdict[k]
-            child = Qt.QTreeWidgetItem([k])
-            item.addChild(child)
-            if BaseConfigurableClass.isTaurusConfig(value):
-                self.fillTaurusConfig(child, value) #recursive call to fill all nodes
-            else:
-                child.setText(1,repr(type(value)))
-                child.setText(2,repr(value))
-        #now deal with custom keys (not registered)
-        customkeys = [k for k in configdict if k not in ('__orderedConfigNames__', '__itemConfigurations__', 'ConfigVersion', '__pickable__')]
-        if len(customkeys) > 0:
-            custom = Qt.QTreeWidgetItem(['[custom]'])
-            item.addChild(custom)
-            for k in customkeys:
-                value = configdict[k]
-                child = Qt.QTreeWidgetItem([k])
-                item.addChild(child)
-                if BaseConfigurableClass.isTaurusConfig(value):
-                    self.fillTaurusConfig(child, value) #recursive call to fill all nodes
-                else:
-                    child.setText(1,repr(type(value)))
-                    child.setText(2,repr(value))
-
-
-def main():
-    from taurus.qt.qtgui.application import TaurusApplication
-    from taurus.core.util import argparse
-    import sys
-    
-    parser = argparse.get_taurus_parser()
-    parser.set_usage("%prog [options] [INIFILENAME]")
-    parser.set_description("taurus configuration viewer")
-    app = TaurusApplication(cmd_line_parser=parser,
-                            app_name="taurusconfigbrowser",
-                            app_version=taurus.Release.version)
-    args = app.get_command_line_args()
-    
-    w = QConfigViewer()
-    w.show()
-    
-    if len(args) == 1:
-        w.loadFile(args[0])
-    
-    sys.exit(app.exec_())
-        
-if __name__ == '__main__':
-    main()
-    
diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py
index 3e442d4..1f0316a 100644
--- a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py
+++ b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-taurusconfigeditor.py: 
+taurusconfigeditor.py:
 """
 
 __all__ = ["QConfigEditor"]
@@ -36,14 +36,16 @@ import cPickle as pickle
 import os
 import tempfile
 from taurus.qt.qtcore.configuration import BaseConfigurableClass
-from taurus.qt.qtgui.resource import getThemeIcon
 from taurus.qt.qtgui.container import TaurusWidget
 import shutil
 
 
 class QConfigEditorModel(Qt.QStandardItemModel):
     '''A custom Model for QConfigEditor'''
-    def __init__(self, parent = None, designMode = False):
+
+    showError = Qt.pyqtSignal(str, str)
+
+    def __init__(self, parent=None, designMode=False):
         super(Qt.QStandardItemModel, self).__init__()
         self._temporaryFile = None
         self._settings = None
@@ -51,10 +53,10 @@ class QConfigEditorModel(Qt.QStandardItemModel):
         self._modifiedPerspectives = []
         self.originalFile = None
         self.markedItems = []
-        
-    def setData(self,index, value, role = Qt.Qt.DisplayRole):
+
+    def setData(self, index, value, role=Qt.Qt.DisplayRole):
         '''see :meth:`Qt.QAbstractTableModel.setData`'''
-        
+
         idx_data_str = Qt.from_qvariant(index.data(), str)
         value_str = Qt.from_qvariant(value, str)
         if idx_data_str == value_str:
@@ -63,15 +65,16 @@ class QConfigEditorModel(Qt.QStandardItemModel):
         try:
             self.valueChanged(value_str, index)
         except:
-            self.emit(Qt.SIGNAL("showError"),'Wrong value!','The value you entered is wrong. The old value will be restored.')
-            return Qt.QStandardItemModel.setData(self,index,index.data(),role)
-        return Qt.QStandardItemModel.setData(self,index,value,role)
+            self.showError.emit('Wrong value!',
+                      'The value you entered is wrong. The old value will be restored.')
+            return Qt.QStandardItemModel.setData(self, index, index.data(), role)
+        return Qt.QStandardItemModel.setData(self, index, value, role)
 
-    def loadFile(self,iniFileName):
+    def loadFile(self, iniFileName):
         '''
         Loads file with setting, creates temporary settings file, where changes
         made to configuration are saved.
-        
+
         :param iniFileName: (str)
         '''
         self.originalFile = unicode(iniFileName)
@@ -79,13 +82,14 @@ class QConfigEditorModel(Qt.QStandardItemModel):
         self._temporaryFile = unicode(self._file.name)
 
         shutil.copyfile(self.originalFile, self._temporaryFile)
-        
-        self._settings = Qt.QSettings(self._temporaryFile, Qt.QSettings.IniFormat)
+
+        self._settings = Qt.QSettings(
+            self._temporaryFile, Qt.QSettings.IniFormat)
         self.clear()
         self.setHorizontalHeaderLabels(['Configuration key', 'type', 'value'])
         self._configurationDictionaries = self.fillTopLevel()
         self.markedItems = []
-    
+
     def deleteBranch(self):
         '''
         Deletes selected branch from the settings tree. Also updates the
@@ -95,42 +99,49 @@ class QConfigEditorModel(Qt.QStandardItemModel):
         item = self.itemFromIndex(tmpindex)
         path = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str)
         self._delete = False
-        self._configurationDictionaries = self.removeBranch(self._configurationDictionaries, path)
-        
-        try: group = eval(str(path).split(';',1)[0])
-        except: group = str(path).split(';',1)[0]
+        self._configurationDictionaries = self.removeBranch(
+            self._configurationDictionaries, path)
+
+        try:
+            group = eval(str(path).split(';', 1)[0])
+        except:
+            group = str(path).split(';', 1)[0]
         itemToMark = self.itemFromIndex(tmpindex.parent())
-        while(itemToMark != None):    
-            itemToMark.setData(Qt.QVariant(Qt.QFont("Arial", 10, Qt.QFont.Bold)), Qt.Qt.FontRole)
-            itemToMark=self.itemFromIndex(itemToMark.index().parent())
-        
+        while(itemToMark is not None):
+            itemToMark.setData(Qt.QVariant(
+                Qt.QFont("Arial", 10, Qt.QFont.Bold)), Qt.Qt.FontRole)
+            itemToMark = self.itemFromIndex(itemToMark.index().parent())
+
         self.markedItems.append(self._toDeleteIndex.parent())
         self.removeRow(tmpindex.row(), tmpindex.parent())
         self.saveSettings(group)
-  
+
     def removeBranch(self, dict, path):
         '''
         Method called recursively by self.deleteBranch. In each step it takes
         next key (from the path) until reaches element to be deleted. After the
         element is deleted, returns updated dictionary.
-        
-        :param dict: (dict) a taurus configuration dictionary. See 
+
+        :param dict: (dict) a taurus configuration dictionary. See
                      :class:`BaseConfigurableClass`
-        :param path: (str) a semicolon-separated string containing the 
+        :param path: (str) a semicolon-separated string containing the
                      path of the branch in the tree
-        
+
         :returns:  (dict) the modified config dict
         '''
-        val = str(path).split(';',1)
-        if len(val)==2:
+        val = str(path).split(';', 1)
+        if len(val) == 2:
             path = val[1]
-            try: key = eval(val[0])
-            except: key = val[0] 
+            try:
+                key = eval(val[0])
+            except:
+                key = val[0]
             dict[key] = self.removeBranch(dict[key], path)
             if self._delete == True:
                 if not dict.has_key('__orderedConfigNames__'):
                     return dict
-                dict['__orderedConfigNames__'] = self.removeBranch(dict['__orderedConfigNames__'], path)
+                dict['__orderedConfigNames__'] = self.removeBranch(
+                    dict['__orderedConfigNames__'], path)
                 self._delete = False
             return dict
         else:
@@ -143,30 +154,38 @@ class QConfigEditorModel(Qt.QStandardItemModel):
                 self._delete = True
             dict.pop(val[0])
             return dict
-    
+
     def valueChanged(self, value, index):
         '''
         Modifies value in the temporary settings file and the model internal
         dictionary. Invoked by :meth:`Qt.QAbstractTableModel.setData`, when user
         make changes to the value in the settings tree.
-        
+
         :param value: (str) the new value (a string that will be python-evaluated)
         :param index: (QModelIndex) index of the model
         '''
         changedItem = self.itemFromIndex(index)
         path = Qt.from_qvariant(changedItem.data(Qt.Qt.UserRole), str)
-        self._configurationDictionaries = self.changeTreeValue(self._configurationDictionaries, path, value)
-        try: group = eval(str(path).split(';',1)[0])
-        except: group = str(path).split(';',1)[0]
+        self._configurationDictionaries = self.changeTreeValue(
+            self._configurationDictionaries, path, value)
+        try:
+            group = eval(str(path).split(';', 1)[0])
+        except:
+            group = str(path).split(';', 1)[0]
         itemToMark = self.itemFromIndex(index.sibling(index.row(), 0))
         self.markedItems.append(itemToMark.index())
-        
-        self.itemFromIndex(index.sibling(index.row(), 1)).setText(str(type(eval(value))))
-        changedItem.setData(Qt.QVariant('Value has been changed. Old value: '+ str(changedItem.text())), Qt.Qt.ToolTipRole)
-        itemToMark.setData(Qt.QVariant(getThemeIcon('emblem-important')), Qt.Qt.DecorationRole)
-        while(itemToMark != None):    
-            itemToMark.setData(Qt.QVariant(Qt.QFont("Arial", 10, Qt.QFont.Bold)), Qt.Qt.FontRole)
-            itemToMark=self.itemFromIndex(itemToMark.index().parent())
+
+        self.itemFromIndex(index.sibling(index.row(), 1)
+                           ).setText(str(type(eval(value))))
+        changedItem.setData(Qt.QVariant(
+            'Value has been changed. Old value: ' + str(changedItem.text())),
+            Qt.Qt.ToolTipRole)
+        itemToMark.setData(Qt.QVariant(Qt.QIcon.fromTheme('emblem-important')),
+                           Qt.Qt.DecorationRole)
+        while(itemToMark is not None):
+            itemToMark.setData(Qt.QVariant(
+                Qt.QFont("Arial", 10, Qt.QFont.Bold)), Qt.Qt.FontRole)
+            itemToMark = self.itemFromIndex(itemToMark.index().parent())
         self.saveSettings(group)
 
     def changeTreeValue(self, cdict, path, value):
@@ -174,38 +193,40 @@ class QConfigEditorModel(Qt.QStandardItemModel):
         Method called recursively by valueChanged. In each step it takes next
         key (from the path) until reaches element to be modified. After the
         element is modified, returns updated dictionary.
-        
+
         :param cdict: a configuration dictionary.  See :class:`BaseConfigurableClass`
-        :param path: (str) a semicolon-separated string containing the 
+        :param path: (str) a semicolon-separated string containing the
                      path of the branch in the tree
         :param value: (str) the new value (a string that will be python-evaluated)
-        
+
         :returns:  (dict) the modified config dict
         '''
-        val = str(path).split(';',1)
+        val = str(path).split(';', 1)
         if len(val) == 2:
             path = val[1]
-            try: key = eval(val[0])
-            except: key = val[0] 
+            try:
+                key = eval(val[0])
+            except:
+                key = val[0]
             cdict[key] = self.changeTreeValue(cdict[key], path, value)
             return cdict
         else:
             cdict[val[0]] = eval(value)
             return cdict
-    
+
     def fillTopLevel(self):
         '''
         Creates a dictionary containing Main Window and Perspectives settings.
         This metod creates top nodes only (names of the perspectives, main
         window) and invokes fillTaurusConfig. Returns complete dictionary.
-        
+
         :returns:  (dict) a configuration dictionary.  See :class:`BaseConfigurableClass`
         '''
-        #self.tree.clear()
-        root=self.invisibleRootItem()
+        # self.tree.clear()
+        root = self.invisibleRootItem()
         item = Qt.QStandardItem('LAST')
         item.setEditable(False)
-        #item.setSelectable(False)
+        # item.setSelectable(False)
         root.appendRow(item)
         mainConfig = {}
         configdict = self.getTaurusConfigFromSettings()
@@ -218,89 +239,93 @@ class QConfigEditorModel(Qt.QStandardItemModel):
         for name in self.perspectives:
             item = Qt.QStandardItem(name)
             item.setEditable(False)
-            #item.setSelectable(False)
-            path = Qt.QVariant("Perspectives/"+name)
+            # item.setSelectable(False)
+            path = Qt.QVariant("Perspectives/" + name)
             item.setData(path, Qt.Qt.UserRole)
             root.appendRow(item)
             self._settings.beginGroup(name)
             configdict = self.getTaurusConfigFromSettings()
             if configdict is not None:
-                mainConfig["Perspectives/"+str(name)] = configdict
+                mainConfig["Perspectives/" + str(name)] = configdict
                 self.fillTaurusConfig(item, configdict)
             self._settings.endGroup()
         self._settings.endGroup()
 
         return mainConfig
-        
+
     def fillTaurusConfig(self, item, configdict):
         '''
         Fills the non-top nodes of the dictionary recursively.
-        
+
         :param item: (Qt.QStandardItem) parent item
         :param configdict: (dict) a configuration dictionary.  See :class:`BaseConfigurableClass`
         '''
-        if not BaseConfigurableClass.isTaurusConfig(configdict): return
-        #fill the registered keys
-        registeredkeys = configdict.get('__orderedConfigNames__',[])
-        valuesdict = configdict.get('__itemConfigurations__',{})
+        if not BaseConfigurableClass.isTaurusConfig(configdict):
+            return
+        # fill the registered keys
+        registeredkeys = configdict.get('__orderedConfigNames__', [])
+        valuesdict = configdict.get('__itemConfigurations__', {})
         for k in registeredkeys:
             value = valuesdict[k]
             child = Qt.QStandardItem(k)
             if BaseConfigurableClass.isTaurusConfig(value):
                 child.setEditable(False)
                 item.appendRow(child)
-                
+
                 txt = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str)
                 path = Qt.QVariant(txt + ";__itemConfigurations__;" + k)
                 child.setData(path, Qt.Qt.UserRole)
-                self.fillTaurusConfig(child, value) #recursive call to fill all nodes
+                # recursive call to fill all nodes
+                self.fillTaurusConfig(child, value)
             else:
                 typeV = Qt.QStandardItem(repr(type(value)))
-                valueV =Qt.QStandardItem(repr(value))
-                
+                valueV = Qt.QStandardItem(repr(value))
+
                 typeV.setForeground(Qt.QBrush(Qt.QColor('gray')))
                 child.setForeground(Qt.QBrush(Qt.QColor('gray')))
-                
-                item.appendRow([child,typeV,valueV])
-                
+
+                item.appendRow([child, typeV, valueV])
+
                 txt = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str)
                 path = Qt.QVariant(txt + ";__itemConfigurations__;" + k)
                 child.setEditable(False)
                 typeV.setEditable(False)
-                
+
                 child.setData(path, Qt.Qt.UserRole)
                 typeV.setData(path, Qt.Qt.UserRole)
                 valueV.setData(path, Qt.Qt.UserRole)
 
-        customkeys = [k for k in configdict if k not in ('__orderedConfigNames__', '__itemConfigurations__', 'ConfigVersion', '__pickable__')]
+        customkeys = [k for k in configdict if k not in (
+            '__orderedConfigNames__', '__itemConfigurations__', 'ConfigVersion', '__pickable__')]
         if len(customkeys) > 0:
 
             custom = Qt.QStandardItem('[custom]')
             item.appendRow(custom)
             custom.setEditable(False)
-            #custom.setSelectable(False)
+            # custom.setSelectable(False)
             custom.setBackground(Qt.QBrush(Qt.QColor('gray')))
             for k in customkeys:
                 value = configdict[k]
                 child = Qt.QStandardItem(str(k))
-                #item.appendRow(child)
-                
+                # item.appendRow(child)
+
                 if BaseConfigurableClass.isTaurusConfig(value):
                     child.setEditable(False)
                     item.appendRow(child)
                     txt = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str)
-                    path = Qt.QVariant(txt +";" + k)
+                    path = Qt.QVariant(txt + ";" + k)
                     child.setData(path, Qt.Qt.UserRole)
-                    self.fillTaurusConfig(child, value) #recursive call to fill all nodes
+                    # recursive call to fill all nodes
+                    self.fillTaurusConfig(child, value)
                 else:
                     typeV = Qt.QStandardItem(repr(type(value)))
-                    valueV =Qt.QStandardItem(repr(value))
+                    valueV = Qt.QStandardItem(repr(value))
                     typeV.setForeground(Qt.QBrush(Qt.QColor('gray')))
                     child.setForeground(Qt.QBrush(Qt.QColor('gray')))
-                    item.appendRow([child,typeV,valueV])
+                    item.appendRow([child, typeV, valueV])
                     txt = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str)
                     path = Qt.QVariant(txt + ";" + k)
-    
+
                     child.setData(path, Qt.Qt.UserRole)
                     child.setEditable(False)
                     typeV.setEditable(False)
@@ -311,20 +336,21 @@ class QConfigEditorModel(Qt.QStandardItemModel):
         '''
         Loads and returns the configuration dictionary from the settings file
         using pickle module.
-        
+
         :param key: (str)
-        
+
         :returns (dict)
         '''
         result = None
         qstate = Qt.from_qvariant(self._settings.value(key), 'toByteArray')
         if qstate is not None and not qstate.isNull():
-            try: result = pickle.loads(qstate.data())
-            except Exception,e: 
-                msg = 'problems loading TaurusConfig: \n%s'%repr(e)
+            try:
+                result = pickle.loads(qstate.data())
+            except Exception, e:
+                msg = 'problems loading TaurusConfig: \n%s' % repr(e)
                 Qt.QMessageBox.critical(None, 'Error loading settings', msg)
         return result
-    
+
     def reloadFile(self):
         '''
         Reloads the file. Configuration tree is build again.
@@ -339,24 +365,24 @@ class QConfigEditorModel(Qt.QStandardItemModel):
             return
         shutil.copyfile(self._temporaryFile, self.originalFile)
         self.clearChanges()
-        #self.reloadFile()
-   
+        # self.reloadFile()
+
     def saveSettings(self, group=None):
         '''Saves the current state to the temporary file
-        
+
         :param group: (str) a prefix that will be added to the keys to be
                        saved (no prefix by default)
-        '''  
-        if group is not None: 
+        '''
+        if group is not None:
             self._settings.beginGroup(group)
-        
-        #store the config dict
-        self._settings.setValue("TaurusConfig", Qt.QVariant(Qt.QByteArray(pickle.dumps(self._configurationDictionaries[group]))))
-        if group is not None: 
+
+        # store the config dict
+        self._settings.setValue("TaurusConfig", Qt.QVariant(
+            Qt.QByteArray(pickle.dumps(self._configurationDictionaries[group]))))
+        if group is not None:
             self._settings.endGroup()
         #self.info('MainWindow settings saved in "%s"'%self._settings.fileName())
 
-
     def restoreOriginal(self):
         '''
         Replaces temporary file with the original file and builds again the
@@ -367,113 +393,121 @@ class QConfigEditorModel(Qt.QStandardItemModel):
         shutil.copyfile(self.originalFile, self._temporaryFile)
         self.reloadFile()
 
-        
     def clearChanges(self):
         '''
         Clears all changes in style of the modified elements in tree view.
         '''
         for index in self.markedItems:
             itemToMark = self.itemFromIndex(index)
-            while(itemToMark != None):    
-                itemToMark.setData(Qt.QVariant(Qt.QFont("Arial", 10, Qt.QFont.Normal)), Qt.Qt.FontRole)
+            while(itemToMark is not None):
+                itemToMark.setData(Qt.QVariant(
+                    Qt.QFont("Arial", 10, Qt.QFont.Normal)), Qt.Qt.FontRole)
                 itemToMark.setData(Qt.QVariant(), Qt.Qt.DecorationRole)
-                itemToMark=self.itemFromIndex(itemToMark.index().parent())
-            
-    
+                itemToMark = self.itemFromIndex(itemToMark.index().parent())
+
 
 class QConfigEditor(TaurusWidget):
-    '''A widget that shows a tree view of the contents of Taurus 
-    configuration files saved by TaurusMainWindow and lets the user edit 
+    '''A widget that shows a tree view of the contents of Taurus
+    configuration files saved by TaurusMainWindow and lets the user edit
     the values of the configuration keys'''
-    
-    def __init__(self, parent = None, designMode = False):
-        TaurusWidget.__init__(self, parent = parent, designMode = designMode)
+
+    def __init__(self, parent=None, designMode=False):
+        TaurusWidget.__init__(self, parent=parent, designMode=designMode)
         self.setLayout(Qt.QVBoxLayout())
         self.tree = QConfigEditorModel()
         self.treeview = Qt.QTreeView()
-        self.tree.setHorizontalHeaderLabels(['Configuration key', 'type', 'value'])
+        self.tree.setHorizontalHeaderLabels(
+            ['Configuration key', 'type', 'value'])
         self.layout().addWidget(self.treeview)
         self._toolbar = Qt.QToolBar("QConfigViewer Main toolBar")
-        self._toolbar.addAction(getThemeIcon("document-open"), "Open File", self.loadFile)
-        self._toolbar.addAction(getThemeIcon("document-save"), "Save File", self.saveFile)
-        self._toolbar.addAction(getThemeIcon("edit-undo"), "Reload from file", self.restoreOriginal)
+        self._toolbar.addAction(Qt.QIcon.fromTheme(
+            "document-open"), "Open File", self.loadFile)
+        self._toolbar.addAction(Qt.QIcon.fromTheme(
+            "document-save"), "Save File", self.saveFile)
+        self._toolbar.addAction(Qt.QIcon.fromTheme(
+            "edit-undo"), "Reload from file", self.restoreOriginal)
         self.layout().setMenuBar(self._toolbar)
         self.setWindowTitle('TaurusConfigEditor')
-        self.connect(self.tree, Qt.SIGNAL("showError"), self._showError)
-        
+        self.tree.showError.connect(self._showError)
+
     def contextMenuEvent(self, event):
         '''Reimplemented from :meth:`QWidget.contextMenuEvent`'''
-  
+
         self.tree._toDeleteIndex = self.treeview.selectedIndexes()[0]
         text = Qt.from_qvariant(self.tree._toDeleteIndex.data(), str)
-        if self.tree._toDeleteIndex.column() in [1,2] or text in ['LAST', '[custom]'] or text in self.tree.perspectives:
+        if self.tree._toDeleteIndex.column() in [1, 2] or text in ['LAST', '[custom]'] or text in self.tree.perspectives:
             return
         menu = Qt.QMenu()
-        menu.addAction(getThemeIcon('process-stop'), "Delete branch: "+text, self.tree.deleteBranch)
+        menu.addAction(Qt.QIcon.fromTheme('process-stop'),
+                       "Delete branch: " + text, self.tree.deleteBranch)
         menu.addSeparator()
-        menu.addAction(getThemeIcon('help-browser') ,"Help")
+        menu.addAction(Qt.QIcon.fromTheme('help-browser'), "Help")
         menu.exec_(event.globalPos())
         event.accept()
-           
-    def _showError(self,title, body):
+
+    def _showError(self, title, body):
         '''
         Opens a warning dialog with a given title and body.
-        
+
         :title: (str) title
         :body: (str) body
         '''
-        Qt.QMessageBox.warning(self,title,body,Qt.QMessageBox.Ok)
-    
+        Qt.QMessageBox.warning(self, title, body, Qt.QMessageBox.Ok)
+
     def loadFile(self, iniFileName=None):
         '''
         Loads a configuration stored in a file and creates the tree.
-        
+
         :iniFileName: (str) Name of the file. If None is given the user is prompted for a file.
         '''
         if iniFileName is None:
-            if self.tree.originalFile is None: path = Qt.QDir.homePath()
-            else: path = self.tree.originalFile
-            iniFileName = Qt.QFileDialog.getOpenFileName ( self, 'Select a settings file', path, 'Ini Files (*.ini)')
+            if self.tree.originalFile is None:
+                path = Qt.QDir.homePath()
+            else:
+                path = self.tree.originalFile
+            iniFileName = Qt.QFileDialog.getOpenFileName(
+                self, 'Select a settings file', path, 'Ini Files (*.ini)')
             if not iniFileName:
                 return
         self.tree.loadFile(iniFileName)
         self.treeview.setModel(self.tree)
-        self.setWindowTitle('TaurusConfigEditor - %s'%os.path.basename(self.tree.originalFile))
-        
+        self.setWindowTitle('TaurusConfigEditor - %s' %
+                            os.path.basename(self.tree.originalFile))
+
     def saveFile(self):
         '''
         Replaces original file with temporary file (where changes were being saved).
         '''
         self.tree.saveFile()
-        
+
     def restoreOriginal(self):
         '''
         Replaces temporary file with the original file and builds again the
         configuration tree.
         '''
-        self.tree.restoreOriginal()  
+        self.tree.restoreOriginal()
+
 
 def main():
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.core.util import argparse
     from taurus import Release
     import sys
-    
+
     parser = argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [INIFILENAME]")
     parser.set_description("taurus configuration editor")
     app = TaurusApplication(cmd_line_parser=parser,
                             app_name="taurusconfigeditor",
-                            app_version= Release.version)
+                            app_version=Release.version)
     args = app.get_command_line_args()
     w = QConfigEditor()
-    w.setMinimumSize(500,500)
+    w.setMinimumSize(500, 500)
     w.show()
     if len(args) == 1:
         w.loadFile(args[0])
-    
+
     sys.exit(app.exec_())
-        
+
 if __name__ == '__main__':
     main()
-    
diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py b/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py
old mode 100644
new mode 100755
index 6c60028..06c8226
--- a/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py
+++ b/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py
@@ -2,88 +2,229 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides a set of basic taurus widgets based on QLineEdit"""
 
-__all__ = ["TaurusConfigurationPanel"]
+__all__ = ["TaurusConfigurationPanel", "TangoConfigLineEdit",
+           "TaurusConfigLineEdit"]
 
 __docformat__ = 'restructuredtext'
 
-import sys, traceback
+import sys
 
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.input import TaurusConfigLineEdit
 from taurus.qt.qtgui.util import getWidgetsOfType
 from taurus.qt.qtgui.util.ui import UILoadable
+from taurus.qt.qtgui.base import TaurusBaseWritableWidget
+from taurus.core.taurusattribute import TaurusAttribute
+from taurus.core.taurusoperation import WriteAttrOperation
+from taurus.core.util.log import taurus4_deprecation
+
+
+class TangoConfigLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget):
+
+    def __init__(self, qt_parent=None, designMode=False):
+        name = self.__class__.__name__
+        self.call__init__wo_kw(Qt.QLineEdit, qt_parent)
+        self.call__init__(TaurusBaseWritableWidget,
+                          name, designMode=designMode)
+
+        self.textChanged.connect(self.notifyValueChanged)
+        self.returnPressed.connect(self.writeValue)
+        self.editingFinished.connect(self._onEditingFinished)
+
+    def _onEditingFinished(self):
+        if self._autoApply:
+            self.writeValue()
+
+    def handleEvent(self, evt_src, evt_type, evt_value):
+        self.notifyValueChanged()
+
+    def getModelClass(self):
+        return TaurusAttribute
+
+    def postAttach(self):
+        if self.isAttached():
+            try:
+                v = self._getAttrInfoExMember(self.modelFragmentName)
+            except:
+                v = None
+            self.setValue(v)
+
+    def updatePendingOperations(self):
+        model = self.getModelObj()
+        try:
+            model_value = self.text()
+            wigdet_value = self.getValue()
+            if model.areStrValuesEqual(model_value, wigdet_value):
+                self._operations = []
+            else:
+                operation = WriteAttrOperation(model, wigdet_value,
+                                               self.getOperationCallbacks())
+                self._operations = [operation]
+        except:
+            self._operations = []
+        self.updateStyle()
+
+    def setValue(self, v):
+        model = self.getModelObj()
+        if model is None:
+            v_str = str(v)
+        else:
+            v_str = str(self.getValue())
+        self.blockSignals(True)
+        self.setText(v_str.strip())
+        self.blockSignals(False)
+
+    def _getAttrInfoExMember(self, member):
+        model_obj = self.getModelObj()
+        attrInfoEx = model_obj.getAttributeInfoEx()
+        if '_alarm' in member or '_warning' in member:
+            alarms = getattr(attrInfoEx, 'alarms')
+            return getattr(alarms, member)
+        else:
+            return getattr(attrInfoEx, member)
+
+    def _setAttrInfoExMember(self, member, value):
+        model_obj = self.getModelObj()
+        attrInfoEx = model_obj.getAttributeInfoEx()
+        if '_alarm' in member or '_warning' in member:
+            alarms = getattr(attrInfoEx, 'alarms')
+            setattr(alarms, member, value)
+        else:
+            setattr(attrInfoEx, member, value)
+        model_obj.setConfigEx(attrInfoEx)
+
+    def getValue(self):
+        if self.modelFragmentName is None:
+            return None
+        return self._getAttrInfoExMember(self.modelFragmentName)
+
+    def notifyValueChanged(self):
+        if str(self.text()) != str(self.getValue()):
+            style = 'TangoConfigLineEdit {color: %s; font-weight: %s}' %\
+                    ('blue', 'bold')
+            self.setStyleSheet(style)
+        else:
+            style = 'TangoConfigLineEdit {color: %s; font-weight: %s}' %\
+                    ('black', 'normal')
+            self.setStyleSheet(style)
+
+    def writeValue(self):
+        if self.modelFragmentName is not None:
+            self._setAttrInfoExMember(self.modelFragmentName, str(self.text()))
+        style = 'TangoConfigLineEdit {color: %s; font-weight: %s}' %\
+                ('black', 'normal')
+        self.setStyleSheet(style)
+
+    def setModel(self, model):
+        TaurusBaseWritableWidget.setModel(self, model)
+        self.notifyValueChanged()
+
+    @classmethod
+    def getQtDesignerPluginInfo(cls):
+        ret = TaurusBaseWritableWidget.getQtDesignerPluginInfo()
+        ret['module'] = 'taurus.qt.qtgui.input'
+        ret['icon'] = "designer:lineedit.png"
+        return ret
+
+#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # QT properties
+#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
+    model = Qt.pyqtProperty("QString", TaurusBaseWritableWidget.getModel,
+                            TaurusBaseWritableWidget.setModel,
+                            TaurusBaseWritableWidget.resetModel)
+
+    autoApply = Qt.pyqtProperty("bool", TaurusBaseWritableWidget.getAutoApply,
+                                TaurusBaseWritableWidget.setAutoApply,
+                                TaurusBaseWritableWidget.resetAutoApply)
+
+    forcedApply = Qt.pyqtProperty("bool", TaurusBaseWritableWidget.getForcedApply,
+                                  TaurusBaseWritableWidget.setForcedApply,
+                                  TaurusBaseWritableWidget.resetForcedApply)
+
+
+class TaurusConfigLineEdit(TangoConfigLineEdit):
+
+    @taurus4_deprecation(alt='TangoConfigLineEdit')
+    def __init__(self, qt_parent=None, designMode=False):
+        TangoConfigLineEdit.__init__(self, qt_parent=None, designMode=False)
+
+    @classmethod
+    def getQtDesignerPluginInfo(cls):
+        return None
 
 
 @UILoadable(with_ui='_ui')
 class TaurusConfigurationPanel(Qt.QWidget):
+
     def __init__(self, parent=None, designMode=False):
         Qt.QWidget.__init__(self, parent)
         self.loadUi()
 
-        Qt.QObject.connect(self._ui.pushButtonOk, Qt.SIGNAL("clicked()"), self._onOk)
-        Qt.QObject.connect(self._ui.pushButtonApply, Qt.SIGNAL("clicked()"), self._onApply)
-        Qt.QObject.connect(self._ui.pushButtonCancel, Qt.SIGNAL("clicked()"), self._onCancel)
-        Qt.QObject.connect(self._ui.pushButtonRestore, Qt.SIGNAL("clicked()"), self._onRestore)
+        self._ui.pushButtonOk.clicked.connect(self._onOk)
+        self._ui.pushButtonApply.clicked.connect(self._onApply)
+        self._ui.pushButtonCancel.clicked.connect(self._onCancel)
+        self._ui.pushButtonRestore.clicked.connect(self._onRestore)
 
     def _onOk(self):
-	    self._onApply()
-	    self._onCancel()
+        self._onApply()
+        self._onCancel()
 
     def _onApply(self):
-	    widgets=getWidgetsOfType(self, TaurusConfigLineEdit)
-            for w in widgets:
-                model = w.getModelObj()
-                if w.getValue() != str(model.getParam(w._configParam)):
-	            w.writeValue()
+        widgets = getWidgetsOfType(self, TangoConfigLineEdit)
+        for w in widgets:
+            param = str(w.text())
+            if w.getValue() != param:
+                w.writeValue()
 
     def _onCancel(self):
-       self.close()
+        self.close()
 
     def _onRestore(self):
-	    widgets=getWidgetsOfType(self, TaurusConfigLineEdit)
-            for w in widgets:
-                model = w.getModelObj()
-                if w.getValue() != str(model.getParam(w._configParam)):
-		    w.setText(str(model.getParam(w._configParam)))
+        widgets = getWidgetsOfType(self, TangoConfigLineEdit)
+        for w in widgets:
+            param = str(w.text())
+            if w.getValue() != param:
+                w.setText(param)
 
     def setModel(self, model):
-    	self._ui.fullNameLineEdit.setText(model)
-    	model+='?configuration='
-        self._ui.labelConfig.setModel(model+'label')
-        self._ui.unitConfig.setModel(model+'unit')
-        self._ui.displayUnitConfig.setModel(model+'display_unit')
-        self._ui.standardUnitConfig.setModel(model+'standard_unit')
-        self._ui.formatConfig.setModel(model+'format')
-        self._ui.descriptionConfig.setModel(model+'description')
-        self._ui.valueMinConfig.setModel(model+'min_value')
-        self._ui.valueMaxConfig.setModel(model+'max_value')
-        self._ui.alarmMinConfig.setModel(model+'min_alarm')
-        self._ui.alarmMaxConfig.setModel(model+'max_alarm')
-        self._ui.warningMinConfig.setModel(model+'min_warning')
-        self._ui.warningMaxConfig.setModel(model+'max_warning')
+        self._ui.fullNameLineEdit.setText(model)
+        model += '#'
+        self._ui.labelConfig.setModel(model + 'label')
+        self._ui.unitConfig.setModel(model + 'unit')
+        self._ui.displayUnitConfig.setModel(model + 'display_unit')
+        self._ui.standardUnitConfig.setModel(model + 'standard_unit')
+        self._ui.formatConfig.setModel(model + 'format')
+        self._ui.descriptionConfig.setModel(model + 'description')
+        self._ui.valueMinConfig.setModel(model + 'min_value')
+        self._ui.valueMaxConfig.setModel(model + 'max_value')
+        self._ui.alarmMinConfig.setModel(model + 'min_alarm')
+        self._ui.alarmMaxConfig.setModel(model + 'max_alarm')
+        self._ui.warningMinConfig.setModel(model + 'min_warning')
+        self._ui.warningMaxConfig.setModel(model + 'max_warning')
+
 
 def main():
     import sys
diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
index b5ea850..34e2d5f 100644
--- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
+++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py
@@ -2,122 +2,145 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-TaurusDevicePanel.py: 
+TaurusDevicePanel.py:
 """
 
-__all__ = ["TaurusDevicePanel","TaurusDevPanel"]
+__all__ = ["TaurusDevicePanel", "TaurusDevPanel"]
 
 __docformat__ = 'restructuredtext'
 
-import re,traceback
+import re
+import traceback
+
+import taurus
 from taurus.external.qt import Qt
 
-import taurus.qt.qtgui.resource
-from taurus.core.taurusbasetypes import TaurusSWDevState, TaurusElementType
+from taurus import tauruscustomsettings
+from taurus.core.taurusbasetypes import TaurusDevState, 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
+from taurus.qt.qtgui.display import TaurusLabel
+from taurus.qt.qtgui.display import TaurusLed
 from taurus.qt.qtgui.panel.taurusform import TaurusForm
 from taurus.qt.qtgui.panel.taurusform import TaurusCommandsForm
 from taurus.qt.qtgui.util.ui import UILoadable
+from taurus.qt.qtgui.icon import getCachedPixmap
+
+from taurus.core.tango.tangodatabase import TangoDevInfo  # @todo: Tango-centric!
 
 ###############################################################################
 # TaurusDevicePanel (from Vacca)
 
 # Variables that control TaurusDevicePanel shape
 
-STATUS_HEIGHT=170
-SPLIT_SIZES=[15,65,20]
-IMAGE_SIZE=(200,100) #(width,height)
+STATUS_HEIGHT = 170
+SPLIT_SIZES = [15, 65, 20]
+IMAGE_SIZE = (200, 100)  # (width,height)
 
 # Helper methods
 
-def matchCl(m,k):
-    return re.match(m.lower(),k.lower())
 
-def searchCl(m,k):
-    if m.startswith('^') or m.startswith('(^') or '(?!^' in m: return matchCl(m,k)
-    return re.search(m.lower(),k.lower())
+def matchCl(m, k):  # TODO: Tango-centric
+    return re.match(m.lower(), k.lower())
+
+
+def searchCl(m, k):  # TODO: Tango-centric
+    if m.startswith('^') or m.startswith('(^') or '(?!^' in m:
+        return matchCl(m, k)
+    return re.search(m.lower(), k.lower())
 
-def get_regexp_dict(dct,key,default=None):
-    for k,v in dct.items(): #Trying regular expression match
-        if matchCl(k,key):
+
+def get_regexp_dict(dct, key, default=None):  # TODO: Tango-centric
+    for k, v in dct.items():  # Trying regular expression match
+        if matchCl(k, key):
             return v
-    for k,v in dct.items(): #If failed, trying if key is contained
+    for k, v in dct.items():  # If failed, trying if key is contained
         if k.lower() in key.lower():
             return v
-    if default is not None: return default
-    else: raise Exception('KeyNotFound:%s'%k)
-    
-def get_eqtype(dev):
+    if default is not None:
+        return default
+    else:
+        raise Exception('KeyNotFound:%s' % k)
+
+
+def get_eqtype(dev):  # TODO: Tango-centric
     ''' It extracts the eqtype from a device name like domain/family/eqtype-serial'''
-    try: eq = str(dev).split('/')[-1].split('-',1)[0].upper()
-    except: eq = ''
+    try:
+        eq = str(dev).split('/')[-1].split('-', 1)[0].upper()
+    except:
+        eq = ''
     return eq
-    
-def str_to_filter(seq):
-    try: f = eval(seq)
-    except: f = seq
-    if isinstance(f,basestring): return {'.*':[f]}
-    elif isinstance(f,list): return {'.*':f}
-    else: return f
-    
-#Stacked palette
+
+
+def str_to_filter(seq):  # TODO: Tango-centric
+    try:
+        f = eval(seq)
+    except:
+        f = seq
+    if isinstance(f, basestring):
+        return {'.*': [f]}
+    elif isinstance(f, list):
+        return {'.*': f}
+    else:
+        return f
+
+# Stacked palette
+
+
 def get_White_palette():
-        palette = Qt.QPalette()
+    palette = Qt.QPalette()
 
-        brush = Qt.QBrush(Qt.QColor(255,255,255))
-        brush.setStyle(Qt.Qt.SolidPattern)
-        palette.setBrush(Qt.QPalette.Active,Qt.QPalette.Base,brush)
+    brush = Qt.QBrush(Qt.QColor(255, 255, 255))
+    brush.setStyle(Qt.Qt.SolidPattern)
+    palette.setBrush(Qt.QPalette.Active, Qt.QPalette.Base, brush)
 
-        brush = Qt.QBrush(Qt.QColor(255,255,255))
-        brush.setStyle(Qt.Qt.SolidPattern)
-        palette.setBrush(Qt.QPalette.Active,Qt.QPalette.Window,brush)
+    brush = Qt.QBrush(Qt.QColor(255, 255, 255))
+    brush.setStyle(Qt.Qt.SolidPattern)
+    palette.setBrush(Qt.QPalette.Active, Qt.QPalette.Window, brush)
 
-        brush = Qt.QBrush(Qt.QColor(255,255,255))
-        brush.setStyle(Qt.Qt.SolidPattern)
-        palette.setBrush(Qt.QPalette.Inactive,Qt.QPalette.Base,brush)
+    brush = Qt.QBrush(Qt.QColor(255, 255, 255))
+    brush.setStyle(Qt.Qt.SolidPattern)
+    palette.setBrush(Qt.QPalette.Inactive, Qt.QPalette.Base, brush)
 
-        brush = Qt.QBrush(Qt.QColor(255,255,255))
-        brush.setStyle(Qt.Qt.SolidPattern)
-        palette.setBrush(Qt.QPalette.Inactive,Qt.QPalette.Window,brush)
+    brush = Qt.QBrush(Qt.QColor(255, 255, 255))
+    brush.setStyle(Qt.Qt.SolidPattern)
+    palette.setBrush(Qt.QPalette.Inactive, Qt.QPalette.Window, brush)
 
-        brush = Qt.QBrush(Qt.QColor(255,255,255))
-        brush.setStyle(Qt.Qt.SolidPattern)
-        palette.setBrush(Qt.QPalette.Disabled,Qt.QPalette.Base,brush)
+    brush = Qt.QBrush(Qt.QColor(255, 255, 255))
+    brush.setStyle(Qt.Qt.SolidPattern)
+    palette.setBrush(Qt.QPalette.Disabled, Qt.QPalette.Base, brush)
 
-        brush = Qt.QBrush(Qt.QColor(255,255,255))
-        brush.setStyle(Qt.Qt.SolidPattern)
-        palette.setBrush(Qt.QPalette.Disabled,Qt.QPalette.Window,brush)
-        return palette
+    brush = Qt.QBrush(Qt.QColor(255, 255, 255))
+    brush.setStyle(Qt.Qt.SolidPattern)
+    palette.setBrush(Qt.QPalette.Disabled, Qt.QPalette.Window, brush)
+    return palette
 
 # TaurusDevicePanel class
 
+
 class TaurusDevicePanel(TaurusWidget):
     '''
     TaurusDevPanel is a Taurus Application inspired in Jive and Atk Panel.
@@ -125,165 +148,179 @@ class TaurusDevicePanel(TaurusWidget):
     It Provides a Device selector and a panel for displaying information from
     the selected device.
     '''
+    # TODO: Tango-centric (This whole class should be called TangoDevicePanel)
+    # TODO: a scheme-agnostic base class should be implemented
 
     READ_ONLY = False
-    _attribute_filter = {} #A dictionary like {device_regexp:[attribute_regexps]}
-    _command_filter = {} #A dictionary like {device_regexp:[(command_regexp,default_args)]}
-    _icon_map = {} #A dictionary like {device_regexp:pixmap_url}
+    # A dictionary like {device_regexp:[attribute_regexps]}
+    _attribute_filter = {}
+    # A dictionary like {device_regexp:[(command_regexp,default_args)]}
+    _command_filter = {}
+    _icon_map = {}  # A dictionary like {device_regexp:pixmap_url}
 
     @classmethod
-    def setIconMap(klass,filters):
+    def setIconMap(klass, filters):
         """A dictionary like {device_regexp:pixmap_url}"""
         klass._icon_map = filters
-        
+
     @classmethod
     def getIconMap(klass):
         return klass._icon_map
-      
+
     @classmethod
-    def setAttributeFilters(klass,filters):
-        """ 
+    def setAttributeFilters(klass, filters):
+        """
         It will set the attribute filters
         filters will be like: {device_regexp:[attribute_regexps]}
         example: {'.*/VGCT-.*': ['ChannelState','p[0-9]']}
         """
         klass._attribute_filter.update(filters)
-        
+
     @classmethod
     def getAttributeFilters(klass):
         return klass._attribute_filter
-        
+
     @classmethod
-    def setCommandFilters(klass,filters):
-        """ 
+    def setCommandFilters(klass, filters):
+        """
         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',()), 
+                           ('setmode',('SERIAL','LOCAL','STEP','FIXED','START','PROTECT')),
+                           ('onhv1',()), ('offhv1',()), ('onhv2',()), ('offhv2',()),
                            ('sendcommand',())
                          ),}
-                         
+
         """
-        klass._command_filter.update(filters)        
-        
+        klass._command_filter.update(filters)
+
     @classmethod
     def getCommandFilters(klass):
         return klass._command_filter
-    
+
     ###########################################################################
-    
-    def __init__(self,parent=None,model=None,palette=None,bound=True):
-        TaurusWidget.__init__(self,parent)
-        if palette: self.setPalette(palette)
+
+    def __init__(self, parent=None, model=None, palette=None, bound=True):
+        TaurusWidget.__init__(self, parent)
+        if palette:
+            self.setPalette(palette)
         self.setLayout(Qt.QGridLayout())
         self.bound = bound
         self._dups = []
-        
+
         self.setWindowTitle('TaurusDevicePanel')
         self._label = Qt.QLabel()
         self._label.font().setBold(True)
-        
+
         self._stateframe = TaurusWidget(self)
         self._stateframe.setLayout(Qt.QGridLayout())
-        self._stateframe.layout().addWidget(Qt.QLabel('State'),0,0,Qt.Qt.AlignCenter)
-        self._statelabel = LABEL_CLASS(self._stateframe)
-        self._statelabel.setMinimumWidth(100)        
-        self._statelabel.setShowQuality(False)
-        self._statelabel.setShowState(True)
-        self._stateframe.layout().addWidget(self._statelabel,0,1,Qt.Qt.AlignCenter)
-        self._state = LED_CLASS(self._stateframe)
+        self._stateframe.layout().addWidget(Qt.QLabel('State'), 0, 0, Qt.Qt.AlignCenter)
+        self._statelabel = TaurusLabel(self._stateframe)
+        self._statelabel.setMinimumWidth(100)
+        self._statelabel.setBgRole('state')
+        self._stateframe.layout().addWidget(self._statelabel, 0, 1, Qt.Qt.AlignCenter)
+        self._state = TaurusLed(self._stateframe)
         self._state.setShowQuality(False)
-        self._stateframe.layout().addWidget(self._state,0,2,Qt.Qt.AlignCenter)        
-        
+        self._stateframe.layout().addWidget(self._state, 0, 2, Qt.Qt.AlignCenter)
+
         self._statusframe = Qt.QScrollArea(self)
-        self._status = LABEL_CLASS(self._statusframe)
-        self._status.setShowQuality(False)
+        self._status = TaurusLabel(self._statusframe)
+        self._status.setBgRole('none')
         self._status.setAlignment(Qt.Qt.AlignLeft)
         self._status.setFixedHeight(2000)
         self._status.setFixedWidth(5000)
-        #self._statusframe.setFixedHeight(STATUS_HEIGHT)
+        # self._statusframe.setFixedHeight(STATUS_HEIGHT)
         self._statusframe.setHorizontalScrollBarPolicy(Qt.Qt.ScrollBarAlwaysOn)
         self._statusframe.setVerticalScrollBarPolicy(Qt.Qt.ScrollBarAlwaysOn)
         self._statusframe.setWidget(self._status)
         self._statusframe.setPalette(get_White_palette())
-        
+
         self._attrsframe = Qt.QTabWidget(self)
-        
-        self._splitter = Qt.QSplitter(Qt.Qt.Vertical,self) ##Horizontal will not allow to show labels of attributes!
-        
-        self._attrs,self._comms = None,None
-        
-        self.layout().addWidget(self._splitter,0,0)
+
+        # Horizontal will not allow to show labels of attributes!
+        self._splitter = Qt.QSplitter(Qt.Qt.Vertical, self)
+
+        self._attrs, self._comms = None, None
+
+        self.layout().addWidget(self._splitter, 0, 0)
         self._header = Qt.QFrame()
-        self._header.setFixedHeight(1.1*IMAGE_SIZE[1])
+        self._header.setFixedHeight(1.1 * IMAGE_SIZE[1])
         self._header.setLayout(Qt.QGridLayout())
-        
+
         self._dup = Qt.QPushButton()
-        qpixmap = taurus.qt.qtgui.resource.getPixmap(':/actions/window-new.svg')
+        qpixmap = Qt.QIcon("actions:window-new.svg")
         self._dup.setIcon(Qt.QIcon(qpixmap))
-        self._dup.setIconSize(Qt.QSize(15,15))
-        self.connect(self._dup,Qt.SIGNAL("pressed()"),self.duplicate)
-        
+        self._dup.setIconSize(Qt.QSize(15, 15))
+        self._dup.pressed.connect(self.duplicate)
+
         self._image = Qt.QLabel()
-            
-        self._header.layout().addWidget(self._image,0,0,2,1,Qt.Qt.AlignCenter)
-        self._header.layout().addWidget(self._label,0,1,Qt.Qt.AlignLeft)
-        self._header.layout().addWidget(self._stateframe,1,1,1,2,Qt.Qt.AlignLeft)
-        self._header.layout().addWidget(self._dup,0,2,Qt.Qt.AlignRight)
-        
-        self._splitter.insertWidget(0,self._header)
-        self._splitter.insertWidget(1,self._attrsframe)
-        self._splitter.insertWidget(2,self._statusframe)
+
+        self._header.layout().addWidget(self._image, 0, 0, 2, 1, Qt.Qt.AlignCenter)
+        self._header.layout().addWidget(self._label, 0, 1, Qt.Qt.AlignLeft)
+        self._header.layout().addWidget(self._stateframe, 1, 1, 1, 2, Qt.Qt.AlignLeft)
+        self._header.layout().addWidget(self._dup, 0, 2, Qt.Qt.AlignRight)
+
+        self._splitter.insertWidget(0, self._header)
+        self._splitter.insertWidget(1, self._attrsframe)
+        self._splitter.insertWidget(2, self._statusframe)
         self._splitter.setSizes(SPLIT_SIZES)
-        [self._splitter.setStretchFactor(i,v) for i,v in enumerate(SPLIT_SIZES)]
-        self._splitter.setCollapsible(0,False)
-        self._splitter.setCollapsible(1,False)
-        
-        if model: self.setModel(model)
-        
-    def loadConfigFile(self,ifile=None):
-        self.info('In TaurusDevicePanel.loadConfigFile(%s)'%ifile)
-        if isinstance(ifile,file) or isinstance(ifile,str) and not ifile.endswith('.py'):
-            TaurusWidget.loadConfigFile(self,ifile)
+        [self._splitter.setStretchFactor(i, v)
+         for i, v in enumerate(SPLIT_SIZES)]
+        self._splitter.setCollapsible(0, False)
+        self._splitter.setCollapsible(1, False)
+
+        if model:
+            self.setModel(model)
+
+    def loadConfigFile(self, ifile=None):
+        self.info('In TaurusDevicePanel.loadConfigFile(%s)' % ifile)
+        if isinstance(ifile, file) or isinstance(ifile, str) and not ifile.endswith('.py'):
+            TaurusWidget.loadConfigFile(self, ifile)
         else:
             from imp import load_source
-            config_file = load_source('config_file',ifile)
-            af,cf,im = [getattr(config_file,x,None) for x in ('AttributeFilters','CommandFilters','IconMap')]
-            if af is not None:  self.setAttributeFilters(af)
-            if cf is not None:  self.setCommandFilters(cf)
-            if im is not None: self.setIconMap(im)
-        self.debug('AttributeFilters are:\n%s'%self.getAttributeFilters())
-        
+            config_file = load_source('config_file', ifile)
+            af, cf, im = [getattr(config_file, x, None) for x in (
+                'AttributeFilters', 'CommandFilters', 'IconMap')]
+            if af is not None:
+                self.setAttributeFilters(af)
+            if cf is not None:
+                self.setCommandFilters(cf)
+            if im is not None:
+                self.setIconMap(im)
+        self.debug('AttributeFilters are:\n%s' % self.getAttributeFilters())
+
     def duplicate(self):
         self._dups.append(TaurusDevicePanel(bound=False))
         self._dups[-1].setModel(self.getModel())
         self._dups[-1].show()
-    
-    @Qt.pyqtSignature("setModel(QString)")
-    def setModel(self,model,pixmap=None):        
-        model,modelclass,raw = str(model).strip(),'',model
-        if model: 
+
+    @Qt.pyqtSlot('QString')
+    def setModel(self, model, pixmap=None):
+        model, modelclass, raw = str(model).strip(), '', model
+        if model:
             model = model and model.split()[0] or ''
             modelclass = taurus.Factory().findObjectClass(model)
-        self.trace('In TaurusDevicePanel.setModel(%s(%s),%s)'%(raw,modelclass,pixmap))
+        self.trace('In TaurusDevicePanel.setModel(%s(%s),%s)' %
+                   (raw, modelclass, pixmap))
         if model == self.getModel():
             return
-        elif raw is None or not model or not modelclass: 
-            if self.getModel(): self.detach()
+        elif raw is None or not model or not modelclass:
+            if self.getModel():
+                self.detach()
             return
         elif issubclass(modelclass, TaurusAttribute):
-            #if model.lower().endswith('/state'): 
-            model = model.rsplit('/',1)[0]
+            # if model.lower().endswith('/state'):
+            model = model.rsplit('/', 1)[0]  # TODO: Tango-centric
         elif not issubclass(modelclass, TaurusDevice):
             self.warning('TaurusDevicePanel accepts only Device models')
             return
         try:
-            taurus.Device(model).ping()
-            if self.getModel(): self.detach() #Do not dettach previous model before pinging the new one (fail message will be shown at except: clause)
-            TaurusWidget.setModel(self,model)
+            taurus.Device(model).ping()  # TODO: Tango-centric
+            if self.getModel():
+                self.detach()  # Do not dettach previous model before pinging the new one (fail message will be shown at except: clause)
+            TaurusWidget.setModel(self, model)
             self.setWindowTitle(str(model).upper())
             model = self.getModel()
             self._label.setText(model.upper())
@@ -291,133 +328,169 @@ class TaurusDevicePanel(TaurusWidget):
             font.setPointSize(15)
             self._label.setFont(font)
             if pixmap is None and self.getIconMap():
-                for k,v in self.getIconMap().items():
-                    if searchCl(k,model):
-                        pixmap = v                  
+                for k, v in self.getIconMap().items():
+                    if searchCl(k, model):
+                        pixmap = v
             if pixmap is not None:
-                #print 'Pixmap is %s'%pixmap
+                # print 'Pixmap is %s'%pixmap
                 qpixmap = Qt.QPixmap(pixmap)
-                if qpixmap.height()>.9*IMAGE_SIZE[1]: qpixmap=qpixmap.scaledToHeight(.9*IMAGE_SIZE[1])
-                if qpixmap.width()>.9*IMAGE_SIZE[0]: qpixmap=qpixmap.scaledToWidth(.9*IMAGE_SIZE[0])
+                if qpixmap.height() > .9 * IMAGE_SIZE[1]:
+                    qpixmap = qpixmap.scaledToHeight(.9 * IMAGE_SIZE[1])
+                if qpixmap.width() > .9 * IMAGE_SIZE[0]:
+                    qpixmap = qpixmap.scaledToWidth(.9 * IMAGE_SIZE[0])
             else:
-                qpixmap = taurus.qt.qtgui.resource.getPixmap(':/logo.png')
-            
+                logo = getattr(tauruscustomsettings, 'ORGANIZATION_LOGO',
+                               "logos:taurus.png")
+                qpixmap = getCachedPixmap(logo)
+
             self._image.setPixmap(qpixmap)
-            self._state.setModel(model+'/state')
-            if hasattr(self,'_statelabel'): self._statelabel.setModel(model+'/state')
-            self._status.setModel(model+'/status')
+            self._state.setModel(model + '/state')  # TODO: Tango-centric
+            if hasattr(self, '_statelabel'):
+                self._statelabel.setModel(
+                    model + '/state')  # TODO: Tango-centric
+            self._status.setModel(model + '/status')  # TODO: Tango-centric
             try:
                 self._attrsframe.clear()
-                filters = get_regexp_dict(TaurusDevicePanel._attribute_filter,model,['.*'])
-                if hasattr(filters,'keys'): filters = filters.items() #Dictionary!
-                if filters and isinstance(filters[0],(list,tuple)): #Mapping
+                filters = get_regexp_dict(
+                    TaurusDevicePanel._attribute_filter, model, ['.*'])
+                if hasattr(filters, 'keys'):
+                    filters = filters.items()  # Dictionary!
+                if filters and isinstance(filters[0], (list, tuple)):  # Mapping
                     self._attrs = []
-                    for tab,attrs in filters:
-                        self._attrs.append(self.get_attrs_form(device=model,filters=attrs,parent=self))
-                        self._attrsframe.addTab(self._attrs[-1],tab)
+                    for tab, attrs in filters:
+                        self._attrs.append(self.get_attrs_form(
+                            device=model, filters=attrs, parent=self))
+                        self._attrsframe.addTab(self._attrs[-1], tab)
                 else:
-                    if self._attrs and isinstance(self._attrs,list): self._attrs = self._attrs[0]
-                    self._attrs = self.get_attrs_form(device=model,form=self._attrs,filters=filters,parent=self)
-                    if self._attrs: self._attrsframe.addTab(self._attrs,'Attributes')               
+                    if self._attrs and isinstance(self._attrs, list):
+                        self._attrs = self._attrs[0]
+                    self._attrs = self.get_attrs_form(
+                        device=model, form=self._attrs, filters=filters, parent=self)
+                    if self._attrs:
+                        self._attrsframe.addTab(self._attrs, 'Attributes')
                 if not TaurusDevicePanel.READ_ONLY:
-                    self._comms = self.get_comms_form(model,self._comms,self)
-                    if self._comms: self._attrsframe.addTab(self._comms,'Commands')
-                if SPLIT_SIZES: self._splitter.setSizes(SPLIT_SIZES)
+                    self._comms = self.get_comms_form(model, self._comms, self)
+                    if self._comms:
+                        self._attrsframe.addTab(self._comms, 'Commands')
+                if SPLIT_SIZES:
+                    self._splitter.setSizes(SPLIT_SIZES)
             except:
-                self.warning( traceback.format_exc())
-                qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical,'%s Error'%model,'%s not available'%model,Qt.QMessageBox.Ok,self)
+                self.warning(traceback.format_exc())
+                qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' %
+                                      model, '%s not available' % model, Qt.QMessageBox.Ok, self)
                 qmsg.setDetailedText(traceback.format_exc())
                 qmsg.show()
         except:
             self.warning(traceback.format_exc())
-            qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical,'%s Error'%model,'%s not available'%model,Qt.QMessageBox.Ok,self)
+            qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' %
+                                  model, '%s not available' % model, Qt.QMessageBox.Ok, self)
             qmsg.show()
         self.setWindowTitle(self.getModel())
         return
-                    
+
     def detach(self):
-        self.trace('In TaurusDevicePanel(%s).detach()'%self.getModel())
+        self.trace('In TaurusDevicePanel(%s).detach()' % self.getModel())
         _detached = []
-        #long imports to avoid comparison problems in the isinstance below 
+        # long imports to avoid comparison problems in the isinstance below
         import taurus.qt.qtgui.container
         import taurus.qt.qtgui.base
+
         def detach_recursive(obj):
-            if obj in _detached: return
-            if isinstance(obj,taurus.qt.qtgui.container.TaurusBaseContainer):
+            if obj in _detached:
+                return
+            if isinstance(obj, taurus.qt.qtgui.container.TaurusBaseContainer):
                 for t in obj.taurusChildren():
                     detach_recursive(t)
-            if obj is not self and isinstance(obj,taurus.qt.qtgui.base.TaurusBaseWidget):
+            if obj is not self and isinstance(obj, taurus.qt.qtgui.base.TaurusBaseWidget):
                 try:
-                    if getattr(obj,'model',None):
+                    if getattr(obj, 'model', None):
                         #self.debug('detaching %s from %s'%(obj,obj.model))
-                        obj.setModel([] if isinstance(obj,TaurusForm) else '')
+                        obj.setModel([] if isinstance(obj, TaurusForm) else '')
                 except:
-                    self.warning('detach of %s failed!'%obj)
-                    self.warning(traceback.format_exc())                    
+                    self.warning('detach of %s failed!' % obj)
+                    self.warning(traceback.format_exc())
             _detached.append(obj)
         detach_recursive(self)
         try:
             self._label.setText('')
             self._state.setModel('')
-            if hasattr(self,'_statelabel'): self._statelabel.setModel('')
+            if hasattr(self, '_statelabel'):
+                self._statelabel.setModel('')
             self._status.setModel('')
             self._image.setPixmap(Qt.QPixmap())
         except:
             self.warning(traceback.format_exc())
-        
-    def get_attrs_form(self,device,form=None,filters=None,parent=None):
-        filters = filters or get_regexp_dict(TaurusDevicePanel._attribute_filter,device,['.*'])
-        self.trace( 'In TaurusDevicePanel.get_attrs_form(%s,%s)'%(device,filters))
-        allattrs = sorted(str(a) for a in taurus.Device(device).get_attribute_list() if str(a).lower() not in ('state','status'))
+
+    def get_attrs_form(self, device, form=None, filters=None, parent=None):
+        filters = filters or get_regexp_dict(
+            TaurusDevicePanel._attribute_filter, device, ['.*'])
+        self.trace('In TaurusDevicePanel.get_attrs_form(%s,%s)' %
+                   (device, filters))
+        allattrs = sorted(str(a) for a in taurus.Device(
+            device).get_attribute_list() if str(a).lower() not in ('state', 'status'))
         attrs = []
         for a in filters:
             for t in allattrs:
-                if a and searchCl(a.strip(),t.strip()):
-                    aname = '%s/%s' % (device,t)
-                    if not aname in attrs:
-                        attrs.append(aname)  
+                if a and searchCl(a.strip(), t.strip()):
+                    aname = '%s/%s' % (device, t)
+                    if aname not in attrs:
+                        attrs.append(aname)
         if attrs:
             #self.trace( 'Matching attributes are: %s' % str(attrs)[:100])
-            if form is None: form = TaurusForm(parent)
-            elif hasattr(form,'setModel'): form.setModel([])
-            ##Configuring the TauForm:
+            if form is None:
+                form = TaurusForm(parent)
+            elif hasattr(form, 'setModel'):
+                form.setModel([])
+            # Configuring the TauForm:
             form.setWithButtons(False)
             form.setWindowTitle(device)
-            try: form.setModel(attrs)
-            except Exception: self.warning('TaurusDevicePanel.ERROR: Unable to setModel for TaurusDevicePanel.attrs_form!!: %s'%traceback.format_exc())
+            try:
+                form.setModel(attrs)
+            except Exception:
+                self.warning(
+                    'TaurusDevicePanel.ERROR: Unable to setModel for TaurusDevicePanel.attrs_form!!: %s' % traceback.format_exc())
             return form
-        else: return None
-    
-    def get_comms_form(self,device,form=None,parent=None):
-        self.trace( 'In TaurusDevicePanel.get_comms_form(%s)'%device)
-        params = get_regexp_dict(TaurusDevicePanel._command_filter,device,[])
-        if TaurusDevicePanel._command_filter and not params: #If filters are defined only listed devices will show commands
-            self.debug('TaurusDevicePanel.get_comms_form(%s): By default an unknown device type will display no commands'% device)
-            return None 
-        if not form: 
+        else:
+            return None
+
+    def get_comms_form(self, device, form=None, parent=None):
+        self.trace('In TaurusDevicePanel.get_comms_form(%s)' % device)
+        params = get_regexp_dict(TaurusDevicePanel._command_filter, device, [])
+        # If filters are defined only listed devices will show commands
+        if TaurusDevicePanel._command_filter and not params:
+            self.debug(
+                'TaurusDevicePanel.get_comms_form(%s): By default an unknown device type will display no commands' % device)
+            return None
+        if not form:
             form = TaurusCommandsForm(parent)
-        elif hasattr(form,'setModel'): 
+        elif hasattr(form, 'setModel'):
             form.setModel('')
         try:
             form.setModel(device)
-            if params: 
-                form.setSortKey(lambda x,vals=[s[0].lower() for s in params]: vals.index(x.cmd_name.lower()) if str(x.cmd_name).lower() in vals else 100)
-                form.setViewFilters([lambda c: str(c.cmd_name).lower() not in ('state','status') and any(searchCl(s[0],str(c.cmd_name)) for s in params)])
-                form.setDefaultParameters(dict((k,v) for k,v in (params if not hasattr(params,'items') else params.items()) if v))
+            if params:
+                form.setSortKey(lambda x, vals=[s[0].lower() for s in params]: vals.index(
+                    x.cmd_name.lower()) if str(x.cmd_name).lower() in vals else 100)
+                form.setViewFilters([lambda c: str(c.cmd_name).lower() not in (
+                    'state', 'status') and any(searchCl(s[0], str(c.cmd_name)) for s in params)])
+                form.setDefaultParameters(dict((k, v) for k, v in (
+                    params if not hasattr(params, 'items') else params.items()) if v))
             for wid in form._cmdWidgets:
-                if not hasattr(wid,'getCommand') or not hasattr(wid,'setDangerMessage'): continue
-                if re.match('.*(on|off|init|open|close).*',str(wid.getCommand().lower())):
-                    wid.setDangerMessage('This action may affect other systems!')
-            #form._splitter.setStretchFactor(1,70)
-            #form._splitter.setStretchFactor(0,30)
-            form._splitter.setSizes([80,20])
-        except Exception: 
-            self.warning('Unable to setModel for TaurusDevicePanel.comms_form!!: %s'%traceback.format_exc())
+                if not hasattr(wid, 'getCommand') or not hasattr(wid, 'setDangerMessage'):
+                    continue
+                if re.match('.*(on|off|init|open|close).*', str(wid.getCommand().lower())):
+                    wid.setDangerMessage(
+                        'This action may affect other systems!')
+            # form._splitter.setStretchFactor(1,70)
+            # form._splitter.setStretchFactor(0,30)
+            form._splitter.setSizes([80, 20])
+        except Exception:
+            self.warning(
+                'Unable to setModel for TaurusDevicePanel.comms_form!!: %s' % traceback.format_exc())
         return form
 
 
 def filterNonExported(obj):
-    if not isinstance(obj, TaurusDevInfo) or obj.exported():
+    if not isinstance(obj, TangoDevInfo) or obj.exported():
         return obj
     return None
 
@@ -426,138 +499,147 @@ def filterNonExported(obj):
 class TaurusDevPanel(TaurusMainWindow):
     '''
     TaurusDevPanel is a Taurus Application inspired in Jive and Atk Panel.
-    
+
     It Provides a Device selector and several dockWidgets for interacting and
     displaying information from the selected device.
     '''
-    def __init__(self, parent=None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         TaurusMainWindow.__init__(self, parent, designMode=designMode)
         self.loadUi()
-        
-        #setting up the device Tree. 
+
+        # setting up the device Tree.
         #@todo: This should be done in the ui file when the TaurusDatabaseTree Designer plugin is available
         import taurus.qt.qtgui.tree
         TaurusDbTreeWidget = taurus.qt.qtgui.tree.TaurusDbTreeWidget
 
-        self.deviceTree = TaurusDbTreeWidget(perspective=TaurusElementType.Device)
-        self.deviceTree.getQModel().setSelectables([TaurusElementType.Member])
-        #self.deviceTree.insertFilter(filterNonExported)
-        self.setCentralWidget(self.deviceTree)        
-        
-        #needed because of a limitation in when using the useParentModel
-        #property from designer and taurus parents are not the same as Qt Parents
+        self.deviceTree = TaurusDbTreeWidget(
+            perspective=TaurusElementType.Device)
+        self.deviceTree.getQModel().setSelectables(
+            [TaurusElementType.Member])  # TODO: Tango-centric
+        # self.deviceTree.insertFilter(filterNonExported)
+        self.setCentralWidget(self.deviceTree)
+
+        # needed because of a limitation in when using the useParentModel
+        # property from designer and taurus parents are not the same as Qt
+        # Parents
         self._ui.taurusAttrForm.recheckTaurusParent()
         self._ui.taurusCommandsForm.recheckTaurusParent()
-        
-        #Add StateLed to statusBar
-#        self.devStateLed = TaurusStateLed()
+
+        # Add StateLed to statusBar
+#        self.devStateLed = TaurusLed()
 #        self.statusbar.addPermanentWidget(self.devStateLed)
 #        self.devStateLed.setModel('/state')
 #        self.devStateLed.setUseParentModel(True)
-        
-        #register subwidgets for configuration purposes 
-        #self.registerConfigDelegate(self.taurusAttrForm)
-        #self.registerConfigDelegate(self.deviceTree)
+
+        # register subwidgets for configuration purposes
+        # self.registerConfigDelegate(self.taurusAttrForm)
+        # self.registerConfigDelegate(self.deviceTree)
         self.registerConfigDelegate(self._ui.taurusCommandsForm)
-        
+
         self.loadSettings()
         self.createActions()
-        
-        #self.addToolBar(self.basicTaurusToolbar())
-        
-        self.connect(self.deviceTree, Qt.SIGNAL("currentItemChanged"),self.onItemSelectionChanged)
-                
+
+        # self.addToolBar(self.basicTaurusToolbar())
+
+        self.deviceTree.currentItemChanged.connect(self.onItemSelectionChanged)
+
         self.updatePerspectivesMenu()
         if not designMode:
             self.splashScreen().finish(self)
-    
+
     def createActions(self):
         '''create actions '''
-        #View Menu
-        self.showAttrAction = self.viewMenu.addAction(self._ui.attrDW.toggleViewAction())
-        self.showCommandsAction = self.viewMenu.addAction(self._ui.commandsDW.toggleViewAction())
-        self.showTrendAction = self.viewMenu.addAction(self._ui.trendDW.toggleViewAction())
+        # View Menu
+        self.showAttrAction = self.viewMenu.addAction(
+            self._ui.attrDW.toggleViewAction())
+        self.showCommandsAction = self.viewMenu.addAction(
+            self._ui.commandsDW.toggleViewAction())
+        self.showTrendAction = self.viewMenu.addAction(
+            self._ui.trendDW.toggleViewAction())
 
     def setTangoHost(self, host):
         '''extended from :class:setTangoHost'''
         TaurusMainWindow.setTangoHost(self, host)
         self.deviceTree.setModel(host)
-        #self.deviceTree.insertFilter(filterNonExported)
-        
+        # self.deviceTree.insertFilter(filterNonExported)
+
     def onItemSelectionChanged(self, current, previous):
         itemData = current.itemData()
-        if isinstance(itemData, TaurusDevInfo):
+        if isinstance(itemData, TangoDevInfo):  # TODO: Tango-centric
             self.onDeviceSelected(itemData)
-        
+
     def onDeviceSelected(self, devinfo):
         devname = devinfo.name()
-        msg = 'Connecting to "%s"...'%devname
+        msg = 'Connecting to "%s"...' % devname
         self.statusBar().showMessage(msg)
-        #abort if the device is not exported
-        if not devinfo.exported():
-            msg = 'Connection to "%s" failed (not exported)'%devname
+        # abort if the device is not exported
+        if not devinfo.exported():  # TODO: Tango-centric
+            msg = 'Connection to "%s" failed (not exported)' % devname
             self.statusBar().showMessage(msg)
             self.info(msg)
             Qt.QMessageBox.warning(self, "Device unreachable", msg)
             self.setModel('')
             return
         self.setDevice(devname)
-        
-    def setDevice(self,devname):
-        #try to connect with the device
+
+    def setDevice(self, devname):
+        # try to connect with the device
         self.setModel(devname)
         dev = self.getModelObj()
-        dev.state()
-        state = dev.getSWState()
-        #test the connection
-        if state == TaurusSWDevState.Running:
-            msg = 'Connected to "%s"'%devname
+        state = dev.state
+        # test the connection
+        if state == TaurusDevState.Ready:
+            msg = 'Connected to "%s"' % devname
             self.statusBar().showMessage(msg)
-            self._ui.attrDW.setWindowTitle('Attributes - %s'%devname)
-            self._ui.commandsDW.setWindowTitle('Commands - %s'%devname)
+            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, TaurusSWDevState.whatis(state))
+            # reset the model if the connection failed
+            msg = 'Connection to "%s" failed (state = %s)' % (devname,
+                                                              state.name)
             self.statusBar().showMessage(msg)
             self.info(msg)
             Qt.QMessageBox.warning(self, "Device unreachable", msg)
             self.setModel('')
-            
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         ret = TaurusMainWindow.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.panel'
         return ret
 
-#===============================================================================
+#=========================================================================
 # Launchers
-#===============================================================================
+#=========================================================================
+
 
 def TaurusDevicePanelMain():
     '''A launcher for TaurusDevicePanel.'''
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.core.util import argparse
-    
+
     parser = argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [devname [attrs]]")
     parser.set_description("Taurus Application inspired in Jive and Atk Panel")
     parser.add_option("", "--config-file", dest="config_file", default=None,
-                  help="load a config file (TODO: document this option)") 
-                      
-    app = TaurusApplication(cmd_line_parser=parser,app_name="TaurusDevicePanel",
+                      help="load a config file (TODO: document this option)")
+
+    app = TaurusApplication(cmd_line_parser=parser, app_name="TaurusDevicePanel",
                             app_version=taurus.Release.version)
     args = app.get_command_line_args()
     options = app.get_command_line_options()
-    
+
     w = TaurusDevicePanel()
     w.show()
-    
+
     if len(args) == 0:
         from taurus.qt.qtgui.panel import TaurusModelChooser
-        models, ok = TaurusModelChooser.modelChooserDlg(w, 
-                                       selectables = [TaurusElementType.Member],
-                                       singleModel= True )
+        models, ok = TaurusModelChooser.modelChooserDlg(w,
+                                                        selectables=[
+                                                            TaurusElementType.Member],
+                                                        singleModel=True)
         model = models[0] if ok and models else None
         filters = ''
     else:
@@ -567,46 +649,45 @@ def TaurusDevicePanelMain():
     if options.config_file is not None:
         w.loadConfigFile(options.config_file)
     elif model and filters:
-        w.setAttributeFilters({model:filters})
+        w.setAttributeFilters({model: filters})
 
     w.setModel(model)
-    
-    sys.exit(app.exec_())             
+
+    sys.exit(app.exec_())
 
 
 def TaurusPanelMain():
     '''A launcher for TaurusPanel.'''
-    ## NOTE: DON'T PUT TEST CODE HERE.
-    ## THIS IS CALLED FROM THE LAUNCHER SCRIPT (<taurus>/scripts/tauruspanel)
+    # NOTE: DON'T PUT TEST CODE HERE.
+    # THIS IS CALLED FROM THE LAUNCHER SCRIPT (<taurus>/scripts/tauruspanel)
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.core.util import argparse
     import sys
-    
+
     parser = argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [devname]")
     parser.set_description("Taurus Application inspired in Jive and Atk Panel")
-    
-    app = TaurusApplication(cmd_line_parser=parser,app_name="tauruspanel",
+
+    app = TaurusApplication(cmd_line_parser=parser, app_name="tauruspanel",
                             app_version=taurus.Release.version)
     args = app.get_command_line_args()
     options = app.get_command_line_options()
-    
+
     w = TaurusDevPanel()
-    
+
     if options.tango_host is None:
-        options.tango_host = taurus.Database().getNormalName()
+        options.tango_host = taurus.Authority().getNormalName()
     w.setTangoHost(options.tango_host)
-    
-    if len(args) == 1: 
+
+    if len(args) == 1:
         w.setDevice(args[0])
-    
+
     w.show()
-    
+
     sys.exit(app.exec_())
-    
 
 
 ###############################################################################
-    
+
 if __name__ == "__main__":
-    TaurusDevicePanelMain() 
+    TaurusDevicePanelMain()
diff --git a/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py b/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
index 70275ce..d792b9b 100644
--- a/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
+++ b/lib/taurus/qt/qtgui/panel/taurusfilterpanel.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides widgets that display the database in a tree format"""
+"""This module provides widgets that display the authority in a tree format"""
 
 __docformat__ = 'restructuredtext'
 
@@ -32,25 +32,28 @@ import re
 
 from taurus.external.qt import Qt
 
-import taurus.core
-import taurus.core.util
+from taurus.core.taurusauthority import TaurusAuthority
+from taurus.core.taurusbasetypes import TaurusElementType as ElemType
 import taurus.qt.qtgui.base
-import taurus.qt.qtgui.resource
 
-ElemType = taurus.core.taurusbasetypes.TaurusElementType
-getElementTypeIcon = taurus.qt.qtgui.resource.getElementTypeIcon
-getPixmap = taurus.qt.qtgui.resource.getPixmap
-getThemeIcon = taurus.qt.qtgui.resource.getThemeIcon
-getThemePixmap = taurus.qt.qtgui.resource.getThemePixmap
+from taurus.core.tango.tangodatabase import (TangoAttrInfo, TangoDevInfo,
+                                             TangoServInfo)
+
+from taurus.qt.qtgui.icon import getElementTypeIcon
+
+
+
 
 class BaseFilter(object):
-    
+
     def __init__(self, re_expr):
         if len(re_expr) == 0:
             re_expr = ".*"
         else:
-            if re_expr[0] != "^": re_expr = "^" + re_expr
-            if re_expr[-1] != "$": re_expr += "$"
+            if re_expr[0] != "^":
+                re_expr = "^" + re_expr
+            if re_expr[-1] != "$":
+                re_expr += "$"
         self._re_expr = re.compile(re_expr, re.IGNORECASE)
 
     def __call__(self, obj):
@@ -58,12 +61,12 @@ class BaseFilter(object):
 
 
 class BaseElementFilter(BaseFilter):
-    
+
     def __init__(self, re_expr, func=None):
         super(BaseElementFilter, self).__init__(re_expr)
         self._klass = func.im_class
         self._func = func
-    
+
     def filter(self, obj):
         if not isinstance(obj, self._klass):
             return obj
@@ -73,36 +76,36 @@ class BaseElementFilter(BaseFilter):
 
 
 class DeviceFilter(BaseElementFilter):
-    
-    def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusDevInfo.name):
+
+    def __init__(self, re_expr, func=TangoDevInfo.name):
         super(DeviceFilter, self).__init__(re_expr, func=func)
 
 
 class DeviceClassFilter(BaseElementFilter):
-    
-    def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusDevInfo.name):
+
+    def __init__(self, re_expr, func=TangoDevInfo.name):
         super(DeviceClassFilter, self).__init__(re_expr, func=func)
 
 
 class ServerFilter(BaseElementFilter):
 
-    def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusServInfo.name):
+    def __init__(self, re_expr, func=TangoServInfo.name):
         super(ServerFilter, self).__init__(re_expr, func=func)
 
 
 class AttributeFilter(BaseElementFilter):
-    
-    def __init__(self, re_expr, func=taurus.core.taurusdatabase.TaurusAttrInfo.name):
+
+    def __init__(self, re_expr, func=TangoAttrInfo.name):
         super(AttributeFilter, self).__init__(re_expr, func=func)
 
 
 class KlassFilter(BaseFilter):
-    
+
     def __init__(self, klass):
-        #don't call super on purpose. We don't need/have a regular expression here!
+        # don't call super on purpose. We don't need/have a regular expression here!
         #super(KlassFilter, self).__init__(re_expr)
         self._klass = klass
-        
+
     def filter(self, obj):
         if isinstance(obj, self._klass):
             return obj
@@ -111,61 +114,63 @@ class KlassFilter(BaseFilter):
 def getFilter(type, re_expr=None):
     if re_expr is None:
         if type == ElemType.Device:
-            return KlassFilter(taurus.core.taurusdatabase.TaurusDevInfo)
+            return KlassFilter(TangoDevInfo)
         elif type == ElemType.Server:
-            return KlassFilter(taurus.core.taurusdatabase.TaurusServInfo)
+            return KlassFilter(TangoServInfo)
         elif type == ElemType.DeviceClass:
-            return KlassFilter(taurus.core.taurusdatabase.TaurusDevInfo)
+            return KlassFilter(TangoDevInfo)
         return None
 
     if type == ElemType.Device:
         return DeviceFilter(re_expr)
     elif type == ElemType.Domain:
-        return DeviceFilter(re_expr, taurus.core.taurusdatabase.TaurusDevInfo.domain)
+        return DeviceFilter(re_expr, TangoDevInfo.domain)
     elif type == ElemType.Family:
-        return DeviceFilter(re_expr, taurus.core.taurusdatabase.TaurusDevInfo.family)
+        return DeviceFilter(re_expr, TangoDevInfo.family)
     elif type == ElemType.Member:
-        return DeviceFilter(re_expr, taurus.core.taurusdatabase.TaurusDevInfo.member)
+        return DeviceFilter(re_expr, TangoDevInfo.member)
     elif type == ElemType.Server:
         return ServerFilter(re_expr)
     elif type == ElemType.ServerName:
-        return ServerFilter(re_expr, taurus.core.taurusdatabase.TaurusServInfo.serverName)
+        return ServerFilter(re_expr, TangoServInfo.serverName)
     elif type == ElemType.ServerInstance:
-        return ServerFilter(re_expr, taurus.core.taurusdatabase.TaurusServInfo.serverInstance)
+        return ServerFilter(re_expr, TangoServInfo.serverInstance)
     elif type == ElemType.DeviceClass:
         return DeviceClassFilter(re_expr)
     elif type == ElemType.Attribute:
         return AttributeFilter(re_expr)
 
 
-
-
-
 class TaurusFilterPanelOld1(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
-    
-    def __init__(self, parent = None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QWidget, parent)
-        self.call__init__(taurus.qt.qtgui.base.TaurusBaseWidget, name, designMode=designMode)
+        self.call__init__(taurus.qt.qtgui.base.TaurusBaseWidget,
+                          name, designMode=designMode)
         self.init()
-    
+
     def init(self):
         l = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom)
         self.setLayout(l)
         self.addFilterHeader()
         self.insertFilterItem()
         l.addStretch(1)
-        
+
     def addFilterHeader(self):
         label = Qt.QLabel("Type:")
         comboBox = Qt.QComboBox()
-        comboBox.addItem(getElementTypeIcon(ElemType.Attribute), "Attribute", ElemType.Attribute)
-        comboBox.addItem(getElementTypeIcon(ElemType.Device), "Device", ElemType.Device)
-        comboBox.addItem(getElementTypeIcon(ElemType.DeviceClass), "Device type", ElemType.DeviceClass)
-        comboBox.addItem(getElementTypeIcon(ElemType.Server), "Server", ElemType.Server)
+        comboBox.addItem(getElementTypeIcon(ElemType.Attribute),
+                         "Attribute", ElemType.Attribute)
+        comboBox.addItem(getElementTypeIcon(ElemType.Device),
+                         "Device", ElemType.Device)
+        comboBox.addItem(getElementTypeIcon(ElemType.DeviceClass),
+                         "Device type", ElemType.DeviceClass)
+        comboBox.addItem(getElementTypeIcon(ElemType.Server),
+                         "Server", ElemType.Server)
         comboBox.addItem("Any")
         previewButton = Qt.QPushButton("Preview")
-        Qt.QObject.connect(previewButton, Qt.SIGNAL("clicked()"), self.onPreview)
+        previewButton.clicked.connect(self.onPreview)
         field = Qt.QWidget()
         l = Qt.QHBoxLayout()
         field.setLayout(l)
@@ -174,22 +179,23 @@ class TaurusFilterPanelOld1(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         l.addWidget(previewButton)
         l.addStretch(1)
         self.layout().addWidget(field)
-    
+
     def insertFilterItem(self, row=None):
 
         sl = self.layout()
 
         comboBox = Qt.QComboBox()
         self._fillComboBox(comboBox)
-        Qt.QObject.connect(comboBox, Qt.SIGNAL("currentIndexChanged(int)"), self.onFilterComboBoxItemSelected)
-        
+        comboBox.currentIndexChanged.connect(self.onFilterComboBoxItemSelected)
+
         edit = Qt.QLineEdit()
-        
-        addButton = Qt.QPushButton(Qt.QIcon(":/actions/list-add.svg"),"")
-        Qt.QObject.connect(addButton, Qt.SIGNAL("clicked()"), self.onAddFilterButtonClicked)
-        
-        removeButton = Qt.QPushButton(Qt.QIcon(":/actions/list-remove.svg"),"")
-        Qt.QObject.connect(removeButton, Qt.SIGNAL("clicked()"), self.onRemoveFilterButtonClicked)
+
+        addButton = Qt.QPushButton(Qt.QIcon(":/actions/list-add.svg"), "")
+        addButton.clicked.connect(self.onAddFilterButtonClicked)
+
+        removeButton = Qt.QPushButton(
+            Qt.QIcon(":/actions/list-remove.svg"), "")
+        removeButton.clicked.connect(self.onRemoveFilterButtonClicked)
 
         field = Qt.QWidget()
         l = Qt.QHBoxLayout()
@@ -199,34 +205,43 @@ class TaurusFilterPanelOld1(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         l.addWidget(edit)
         l.addWidget(addButton)
         l.addWidget(removeButton)
-        
+
         if row is None:
             sl.addWidget(field)
         else:
             sl.insertWidget(row, field)
-    
+
     def _fillComboBox(self, comboBox):
-        comboBox.addItem(getElementTypeIcon(ElemType.Attribute), "Attribute", ElemType.Attribute)
-        comboBox.addItem(getElementTypeIcon(ElemType.Device), "Device", ElemType.Device)
-        comboBox.addItem(getElementTypeIcon(ElemType.DeviceClass), "Device type", ElemType.DeviceClass)
-        comboBox.addItem(getElementTypeIcon(ElemType.Domain), "Domain", ElemType.Domain)
-        comboBox.addItem(getElementTypeIcon(ElemType.Family), "Family", ElemType.Family)
-        comboBox.addItem(getElementTypeIcon(ElemType.Member), "Member", ElemType.Member)
-        comboBox.addItem(getElementTypeIcon(ElemType.Server), "Server", ElemType.Server)
-        comboBox.addItem(getElementTypeIcon(ElemType.ServerName), "Server Name", ElemType.ServerName)
-        comboBox.addItem(getElementTypeIcon(ElemType.ServerInstance), "Server Instance", ElemType.ServerInstance)
-    
+        comboBox.addItem(getElementTypeIcon(ElemType.Attribute),
+                         "Attribute", ElemType.Attribute)
+        comboBox.addItem(getElementTypeIcon(ElemType.Device),
+                         "Device", ElemType.Device)
+        comboBox.addItem(getElementTypeIcon(ElemType.DeviceClass),
+                         "Device type", ElemType.DeviceClass)
+        comboBox.addItem(getElementTypeIcon(ElemType.Domain),
+                         "Domain", ElemType.Domain)
+        comboBox.addItem(getElementTypeIcon(ElemType.Family),
+                         "Family", ElemType.Family)
+        comboBox.addItem(getElementTypeIcon(ElemType.Member),
+                         "Member", ElemType.Member)
+        comboBox.addItem(getElementTypeIcon(ElemType.Server),
+                         "Server", ElemType.Server)
+        comboBox.addItem(getElementTypeIcon(ElemType.ServerName),
+                         "Server Name", ElemType.ServerName)
+        comboBox.addItem(getElementTypeIcon(ElemType.ServerInstance),
+                         "Server Instance", ElemType.ServerInstance)
+
     def onFilterComboBoxItemSelected(self, index):
         pass
-    
+
     def onAddFilterButtonClicked(self):
         button = self.sender()
-        if button is None: 
+        if button is None:
             return
         field = button.parent()
         index = self.layout().indexOf(field)
-        self.insertFilterItem(index+1)
-    
+        self.insertFilterItem(index + 1)
+
     def onRemoveFilterButtonClicked(self):
         l = self.layout()
         # there is a header row, at least one filter row and a stretch at the
@@ -235,7 +250,7 @@ class TaurusFilterPanelOld1(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         if l.count() <= 3:
             return
         button = self.sender()
-        if button is None: 
+        if button is None:
             return
         field = button.parent()
         l.removeWidget(field)
@@ -248,7 +263,7 @@ class TaurusFilterPanelOld1(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         dialog.setModal(True)
         w = trees.TaurusTreeWidget(dialog, perspective=self.getHeaderType())
         w.setModel(model)
-        w.setFilters( self.calculate() )
+        w.setFilters(self.calculate())
         dialog.exec_()
 
     def getHeaderType(self):
@@ -261,37 +276,36 @@ class TaurusFilterPanelOld1(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         db = self.getModelObj()
         if db is None:
             return
-        
+
         g_layout = self.layout()
-        
+
         filters = []
-        for i in xrange(1, g_layout.count()-1):
+        for i in xrange(1, g_layout.count() - 1):
             field_layout = g_layout.itemAt(i).widget().layout()
             comboBox = field_layout.itemAt(1).widget()
             edit = field_layout.itemAt(2).widget()
-            
+
             type = Qt.from_qvariant(comboBox.itemData(comboBox.currentIndex()))
             expr = str(edit.text())
             f = getFilter(type, expr)
             filters.append(f)
-        
+
         finalType = self.getHeaderType()
         filters.append(getFilter(finalType))
         return filters
-        
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getModelClass(self):
-        return taurus.core.taurusdatabase.TaurusDatabase
+        return TaurusAuthority
 
-    #: This property holds the unique URI string representing the model name 
-    #: with which this widget will get its data from. The convention used for 
+    #: This property holds the unique URI string representing the model name
+    #: with which this widget will get its data from. The convention used for
     #: the string can be found :ref:`here <model-concept>`.
-    #: 
-    #: In case the property :attr:`useParentModel` is set to True, the model 
+    #:
+    #: In case the property :attr:`useParentModel` is set to True, the model
     #: text must start with a '/' followed by the attribute name.
     #:
     #: **Access functions:**
@@ -307,24 +321,29 @@ class TaurusFilterPanelOld1(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
 
 
 class TaurusFilterPanelOld2(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
-    
-    def __init__(self, parent = None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QWidget, parent)
-        self.call__init__(taurus.qt.qtgui.base.TaurusBaseWidget, name, designMode=designMode)
+        self.call__init__(taurus.qt.qtgui.base.TaurusBaseWidget,
+                          name, designMode=designMode)
         self.init()
-    
+
     def init(self):
         l = Qt.QGridLayout()
-        l.setContentsMargins(0,0,0,0)
+        l.setContentsMargins(0, 0, 0, 0)
         self.setLayout(l)
 
         comboBox = Qt.QComboBox()
-        comboBox.addItem(getElementTypeIcon(ElemType.Attribute), "Attribute", ElemType.Attribute)
-        comboBox.addItem(getElementTypeIcon(ElemType.Device), "Device", ElemType.Device)
-        comboBox.addItem(getElementTypeIcon(ElemType.DeviceClass), "Device type", ElemType.DeviceClass)
-        comboBox.addItem(getElementTypeIcon(ElemType.Server), "Server", ElemType.Server)
-        
+        comboBox.addItem(getElementTypeIcon(ElemType.Attribute),
+                         "Attribute", ElemType.Attribute)
+        comboBox.addItem(getElementTypeIcon(ElemType.Device),
+                         "Device", ElemType.Device)
+        comboBox.addItem(getElementTypeIcon(ElemType.DeviceClass),
+                         "Device type", ElemType.DeviceClass)
+        comboBox.addItem(getElementTypeIcon(ElemType.Server),
+                         "Server", ElemType.Server)
+
         l.addWidget(Qt.QLabel("Filter for:"), 0, 0)
         l.addWidget(comboBox, 0, 1)
 
@@ -341,7 +360,7 @@ class TaurusFilterPanelOld2(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         self._serverNameEdit = Qt.QLineEdit()
         self._serverInstanceEdit = Qt.QLineEdit()
         self._attributeEdit = Qt.QLineEdit()
-        
+
         lbl = Qt.QLabel("Device type:")
         l.addWidget(lbl, 1, 0)
         l.setAlignment(lbl, Qt.Qt.AlignRight)
@@ -362,32 +381,32 @@ class TaurusFilterPanelOld2(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         l.addWidget(self._serverInstanceEdit, 8, 1)
         l.addWidget(Qt.QLabel("Attribute:"), 9, 0)
         l.addWidget(self._attributeEdit, 9, 1)
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getModelClass(self):
-        return taurus.core.taurusdatabase.TaurusDatabase
+        return TaurusAuthority
 
     def setModel(self, m):
         taurus.qt.qtgui.base.TaurusBaseWidget.setModel(self, m)
         db = self.getModelObj()
         #model = self._deviceEdit.model()
-        #if model is None: return
-        #model.setDataSource(db)
+        # if model is None: return
+        # model.setDataSource(db)
         self._deviceEdit.clear()
         if db is not None:
             deviceNames = db.cache().getDeviceNames()
             deviceNames.sort()
             #icon = taurus.core.icons.getElementTypeIcon(ElemType.Device)
             self._deviceEdit.addItems(deviceNames)
-        
-    #: This property holds the unique URI string representing the model name 
-    #: with which this widget will get its data from. The convention used for 
+
+    #: This property holds the unique URI string representing the model name
+    #: with which this widget will get its data from. The convention used for
     #: the string can be found :ref:`here <model-concept>`.
-    #: 
-    #: In case the property :attr:`useParentModel` is set to True, the model 
+    #:
+    #: In case the property :attr:`useParentModel` is set to True, the model
     #: text must start with a '/' followed by the attribute name.
     #:
     #: **Access functions:**
@@ -410,12 +429,12 @@ class _MessageWidget(Qt.QWidget):
         self.setLayout(l)
         self._icon = Qt.QLabel()
         if pixmap is None:
-            pixmap = getThemePixmap("dialog-warning", 16)
+            pixmap = Qt.QIcon.fromTheme("dialog-warning").pixmap(16, 16)
         self._icon.setPixmap(pixmap)
         self._label = Qt.QLabel()
         l.addWidget(self._icon)
         l.addWidget(self._label)
-    
+
     def setText(self, text):
         self._label.setText(text)
 
@@ -424,73 +443,85 @@ from taurus.external.qt.uic import loadUi
 
 
 class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
-    
+
     _Items = "server", "serverName", "serverInstance", \
              "deviceName", "deviceType", "deviceDomain", "deviceFamily", "deviceMember", \
              "attribute"
-             
-    def __init__(self, parent = None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QWidget, parent)
-        self.call__init__(taurus.qt.qtgui.base.TaurusBaseWidget, name, designMode=designMode)
+        self.call__init__(taurus.qt.qtgui.base.TaurusBaseWidget,
+                          name, designMode=designMode)
         self.init()
-    
+
     def init(self):
         l = Qt.QVBoxLayout()
         self.setLayout(l)
-        
+
         panel = self._mainPanel = Qt.QWidget()
         l.addWidget(panel, 1)
         this_dir = os.path.dirname(os.path.abspath(__file__))
         ui_filename = os.path.join(this_dir, 'ui', 'TaurusFilterPanel.ui')
         self.ui = ui = loadUi(ui_filename, baseinstance=panel)
-        
+
         comboBox = ui.filterTypeCombo
-        comboBox.addItem(getElementTypeIcon(ElemType.Attribute), "Attribute", ElemType.Attribute)
-        comboBox.addItem(getElementTypeIcon(ElemType.Device), "Device", ElemType.Device)
-        comboBox.addItem(getElementTypeIcon(ElemType.DeviceClass), "Device type", ElemType.DeviceClass)
-        comboBox.addItem(getElementTypeIcon(ElemType.Server), "Server", ElemType.Server)
+        comboBox.addItem(getElementTypeIcon(ElemType.Attribute),
+                         "Attribute", ElemType.Attribute)
+        comboBox.addItem(getElementTypeIcon(ElemType.Device),
+                         "Device", ElemType.Device)
+        comboBox.addItem(getElementTypeIcon(ElemType.DeviceClass),
+                         "Device type", ElemType.DeviceClass)
+        comboBox.addItem(getElementTypeIcon(ElemType.Server),
+                         "Server", ElemType.Server)
 
         clickedSig = Qt.SIGNAL("clicked()")
         idxChangedSig = Qt.SIGNAL("currentIndexChanged(int)")
-        Qt.QObject.connect(ui.serverNameCombo, idxChangedSig, self._updateServerInstanceCombo)
-        Qt.QObject.connect(ui.deviceDomainCombo, idxChangedSig, self._updateDeviceFamilyCombo)
-        Qt.QObject.connect(ui.deviceFamilyCombo, idxChangedSig, self._updateDeviceMemberCombo)
+        ui.serverNameCombo.currentIndexChanged.connect(
+                           self._updateServerInstanceCombo)
+        ui.deviceDomainCombo.currentIndexChanged.connect(
+                           self._updateDeviceFamilyCombo)
+        ui.deviceFamilyCombo.currentIndexChanged.connect(
+                           self._updateDeviceMemberCombo)
 
         class clearSelection(object):
+
             def __init__(self, cb):
-                self._cb=cb
+                self._cb = cb
+
             def __call__(self):
                 self._cb.setCurrentIndex(-1)
 
-        clear_icon = getThemeIcon("edit-clear")
+        clear_icon = Qt.QIcon.fromTheme("edit-clear")
         for combo, clearButton in zip(self.combos(), self.clearButtons()):
-            Qt.QObject.connect(combo, idxChangedSig, self._updateStatusBar)
-            Qt.QObject.connect(clearButton, clickedSig, clearSelection(combo))
+            combo.currentIndexChanged.connect(self._updateStatusBar)
+            clearButton.clicked.connect(clearSelection(combo))
             clearButton.setIcon(clear_icon)
-        
+
         sb = self._statusbar = Qt.QStatusBar()
         sb.setSizeGripEnabled(False)
         l.addWidget(sb)
         sbWarningMsg = self._sbWarningMsg = _MessageWidget()
         sbWarningMsg.setVisible(False)
         sb.addWidget(sbWarningMsg)
-    
+
     def combos(self):
         if not hasattr(self, "_combos"):
             f = self.ui
-            self._combos = [ getattr(f, name + "Combo") for name in self._Items ]
+            self._combos = [getattr(f, name + "Combo") for name in self._Items]
         return self._combos
 
     def clearButtons(self):
         if not hasattr(self, "_clearButtons"):
             f = self.ui
-            self._clearButtons = [ getattr(f, name + "ClearButton") for name in self._Items ]
+            self._clearButtons = [getattr(f, name + "ClearButton")
+                                  for name in self._Items]
         return self._clearButtons
-    
+
     def _db_cache(self):
         db = self.getModelObj()
-        if db is None: return
+        if db is None:
+            return
         return db.cache()
 
     def _updateStatusBar(self, index=None):
@@ -498,7 +529,7 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         server = str(form.serverCombo.currentText())
         serverName = str(form.serverNameCombo.currentText())
         serverInstance = str(form.serverInstanceCombo.currentText())
-        
+
         msg = self._sbWarningMsg
         msg.setVisible(False)
 
@@ -508,25 +539,25 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
                 "time may result in an empty filter"
             msg.setVisible(True)
             msg.setText(s)
-        
+
         deviceName = str(form.deviceNameCombo.currentText())
         deviceDomain = str(form.deviceDomainCombo.currentText())
         deviceFamily = str(form.deviceFamilyCombo.currentText())
         deviceMember = str(form.deviceMemberCombo.currentText())
-        
+
         if deviceName and (deviceDomain or deviceFamily or deviceMember):
             sb = self._statusbar
             s = "Specifying name filter and domain/family/member filters at the same " \
                 "time may result in an empty filter"
             msg.setVisible(True)
             msg.setText(s)
-        
-        
+
     def _updateServerCombo(self, index=None):
         combo = self.ui.serverCombo
         combo.clear()
         db_cache = self._db_cache()
-        if db_cache is None: return
+        if db_cache is None:
+            return
         servers = db_cache.servers()
         icon = getElementTypeIcon(ElemType.Server)
         for serverName in sorted(servers):
@@ -538,7 +569,8 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         combo = self.ui.serverNameCombo
         combo.clear()
         db_cache = self._db_cache()
-        if db_cache is None: return
+        if db_cache is None:
+            return
         servers = db_cache.servers()
         serverNames = []
         for server in servers.values():
@@ -555,8 +587,10 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         combo = self.ui.serverInstanceCombo
         combo.clear()
         db_cache = self._db_cache()
-        if db_cache is None: return
-        if index is None or index == -1: return
+        if db_cache is None:
+            return
+        if index is None or index == -1:
+            return
         serverName = str(self.sender().currentText())
         servers = db_cache.servers()
         serverInstances = []
@@ -568,12 +602,13 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         for serverInstance in serverInstances:
             combo.addItem(icon, serverInstance)
         combo.setCurrentIndex(-1)
-        
+
     def _updateDeviceTypeCombo(self, index=None):
         combo = self.ui.deviceTypeCombo
         combo.clear()
         db_cache = self._db_cache()
-        if db_cache is None: return
+        if db_cache is None:
+            return
         deviceKlasses = db_cache.klasses()
         icon = getElementTypeIcon(ElemType.DeviceClass)
         for klassName in sorted(deviceKlasses):
@@ -585,7 +620,8 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         combo = self.ui.deviceNameCombo
         combo.clear()
         db_cache = self._db_cache()
-        if db_cache is None: return
+        if db_cache is None:
+            return
         devices = db_cache.devices()
         icon = getElementTypeIcon(ElemType.Device)
         for deviceName in sorted(devices):
@@ -597,7 +633,8 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         combo = self.ui.deviceDomainCombo
         combo.clear()
         db_cache = self._db_cache()
-        if db_cache is None: return
+        if db_cache is None:
+            return
         domains = db_cache.getDeviceDomainNames()
         domains.sort()
         icon = getElementTypeIcon(ElemType.Domain)
@@ -609,10 +646,12 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         combo = self.ui.deviceFamilyCombo
         combo.clear()
         db_cache = self._db_cache()
-        if db_cache is None: return
-        
+        if db_cache is None:
+            return
+
         deviceDomain = str(self.ui.deviceDomainCombo.currentText())
-        if deviceDomain == "": return
+        if deviceDomain == "":
+            return
         families = db_cache.getDeviceFamilyNames(deviceDomain)
         families.sort()
         icon = getElementTypeIcon(ElemType.Family)
@@ -624,24 +663,28 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         combo = self.ui.deviceMemberCombo
         combo.clear()
         db_cache = self._db_cache()
-        if db_cache is None: return
+        if db_cache is None:
+            return
 
         deviceDomain = str(self.ui.deviceDomainCombo.currentText())
-        if deviceDomain == "": return
+        if deviceDomain == "":
+            return
         deviceFamily = str(self.ui.deviceFamilyCombo.currentText())
-        if deviceFamily == "": return
+        if deviceFamily == "":
+            return
         members = db_cache.getDeviceMemberNames(deviceDomain, deviceFamily)
         members.sort()
         icon = getElementTypeIcon(ElemType.Member)
         for member in members:
             combo.addItem(icon, member)
         combo.setCurrentIndex(-1)
-        
+
     def _updateAttributeCombo(self, index=None):
         combo = self.ui.attributeCombo
         combo.clear()
         db_cache = self._db_cache()
-        if db_cache is None: return
+        if db_cache is None:
+            return
 
     def _fillItems(self):
         self._updateServerCombo()
@@ -653,28 +696,28 @@ class TaurusFilterPanel(Qt.QWidget, taurus.qt.qtgui.base.TaurusBaseWidget):
         self._updateDeviceFamilyCombo()
         self._updateDeviceMemberCombo()
         self._updateAttributeCombo()
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getModelClass(self):
-        return taurus.core.taurusdatabase.TaurusDatabase
+        return TaurusAuthority
 
     def setModel(self, m):
         taurus.qt.qtgui.base.TaurusBaseWidget.setModel(self, m)
         db = self.getModelObj()
         #model = self._deviceEdit.model()
-        #if model is None: return
-        #model.setDataSource(db)
+        # if model is None: return
+        # model.setDataSource(db)
         self.ui.deviceNameCombo.clear()
         self._fillItems()
-        
-    #: This property holds the unique URI string representing the model name 
-    #: with which this widget will get its data from. The convention used for 
+
+    #: This property holds the unique URI string representing the model name
+    #: with which this widget will get its data from. The convention used for
     #: the string can be found :ref:`here <model-concept>`.
-    #: 
-    #: In case the property :attr:`useParentModel` is set to True, the model 
+    #:
+    #: In case the property :attr:`useParentModel` is set to True, the model
     #: text must start with a '/' followed by the attribute name.
     #:
     #: **Access functions:**
@@ -693,18 +736,18 @@ def main():
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.core.util import argparse
     import sys
-    
+
     parser = argparse.get_taurus_parser()
     parser.usage = "%prog [options] [hostname]"
-    
+
     app = TaurusApplication(cmd_line_parser=parser)
     args = app.get_command_line_args()
-    
-    if len(args)>0: 
-        host=args[0]
-    else: 
-        host = taurus.Database().getNormalName()
-    
+
+    if len(args) > 0:
+        host = args[0]
+    else:
+        host = taurus.Authority().getNormalName()
+
     w = TaurusFilterPanel()
     w.setWindowIcon(Qt.QIcon(":/actions/system-shutdown.svg"))
     w.setWindowTitle("A Taurus Filter Example")
@@ -712,6 +755,6 @@ def main():
     w.show()
 
     sys.exit(app.exec_())
-    
+
 if __name__ == "__main__":
     main()
diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py
index 4b38c58..657c005 100644
--- a/lib/taurus/qt/qtgui/panel/taurusform.py
+++ b/lib/taurus/qt/qtgui/panel/taurusform.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -35,9 +35,10 @@ from taurus.external.qt import Qt
 import PyTango
 
 import taurus.core
+from taurus.core import TaurusDevState
 
-from taurus.qt.qtcore.mimetypes import (TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, 
-                                       TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_MODEL_MIME_TYPE)
+from taurus.qt.qtcore.mimetypes import (TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE,
+                                        TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_MODEL_MIME_TYPE)
 from taurus.qt.qtgui.container import TaurusWidget, TaurusScrollArea
 from taurus.qt.qtgui.button import QButtonBox, TaurusCommandButton
 from taurusmodelchooser import TaurusModelChooser
@@ -45,10 +46,11 @@ from taurusmodelchooser import TaurusModelChooser
 
 class ParameterCB(Qt.QComboBox):
     '''A custom combobox'''
+
     def __init__(self, parent=None):
         Qt.QComboBox.__init__(self, parent)
         self.setEditable(True)
-        
+
     def rememberCurrentText(self):
         '''Adds the current text to the combobox items list (unless it is already there)'''
         text = self.currentText()
@@ -59,205 +61,214 @@ class ParameterCB(Qt.QComboBox):
 class TaurusForm(TaurusWidget):
     '''A form containing specific widgets for interacting with
     a given list of taurus attributes and/or devices.
-    
+
     Its model is a list of attribute and/or device names to be shown. Each item
     is represented in a row consisting of a label, a read widget, a write
     widget, a units widget and an "extra" widget (some of them may not be shown)
     which are vertically aligned with their counterparts from other items.
-    
+
     By default a :class:`TaurusValue` object is used for each item, but this
     can be changed and specific mappings can be defined using the
     :meth:`setCustomWidgetMap` method.
-    
+
     Item objects can be accessed by index using a list-like notation::
-    
+
       form = TaurusForm()
-      form.model = ['sys/tg_test/1'+a for a in ('short_image','/float_scalar','/double_scalar')] 
+      form.model = ['sys/tg_test/1'+a for a in ('short_image','/float_scalar','/double_scalar')]
       form[0].labelConfig = 'dev_alias'
       form[-1].writeWidgetClass = 'TaurusWheelEdit'
       print(len(form))  # --> outputs '3' (the length of the form is the number of items)
-    
+
     By default, the form provides global Apply and Cancel buttons.
-    
+
     You can also see some code that exemplifies the use of TaurusForm in :ref:`Taurus
     coding examples <examples>` '''
-    
-    def __init__(self, parent = None,
-                 formWidget = None,
-                 buttons = None,
-                 withButtons = True, 
-                 designMode = False):
+
+    def __init__(self, parent=None,
+                 formWidget=None,
+                 buttons=None,
+                 withButtons=True,
+                 designMode=False):
         TaurusWidget.__init__(self, parent, designMode)
-        
-        if buttons == None: buttons = Qt.QDialogButtonBox.Apply| \
-                                        Qt.QDialogButtonBox.Reset
+
+        if buttons is None:
+            buttons = Qt.QDialogButtonBox.Apply | \
+                Qt.QDialogButtonBox.Reset
         self._customWidgetMap = {}
         self._model = []
         self._children = []
         self.setFormWidget(formWidget)
-        
+
         self.setLayout(Qt.QVBoxLayout())
-        
+
         frame = TaurusWidget()
         frame.setLayout(Qt.QGridLayout())
-        
+
         self.scrollArea = TaurusScrollArea(self)
         self.scrollArea.setWidget(frame)
         self.scrollArea.setWidgetResizable(True)
         self.layout().addWidget(self.scrollArea)
         self.__modelChooserDlg = None
-        
-        self.buttonBox = QButtonBox(buttons = buttons, parent = self)
+
+        self.buttonBox = QButtonBox(buttons=buttons, parent=self)
         self.layout().addWidget(self.buttonBox)
-        
+
         self._connectButtons()
-        
-        #Actions (they automatically populate the context menu)
+
+        # Actions (they automatically populate the context menu)
         self.setContextMenuPolicy(Qt.Qt.ActionsContextMenu)
-        
+
         self.chooseModelsAction = Qt.QAction('Modify Contents', self)
         self.addAction(self.chooseModelsAction)
-        self.connect(self.chooseModelsAction, Qt.SIGNAL("triggered()"), self.chooseModels)
-        
+        self.chooseModelsAction.triggered[()].connect(self.chooseModels)
+
         self.showButtonsAction = Qt.QAction('Show Buttons', self)
         self.showButtonsAction.setCheckable(True)
         self.addAction(self.showButtonsAction)
-        self.connect(self.showButtonsAction, Qt.SIGNAL("triggered(bool)"), self.setWithButtons)
+        self.showButtonsAction.triggered[bool].connect(self.setWithButtons)
         self.setWithButtons(withButtons)
-        
+
         self.changeLabelsAction = Qt.QAction('Change labels (all items)', self)
         self.addAction(self.changeLabelsAction)
-        self.connect(self.changeLabelsAction, Qt.SIGNAL("triggered()"), self.onChangeLabelsAction)
-        
+        self.changeLabelsAction.triggered[()].connect(self.onChangeLabelsAction)
+
         self.compactModeAction = Qt.QAction('Compact mode (all items)', self)
         self.compactModeAction.setCheckable(True)
         self.addAction(self.compactModeAction)
-        self.connect(self.compactModeAction, Qt.SIGNAL("triggered(bool)"), self.setCompact)
-        
+        self.compactModeAction.triggered[bool].connect(self.setCompact)
+
         self.resetModifiableByUser()
-        self.setSupportedMimeTypes([TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE, 'text/plain'])
+        self.setSupportedMimeTypes([TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_DEV_MIME_TYPE,
+                                    TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE, 'text/plain'])
 
-        
         self.resetCompact()
-        
-        #properties
-        self.registerConfigProperty(self.isWithButtons, self.setWithButtons, 'withButtons')
+
+        # properties
+        self.registerConfigProperty(
+            self.isWithButtons, self.setWithButtons, 'withButtons')
         self.registerConfigProperty(self.isCompact, self.setCompact, 'compact')
 
     def __getitem__(self, key):
         '''provides a list-like interface: items of the form can be accessed using slice notation'''
         return self.getItemByIndex(key)
-    
+
     def __len__(self):
         '''returns the number of items contained by the form'''
         return len(self.getItems())
-    
+
     def _splitModel(self, modelNames):
         '''convert str to list if needed (commas and whitespace are considered as separators)'''
-        if isinstance(modelNames,(basestring,Qt.QString)): 
-            modelNames = str(modelNames).replace(',',' ')
+        if isinstance(modelNames, (basestring, Qt.QString)):
+            modelNames = str(modelNames).replace(',', ' ')
             modelNames = modelNames.split()
-        return modelNames 
-    
+        return modelNames
+
     def setCustomWidgetMap(self, cwmap):
         '''Sets a map map for custom widgets.
-        
+
         :param cwmap: (dict<str,tuple>) a dictionary whose keys are device
                       type strings (i.e. see :class:`PyTango.DeviceInfo`) and
                       whose values are tuples of classname,args,kwargs
         '''
         self._customWidgetMap = cwmap
-        
+
     def getCustomWidgetMap(self):
         '''Returns the map used to create custom widgets.
-        
+
         :return: (dict<str,tuple>) a dictionary whose keys are device
                  type strings (i.e. see :class:`PyTango.DeviceInfo`) and whose
                  values are tuples of classname,args,kwargs
         '''
         return self._customWidgetMap
-      
-    @Qt.pyqtSignature("modelChanged(const QString &)")
+
+    @Qt.pyqtSlot('QString', name='modelChanged')
     def parentModelChanged(self, parentmodel_name):
         self.info("Parent model changed to '%s'" % parentmodel_name)
         parentmodel_name = str(parentmodel_name)
         if self.getUseParentModel():
-            #reset the model of childs
-            for obj,model in zip(self.getItems(), self.getModel()):
-                obj.setModel('%s/%s'%(parentmodel_name, str(model)))
+            # reset the model of childs
+            for obj, model in zip(self.getItems(), self.getModel()):
+                obj.setModel('%s/%s' % (parentmodel_name, str(model)))
         else:
-            self.debug("received event from parent although not using parent model")
-    
+            self.debug(
+                "received event from parent although not using parent model")
+
     def chooseModels(self):
         '''launches a model chooser dialog to modify the contents of the form'''
-        if self.__modelChooserDlg is None: 
+        if self.__modelChooserDlg is None:
             self.__modelChooserDlg = Qt.QDialog(self)
-            self.__modelChooserDlg.setWindowTitle("%s - Model Chooser"%unicode(self.windowTitle()))
+            self.__modelChooserDlg.setWindowTitle(
+                "%s - Model Chooser" % unicode(self.windowTitle()))
             self.__modelChooserDlg.modelChooser = TaurusModelChooser()
             layout = Qt.QVBoxLayout()
             layout.addWidget(self.__modelChooserDlg.modelChooser)
             self.__modelChooserDlg.setLayout(layout)
-            self.connect(self.__modelChooserDlg.modelChooser, Qt.SIGNAL("updateModels"), self.setModel)
-            
+            self.__modelChooserDlg.modelChooser.updateModels.connect(self.setModel)
+
         models_and_labels = []
         models = [m.lower() for m in self.getModel()]
         indexdict = {}
         for m in models:
-            indexdict[m]=indexdict.get(m,-1)+1
-            item = self.getItemByModel(m,indexdict[m])
+            indexdict[m] = indexdict.get(m, -1) + 1
+            item = self.getItemByModel(m, indexdict[m])
             if item is None:
                 label = None
             else:
-                try: 
-                    label = str(item.labelWidget().text()) #this assumes that the readwidget is a QLabel subclass (or something that has text())
+                try:
+                    # this assumes that the readwidget is a QLabel subclass (or
+                    # something that has text())
+                    label = str(item.labelWidget().text())
                 except:
                     label = None
-            models_and_labels.append((m,label))
-            
+            models_and_labels.append((m, label))
+
         self.__modelChooserDlg.modelChooser.setListedModels(models_and_labels)
         self.__modelChooserDlg.show()
         self.__modelChooserDlg.raise_()
-        
+
     def chooseAttrs(self):
-        self.info('TaurusForm.chooseAttrs() ahs been deprecated. Use TaurusForm.chooseModels() instead')
+        self.info(
+            'TaurusForm.chooseAttrs() ahs been deprecated. Use TaurusForm.chooseModels() instead')
         self.chooseModels()
-        
+
     def sizeHint(self):
         return Qt.QWidget.sizeHint(self)
-        
+
     def _connectButtons(self):
-        Qt.QObject.connect(self.buttonBox, Qt.SIGNAL("applyClicked()"), self.apply)
-        Qt.QObject.connect(self.buttonBox, Qt.SIGNAL("resetClicked()"), self.reset)
-        
+        self.buttonBox.applyClicked.connect(self.apply)
+        self.buttonBox.resetClicked.connect(self.reset)
+
     def getModel(self):
         return self._model
-    
-    @Qt.pyqtSignature("addModels(QStringList)")
+
+    @Qt.pyqtSlot('QStringList')
     def addModels(self, modelNames):
         '''Adds models to the existing ones:
-        
+
         :param modelNames:  (sequence<str>) the names of the models to be added
-        
+
         .. seealso:: :meth:`removeModels`
         '''
         modelNames = self._splitModel(modelNames)
-        self.setModel(self.getModel()+modelNames)
-    
-    @Qt.pyqtSignature("removeModels(QStringList)")
+        self.setModel(self.getModel() + modelNames)
+
+    @Qt.pyqtSlot('QStringList')
     def removeModels(self, modelNames):
         '''Removes models from those already in the form.
-        
+
         :param modelNames:  (sequence<str>) the names of the models to be removed
-        
+
         .. seealso:: :meth:`addModels`
         '''
         modelNames = self._splitModel(modelNames)
         currentModels = self.getModel()
         for name in modelNames:
-            try: currentModels.remove(name)
-            except: self.warning("'%s' not in model list"%name)
+            try:
+                currentModels.remove(name)
+            except:
+                self.warning("'%s' not in model list" % name)
         self.setModel(currentModels)
-    
+
     def setModelCheck(self, model, check=True):
         if model is None:
             model = []
@@ -265,64 +276,68 @@ class TaurusForm(TaurusWidget):
         self.destroyChildren()
         self._model = model
         self.fillWithChildren()
-        #update the modelchooser list
+        # update the modelchooser list
         if self.__modelChooserDlg is not None:
             self.__modelChooserDlg.modelChooser.setListedModels(self._model)
-                
+
     def resetModel(self):
         self.destroyChildren()
         self._model = []
-        
+
     def getFormWidget(self, model=None):
         '''Returns a tuple that can be used for creating a widget for a given model.
-        
+
         :param model: (str) a taurus model name for which the new item of the
                       form will be created
-        
+
         :return: (tuple<type,list,dict>) a tuple containing a class, a list of
                  args and a dict of keyword args. The args and the keyword args
                  can be passed to the class constructor
         '''
         if model is None:
-            return self._defaultFormWidget,(),{}
-        #If a model is given, check if is in the custom widget map
-        try: 
-            obj=taurus.Attribute(model) #if it is not an attribute, it will get an exception here
-            return self._defaultFormWidget,(),{}
+            return self._defaultFormWidget, (), {}
+        # If a model is given, check if is in the custom widget map
+        try:
+            # if it is not an attribute, it will get an exception here
+            obj = taurus.Attribute(model)
+            return self._defaultFormWidget, (), {}
         except:
             try:
-                obj=taurus.Device(model)
+                obj = taurus.Device(model)
             except:
-                self.warning('Cannot handle model "%s". Using default widget.'%(model))
-                return self._defaultFormWidget,(),{}
+                self.warning(
+                    'Cannot handle model "%s". Using default widget.' % (model))
+                return self._defaultFormWidget, (), {}
             try:
-                key = obj.getHWObj().info().dev_class
+                key = obj.getDeviceProxy().info().dev_class  # TODO: Tango-centric
             except:
-                return self._defaultFormWidget,(),{}
+                return self._defaultFormWidget, (), {}
             #value = self._formWidgetsMap.get(key, self._defaultFormWidget)
             cwmap = self.getCustomWidgetMap()
             value = cwmap.get(key, self._defaultFormWidget)
-            if isinstance(value, type): #for backwards compatibility
+            if isinstance(value, type):  # for backwards compatibility
                 if issubclass(value, self._defaultFormWidget):
-                    return value,(),{}
+                    return value, (), {}
                 else:
-                    return self._defaultFormWidget,(), {'customWidgetMap':{key:value}}
-            #we expect a tuple of str,list,dict --> (classname_including_full_module, args, kwargs)
-            name,args,kwargs = value
-            pkgname,klassname = name.rsplit('.',1)
+                    return self._defaultFormWidget, (), {'customWidgetMap': {key: value}}
+            # we expect a tuple of str,list,dict -->
+            # (classname_including_full_module, args, kwargs)
+            name, args, kwargs = value
+            pkgname, klassname = name.rsplit('.', 1)
             try:
                 pkg = __import__(pkgname, fromlist=[klassname])
-                klass = getattr(pkg,klassname)
+                klass = getattr(pkg, klassname)
             except:
-                self.warning('Cannot import "%s". Using default widget for "%s".'%(name, model))
-                return self._defaultFormWidget,(),{}
+                self.warning(
+                    'Cannot import "%s". Using default widget for "%s".' % (name, model))
+                return self._defaultFormWidget, (), {}
             if not issubclass(klass, self._defaultFormWidget):
-                cwmap = kwargs.get('customWidgetMap',{})
-                cwmap.update({key:klass})
+                cwmap = kwargs.get('customWidgetMap', {})
+                cwmap.update({key: klass})
                 kwargs['customWidgetMap'] = cwmap
                 klass = self._defaultFormWidget
-            return klass,args,kwargs    
-                
+            return klass, args, kwargs
+
     def setFormWidget(self, formWidget):
         if formWidget is None:
             from taurus.qt.qtgui.panel import TaurusValue
@@ -330,22 +345,23 @@ class TaurusForm(TaurusWidget):
         elif issubclass(formWidget, Qt.QWidget):
             self._defaultFormWidget = formWidget
         else:
-            raise TypeError('formWidget must be one of None, QWidget. %s passed'%repr(type(formWidget)))
-        
+            raise TypeError(
+                'formWidget must be one of None, QWidget. %s passed' % repr(type(formWidget)))
+
     def resetFormWidget(self):
         self.setFormWidget(self, None)
-        
+
     def isWithButtons(self):
         return self._withButtons
-    
+
     def setWithButtons(self, trueFalse):
         self._withButtons = trueFalse
         self.buttonBox.setVisible(self._withButtons)
         self.showButtonsAction.setChecked(self._withButtons)
-        
+
     def resetWithButtons(self):
         self.setWithButtons(True)
-        
+
     def setCompact(self, compact):
         self._compact = compact
         for item in self.getItems():
@@ -354,27 +370,27 @@ class TaurusForm(TaurusWidget):
 
     def isCompact(self):
         return self._compact
-    
+
     def resetCompact(self):
         from taurus import tauruscustomsettings
-        self.setCompact(getattr(tauruscustomsettings,'T_FORM_COMPACT',{}))
-    
+        self.setCompact(getattr(tauruscustomsettings, 'T_FORM_COMPACT', {}))
+
     def dropEvent(self, event):
         '''reimplemented to support dropping of modelnames in forms'''
-        mtype = self.handleMimeData(event.mimeData(),self.addModels)
+        mtype = self.handleMimeData(event.mimeData(), self.addModels)
         if mtype is None:
             self.info('Invalid model in dropped data')
         else:
-            event.acceptProposedAction() 
-      
+            event.acceptProposedAction()
+
     def setModifiableByUser(self, modifiable):
         '''
         sets whether the user can change the contents of the form
         (e.g., via Modify Contents in the context menu)
         Reimplemented from :meth:`TaurusWidget.setModifiableByUser`
-        
+
         :param modifiable: (bool)
-        
+
         .. seealso:: :meth:`TaurusWidget.setModifiableByUser`
         '''
         TaurusWidget.setModifiableByUser(self, modifiable)
@@ -383,62 +399,70 @@ class TaurusForm(TaurusWidget):
         self.changeLabelsAction.setEnabled(modifiable)
         self.compactModeAction.setEnabled(modifiable)
         for item in self.getItems():
-            try: 
+            try:
                 item.setModifiableByUser(modifiable)
             except:
                 pass
-        
+
     def setRegExp(self, regExp):
         pass
-    
+
     def getRegExp(self):
         pass
-    
+
     def destroyChildren(self):
         for child in self._children:
             self.unregisterConfigurableItem(child)
-            #child.destroy()
+            # child.destroy()
             child.setModel(None)
             child.deleteLater()
         self._children = []
-                
+
     def fillWithChildren(self):
         frame = TaurusWidget()
         frame.setLayout(Qt.QGridLayout())
-        frame.layout().addItem(Qt.QSpacerItem(0,0,Qt.QSizePolicy.Minimum,Qt.QSizePolicy.MinimumExpanding))
-        
+        frame.layout().addItem(Qt.QSpacerItem(
+            0, 0, Qt.QSizePolicy.Minimum, Qt.QSizePolicy.MinimumExpanding))
+
         parent_name = None
         if self.getUseParentModel():
             parent_model = self.getParentModelObj()
             if parent_model:
                 parent_name = parent_model.getFullName()
-        
-        for i,model in enumerate(self.getModel()):
+
+        for i, model in enumerate(self.getModel()):
             if not model:
                 continue
-            if parent_name: model = "%s/%s" % (parent_name, model) #@todo: Change this (it assumes tango model naming!)
+            if parent_name:
+                # @todo: Change this (it assumes tango model naming!)
+                model = "%s/%s" % (parent_name, model)
             klass, args, kwargs = self.getFormWidget(model=model)
-            widget = klass(frame,*args,**kwargs)
-            widget.setMinimumHeight(20)  #@todo UGLY... See if this can be done in other ways... (this causes trouble with widget that need more vertical space , like PoolMotorTV)
+            widget = klass(frame, *args, **kwargs)
+            # @todo UGLY... See if this can be done in other ways... (this causes trouble with widget that need more vertical space , like PoolMotorTV)
+            widget.setMinimumHeight(20)
 
             try:
                 widget.setCompact(self.isCompact())
                 widget.setModel(model)
                 widget.setParent(frame)
-            except: 
-                #raise
-                self.warning('an error occurred while adding the child "%s". Skipping'%model)
+            except:
+                # raise
+                self.warning(
+                    'an error occurred while adding the child "%s". Skipping' % model)
                 self.traceback(level=taurus.Debug)
-            try: widget.setModifiableByUser(self.isModifiableByUser())
-            except: pass
-            widget.setObjectName("__item%i"%i)
+            try:
+                widget.setModifiableByUser(self.isModifiableByUser())
+            except:
+                pass
+            widget.setObjectName("__item%i" % i)
             self.registerConfigDelegate(widget)
             self._children.append(widget)
-       
-        frame.layout().addItem(Qt.QSpacerItem(0,0,Qt.QSizePolicy.Minimum,Qt.QSizePolicy.MinimumExpanding))
+
+        frame.layout().addItem(Qt.QSpacerItem(
+            0, 0, Qt.QSizePolicy.Minimum, Qt.QSizePolicy.MinimumExpanding))
         self.scrollArea.setWidget(frame)
 #        self.scrollArea.setWidgetResizable(True)
-        self.scrollArea.setMinimumWidth(frame.layout().sizeHint().width()+20)
+        self.scrollArea.setMinimumWidth(frame.layout().sizeHint().width() + 20)
 
     def getItemByModel(self, model, index=0):
         '''returns the child item with given model. If there is more than one item
@@ -450,15 +474,15 @@ class TaurusForm(TaurusWidget):
                     return child
                 else:
                     index -= 1
-    
+
     def getItemByIndex(self, index):
         '''returns the child item with at the given index position. '''
         return self.getItems()[index]
-    
+
     def getItems(self):
         '''returns a list of the objects that have been created as childs of the form'''
         return self._children
-    
+
 #    def _manageButtonBox(self):
 #        if self.isWithButtons():
 #            self.buttonBox.setVisible(True)
@@ -467,22 +491,24 @@ class TaurusForm(TaurusWidget):
 
     def onChangeLabelsAction(self):
         '''changes the labelConfig of all its items'''
-        keys = ['label', 'attr_name', 'attr_fullname', 'dev_alias', 'dev_name', 'dev_fullname']
-            
-        msg = 'Choose new source for the label. \n'+\
-              'You can also write a more complex text\n'+\
-              'using any of the proposed sources as a\n'+\
-              'placeholder by enclosing it in "< >" brackets'
-        labelConfig, ok = Qt.QInputDialog.getItem(self, 'Change Label', msg, keys, 0, True)
+        keys = ['{attr.label}', '{attr.name}', '{attr.fullname}', '{dev.name}',
+                '{dev.fullname}']
+
+        msg = 'Choose the label format. \n' + \
+              'You may use Python format() syntax. The TaurusDevice object\n' + \
+              'can be referenced as "dev" and the TaurusAttribute object\n' + \
+              'as "attr"'
+        labelConfig, ok = Qt.QInputDialog.getItem(self, 'Change Label', msg,
+                                                  keys, 0, True)
         if ok:
             for item in self.getItems():
-                item.labelConfig=str(labelConfig)
+                item.labelConfig = (str(labelConfig))
 
-    @Qt.pyqtSignature("apply()")        
+    @Qt.pyqtSlot()
     def apply(self):
         self.safeApplyOperations()
-                
-    @Qt.pyqtSignature("reset()")
+
+    @Qt.pyqtSlot()
     def reset(self):
         self.resetPendingOperations()
 
@@ -492,98 +518,100 @@ class TaurusForm(TaurusWidget):
         ret['module'] = 'taurus.qt.qtgui.panel'
         ret['container'] = False
         return ret
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
-    model = Qt.pyqtProperty("QStringList", getModel, 
-                                                TaurusWidget.setModel, 
-                                                resetModel)
-
-    useParentModel = Qt.pyqtProperty("bool", 
-                                         TaurusWidget.getUseParentModel, 
-                                         TaurusWidget.setUseParentModel,
-                                         TaurusWidget.resetUseParentModel)
-    
-    withButtons = Qt.pyqtProperty("bool", isWithButtons, 
-                                                setWithButtons,
-                                                resetWithButtons)
-    
-    modifiableByUser = Qt.pyqtProperty("bool", TaurusWidget.isModifiableByUser, 
-                                               setModifiableByUser,
-                                               TaurusWidget.resetModifiableByUser)
-    
+
+    model = Qt.pyqtProperty("QStringList", getModel,
+                            TaurusWidget.setModel,
+                            resetModel)
+
+    useParentModel = Qt.pyqtProperty("bool",
+                                     TaurusWidget.getUseParentModel,
+                                     TaurusWidget.setUseParentModel,
+                                     TaurusWidget.resetUseParentModel)
+
+    withButtons = Qt.pyqtProperty("bool", isWithButtons,
+                                  setWithButtons,
+                                  resetWithButtons)
+
+    modifiableByUser = Qt.pyqtProperty("bool", TaurusWidget.isModifiableByUser,
+                                       setModifiableByUser,
+                                       TaurusWidget.resetModifiableByUser)
+
     compact = Qt.pyqtProperty("bool", isCompact, setCompact, resetCompact)
-      
-    
+
 
 class TaurusCommandsForm(TaurusWidget):
     '''A form that shows commands available for a Device Server'''
-    def __init__(self, parent = None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         TaurusWidget.__init__(self, parent, designMode)
-        
+
         self.setLayout(Qt.QVBoxLayout())
-                
+
         self._splitter = Qt.QSplitter()
         self._splitter.setOrientation(Qt.Qt.Vertical)
         self.layout().addWidget(self._splitter)
-        
+
         self._frame = TaurusWidget(self)
         self._frame.setLayout(Qt.QGridLayout())
-        
+
         self._scrollArea = TaurusScrollArea(self)
         self._scrollArea.setWidget(self._frame)
         self._scrollArea.setWidgetResizable(True)
         self._splitter.addWidget(self._scrollArea)
-        
+
         self._outputTE = Qt.QTextEdit()
         self._outputTE.setReadOnly(True)
         self._splitter.addWidget(self._outputTE)
         #self._splitter.moveSplitter(self._splitter.getRange(0)[-1], 0)
-        
+
         self._cmdWidgets = []
         self._paramWidgets = []
         self._viewFilters = []
         self._defaultParameters = []
-        self._sortKey = lambda x:x.cmd_name
-        
+        self._sortKey = lambda x: x.cmd_name
+
         self._operatorViewFilter = lambda x: x.disp_level == PyTango.DispLevel.OPERATOR
-        
-        #self.setLayout(Qt.QGridLayout())
-        self.connect(self, Qt.SIGNAL('modelChanged(const QString &)'),self._updateCommandWidgets )
-        
+
+        # self.setLayout(Qt.QGridLayout())
+        self.modelChanged.connect(self._updateCommandWidgets)
+
     def createConfig(self, allowUnpickable=False):
         '''
-        extending  :meth:`TaurusBaseWidget.createConfig`                
-        :param alllowUnpickable:  (bool) 
-        
+        extending  :meth:`TaurusBaseWidget.createConfig`
+        :param alllowUnpickable:  (bool)
+
         :return: (dict<str,object>) configurations (which can be loaded with :meth:`applyConfig`).
-        
-        .. seealso: :meth:`TaurusBaseWidget.createConfig`, :meth:`applyConfig` 
+
+        .. seealso: :meth:`TaurusBaseWidget.createConfig`, :meth:`applyConfig`
         '''
-        #get the basic config
-        configdict = TaurusWidget.createConfig(self, allowUnpickable=allowUnpickable)
-        #store the splitter config
-        configdict['splitter/state'] = self._splitter.saveState().data()        
+        # get the basic config
+        configdict = TaurusWidget.createConfig(
+            self, allowUnpickable=allowUnpickable)
+        # store the splitter config
+        configdict['splitter/state'] = self._splitter.saveState().data()
         return configdict
-    
+
     def applyConfig(self, configdict, **kwargs):
         """extending :meth:`TaurusBaseWidget.applyConfig` to restore the splitter config
-     
+
         :param configdict: (dict)
-        
+
         .. seealso:: :meth:`TaurusBaseWidget.applyConfig`, :meth:`createConfig`
         """
-        #first do the basic stuff...
+        # first do the basic stuff...
         TaurusWidget.applyConfig(self, configdict, **kwargs)
-        #restore the splitter config
-        self._splitter.restoreState(Qt.QByteArray(configdict['splitter/state']))
-        
+        # restore the splitter config
+        self._splitter.restoreState(
+            Qt.QByteArray(configdict['splitter/state']))
+
     def getModelClass(self):
         '''see :meth:`TaurusBaseComponent.getModelClass`'''
         return taurus.core.taurusdevice.TaurusDevice
-        
+
     def _updateCommandWidgets(self, *args):
         '''
         Inserts command buttons and parameter widgets in the layout, according to
@@ -591,76 +619,81 @@ class TaurusCommandsForm(TaurusWidget):
         '''
         #self.debug('In TaurusCommandsForm._updateCommandWidgets())')
         dev = self.getModelObj()
-        if dev is None or dev.getSWState() != taurus.core.taurusbasetypes.TaurusSWDevState.Running:
+        if dev is None or dev.state != TaurusDevState.Ready:
             self.debug('Cannot connect to device')
             self._clearFrame()
             return
         commands = sorted(dev.command_list_query(), key=self._sortKey)
-        
+
         for f in self.getViewFilters():
             commands = filter(f, commands)
-        
+
         self._clearFrame()
-        
+
         layout = self._frame.layout()
 
-        for row,c in enumerate(commands):
-            self.debug('Adding button for command %s'%c.cmd_name)
-            button = TaurusCommandButton(command=c.cmd_name,text=c.cmd_name)
+        for row, c in enumerate(commands):
+            self.debug('Adding button for command %s' % c.cmd_name)
+            button = TaurusCommandButton(command=c.cmd_name, text=c.cmd_name)
             layout.addWidget(button, row, 0)
             button.setUseParentModel(True)
             self._cmdWidgets.append(button)
-            self.connect(button, Qt.SIGNAL('commandExecuted'), self._onCommandExecuted)
-            
+            button.commandExecuted.connect(self._onCommandExecuted)
+
             if c.in_type != PyTango.CmdArgType.DevVoid:
-                self.debug('Adding arguments for command %s'%c.cmd_name)
+                self.debug('Adding arguments for command %s' % c.cmd_name)
                 pwidget = ParameterCB()
                 if c.cmd_name.lower() in self._defaultParameters:
-                    for par in self._defaultParameters.get(c.cmd_name.lower(),[]): pwidget.addItem(par)
+                    for par in self._defaultParameters.get(c.cmd_name.lower(), []):
+                        pwidget.addItem(par)
                     #pwidget.setEditable( (self._defaultParameters[c.cmd_name.lower()] or [''])[0] == '' )
                     if (self._defaultParameters[c.cmd_name.lower()] or [''])[0] == '':
                         pwidget.setEditable(True)
                     else:
                         pwidget.setEditable(False)
-                        button.setParameters(self._defaultParameters[c.cmd_name.lower()][0])
-                self.connect(pwidget, Qt.SIGNAL('editTextChanged (const QString&)'),button.setParameters)
-                self.connect(pwidget, Qt.SIGNAL('currentIndexChanged (const QString&)'),button.setParameters)
-                self.connect(pwidget, Qt.SIGNAL('activated (int)'), button.setFocus)
-                self.connect(button, Qt.SIGNAL('commandExecuted'), pwidget.rememberCurrentText)
+                        button.setParameters(self._defaultParameters[
+                                             c.cmd_name.lower()][0])
+                pwidget.editTextChanged.connect(button.setParameters)
+                pwidget.currentIndexChanged.connect(button.setParameters)
+                pwidget.activated.connect(button.setFocus)
+                button.commandExecuted.connect(pwidget.rememberCurrentText)
                 layout.addWidget(pwidget, row, 1)
                 self._paramWidgets.append(pwidget)
-    
+
     def _clearFrame(self):
         '''destroys all widgets in the scroll area frame'''
         self._frame = TaurusWidget(self)
         self._frame.setLayout(Qt.QGridLayout())
-        self._frame.setModel(self.getModelName()) # hack because useParentModel does not work!
+        # hack because useParentModel does not work!
+        self._frame.setModel(self.getModelName())
         self._scrollArea.setWidget(self._frame)
         self._cmdWidgets = []
         self._paramWidgets = []
-        
+
     def _onCommandExecuted(self, result):
         '''Slot called when the command is executed, to manage the output
-        
+
         :param result: return value from the command. The type depends on the command
         '''
         timestamp = datetime.now()
         cmdbutton = self.sender()
-        output = '<i>%s</i><br>'%timestamp.strftime('%Y-%m-%d %H:%M:%S') +\
-                 '<b>Command:</b> %s<br>'%cmdbutton.getCommand() +\
-                 '<b>Pars:</b> %s<br>'%repr(cmdbutton.getParameters()) +\
-                 '<b>Return Value:</b><br>%s'%str(result)
+        output = '<i>%s</i><br>' % timestamp.strftime('%Y-%m-%d %H:%M:%S') +\
+                 '<b>Command:</b> %s<br>' % cmdbutton.getCommand() +\
+                 '<b>Pars:</b> %s<br>' % repr(cmdbutton.getParameters()) +\
+                 '<b>Return Value:</b><br>%s' % str(result)
         self._outputTE.append(output)
-        separator = '<table width=\"100%\"><tr><td><hr /></td></tr></table>' # ugly workaround for bug in html rendering in Qt
-        self._outputTE.append(separator)                                     # see http://lists.trolltech.com/qt-interest/2008-04/thread00224-0.html
-        #self._outputTE.append('%s'%timestamp)
+        # ugly workaround for bug in html rendering in Qt
+        separator = '<table width=\"100%\"><tr><td><hr /></td></tr></table>'
+        # see http://lists.trolltech.com/qt-interest/2008-04/thread00224-0.html
+        self._outputTE.append(separator)
+        # self._outputTE.append('%s'%timestamp)
         #self._outputTE.append('<b>Command:</b> "%s"'%cmdbutton.getCommand())
         #self._outputTE.append('<b>Pars:</b> %s'%repr(cmdbutton.getParameters()))
         #self._outputTE.append('<b>Return Value:</b><br>%s<hr>'%str(result))
-        
+
     def setSortKey(self, sortkey):
         '''sets the method used to sort the commands (cmd_name by default)
-        
+
         :param sortkey: (callable) a function that takes a :class:`CommandInfo`
                         as argument and returns a key to use for sorting purposes
                         (e.g. the default sortKey is ``lambda x:x.cmd_name``)
@@ -671,16 +704,17 @@ class TaurusCommandsForm(TaurusWidget):
     def setDefaultParameters(self, params):
         '''sets the values that will appear by default in the parameters combo box,
         the command combo box for the command will be editable only if the first parameter is an empty string
-        
+
         :param params: (dict<str,list>) { 'cmd_name': ['parameters string 1', 'parameters string 2' ] }
- 
+
         '''
-        self._defaultParameters = dict((k.lower(),v) for k,v in params.items())
+        self._defaultParameters = dict((k.lower(), v)
+                                       for k, v in params.items())
         self._updateCommandWidgets()
 
     def setViewFilters(self, filterlist):
         '''sets the filters to be applied when displaying the commands
-        
+
         :param filterlist: (sequence<callable>) a sequence of command filters.
                            All filters will be applied to each command to decide
                            whether to display it or not.
@@ -690,18 +724,18 @@ class TaurusCommandsForm(TaurusWidget):
         '''
         self._viewFilters = filterlist
         self._updateCommandWidgets()
-    
+
     def getViewFilters(self):
         '''returns the filters used in deciding which commands are displayed
-        
+
         :return: (sequence<callable>) a sequence of filters
         '''
         return self._viewFilters
-    
-    @Qt.pyqtSignature("setCommand(bool)")
-    def setExpertView(self,expert):
+
+    @Qt.pyqtSlot(bool, name="setCommand")
+    def setExpertView(self, expert):
         '''sets the expert view mode
-        
+
         :param expert: (bool) If expert is True, commands won't be filtered. If
                        it is False, commands with  display level Expert won't be shown
         '''
@@ -714,11 +748,11 @@ class TaurusCommandsForm(TaurusWidget):
                 currentfilters.insert(0, self._operatorViewFilter)
         self.setViewFilters(currentfilters)
         self._expertView = expert
-    
+
     def getSplitter(self):
-        '''returns the splitter that separates the command buttons area from 
+        '''returns the splitter that separates the command buttons area from
         the output area
-        
+
         :return: (QSplitter)'''
         return self._splitter
 
@@ -732,42 +766,43 @@ class TaurusCommandsForm(TaurusWidget):
 
 class TaurusAttrForm(TaurusWidget):
     '''A form that displays the attributes of a Device Server'''
-    def __init__(self, parent = None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         TaurusWidget.__init__(self, parent, designMode)
-        
+
         self._viewFilters = []
         self._operatorViewFilter = lambda x: x.disp_level == PyTango.DispLevel.OPERATOR
-        
+
         self.setLayout(Qt.QVBoxLayout())
-   
-        self._form = TaurusForm(parent = self)
+
+        self._form = TaurusForm(parent=self)
         self.layout().addWidget(self._form)
         self.registerConfigDelegate(self._form)
-        
-        self.connect(self, Qt.SIGNAL('modelChanged(const QString &)'),self._updateAttrWidgets )
-        
-        self._sortKey = lambda x:x.name
+
+        self.modelChanged.connect(self._updateAttrWidgets)
+
+        self._sortKey = lambda x: x.name
 
     def setSortKey(self, sortkey):
-        '''sets the key function used to sort the attributes in the form 
-        
+        '''sets the key function used to sort the attributes in the form
+
         :param sortkey: (callable) a function that takes a :class:`AttributeInfo`
                         as argument and returns a key to use for sorting purposes
                         (e.g. the default sortKey is ``lambda x:x.name``)
-        
+
         '''
         self._sortKey = sortkey
-        self._updateAttrWidgets()        
-        
+        self._updateAttrWidgets()
+
     def getModelClass(self):
         '''see :meth:`TaurusBaseComponent.getModelClass`'''
         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.taurusbasetypes.TaurusSWDevState.Running:
+        if dev is None or dev.state != TaurusDevState.Ready:
             self.debug('Cannot connect to device')
             self._form.setModel([])
             return
@@ -777,13 +812,14 @@ class TaurusAttrForm(TaurusWidget):
         attrnames = []
         devname = self.getModelName()
         for a in attrlist:
-            attrnames.append("%s/%s"%(devname,a.name)) #ugly hack . But setUseParentModel does not work well
-        self.debug('Filling with attribute list: %s'%("; ".join(attrnames))) 
+            # ugly hack . But setUseParentModel does not work well
+            attrnames.append("%s/%s" % (devname, a.name))
+        self.debug('Filling with attribute list: %s' % ("; ".join(attrnames)))
         self._form.setModel(attrnames)
-        
+
     def setViewFilters(self, filterlist):
         '''sets the filters to be applied when displaying the attributes
-        
+
         :param filterlist: (sequence<callable>) a sequence of attr filters. All
                            filters will be applied to each attribute name to
                            decide whether to display it or not. for an attribute
@@ -792,18 +828,18 @@ class TaurusAttrForm(TaurusWidget):
         '''
         self._viewFilters = filterlist
         self._updateAttrWidgets()
-    
+
     def getViewFilters(self):
         '''returns the filters used in deciding which attributes are displayed
-        
+
         :return: (sequence<callable>) a sequence of filters
         '''
         return self._viewFilters
-    
-    @Qt.pyqtSignature("setExpertView(bool)")
+
+    @Qt.pyqtSlot(bool)
     def setExpertView(self, expert):
         '''sets the expert view mode
-        
+
         :param expert: (bool) If expert is True, attributes won't be filtered. If
                        it is False, attributes with display level Expert won't
                        be shown
@@ -817,34 +853,35 @@ class TaurusAttrForm(TaurusWidget):
                 currentfilters.insert(0, self._operatorViewFilter)
         self.setViewFilters(currentfilters)
         self._expertView = expert
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         ret = TaurusWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.panel'
         ret['container'] = False
         return ret
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
-    model = Qt.pyqtProperty("QString", TaurusWidget.getModel, 
-                                       TaurusWidget.setModel, 
-                                       TaurusWidget.resetModel)
-    
-    useParentModel = Qt.pyqtProperty("bool", 
-                                         TaurusWidget.getUseParentModel, 
-                                         TaurusWidget.setUseParentModel,
-                                         TaurusWidget.resetUseParentModel)
 
+    model = Qt.pyqtProperty("QString", TaurusWidget.getModel,
+                            TaurusWidget.setModel,
+                            TaurusWidget.resetModel)
+
+    useParentModel = Qt.pyqtProperty("bool",
+                                     TaurusWidget.getUseParentModel,
+                                     TaurusWidget.setUseParentModel,
+                                     TaurusWidget.resetUseParentModel)
 
 
 def test1():
     '''tests taurusForm'''
     import sys
-    if len(sys.argv)>1: models=sys.argv[1:]
-    else: models = None
+    if len(sys.argv) > 1:
+        models = sys.argv[1:]
+    else:
+        models = None
     app = Qt.QApplication(sys.argv)
     if models is None:
         models = ['sys/tg_test/1/state',
@@ -855,88 +892,104 @@ def test1():
     dialog = TaurusForm()
     dialog.setModel(models)
     dialog.setModifiableByUser(True)
-    for i,tv in enumerate(dialog.getItems()):
-        tv.setDangerMessage("Booooo scaring %d!!!"%i)
+    for i, tv in enumerate(dialog.getItems()):
+        tv.setDangerMessage("Booooo scaring %d!!!" % i)
     dialog.show()
-    
+
     dialog2 = TaurusForm()
     dialog2.show()
     dialog2.setModifiableByUser(True)
     sys.exit(app.exec_())
 
+
 def test2():
     '''tests taurusAttrForm'''
     import sys
-    if len(sys.argv)>1: model=sys.argv[1]
-    else: model = None
-    
-    if model is None: model = 'bl97/pc/dummy-01'
+    if len(sys.argv) > 1:
+        model = sys.argv[1]
+    else:
+        model = None
+
+    if model is None:
+        model = 'bl97/pc/dummy-01'
     app = Qt.QApplication(sys.argv)
     dialog = TaurusAttrForm()
     dialog.setModel(model)
     dialog.show()
     sys.exit(app.exec_())
-    
+
+
 def test3():
     '''tests taurusCommandsForm'''
     import sys
-    if len(sys.argv)>1: model=sys.argv[1]
-    else: model = None
-    
-    if model is None: model = 'bl97/pc/dummy-01'
+    if len(sys.argv) > 1:
+        model = sys.argv[1]
+    else:
+        model = None
+
+    if model is None:
+        model = 'bl97/pc/dummy-01'
     app = Qt.QApplication(sys.argv)
     dialog = TaurusCommandsForm()
     dialog.setModel(model)
     dialog.show()
 #    dialog.getSplitter().setSizes([10,220])
 
-    sys.exit(app.exec_()) 
-    
+    sys.exit(app.exec_())
+
+
 def test4():
     '''tests customwidgetma in taurusforms'''
     import sys
     from taurus.qt.qtgui.display import TaurusLabel
     app = Qt.QApplication(sys.argv)
-    
+
     from taurus.qt.qtgui.panel import TaurusValue
+
     class DummyCW(TaurusValue):
-        def setModel(self,model):
+
+        def setModel(self, model):
             print "!!!!! IN DUMMYCW.SETMODEL", model
-            TaurusValue.setModel(self, model+'/double_scalar')
-    
-    models = ['sys/database/2', 'sys/tg_test/1', 'sys/tg_test/1/short_spectrum', 'sys/tg_test/1/state','sys/tg_test/1/short_scalar_ro']
+            TaurusValue.setModel(self, model + '/double_scalar')
+
+    models = ['sys/database/2', 'sys/tg_test/1', 'sys/tg_test/1/short_spectrum',
+              'sys/tg_test/1/state', 'sys/tg_test/1/short_scalar_ro']
     models.append('tango://controls02:10000/expchan/bl97_simucotictrl_1/1')
-    map={
-        'PseudoCounter':('taurus.qt.qtgui.extra_pool.PoolChannelTV', (),{}), #taurusvalue-like classes given as strings
-        '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', (),{}),
-        'TangoTest':DummyCW,    #a TaurusValue-like class given as a class (old way)
-        'DataBase':TaurusLabel} #a non-TaurusValue-like class given as a class (old way)
-    
+    map = {
+        # taurusvalue-like classes given as strings
+        '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', (), {}),
+        # a TaurusValue-like class given as a class (old way)
+        'TangoTest': DummyCW,
+        'DataBase': TaurusLabel}  # a non-TaurusValue-like class given as a class (old way)
+
     dialog = TaurusForm()
     dialog.setCustomWidgetMap(map)
     dialog.setModel(models)
     dialog.show()
     sys.exit(app.exec_())
-            
+
 
 def taurusFormMain():
     '''A launcher for TaurusForm.'''
-    ## NOTE: DON'T PUT TEST CODE HERE.
-    ## THIS IS CALLED FROM THE LAUNCHER SCRIPT (<taurus>/scripts/taurusform)
-    ## USE test1() instead.
+    # NOTE: DON'T PUT TEST CODE HERE.
+    # THIS IS CALLED FROM THE LAUNCHER SCRIPT (<taurus>/scripts/taurusform)
+    # USE test1() instead.
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.core.util import argparse
-    import sys, os
-    
+    import sys
+    import os
+
     parser = argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [model1 [model2 ...]]")
     parser.set_description("the taurus form panel application")
-    parser.add_option("--window-name", dest="window_name", default="TaurusForm", help="Name of the window")
+    parser.add_option("--window-name", dest="window_name",
+                      default="TaurusForm", help="Name of the window")
     parser.add_option("--config", "--config-file", dest="config_file", default=None,
-                  help="use the given config file for initialization")
+                      help="use the given config file for initialization")
     app = TaurusApplication(cmd_line_parser=parser,
                             app_name="taurusform",
                             app_version=taurus.Release.version)
@@ -951,44 +1004,47 @@ def taurusFormMain():
     # Make sure the window size and position are restored
     dialog.registerConfigProperty(dialog.saveGeometry, dialog.restoreGeometry,
                                   'MainWindowGeometry')
-            
-    from taurus.qt.qtgui.resource import getThemeIcon
-    quitApplicationAction =  Qt.QAction(getThemeIcon("process-stop"),'Close Form', dialog)
-    dialog.connect(quitApplicationAction, Qt.SIGNAL("triggered()"), dialog.close)
-    
+
+    quitApplicationAction = Qt.QAction(
+        Qt.QIcon.fromTheme("process-stop"), 'Close Form', dialog)
+    quitApplicationAction.triggered[()].connect(dialog.close)
+
     saveConfigAction = Qt.QAction("Save current settings...", dialog)
     saveConfigAction.setShortcut(Qt.QKeySequence.Save)
-    dialog.connect(saveConfigAction, Qt.SIGNAL("triggered()"), dialog.saveConfigFile)  
-    
+    saveConfigAction.triggered[()].connect(dialog.saveConfigFile)
+
     loadConfigAction = Qt.QAction("&Retrieve saved settings...", dialog)
     loadConfigAction.setShortcut(Qt.QKeySequence.Open)
-    dialog.connect(loadConfigAction, Qt.SIGNAL("triggered()"), dialog.loadConfigFile)
-    
-    dialog.addActions ((saveConfigAction, loadConfigAction, quitApplicationAction) )
-    
-    #set the default map for this installation
+    loadConfigAction.triggered[()].connect(dialog.loadConfigFile)
+
+    dialog.addActions(
+        (saveConfigAction, loadConfigAction, quitApplicationAction))
+
+    # set the default map for this installation
     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: 
+    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:
         dialog.loadConfigFile(options.config_file)
-    elif len(args)>0:
-        models=args
+    elif len(args) > 0:
+        models = args
         dialog.setModel(models)
     else:
         dialog.chooseModels()
 
     dialog.show()
-    
+
     sys.exit(app.exec_())
 
+
 def main():
-    #test1()
-    #test2()
-    #test3()
-    #test4()
+    # test1()
+    # test2()
+    # test3()
+    # test4()
     taurusFormMain()
-    
+
 if __name__ == "__main__":
-    main() 
+    main()
diff --git a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py
index e975240..7feb943 100644
--- a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py
+++ b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -39,12 +39,12 @@ from taurus.qt.qtgui.util.ui import UILoadable
 @UILoadable(with_ui='_ui')
 class TaurusInputPanel(Qt.QWidget):
     """A panel design to get an input from the user.
-    
+
     The input_data is a dictionary which contains information on how to build
     the input dialog. It **must** contains the following keys:
-    
+
         - *prompt* <str>: message to be displayed
-        
+
     The following are optional keys (and their corresponding default values):
 
         - *title* <str> (doesn't have default value)
@@ -53,7 +53,7 @@ class TaurusInputPanel(Qt.QWidget):
         - *unit* <str> (doesn't have default value):
           a label to be presented right to the input box representing the units
         - *data_type* <str or sequence> ('String'):
-          type of data to be requested. Standard 
+          type of data to be requested. Standard
           accepted data types are 'String', 'Integer', 'Float', 'Boolean',
           'Text'. A list of elements will be interpreted as a selection.
           Default TaurusInputPanel class will interpret any custom data types as
@@ -64,28 +64,28 @@ class TaurusInputPanel(Qt.QWidget):
           minimum value (makes sense when data_type is 'Integer' or 'Float')
         - *maximum* <int/float>:
           maximum value (makes sense when data_type is 'Integer' or 'Float')
-        - *step* <int/float> (1): 
+        - *step* <int/float> (1):
           step size value (makes sense when data_type is 'Integer' or 'Float')
-        - *decimals* <int> (1): 
+        - *decimals* <int> (1):
           number of decimal places to show (makes sense when data_type is
           'Float')
-        - *default_value* <obj> (doesn't have default value): 
+        - *default_value* <obj> (doesn't have default value):
           default value
         - *allow_multiple* <bool> (False):
           allow more than one value to be selected (makes sense when data_type
           is a sequence of possibilities)
-        
+
 
     Example::
 
         app = Qt.QApplication([])
-        
+
         class Listener(object):
             def on_accept(self):
                 print "user selected", self.panel.value()
-        
+
         d = dict(prompt="What's your favourite car brand?",
-                 data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"], 
+                 data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"],
                  default_value="Mercedes")
         w = TaurusInputPanel(d)
         l = Listener()
@@ -94,6 +94,7 @@ class TaurusInputPanel(Qt.QWidget):
         w.show()
         app.exec_()
     """
+
     def __init__(self, input_data, parent=None):
         Qt.QWidget.__init__(self, parent)
         self._input_data = input_data
@@ -102,7 +103,7 @@ class TaurusInputPanel(Qt.QWidget):
 
     def fill_main_panel(self, panel, input_data):
         layout = Qt.QVBoxLayout()
-        layout.setContentsMargins(0, 0, 0 ,0)
+        layout.setContentsMargins(0, 0, 0, 0)
         panel.setLayout(layout)
         if isinstance(input_data, collections.Mapping):
             single_panel, getter = self.create_single_input_panel(input_data)
@@ -110,47 +111,49 @@ class TaurusInputPanel(Qt.QWidget):
             self.value = getter
             if 'title' in input_data:
                 self.setWindowTitle(input_data['title'])
-    
+
     def create_single_input_panel(self, input_data):
         style = Qt.QApplication.instance().style()
         icon = style.standardIcon(Qt.QStyle.SP_MessageBoxQuestion)
         self.setIconPixmap(icon.pixmap(64))
-        
+
         self.setText(input_data['prompt'])
 
         data_type = input_data.get('data_type', 'String')
         is_seq = not isinstance(data_type, (str, unicode)) and \
-                 isinstance(data_type, collections.Sequence)
+            isinstance(data_type, collections.Sequence)
         if is_seq:
             panel, getter = self.create_selection_panel(input_data)
         else:
             data_type_l = data_type.lower()
-            creator = getattr(self, "create_" + data_type_l + "_panel", self.create_custom_panel)
+            creator = getattr(self, "create_" + data_type_l +
+                              "_panel", self.create_custom_panel)
             if creator:
                 panel, getter = creator(input_data)
-        
+
         if panel is None:
-            panel = Qt.QLabel("Cannot create widget for data type '%s'" % data_type)
-            getter = lambda : None
+            panel = Qt.QLabel(
+                "Cannot create widget for data type '%s'" % data_type)
+            getter = lambda: None
         return panel, getter
-        
+
     def create_custom_panel(self, input_data):
         return self.create_string_panel(input_data)
 
     def create_selection_panel(self, input_data):
         allow_multiple = input_data.get('allow_multiple', False)
-        
+
         if allow_multiple:
             return self._create_multi_selection_panel(input_data)
         else:
             return self._create_single_selection_panel(input_data)
-    
+
     def _create_single_selection_panel(self, input_data):
         items = list(map(str, input_data['data_type']))
         if len(items) > 5:
             return self._create_combobox_panel(input_data)
         return self._create_radiobutton_panel(input_data)
-    
+
     def _create_combobox_panel(self, input_data):
         panel = self._create_simple_panel(input_data)
         layout = panel.layout()
@@ -158,7 +161,7 @@ class TaurusInputPanel(Qt.QWidget):
         items = input_data['data_type']
         for item in items:
             is_seq = not isinstance(item, (str, unicode)) and \
-                     isinstance(item, collections.Sequence)
+                isinstance(item, collections.Sequence)
             if is_seq:
                 text, userData = item
             else:
@@ -166,11 +169,11 @@ class TaurusInputPanel(Qt.QWidget):
             combobox.addItem(text, userData)
         layout.addWidget(combobox, 0, 1)
         return panel, self._get_combobox_value
-    
+
     def _get_combobox_value(self):
         combo = self._ui.inputWidget
         return Qt.from_qvariant(combo.itemData(combo.currentIndex()))
-    
+
     def _create_radiobutton_panel(self, input_data):
         panel = self._create_group_panel(input_data)
         layout = panel.layout()
@@ -180,7 +183,7 @@ class TaurusInputPanel(Qt.QWidget):
         buttongroup.setExclusive(True)
         for item in items:
             is_seq = not isinstance(item, (str, unicode)) and \
-                     isinstance(item, collections.Sequence)
+                isinstance(item, collections.Sequence)
             if is_seq:
                 text, userData = item
             else:
@@ -198,7 +201,7 @@ class TaurusInputPanel(Qt.QWidget):
         button = buttongroup.checkedButton()
         if button is not None:
             return button._value
-    
+
     def _create_multi_selection_panel(self, input_data):
         panel = self._create_group_panel(input_data)
         layout = panel.layout()
@@ -207,7 +210,7 @@ class TaurusInputPanel(Qt.QWidget):
         if default_value is None:
             default_value = ()
         dft_is_seq = not isinstance(default_value, (str, unicode)) and \
-                     isinstance(default_value, collections.Sequence)
+            isinstance(default_value, collections.Sequence)
         if not dft_is_seq:
             default_value = default_value,
 
@@ -216,7 +219,7 @@ class TaurusInputPanel(Qt.QWidget):
 
         for item in items:
             is_seq = not isinstance(item, (str, unicode)) and \
-                     isinstance(item, collections.Sequence)
+                isinstance(item, collections.Sequence)
             if is_seq:
                 text, userData = item
             else:
@@ -230,7 +233,7 @@ class TaurusInputPanel(Qt.QWidget):
 
     def _get_multi_selection_value(self):
         listwidget = self._ui.inputWidget
-        return [ Qt.from_qvariant(item.data(Qt.Qt.UserRole)) for item in listwidget.selectedItems() ]
+        return [Qt.from_qvariant(item.data(Qt.Qt.UserRole)) for item in listwidget.selectedItems()]
 
     def _create_group_panel(self, input_data):
         title = input_data.get('key', '')
@@ -243,7 +246,7 @@ class TaurusInputPanel(Qt.QWidget):
         self._ui.inputLabel = Qt.QLabel()
         self._ui.unitLabel = Qt.QLabel()
         return panel
-            
+
     def _create_simple_panel(self, input_data):
         panel = Qt.QWidget()
         key = input_data.get('key', '')
@@ -260,7 +263,7 @@ class TaurusInputPanel(Qt.QWidget):
         layout.setColumnStretch(1, 1)
         layout.setColumnStretch(2, 0)
         return panel
-    
+
     def create_integer_panel(self, input_data):
         panel = self._create_simple_panel(input_data)
         minimum = input_data.get('minimum', numpy.iinfo('i').min)
@@ -275,10 +278,10 @@ class TaurusInputPanel(Qt.QWidget):
             spinbox.setValue(input_data['default_value'])
         layout.addWidget(spinbox, 0, 1)
         return panel, self._get_integer_value
-    
+
     def _get_integer_value(self):
         return int(self._ui.inputWidget.value())
-        
+
     def create_float_panel(self, input_data):
         panel = self._create_simple_panel(input_data)
         minimum = input_data.get('minimum', numpy.finfo('d').min)
@@ -325,7 +328,7 @@ class TaurusInputPanel(Qt.QWidget):
 
     def _get_text_value(self):
         return str(self._ui.inputWidget.toPlainText())
-        
+
     def create_boolean_panel(self, input_data):
         panel = self._create_simple_panel(input_data)
         layout = panel.layout()
@@ -337,7 +340,7 @@ class TaurusInputPanel(Qt.QWidget):
 
     def _get_boolean_value(self):
         return self._ui.inputWidget.checkState() == Qt.Qt.Checked
-    
+
     def inputPanel(self):
         return self._ui._inputPanel
 
@@ -377,7 +380,7 @@ class TaurusInputPanel(Qt.QWidget):
         :return: the text for this panel
         :rtype: str"""
         return self._ui.textLabel.text()
-    
+
     def setInputFocus(self):
         inputWidget = self._ui.inputWidget
         if not inputWidget:
@@ -392,20 +395,23 @@ class TaurusInputPanel(Qt.QWidget):
                 button = inputWidget.button(bid)
             button.setFocus()
 
+
 def main():
     app = Qt.QApplication([])
-    
+
     class Listener(object):
+
         def on_accept(self):
             print "user selected", self.panel.value()
-    
+
     d = dict(prompt="What's your favourite car brand?",
-             data_type=["Mazda", "Skoda", "Citroen", "Mercedes", "Audi", "Ferrari"], 
+             data_type=["Mazda", "Skoda", "Citroen",
+                        "Mercedes", "Audi", "Ferrari"],
              default_value="Mercedes")
     w = TaurusInputPanel(d)
     l = Listener()
     l.panel = w
-    w.connect(w.buttonBox(), Qt.SIGNAL("accepted()"), l.on_accept)
+    w.buttonBox().accepted.connect(l.on_accept)
     w.show()
     app.exec_()
 
diff --git a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py
index 1826d56..e52851a 100644
--- a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py
+++ b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -48,7 +48,6 @@ import PyTango
 
 from taurus.core.util.report import TaurusMessageReportHandler
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.resource import getThemePixmap
 from taurus.qt.qtgui.util.ui import UILoadable
 
 
@@ -164,7 +163,6 @@ class MacroServerMessageErrorHandler(TaurusMessageErrorHandler):
         msgbox.setOriginHtml(html)
 
 
-
 def is_report_handler(report, abs_file=None):
     """Helper function to determine if a certain python object is a valid
     report handler"""
@@ -181,6 +179,8 @@ def is_report_handler(report, abs_file=None):
     return True
 
 _REPORT_HANDLERS = None
+
+
 def get_report_handlers():
     global _REPORT_HANDLERS
     if not _REPORT_HANDLERS is None:
@@ -205,7 +205,8 @@ def get_report_handlers():
             if not elem.endswith('.py'):
                 continue
             elem, _ = os.path.splitext(elem)
-            _is_report_handler = functools.partial(is_report_handler, abs_file=full_elem)
+            _is_report_handler = functools.partial(
+                is_report_handler, abs_file=full_elem)
             report_lib = __import__(elem, globals(), locals(), [], -1)
             for name, obj in inspect.getmembers(report_lib, _is_report_handler):
                 _REPORT_HANDLERS[name] = obj
@@ -227,6 +228,7 @@ An error occured in '{appName} {appVersion}' on {time}
 --------------------------------------------------------------------------------
 """
 
+
 @UILoadable(with_ui='_ui')
 class TaurusMessagePanel(Qt.QWidget):
     """A panel intended to display a taurus error.
@@ -254,6 +256,8 @@ class TaurusMessagePanel(Qt.QWidget):
             msgbox = TaurusMessagePanel(*exc_info)
             msgbox.show()"""
 
+    toggledDetails = Qt.pyqtSignal(bool)
+
     def __init__(self, err_type=None, err_value=None, err_traceback=None, parent=None, designMode=False):
         Qt.QWidget.__init__(self, parent)
         self.loadUi()
@@ -264,12 +268,10 @@ class TaurusMessagePanel(Qt.QWidget):
         self._ui._checkBox.setCheckState(Qt.Qt.Unchecked)
         self._initReportCombo()
 
-        Qt.QObject.connect(self._ui._showDetailsButton,
-                           Qt.SIGNAL("toggled(bool)"), self._onShowDetails)
-        Qt.QObject.connect(self._ui._reportComboBox,
-                           Qt.SIGNAL("activated(int)"), self._onReportTriggered)
+        self._ui._showDetailsButton.toggled.connect(self._onShowDetails)
+        self._ui._reportComboBox.activated.connect(self._onReportTriggered)
 
-        pixmap = getThemePixmap("emblem-important")
+        pixmap = Qt.QIcon.fromTheme("emblem-important").pixmap(48, 48)
         self.setIconPixmap(pixmap)
 
         if err_value is not None:
@@ -306,7 +308,7 @@ class TaurusMessagePanel(Qt.QWidget):
             text = "Show details..."
         self._ui._showDetailsButton.setText(text)
         self.adjustSize()
-        self.emit(Qt.SIGNAL("toggledDetails(bool)"), show)
+        self.toggledDetails.emit(show)
 
     def reportComboBox(self):
         return self._ui._reportComboBox
@@ -470,9 +472,10 @@ class TaurusMessagePanel(Qt.QWidget):
         :param err_traceback: a traceback object which encapsulates the call
                               stack at the point where the exception originally
                               occurred
-        :type err_traceback: traceback"""
+        :type err_traceback: TracebackType"""
         i = sys.exc_info()
-        self._exc_info = [ err_type or i[0], err_value or i[1], err_traceback or i[2] ]
+        self._exc_info = [err_type or i[0],
+                          err_value or i[1], err_traceback or i[2]]
 
         handler_klass = self.findErrorHandler(self._exc_info[0])
         handler_klass(self)
@@ -485,7 +488,7 @@ class TaurusMessagePanel(Qt.QWidget):
         :rtype: tuple<type, value, traceback>"""
         return self._exc_info
 
-    ErrorHandlers = { PyTango.DevFailed : TangoMessageErrorHandler }
+    ErrorHandlers = {PyTango.DevFailed: TangoMessageErrorHandler}
 
     @classmethod
     def registerErrorHandler(klass, err_type, err_handler):
@@ -510,25 +513,29 @@ class DemoException(Exception):
     """Just a plain python exception for demo purposes"""
     pass
 
+
 def s1():
     """Just a function to make the stack more interesting"""
     return s2()
 
+
 def s2():
     """Just a function to make the stack more interesting"""
     return s3()
 
+
 def s3():
     """Just a function to make the stack more interesting"""
     raise DemoException("A demo exception occurred")
 
+
 class QMessageDialog(Qt.QDialog):
     """Helper class for the demo"""
 
     def __init__(self, msgbox, parent=None):
         Qt.QDialog.__init__(self, parent)
         l = Qt.QVBoxLayout()
-        l.setContentsMargins(0,0,0,0)
+        l.setContentsMargins(0, 0, 0, 0)
         l.addWidget(msgbox)
         l.addStretch(1)
         self.setLayout(l)
@@ -542,14 +549,17 @@ def py_exc():
         msgbox = TaurusMessagePanel(*sys.exc_info())
         QMessageDialog(msgbox).exec_()
 
+
 def tg_exc():
     """Shows a tango exception in a TaurusMessagePanel"""
     try:
-        PyTango.Except.throw_exception('TangoException', 'A simple tango exception', 'right here')
+        PyTango.Except.throw_exception(
+            'TangoException', 'A simple tango exception', 'right here')
     except PyTango.DevFailed:
         msgbox = TaurusMessagePanel(*sys.exc_info())
         QMessageDialog(msgbox).exec_()
 
+
 def tg_serv_exc():
     """Shows a tango exception from a server in a TaurusMessagePanel"""
     import taurus
@@ -563,22 +573,27 @@ def tg_serv_exc():
         msgbox = TaurusMessagePanel(*sys.exc_info())
         QMessageDialog(msgbox).exec_()
 
+
 def py_tg_serv_exc():
     """Shows a tango exception from a python server in a TaurusMessagePanel"""
     try:
-        PyTango.Except.throw_exception('TangoException', 'A simple tango exception', 'right here')
+        PyTango.Except.throw_exception(
+            'TangoException', 'A simple tango exception', 'right here')
     except PyTango.DevFailed, df1:
         try:
-            import traceback, StringIO
+            import traceback
+            import StringIO
             origin = StringIO.StringIO()
             traceback.print_stack(file=origin)
             origin.seek(0)
             origin = origin.read()
-            PyTango.Except.re_throw_exception(df1, 'PyDs_Exception', 'DevFailed: A simple tango exception', origin)
+            PyTango.Except.re_throw_exception(
+                df1, 'PyDs_Exception', 'DevFailed: A simple tango exception', origin)
         except PyTango.DevFailed:
             msgbox = TaurusMessagePanel(*sys.exc_info())
             QMessageDialog(msgbox).exec_()
 
+
 def demo():
     """Message panel"""
     panel = Qt.QWidget()
@@ -587,21 +602,22 @@ def demo():
 
     m1 = Qt.QPushButton("Python exception")
     layout.addWidget(m1)
-    Qt.QObject.connect(m1, Qt.SIGNAL("clicked()"), py_exc)
+    m1.clicked.connect(py_exc)
     m2 = Qt.QPushButton("Tango exception")
     layout.addWidget(m2)
-    Qt.QObject.connect(m2, Qt.SIGNAL("clicked()"), tg_exc)
+    m2.clicked.connect(tg_exc)
     layout.addWidget(m2)
     m3 = Qt.QPushButton("Tango server exception")
     layout.addWidget(m3)
-    Qt.QObject.connect(m3, Qt.SIGNAL("clicked()"), tg_serv_exc)
+    m3.clicked.connect(tg_serv_exc)
     layout.addWidget(m3)
     m4 = Qt.QPushButton("Python tango server exception")
     layout.addWidget(m4)
-    Qt.QObject.connect(m4, Qt.SIGNAL("clicked()"), py_tg_serv_exc)
+    m4.clicked.connect(py_tg_serv_exc)
     layout.addWidget(m4)
     return panel
 
+
 def main():
 
     import sys
@@ -626,4 +642,3 @@ def main():
 
 if __name__ == "__main__":
     main()
-
diff --git a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
index d96264d..d72b4aa 100644
--- a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
+++ b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -27,6 +27,7 @@
 AttributeChooser.py: widget for choosing (a list of) attributes from a tango DB
 """
 
+__all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"]
 
 import sys
 from taurus.external.qt import Qt
@@ -35,40 +36,50 @@ from taurus.qt.qtgui.container import TaurusWidget
 from taurus.qt.qtgui.tree import TaurusDbTreeWidget
 from taurus.core.util.containers import CaselessList
 from taurusmodellist import TaurusModelList
-import taurus.qt.qtgui.resource
+
+#@todo: tango-centric!!
+from taurus.core.tango.tangodatabase import TangoDevInfo, TangoAttrInfo
 
 
 class TaurusModelSelectorTree(TaurusWidget):
-    def __init__(self, parent = None, selectables=None, buttonsPos=None, designMode = None):
+
+    addModels = Qt.pyqtSignal('QStringList')
+
+    def __init__(self, parent=None, selectables=None, buttonsPos=None, designMode=None):
         TaurusWidget.__init__(self, parent)
-        if selectables is None: selectables = [taurus.core.taurusbasetypes.TaurusElementType.Attribute, taurus.core.taurusbasetypes.TaurusElementType.Member, 
-                                               taurus.core.taurusbasetypes.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.taurusbasetypes.TaurusElementType.Device)
+
+        # tree
+        self._deviceTree = TaurusDbTreeWidget(
+            perspective=taurus.core.taurusbasetypes.TaurusElementType.Device)
         self._deviceTree.getQModel().setSelectables(self._selectables)
         self._deviceTree.setUseParentModel(True)
-        
-        #toolbar 
+
+        # toolbar
         self._toolbar = Qt.QToolBar("TangoSelector toolbar")
-        self._toolbar.setIconSize(Qt.QSize(16,16))
+        self._toolbar.setIconSize(Qt.QSize(16, 16))
         self._toolbar.setFloatable(False)
-        self._addSelectedAction = self._toolbar.addAction(taurus.qt.qtgui.resource.getThemeIcon("list-add"), "Add selected", self.onAddSelected)
-        
-        #defines the layout
+        self._addSelectedAction = self._toolbar.addAction(
+            Qt.QIcon.fromTheme("list-add"), "Add selected", self.onAddSelected)
+
+        # defines the layout
         self.setButtonsPos(buttonsPos)
-        
-        self._deviceTree.recheckTaurusParent()  ##NOT WORKING????
-        self.connect(self, Qt.SIGNAL(self.ModelChangedSignal), self._deviceTree.setModel)  ##@todo: This is Workaround because UseSetParentModel is giving trouble again!
-    
+
+        self._deviceTree.recheckTaurusParent()  # NOT WORKING????
+        # @todo: This is Workaround because UseSetParentModel is giving trouble again!
+        self.modelChanged.connect(self._deviceTree.setModel)
+
     def setButtonsPos(self, buttonsPos):
-        #we must delete the previous layout before we can set a new one
+        # we must delete the previous layout before we can set a new one
         currlayout = self.layout()
         if currlayout is not None:
             currlayout.deleteLater()
-            Qt.QCoreApplication.sendPostedEvents(currlayout, Qt.QEvent.DeferredDelete)
-        #add to layout
+            Qt.QCoreApplication.sendPostedEvents(
+                currlayout, Qt.QEvent.DeferredDelete)
+        # add to layout
         if buttonsPos is None:
             self.setLayout(Qt.QVBoxLayout())
             self.layout().addWidget(self._deviceTree)
@@ -94,77 +105,84 @@ class TaurusModelSelectorTree(TaurusWidget):
             self.layout().addWidget(self._toolbar)
         else:
             raise ValueError("Invalid buttons position")
-    
+
     def getSelectedModels(self):
+        # todo: this method is tango-centric, but it could be fixed...
         selected = []
         for item in self._deviceTree.selectedItems():
             nfo = item.itemData()
-            if isinstance(nfo, taurus.core.taurusdatabase.TaurusDevInfo):
+            if isinstance(nfo, TangoDevInfo):
                 selected.append(nfo.fullName())
-            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))
+            elif isinstance(nfo, TangoAttrInfo):
+                selected.append("%s/%s" %
+                                (nfo.device().fullName(), nfo.name()))
+            else:
+                self.info("Unknown item '%s' in selection" % repr(nfo))
         return selected
-        
+
     def onAddSelected(self):
-        self.emit(Qt.SIGNAL("addModels"), self.getSelectedModels())
-        
+        self.addModels.emit(self.getSelectedModels())
+
     def treeView(self):
         return self._deviceTree.treeView()
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         ret = TaurusWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.panel'
-        ret['icon'] = ":/designer/listview.png"
+        ret['icon'] = "designer:listview.png"
         ret['container'] = False
         ret['group'] = 'Taurus Views'
         return ret
-        
-        
+
+
 class TaurusModelChooser(TaurusWidget):
     '''A widget that allows the user to select a list of models from a tree representing
     devices and attributes from a Tango server.
-    
+
     The user selects models and adds them to a list. Then the user should click on the
     update button to notify that the selection is ready.
-    
+
     signals::
       - "updateModels"  emitted when the user clicks on the update button. It
         passes a list<str> of models that have been selected.
-    ''' 
-    def __init__(self, parent = None, selectables=None, host=None, designMode=None, singleModel=False):
+    '''
+
+    updateModels = Qt.pyqtSignal('QStringList')
+    UpdateAttrs = Qt.pyqtSignal(['QStringList'], ['QMimeData'])
+
+    def __init__(self, parent=None, selectables=None, host=None, designMode=None, singleModel=False):
         '''Creator of TaurusModelChooser
-        
-        :param parent: (QObject) parent for the dialog 
+
+        :param parent: (QObject) parent for the dialog
         :param selectables: (list<TaurusElementType>) if passed, only elements of the tree whose
-                            type is in the list will be selectable. 
+                            type is in the list will be selectable.
         :param host: (QObject) Tango host to be explored by the chooser
         :param designMode: (bool) needed for taurusdesigner but ignored here
         :param singleModel: (bool) If True, the selection will be of just one
                             model. Otherwise (default) a list of models can be selected
         '''
         TaurusWidget.__init__(self, parent)
-        if host is None: host = taurus.Database().getNormalName()
-        
-        
+        if host is None:
+            host = taurus.Authority().getNormalName()
+
         self._allowDuplicates = False
-        
+
         self.setLayout(Qt.QVBoxLayout())
-        
-        self.tree =  TaurusModelSelectorTree(selectables = selectables, buttonsPos = Qt.Qt.BottomToolBarArea)
+
+        self.tree = TaurusModelSelectorTree(
+            selectables=selectables, buttonsPos=Qt.Qt.BottomToolBarArea)
         self.tree.setModel(host)
         self.list = TaurusModelList()
         self.list.setSelectionMode(Qt.QAbstractItemView.ExtendedSelection)
         applyBT = Qt.QToolButton()
         applyBT.setToolButtonStyle(Qt.Qt.ToolButtonTextBesideIcon)
         applyBT.setText('Apply')
-        applyBT.setIcon(taurus.qt.qtgui.resource.getIcon(":/status/available.svg"))
-        
+        applyBT.setIcon(Qt.QIcon("status:available.svg"))
+
         self.setSingleModelMode(singleModel)
-        
-        #toolbar 
+
+        # toolbar
         self._toolbar = self.tree._toolbar
         self._toolbar.addAction(self.list.removeSelectedAction)
         self._toolbar.addAction(self.list.removeAllAction)
@@ -174,109 +192,114 @@ class TaurusModelChooser(TaurusWidget):
         self._toolbar.addWidget(applyBT)
         self.layout().addWidget(self.tree)
         self.layout().addWidget(self.list)
-        
-        #self.tree.setUseParentModel(True)  #It does not work!!!!
-        self.connect(self, Qt.SIGNAL(self.ModelChangedSignal), self.tree.setModel) ##@todo: This is Workaround because UseSetParentModel is giving trouble again!
-        
-        #connections:
-        self.connect(self.tree, Qt.SIGNAL("addModels"), self.addModels)
-        self.connect(applyBT, Qt.SIGNAL("clicked()"), self._onUpdateModels)
+
+        # self.tree.setUseParentModel(True)  #It does not work!!!!
+        # @todo: This is Workaround because UseSetParentModel is giving trouble again!
+        self.modelChanged.connect(self.tree.setModel)
+
+        # connections:
+        self.tree.addModels.connect(self.addModels)
+        applyBT.clicked.connect(self._onUpdateModels)
 #        self.connect(self.tree._deviceTree, Qt.SIGNAL("itemDoubleClicked"), self.onTreeDoubleClick)
-        
+
 #    def onTreeDoubleClick(self, item, colum): #@todo: Implement this function properly
 #        if item.Role in self.tree._selectables:
 #            self.addModels([str(item.text())])
-    
+
     def getListedModels(self, asMimeData=False):
         '''returns the list of models that have been added
-        
+
         :param asMimeData: (bool) If False (default), the return value will be a
-                           list of models. If True, the return value is a 
+                           list of models. If True, the return value is a
                            `QMimeData` containing at least `TAURUS_MODEL_LIST_MIME_TYPE`
                            and `text/plain` MIME types. If only one model was selected,
                            the mime data also contains a TAURUS_MODEL_MIME_TYPE.
-        
+
         :return: (list<str> or QMimeData) the type of return depends on the value of `asMimeData`'''
         models = self.list.getModelList()
         if self.isSingleModelMode():
-            models=models[:1]
+            models = models[:1]
         if asMimeData:
-            md =  Qt.QMimeData()
-            md.setData(taurus.qt.qtcore.mimetypes.TAURUS_MODEL_LIST_MIME_TYPE, str("\r\n".join(models)))
+            md = Qt.QMimeData()
+            md.setData(taurus.qt.qtcore.mimetypes.TAURUS_MODEL_LIST_MIME_TYPE, str(
+                "\r\n".join(models)))
             md.setText(", ".join(models))
             if len(models) == 1:
-                md.setData(taurus.qt.qtcore.mimetypes.TAURUS_MODEL_MIME_TYPE, str(models[0]))
+                md.setData(
+                    taurus.qt.qtcore.mimetypes.TAURUS_MODEL_MIME_TYPE, str(models[0]))
             return md
         return models
-    
+
     def setListedModels(self, models):
         '''adds the given list of models to the widget list
         '''
         self.list.model().clearAll()
         self.list.addModels(models)
-        
+
     def resetListedModels(self):
         '''equivalent to setListedModels([])'''
         self.list.model().clearAll()
-        
-    def updateList(self, attrList ): 
+
+    def updateList(self, attrList):
         '''for backwards compatibility with AttributeChooser only. Use :meth:`setListedModels` instead'''
-        self.info('ModelChooser.updateList() is provided for backwards compatibility only. Use setListedModels() instead')
+        self.info(
+            'ModelChooser.updateList() is provided for backwards compatibility only. Use setListedModels() instead')
         self.setListedModels(attrList)
-    
+
     def addModels(self, models):
         ''' Add given models to the selected models list'''
-        if  len(models) == 0:
-            models= ['']
+        if len(models) == 0:
+            models = ['']
         if self.isSingleModelMode():
             self.resetListedModels()
         if self._allowDuplicates:
             self.list.addModels(models)
         else:
-            listedmodels = CaselessList(self.getListedModels()) 
+            listedmodels = CaselessList(self.getListedModels())
             for m in models:
                 if m not in listedmodels:
                     listedmodels.append(m)
                     self.list.addModels([m])
-           
+
     def onRemoveSelected(self):
         '''
         Remove the list-selected models from the list
         '''
         self.list.removeSelected()
-        
+
     def _onUpdateModels(self):
         models = self.getListedModels()
-        self.emit(Qt.SIGNAL("updateModels"), models)
+        self.updateModels.emit(models)
         if taurus.core.taurusbasetypes.TaurusElementType.Attribute in self.tree._selectables:
-            self.emit(Qt.SIGNAL("UpdateAttrs"), models) #for backwards compatibility with the old AttributeChooser
-    
+            # for backwards compatibility with the old AttributeChooser
+            self.UpdateAttrs.emit(models)
+
     def setSingleModelMode(self, single):
         '''sets whether the selection should be limited to just one model
-        (single=True) or not (single=False)'''        
+        (single=True) or not (single=False)'''
         if single:
             self.tree.treeView().setSelectionMode(Qt.QAbstractItemView.SingleSelection)
         else:
             self.tree.treeView().setSelectionMode(Qt.QAbstractItemView.ExtendedSelection)
         self._singleModelMode = single
-        
+
     def isSingleModelMode(self):
         '''returns True if the selection is limited to just one model. Returns False otherwise.
-        
+
         :return: (bool)'''
         return self._singleModelMode
-    
+
     def resetSingleModelMode(self):
         '''equivalent to setSingleModelMode(False)'''
         self.setSingleModelMode(self, False)
-    
+
     @staticmethod
-    def modelChooserDlg(parent = None, selectables=None, host=None, asMimeData=False, singleModel=False, windowTitle='Model Chooser'):
+    def modelChooserDlg(parent=None, selectables=None, host=None, asMimeData=False, singleModel=False, windowTitle='Model Chooser'):
         '''Static method that launches a modal dialog containing a TaurusModelChooser
-        
-        :param parent: (QObject) parent for the dialog 
+
+        :param parent: (QObject) parent for the dialog
         :param selectables: (list<TaurusElementType>) if passed, only elements of the tree whose
-                            type is in the list will be selectable. 
+                            type is in the list will be selectable.
         :param host: (QObject) Tango host to be explored by the chooser
         :param asMimeData: (bool) If False (default),  a list of models will be.
                            returned. If True, a `QMimeData` object will be
@@ -285,43 +308,46 @@ class TaurusModelChooser(TaurusWidget):
         :param singleModel: (bool) If True, the selection will be of just one
                             model. Otherwise (default) a list of models can be selected
         :param windowTitle: (str) Title of the dialog (default="Model Chooser")
-        
-        :return: (list,bool or QMimeData,bool) Returns a models,ok tuple. models can be 
+
+        :return: (list,bool or QMimeData,bool) Returns a models,ok tuple. models can be
                  either a list of models or a QMimeData object, depending on
                  `asMimeData`. ok is True if the dialog was accepted (by
                  clicking on the "update" button) and False otherwise
         '''
         dlg = Qt.QDialog(parent)
         dlg.setWindowTitle(windowTitle)
-        dlg.setWindowIcon(taurus.qt.qtgui.resource.getIcon(":/taurus.png"))
+        dlg.setWindowIcon(Qt.QIcon("logos:taurus.png"))
         layout = Qt.QVBoxLayout()
-        w = TaurusModelChooser(parent = parent, selectables=selectables, host=host, singleModel=singleModel)
+        w = TaurusModelChooser(
+            parent=parent, selectables=selectables, host=host, singleModel=singleModel)
         layout.addWidget(w)
         dlg.setLayout(layout)
-        dlg.connect(w,Qt.SIGNAL('updateModels'), dlg.accept)
+        w.updateModels.connect(dlg.accept)
         dlg.exec_()
         return w.getListedModels(asMimeData=asMimeData), (dlg.result() == dlg.Accepted)
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         ret = TaurusWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.panel'
-        ret['icon'] = ":/designer/listview.png"
+        ret['icon'] = "designer:listview.png"
         ret['container'] = False
         ret['group'] = 'Taurus Views'
         return ret
-    
-    singleModelMode = Qt.pyqtProperty("bool", isSingleModelMode, setSingleModelMode, resetSingleModelMode)
-        
+
+    singleModelMode = Qt.pyqtProperty(
+        "bool", isSingleModelMode, setSingleModelMode, resetSingleModelMode)
+
+
 def main(args):
-    if len(sys.argv)>1: 
-        host=sys.argv[1]
-    else: 
+    if len(sys.argv) > 1:
+        host = sys.argv[1]
+    else:
         host = None
-    
+
     app = Qt.QApplication(args)
     print TaurusModelChooser.modelChooserDlg(host=host)
     sys.exit()
 
-if __name__=="__main__":
+if __name__ == "__main__":
     main(sys.argv)
diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py
index d8c0dda..b1369fb 100644
--- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py
+++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py
@@ -2,49 +2,52 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-itemsmodel Model and view for new CurveItem configuration 
+itemsmodel Model and view for new CurveItem configuration
 """
-__all__=['TaurusModelModel','TaurusModelItem', 'TaurusModelList']
+__all__ = ['TaurusModelModel', 'TaurusModelItem', 'TaurusModelList']
 #raise UnimplementedError('Under Construction!')
 
 import copy
 
 from taurus.external.qt import Qt
 import taurus
+from taurus.core.taurushelper import getSchemeFromName
 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
+from taurus.qt.qtgui.icon import getElementTypeIcon
+from taurus.qt.qtcore.util.signal import baseSignal
 
+# set some named constants
+SRC_ROLE = Qt.Qt.UserRole + 1
 
-#set some named constants
-SRC_ROLE =  Qt.Qt.UserRole + 1
 
 class TaurusModelItem(object):
-    '''An item object for :class:`TaurusModelModel`. Exposes `display` `icon` and `ok` 
+    '''An item object for :class:`TaurusModelModel`. Exposes `display` `icon` and `ok`
     attributes which are calculated and kept in synch with the property `src`'''
+
     def __init__(self, src=None, display=None):
         self.icon = Qt.QIcon()
         self.ok = True
@@ -52,85 +55,96 @@ class TaurusModelItem(object):
         self.setSrc(src)
         if display is not None:
             self.display = display
-        
+
     def __repr__(self):
-        ret = "TaurusModelItem('%s')"%(self.display)
+        ret = "TaurusModelItem('%s')" % (self.display)
         return ret
-    
+
     def getSrc(self):
         '''getter for src.'''
         return self._src
-    
+
     def setSrc(self, src):
         '''processes the src and sets the values of _src, display, icon and ok attributes'''
         if src is None:
-            self._src, self.display, self.icon, self.ok = '', '(Empty)', Qt.QIcon(),True
+            self._src, self.display, self.icon, self.ok = '', '(Empty)', Qt.QIcon(
+            ), True
             return
         src = str(src).strip()
         if src == self._src:
             return
         self._src = src
-        #empty
+        # empty
         if src == '':
-            self.display, self.icon, self.ok = '(Empty)', Qt.QIcon(),True
+            self.display, self.icon, self.ok = '(Empty)', Qt.QIcon(), True
             return
-        #for tango devices
+        # TODO tango-centric. For tango devices
         try:
             dev = taurus.Device(src)
-            if dev.isValidDev():
-                self.display, self.icon, self.ok = dev.getSimpleName(), getElementTypeIcon(TaurusElementType.Device), True
+            if dev.getDeviceProxy() is not None:
+                self.display, self.icon, self.ok = dev.getSimpleName(
+                ), getElementTypeIcon(TaurusElementType.Device), True
                 return
             else:
-                self.display, self.icon, self.ok = src, getThemeIcon('network-error'),False
+                self.display, self.icon, self.ok = src, Qt.QIcon.fromTheme(
+                    'network-error'), False
                 return
-        except:               
-            #for tango attributes
+        except:
+            # for tango attributes
             try:
-                attr = taurus.Attribute(src) 
+                attr = taurus.Attribute(src)
                 dev = attr.getParentObj()
             except TaurusException:
-                self.display, self.icon, self.ok = src, getThemeIcon('dialog-warning'), False
+                self.display, self.icon, self.ok = src, Qt.QIcon.fromTheme(
+                    'dialog-warning'), False
                 return
-            except Exception: #@todo: this catchall except is here as an emergency bugfix, but should probably be narrowed to PyTango DevFailed. 
-                self.display, self.icon, self.ok = src, getThemeIcon('network-error'),False
+            except Exception:  # @todo: this catchall except is here as an emergency bugfix, but should probably be narrowed to PyTango DevFailed.
+                self.display, self.icon, self.ok = src, Qt.QIcon.fromTheme(
+                    'network-error'), False
                 return
-            if not dev.isValidDev():
-                self.display, self.icon, self.ok = src, getThemeIcon('network-error'),False
-                return
-            self.display, self.icon, self.ok = attr.getSimpleName(), getElementTypeIcon(TaurusElementType.Attribute),True
-        
-    #properties
+            if getSchemeFromName(attr.getFullName()) == "tango" and \
+                            dev.getDeviceProxy() is None:
+                    self.display, self.icon, self.ok = src, Qt.QIcon.fromTheme(
+                        'network-error'), False
+                    return
+
+            self.display, self.icon, self.ok = attr.getSimpleName(
+            ), getElementTypeIcon(TaurusElementType.Attribute), True
+
+    # properties
     src = property(getSrc, setSrc)
 
+
 class TaurusModelModel(Qt.QAbstractListModel):
     ''' A Qt data model for describing taurus models
     '''
 
-    def __init__(self,items=None):
-        if items is None: items=[]
-        super(TaurusModelModel,self).__init__()
+    def __init__(self, items=None):
+        if items is None:
+            items = []
+        super(TaurusModelModel, self).__init__()
         self.items = items
-    
+
     def addItem(self, item):
         '''appends an item to the internal list
-        
+
         :param item: (TaurusModelItem) '''
         self.items.append(item)
-        
+
     def dumpData(self):
         '''returns a deep copy of the internal item list representation'''
         return copy.deepcopy(self.items)
-    
-    def rowCount(self,index=Qt.QModelIndex()):
+
+    def rowCount(self, index=Qt.QModelIndex()):
         '''reimplemented from :class:`Qt.QAbstractListModel`'''
         return len(self.items)
-        
+
     def data(self, index, role=Qt.Qt.DisplayRole):
         '''reimplemented from :class:`Qt.QAbstractListModel`'''
         if not index.isValid() or not (0 <= index.row() < self.rowCount()):
             return Qt.QVariant()
         row = index.row()
-        #Display Role
+        # Display Role
         if role == Qt.Qt.DisplayRole:
             return Qt.QVariant(Qt.QString(self.items[row].display))
         elif role == Qt.Qt.DecorationRole:
@@ -146,13 +160,13 @@ class TaurusModelModel(Qt.QAbstractListModel):
         if role == Qt.Qt.EditRole:
             return Qt.QVariant(Qt.QString(self.items[row].src))
         return Qt.QVariant()
-        
+
     def flags(self, index):
         '''reimplemented from :class:`Qt.QAbstractListModel`'''
         if not index.isValid():
-            return Qt.Qt.ItemIsEnabled|Qt.Qt.ItemIsDropEnabled
-        return Qt.Qt.ItemFlags(Qt.Qt.ItemIsEnabled |Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsSelectable)
-                     
+            return Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsDropEnabled
+        return Qt.Qt.ItemFlags(Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsSelectable)
+
     def setData(self, index, value=None, role=Qt.Qt.EditRole):
         '''reimplemented from :class:`Qt.QAbstractListModel`'''
         if index.isValid() and (0 <= index.row() < self.rowCount()):
@@ -163,53 +177,57 @@ class TaurusModelModel(Qt.QAbstractListModel):
                 item.src = value
             elif role == Qt.Qt.DisplayRole:
                 item.display = value
-            self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),index, index)
-            return True 
+            self.dataChanged.emit(index, index)
+            return True
         return False
-    
-    def insertRows(self, position=None,rows=1, parentindex=None, items=None):
+
+    def insertRows(self, position=None, rows=1, parentindex=None, items=None):
         '''reimplemented from :class:`Qt.QAbstractListModel`'''
-        if position is None or position==-1: position = self.rowCount()
-        if parentindex is None: parentindex = Qt.QModelIndex()
+        if position is None or position == -1:
+            position = self.rowCount()
+        if parentindex is None:
+            parentindex = Qt.QModelIndex()
         if items is None:
             slice = [TaurusModelItem() for i in xrange(rows)]
         else:
-            slice=list(items)
-            rows = len(slice) #note that the rows parameter is ignored if items is passed
-        self.beginInsertRows(parentindex, position, position + rows -1)
-        self.items = self.items[:position]+slice+self.items[position:]
+            slice = list(items)
+            # note that the rows parameter is ignored if items is passed
+            rows = len(slice)
+        self.beginInsertRows(parentindex, position, position + rows - 1)
+        self.items = self.items[:position] + slice + self.items[position:]
         self.endInsertRows()
         return True
-        
-    def removeRows(self, position,rows=1,parentindex=None):
+
+    def removeRows(self, position, rows=1, parentindex=None):
         '''reimplemented from :class:`Qt.QAbstractListModel`'''
-        if parentindex is None: parentindex = Qt.QModelIndex()
+        if parentindex is None:
+            parentindex = Qt.QModelIndex()
         self.beginRemoveRows(parentindex, position, position + rows - 1)
-        self.items = self.items[:position]+self.items[position+rows:]
+        self.items = self.items[:position] + self.items[position + rows:]
         self.endRemoveRows()
         self.reset()
         return True
-    
+
     def clearAll(self):
         '''clears all rows'''
         self.removeRows(0, self.rowCount())
-        
+
     def swapItems(self, index1, index2):
         '''swap the items described by index1 and index2 in the list'''
         r1, r2 = index1.row(), index2.row()
         self.items[r1], self.items[r2] = self.items[r2], self.items[r1]
-        self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),index1, index2)
-    
+        self.dataChanged.emit(index1, index2)
+
     def mimeTypes(self):
         '''reimplemented from :class:`Qt.QAbstractListModel`'''
         result = list(Qt.QAbstractItemModel.mimeTypes(self))
-        result += [TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE, 
+        result += [TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE,
                    TAURUS_MODEL_LIST_MIME_TYPE, 'text/plain']
         return result
-    
+
     def dropMimeData(self, data, action, row, column, parent):
         '''reimplemented from :class:`Qt.QAbstractListModel`'''
-        if row == -1 and parent.isValid(): 
+        if row == -1 and parent.isValid():
             row = parent.row()
         if data.hasFormat(TAURUS_ATTR_MIME_TYPE):
             items = [str(data.data(TAURUS_ATTR_MIME_TYPE))]
@@ -223,186 +241,206 @@ class TaurusModelModel(Qt.QAbstractListModel):
             return False
         self.insertItems(row, items)
         return True
-    
+
     def insertItems(self, row, items):
         '''convenience method to add new rows by passing a list of strings ()
-        
-        :param row: (int) the row of the list at which the item insertion 
+
+        :param row: (int) the row of the list at which the item insertion
                          starts, if row==-1, items will be appended to the list
-        :param items: (seq) a sequence items to add to the list. The objects 
+        :param items: (seq) a sequence items to add to the list. The objects
                       in the sequence can be either strings, :class:`TaurusModelItem` objects
                       or tuples of valid arguments for initializing :class:`TaurusModelItem` objects
         '''
         itemobjs = []
         for e in items:
-            if isinstance(e,TaurusModelItem): 
+            if isinstance(e, TaurusModelItem):
                 itemobjs.append(e)
-            elif isinstance(e,basestring):
+            elif isinstance(e, basestring):
                 itemobjs.append(TaurusModelItem(src=e))
-            else: #assuming it is a sequence of arguments that can be passed to the constructor of TaurusModelItem
+            else:  # assuming it is a sequence of arguments that can be passed to the constructor of TaurusModelItem
                 itemobjs.append(TaurusModelItem(*e))
-        self.insertRows(position=row,items=itemobjs)
-    
+        self.insertRows(position=row, items=itemobjs)
+
     def mimeData(self, indexes):
         '''reimplemented from :class:`Qt.QAbstractListModel`'''
         mimedata = Qt.QAbstractListModel.mimeData(self, indexes)
-        if len(indexes)==1:
-#            mimedata.setData(TAURUS_ATTR_MIME_TYPE, Qt.from_qvariant(self.data(indexes[0]), str)))
-            txt = Qt.from_qvariant(self.data(indexes[0],role=SRC_ROLE), str)
+        if len(indexes) == 1:
+            # mimedata.setData(TAURUS_ATTR_MIME_TYPE,
+            # Qt.from_qvariant(self.data(indexes[0]), str)))
+            txt = Qt.from_qvariant(self.data(indexes[0], role=SRC_ROLE), str)
             mimedata.setText(txt)
         return mimedata
-        #mimedata.setData()
-    
+        # mimedata.setData()
+
 
 class TaurusModelList(Qt.QListView):
     '''A list view widget to display and manage a list of models
-    
+
     Tries to identify the type of model and show the state of the device/attr
     associated with it. It also allows drag and drop of models and sorting.
     '''
-    
+
+    dataChangedSignal = Qt.pyqtSignal(list, name="dataChanged")
+
     def __init__(self, parent=None, items=None, designMode=False):
-        super(TaurusModelList,self).__init__(parent)
-        if items is None: items = []
+        super(TaurusModelList, self).__init__(parent)
+        if items is None:
+            items = []
         self._model = TaurusModelModel(items)
         self.setModel(self._model)
         self.setDragDropMode(self.DragDrop)
-        #self.setAcceptDrops(True)
+        # self.setAcceptDrops(True)
         self.setSelectionMode(self.ExtendedSelection)
-        
+
         self._contextMenu = Qt.QMenu(self)
-        self.addRowAction = self._contextMenu.addAction(getThemeIcon('list-add'), 'Add new row', self.newRow, Qt.QKeySequence.New)
-        self.removeSelectedAction = self._contextMenu.addAction(getThemeIcon('list-remove'), 'Remove Selected', self.removeSelected, Qt.QKeySequence.Delete)
-        self.removeAllAction = self._contextMenu.addAction(getThemeIcon('edit-clear'), 'Clear all', self.clear, Qt.QKeySequence("Ctrl+Del"))
-        self.moveUpAction = self._contextMenu.addAction(getThemeIcon('go-up'), 'Move up in the list', self._onMoveUpAction, Qt.QKeySequence("Alt+Up"))
-        self.moveDownAction = self._contextMenu.addAction(getThemeIcon('go-down'), 'Move down in the list', self._onMoveDownAction, Qt.QKeySequence("Alt+Down"))
-        self.editDisplayAction = self._contextMenu.addAction(getIcon(':/actions/format-text-italic.svg'), 'Edit the display (leave the source)', self._onEditDisplay, Qt.QKeySequence("Alt+D"))
-        
-        self.addActions([self.addRowAction,self.removeSelectedAction,self.removeAllAction,self.moveUpAction,self.moveDownAction, self.editDisplayAction])
-        
-        #signal connections
+        self.addRowAction = self._contextMenu.addAction(Qt.QIcon.fromTheme(
+            'list-add'), 'Add new row', self.newRow, Qt.QKeySequence.New)
+        self.removeSelectedAction = self._contextMenu.addAction(
+            Qt.QIcon.fromTheme('list-remove'), 'Remove Selected',
+            self.removeSelected, Qt.QKeySequence.Delete)
+        self.removeAllAction = self._contextMenu.addAction(Qt.QIcon.fromTheme(
+            'edit-clear'), 'Clear all', self.clear, Qt.QKeySequence("Ctrl+Del"))
+        self.moveUpAction = self._contextMenu.addAction(Qt.QIcon.fromTheme(
+            'go-up'), 'Move up in the list', self._onMoveUpAction, Qt.QKeySequence("Alt+Up"))
+        self.moveDownAction = self._contextMenu.addAction(Qt.QIcon.fromTheme(
+            'go-down'), 'Move down in the list', self._onMoveDownAction, Qt.QKeySequence("Alt+Down"))
+        self.editDisplayAction = self._contextMenu.addAction(
+            Qt.QIcon("actions:format-text-italic.svg"),
+            'Edit the display (leave the source)', self._onEditDisplay,
+            Qt.QKeySequence("Alt+D"))
+
+        self.addActions([self.addRowAction, self.removeSelectedAction, self.removeAllAction,
+                         self.moveUpAction, self.moveDownAction, self.editDisplayAction])
+
+        # signal connections
         selectionmodel = self.selectionModel()
-        self.connect(selectionmodel, Qt.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"), self._onSelectionChanged)
-        self.connect(self._model, Qt.SIGNAL("dataChanged (QModelIndex, QModelIndex)"), self._onDataChanged)
-        self.connect(self._model, Qt.SIGNAL("rowsInserted (QModelIndex, int, int)"), self._onDataChanged)
-        self.connect(self._model, Qt.SIGNAL("rowsRemoved (QModelIndex, int, int)"), self._onDataChanged)
-        self._onSelectionChanged(Qt.QItemSelection(),Qt.QItemSelection())
-    
+        selectionmodel.selectionChanged.connect(self._onSelectionChanged)
+        self._model.dataChanged.connect(self._onDataChanged)
+        self._model.rowsInserted.connect(self._onDataChanged)
+        self._model.rowsRemoved.connect(self._onDataChanged)
+        self._onSelectionChanged(Qt.QItemSelection(), Qt.QItemSelection())
+
     def clear(self):
         '''removes all items from the list'''
         self._model.clearAll()
-        
+
     def _onEditDisplay(self):
         selected = self.selectionModel().selectedIndexes()
-        if len(selected)==1:
+        if len(selected) == 1:
             idx = selected[0]
         else:
             return
-        value = Qt.from_qvariant(self._model.data(idx, role=Qt.Qt.DisplayRole), str)
+        value = Qt.from_qvariant(self._model.data(
+            idx, role=Qt.Qt.DisplayRole), str)
         src = Qt.from_qvariant(self._model.data(idx, role=SRC_ROLE), str)
-        value,ok = Qt.QInputDialog.getText(self, "Display Value", "Display value for %s?"%src, Qt.QLineEdit.Normal, value)
+        value, ok = Qt.QInputDialog.getText(
+            self, "Display Value", "Display value for %s?" % src, Qt.QLineEdit.Normal, value)
         if not ok:
             return
         self._model.setData(idx, Qt.QVariant(value), role=Qt.Qt.DisplayRole)
-    
+
     def _onSelectionChanged(self, selected, deselected):
         '''updates the status of the actions that depend on the selection'''
         selectedIndexes = self.selectionModel().selectedRows()
-        self.removeSelectedAction.setEnabled(len(selectedIndexes)>0)
-        self.moveUpAction.setEnabled(len(selectedIndexes)==1 and selectedIndexes[0].row()>0)
-        self.moveDownAction.setEnabled(len(selectedIndexes)==1 and (0 <= selectedIndexes[0].row() < self._model.rowCount()-1))
-        self.editDisplayAction.setEnabled(len(selectedIndexes)>0)
-    
+        self.removeSelectedAction.setEnabled(len(selectedIndexes) > 0)
+        self.moveUpAction.setEnabled(
+            len(selectedIndexes) == 1 and selectedIndexes[0].row() > 0)
+        self.moveDownAction.setEnabled(len(selectedIndexes) == 1 and (
+            0 <= selectedIndexes[0].row() < self._model.rowCount() - 1))
+        self.editDisplayAction.setEnabled(len(selectedIndexes) > 0)
+
     def _onDataChanged(self, *args):
         '''emits a signal containing the current data as a list of strings'''
-        self.emit(Qt.SIGNAL("dataChanged"), self.getModelItems())
-        
+        self.dataChangedSignal.emit(self.getModelItems())
+
     def contextMenuEvent(self, event):
         '''see :meth:`QWidget.contextMenuEvent`'''
         self._contextMenu.exec_(event.globalPos())
-        event.accept()    
-    
+        event.accept()
+
     def _onMoveUpAction(self):
         '''slot for move up action'''
         selected = self.selectionModel().selectedIndexes()
-        if len(selected)!=1:
+        if len(selected) != 1:
             return
-        i1 =  selected[0]
-        i2 = self._model.index(i1.row()-1)
+        i1 = selected[0]
+        i2 = self._model.index(i1.row() - 1)
         self._model.swapItems(i1, i2)
-        self.selectionModel().select(i2, Qt.QItemSelectionModel.ClearAndSelect)       
-    
-    def _onMoveDownAction(self):        
+        self.selectionModel().select(i2, Qt.QItemSelectionModel.ClearAndSelect)
+
+    def _onMoveDownAction(self):
         '''slot for move down action'''
         selected = self.selectionModel().selectedIndexes()
-        if len(selected)!=1:
+        if len(selected) != 1:
             return
-        i1 =  selected[0]
-        i2 = self._model.index(i1.row()+1)
-        self._model.swapItems(i1, i2) 
-        self.selectionModel().select(i2, Qt.QItemSelectionModel.ClearAndSelect) 
-        
-    def newRow(self,position=None):
+        i1 = selected[0]
+        i2 = self._model.index(i1.row() + 1)
+        self._model.swapItems(i1, i2)
+        self.selectionModel().select(i2, Qt.QItemSelectionModel.ClearAndSelect)
+
+    def newRow(self, position=None):
         '''adds an empty row *before* the given position
-        
+
         :param position: (int or None) position at which the new row will be added.
                          If None passed, it will be added at the end.
         '''
         if position is None:
             selected = self.selectionModel().selectedIndexes()
-            if len(selected)==0:
+            if len(selected) == 0:
                 position = -1
             elif len(selected) == 1:
                 position = selected[0].row()
             else:
                 return
-        self._model.insertItems(position,[''])
-    
+        self._model.insertItems(position, [''])
+
     def removeSelected(self):
         '''removes selected items from the list'''
-        selected = sorted([idx.row() for idx in self.selectionModel().selectedRows()], reverse=True)
-        for row in selected: #we remove rows starting from the last one
+        selected = sorted(
+            [idx.row() for idx in self.selectionModel().selectedRows()], reverse=True)
+        for row in selected:  # we remove rows starting from the last one
             self._model.removeRows(row)
-        
+
     def addModels(self, models):
         '''adds models to the list
-        
+
         :param models: (list<str>) sequence of model names to be added
         '''
         self._model.insertItems(-1, models)
-            
+
     def getModelItems(self):
         '''returns the model item objects
-        
+
         :return: (list<TaurusModelItem>)
-        
+
         .. seealso:: :meth:`getModelList`
         '''
         return self._model.dumpData()
-    
+
     def getModelList(self):
         '''returns a the model names corresponding to the items in the list
-        
+
         :return: (list<str>)
-        
+
         .. seealso:: :meth:`getModelItems`
         '''
         return [unicode(s.src) for s in self.getModelItems()]
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
-        return { 
-            'group'     : 'Taurus Input',
-            'icon'      : ':/designer/taurus.png',
-            'container' : False,
-            'module'    : 'taurus.qt.qtgui.panel'
-             }
+        return {
+            'group': 'Taurus Input',
+            'icon': 'logos:taurus.png',
+            'container': False,
+            'module': 'taurus.qt.qtgui.panel'
+        }
 
 if __name__ == "__main__":
     from taurus.qt.qtgui.application import TaurusApplication
     import sys
-    app = TaurusApplication()  
+    app = TaurusApplication()
     w = TaurusModelList()
-    w.addModels(["item%i"%i for i in range(3)]+[TaurusModelItem(src='src1',display='d1')]+[('src2','d2')])
-    w.show()    
-    sys.exit(app.exec_()) 
+    w.addModels(["item%i" % i for i in range(3)] +
+                [TaurusModelItem(src='src1', display='d1')] + [('src2', 'd2')])
+    w.show()
+    sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py
index dff58d2..9eae372 100644
--- a/lib/taurus/qt/qtgui/panel/taurusvalue.py
+++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-taurusvalue.py: 
+taurusvalue.py:
 """
 
 __all__ = ["TaurusValue", "TaurusValuesFrame", "DefaultTaurusValueCheckBox", "DefaultLabelWidget",
@@ -34,9 +34,10 @@ __all__ = ["TaurusValue", "TaurusValuesFrame", "DefaultTaurusValueCheckBox", "De
 __docformat__ = 'restructuredtext'
 
 import weakref
+import re
 from taurus.external.qt import Qt
-import PyTango
 import taurus.core
+from taurus.core import DataType, DataFormat
 
 from taurus.core.taurusbasetypes import TaurusElementType
 from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE
@@ -53,81 +54,120 @@ from taurus.qt.qtgui.compact import TaurusReadWriteSwitcher
 
 
 class DefaultTaurusValueCheckBox(TaurusValueCheckBox):
-    def __init__(self,*args):
-        TaurusValueCheckBox.__init__(self,*args)
+
+    def __init__(self, *args):
+        TaurusValueCheckBox.__init__(self, *args)
         self.setShowText(False)
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
         return None
-    
+
+
 class DefaultLabelWidget(TaurusLabel):
     '''
-    The base class used by default for showing the label of a TaurusValue. 
-        
+    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 
+              since it assumes that it can get a reference to a TaurusValue via
               the :meth:`getTaurusValueBuddy` member
     '''
-    
-    _dragEnabled=True
-    
-    def __init__(self,*args):
-        TaurusLabel.__init__(self,*args)
+
+    _dragEnabled = True
+
+    def __init__(self, *args):
+        TaurusLabel.__init__(self, *args)
         self.setAlignment(Qt.Qt.AlignRight)
-        self.setSizePolicy(Qt.QSizePolicy.Preferred,Qt.QSizePolicy.Maximum)
+        self.setSizePolicy(Qt.QSizePolicy.Preferred, Qt.QSizePolicy.Maximum)
         self.setBgRole(None)
         self.autoTrim = False
-        self.setStyleSheet('DefaultLabelWidget {border-style: solid; border-width: 1px; border-color: transparent; border-radius: 4px;}')
-    
+        self.setStyleSheet(
+            'DefaultLabelWidget {border-style: solid; border-width: 1px; border-color: transparent; border-radius: 4px;}')
+
     def setModel(self, model):
-        if model is None or model=='': 
+        if model is None or model == '':
             return TaurusLabel.setModel(self, None)
-        try: config = self.taurusValueBuddy().getLabelConfig()
-        except Exception: config = 'label'
+        try:
+            config = self.taurusValueBuddy().getLabelConfig()
+        except Exception:
+            config = 'label'
         elementtype = self.taurusValueBuddy().getModelType()
+        fullname = self.taurusValueBuddy().getModelObj().getFullName()
         if elementtype == TaurusElementType.Attribute:
             config = self.taurusValueBuddy().getLabelConfig()
-            TaurusLabel.setModel(self, model + "?configuration=%s"%config)
+            TaurusLabel.setModel(self, '%s#%s' % (fullname, config))
         elif elementtype == TaurusElementType.Device:
-            TaurusLabel.setModel(self, model + "/state?configuration=dev_alias")
-    
+            # @TODO: tango-centric!
+            # TaurusLabel.setModel(self, '%s/state#dev_alias'%fullname)
+            #
+            # The following is a workaround to avoid tango-centricity, but
+            # it has the drawback that the model is not set (e.g., no tooltip)
+            devName = self.taurusValueBuddy().getModelObj().getSimpleName()
+            TaurusLabel.setModel(self, None)
+            self.setText(devName)
+
+    _BCK_COMPAT_TAGS = {'<attr_name>': '{attr.name}',
+                        '<attr_fullname>': '{attr.fullname}',
+                        '<dev_alias>': '{dev.name}',
+                        '<dev_name>': '{dev_name}',
+                        '<dev_fullname>': '{dev.fullname}',
+                        }
+
+    def getDisplayValue(self, cache=True, fragmentName=None):
+        if self.modelObj is None or fragmentName is None:
+            return self.getNoneValue()
+        # support bck-compat tags
+        for old in re.findall('<.+?>', fragmentName):
+            new = self._BCK_COMPAT_TAGS.get(old, '{attr.%s}' % old)
+            self.deprecated(dep=old, alt=new)
+            fragmentName = fragmentName.replace(old, new)
+        attr = self.getModelObj()
+        dev = attr.getParent()
+        return fragmentName.format(dev=dev, attr=attr)
+
     def sizeHint(self):
         return Qt.QSize(Qt.QLabel.sizeHint(self).width(), 18)
-    
-    def contextMenuEvent(self,event):   
+
+    def contextMenuEvent(self, event):
         """ The label widget will be used for handling the actions of the whole TaurusValue
-        
+
         see :meth:`QWidget.contextMenuEvent`"""
-        menu = Qt.QMenu(self)  
-        menu.addMenu(ConfigurationMenu(self.taurusValueBuddy())) #@todo: This should be done more Taurus-ish 
+        menu = Qt.QMenu(self)
+        # @todo: This should be done more Taurus-ish
+        menu.addMenu(ConfigurationMenu(self.taurusValueBuddy()))
         if hasattr(self.taurusValueBuddy().writeWidget(followCompact=True), 'resetPendingOperations'):
-            r_action = menu.addAction("reset write value",self.taurusValueBuddy().writeWidget(followCompact=True).resetPendingOperations)
+            r_action = menu.addAction("reset write value", self.taurusValueBuddy(
+            ).writeWidget(followCompact=True).resetPendingOperations)
             r_action.setEnabled(self.taurusValueBuddy().hasPendingOperations())
         if self.taurusValueBuddy().isModifiableByUser():
-            menu.addAction("Change label",self.taurusValueBuddy().onChangeLabelConfig)
-            menu.addAction("Change Read Widget",self.taurusValueBuddy().onChangeReadWidget)
-            cw_action = menu.addAction("Change Write Widget",self.taurusValueBuddy().onChangeWriteWidget)
-            cw_action.setEnabled(not self.taurusValueBuddy().isReadOnly()) #disable the action if the taurusValue is readonly
+            menu.addAction("Change label",
+                           self.taurusValueBuddy().onChangeLabelConfig)
+            menu.addAction("Change Read Widget",
+                           self.taurusValueBuddy().onChangeReadWidget)
+            cw_action = menu.addAction(
+                "Change Write Widget", self.taurusValueBuddy().onChangeWriteWidget)
+            # disable the action if the taurusValue is readonly
+            cw_action.setEnabled(not self.taurusValueBuddy().isReadOnly())
             cm_action = menu.addAction("Compact")
             cm_action.setCheckable(True)
             cm_action.setChecked(self.taurusValueBuddy().isCompact())
-            self.connect(cm_action, Qt.SIGNAL("toggled(bool)"), self.taurusValueBuddy().setCompact)
-            
-            
+            cm_action.toggled.connect(self.taurusValueBuddy().setCompact)
         menu.exec_(event.globalPos())
         event.accept()
-        
+
     def getModelMimeData(self):
         '''reimplemented to use the taurusValueBuddy model instead of its own model'''
         mimeData = TaurusLabel.getModelMimeData(self)
-        mimeData.setData(TAURUS_MODEL_MIME_TYPE, self.taurusValueBuddy().getModelName())
+        mimeData.setData(TAURUS_MODEL_MIME_TYPE,
+                         self.taurusValueBuddy().getModelName())
         if self.taurusValueBuddy().getModelType() == TaurusElementType.Device:
-            mimeData.setData(TAURUS_DEV_MIME_TYPE, self.taurusValueBuddy().getModelName())
+            mimeData.setData(TAURUS_DEV_MIME_TYPE,
+                             self.taurusValueBuddy().getModelName())
         elif self.taurusValueBuddy().getModelType() == TaurusElementType.Attribute:
-            mimeData.setData(TAURUS_ATTR_MIME_TYPE, self.taurusValueBuddy().getModelName())
+            mimeData.setData(TAURUS_ATTR_MIME_TYPE,
+                             self.taurusValueBuddy().getModelName())
         return mimeData
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         return None
@@ -135,79 +175,101 @@ class DefaultLabelWidget(TaurusLabel):
 
 class ExpandingLabel(TaurusLabel):
     '''just a expanding TaurusLabel'''
-    def __init__(self,*args):
-        TaurusLabel.__init__(self,*args)
+
+    def __init__(self, *args):
+        TaurusLabel.__init__(self, *args)
         self.setSizePolicy(Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Preferred)
 
 
+class DefaultReadWidgetLabel(ExpandingLabel):
+    """A customised label for the read widget"""
+
+    def setModel(self, m):
+        TaurusLabel.setModel(self, m)
+        fgrole = 'rvalue'
+        model_obj = self.getModelObj()
+        if model_obj is None:
+            return
+        if model_obj.getType() in (DataType.Integer, DataType.Float):
+            fgrole += '.magnitude'
+        self.setFgRole(fgrole)
+
+
 class CenteredLed(TaurusLed):
     '''just a centered TaurusLed'''
     DefaultAlignment = Qt.Qt.AlignHCenter | Qt.Qt.AlignVCenter
-        
-        
+
+
 class DefaultUnitsWidget(TaurusLabel):
-    def __init__(self,*args):
-        TaurusLabel.__init__(self,*args)
+
+    def __init__(self, *args):
+        TaurusLabel.__init__(self, *args)
         self.setNoneValue('')
-        self.setSizePolicy(Qt.QSizePolicy.Preferred,Qt.QSizePolicy.Maximum)
+        self.setSizePolicy(Qt.QSizePolicy.Preferred, Qt.QSizePolicy.Maximum)
         self.autoTrim = False
         self.setBgRole(None)
         self.setAlignment(Qt.Qt.AlignLeft)
-        
+
     def setModel(self, model):
-        if model is None or model=='': 
+        if model is None or model == '':
             return TaurusLabel.setModel(self, None)
-        TaurusLabel.setModel(self, model + "?configuration=unit") #@todo: tango-centric!
+        TaurusLabel.setModel(self, model + "#rvalue.units")
+
     def sizeHint(self):
-        #print "UNITSSIZEHINT:",Qt.QLabel.sizeHint(self).width(), self.minimumSizeHint().width(), Qt.QLabel.minimumSizeHint(self).width()
+        # print "UNITSSIZEHINT:",Qt.QLabel.sizeHint(self).width(),
+        # self.minimumSizeHint().width(),
+        # Qt.QLabel.minimumSizeHint(self).width()
         return Qt.QSize(Qt.QLabel.sizeHint(self).width(), 24)
- 
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         return None
-    
+
 
 class _AbstractTaurusValueButton(TaurusLauncherButton):
     _deleteWidgetOnClose = True
     _text = 'Show'
-    def __init__(self, parent = None, designMode = False):
-        TaurusLauncherButton.__init__(self, parent = parent, designMode = designMode)
+
+    def __init__(self, parent=None, designMode=False):
+        TaurusLauncherButton.__init__(
+            self, parent=parent, designMode=designMode)
         self.setSizePolicy(Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Maximum)
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
         return None
-    
-    
+
+
 class TaurusPlotButton(_AbstractTaurusValueButton):
     '''A button that launches a TaurusPlot'''
     _widgetClassName = 'TaurusPlot'
-    _icon = ':/designer/qwtplot.png'
-    
+    _icon = 'designer:qwtplot.png'
+
 
 class TaurusArrayEditorButton(_AbstractTaurusValueButton):
     '''A button that launches a TaurusArrayEditor'''
     _widgetClassName = 'TaurusArrayEditor'
-    _icon = ':/designer/arrayedit.png'
+    _icon = 'designer:arrayedit.png'
     _text = 'Edit'
-    
-    
+
+
 class TaurusImageButton(_AbstractTaurusValueButton):
     '''A button that launches a TaurusPlot'''
     _widgetClassName = 'TaurusImageDialog'
     _icon = ':/mimetypes/image-x-generic.svg'
-    
+
 
 class TaurusValuesTableButton(_AbstractTaurusValueButton):
     '''A button that launches a TaurusValuesTable'''
     _widgetClassName = 'TaurusValuesTable'
-    _icon  = ':/designer/table.png'
+    _icon = 'designer:table.png'
+    _kwargs = {'defaultWriteMode': 'r'}
 
 
 class TaurusValuesTableButton_W(TaurusValuesTableButton):
     '''A button that launches a TaurusValuesTable'''
     _text = 'Edit'
-    _kwargs={'defaultWriteMode':True}
+    _kwargs = {'defaultWriteMode': 'w'}
 
 
 class TaurusDevButton(_AbstractTaurusValueButton):
@@ -219,11 +281,12 @@ class TaurusDevButton(_AbstractTaurusValueButton):
 
 class TaurusStatusLabel(TaurusLabel):
     '''just a taurusLabel but showing the state as its background by default'''
-    def __init__(self, parent = None, designMode = False):
-        TaurusLabel.__init__(self, parent = parent, designMode = designMode)
+
+    def __init__(self, parent=None, designMode=False):
+        TaurusLabel.__init__(self, parent=parent, designMode=designMode)
         self.setBgRole('state')
-        self.setSizePolicy(Qt.QSizePolicy.Expanding,Qt.QSizePolicy.Maximum)
-        
+        self.setSizePolicy(Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Maximum)
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         return None
@@ -232,47 +295,46 @@ class TaurusStatusLabel(TaurusLabel):
 class TaurusValue(Qt.QWidget, TaurusBaseWidget):
     '''
     Internal TaurusValue class
-    
+
     .. warning::
-    
-        :class:`TaurusValue` (and any derived class from it) should never be instantiated directly. 
+
+        :class:`TaurusValue` (and any derived class from it) should never be instantiated directly.
         It is designed to be instantiated by a :class:`TaurusForm` class, since it
         breaks some conventions on the way it manages layouts of its parent model.
     '''
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
     _compact = False
-    
-    def __init__(self, parent = None, designMode = False, customWidgetMap=None):
+
+    def __init__(self, parent=None, designMode=False, customWidgetMap=None):
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QWidget, parent)
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-        
+
         self.__modelClass = None
-        self._designMode=designMode
-        
-        #This is a hack to show something usable when in designMode
+        self._designMode = designMode
+
+        # This is a hack to show something usable when in designMode
         if self._designMode:
             layout = Qt.QHBoxLayout(self)
             dummy = ExpandingLabel()
             layout.addWidget(dummy)
             dummy.setUseParentModel(True)
-            dummy.setModel("?configuration=attr_fullname") 
+            dummy.setModel("#attr_fullname")
             dummy.setPrefixText("< TaurusValue: ")
             dummy.setSuffixText(" >")
         else:
-            self.setFixedSize(0,0)
-        
+            self.setFixedSize(0, 0)
+
         self._labelWidget = None
         self._readWidget = None
         self._writeWidget = None
         self._unitsWidget = None
         self._customWidget = None
         self._extraWidget = None
-        
+
         if customWidgetMap is None:
             customWidgetMap = {}
         self.setCustomWidgetMap(customWidgetMap)
-        
+
         self.labelWidgetClassID = 'Auto'
         self.readWidgetClassID = 'Auto'
         self.writeWidgetClassID = 'Auto'
@@ -281,129 +343,134 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
         self.extraWidgetClassID = 'Auto'
         self.setPreferredRow(-1)
         self._row = None
-        
+
         self._allowWrite = True
         self._minimumHeight = None
-        self._labelConfig = 'label'
+        self._labelConfig = '{attr.label}'
         self.setModifiableByUser(False)
-        
+
         if parent is not None:
             self.setParent(parent)
-            
-        self.registerConfigProperty(self.getLabelConfig, self.setLabelConfig, 'labelConfig')
+
+        self.registerConfigProperty(
+            self.getLabelConfig, self.setLabelConfig, 'labelConfig')
         self.registerConfigProperty(self.isCompact, self.setCompact, 'compact')
-            
+
     def setVisible(self, visible):
         for w in (self.labelWidget(), self.readWidget(), self.writeWidget(), self.unitsWidget(), self.customWidget(), self.extraWidget()):
-            if w is not None: w.setVisible(visible)
+            if w is not None:
+                w.setVisible(visible)
         Qt.QWidget.setVisible(self, visible)
-    
+
     def labelWidget(self):
         '''Returns the label widget'''
         return self._labelWidget
-    
+
     def readWidget(self, followCompact=False):
         '''
-        Returns the read widget. If followCompact=True, and compact mode is 
-        used, it returns the switcher's readWidget instead of the switcher 
+        Returns the read widget. If followCompact=True, and compact mode is
+        used, it returns the switcher's readWidget instead of the switcher
         itself.
         '''
         if followCompact and self.isCompact():
             return self._readWidget.readWidget
         return self._readWidget
-    
+
     def writeWidget(self, followCompact=False):
         '''
-        Returns the write widget. If followCompact=True, and compact mode is 
+        Returns the write widget. If followCompact=True, and compact mode is
         used, it returns the switcher's writeWidget instead of None.
         '''
         if followCompact and self.isCompact():
-            return getattr(self._readWidget,'writeWidget', None)
+            return getattr(self._readWidget, 'writeWidget', None)
         return self._writeWidget
-    
+
     def unitsWidget(self):
         '''Returns the units widget'''
         return self._unitsWidget
-    
+
     def customWidget(self):
         '''Returns the custom widget'''
         return self._customWidget
-    
+
     def extraWidget(self):
         '''Returns the extra widget'''
         return self._extraWidget
-    
+
     def setParent(self, parent):
-   
-        #make sure that the parent has a QGriLayout
-        pl=parent.layout()
+
+        # make sure that the parent has a QGriLayout
+        pl = parent.layout()
         if pl is None:
-            pl = Qt.QGridLayout(parent) #creates AND sets the parent layout
+            pl = Qt.QGridLayout(parent)  # creates AND sets the parent layout
         if not isinstance(pl, Qt.QGridLayout):
-            raise ValueError('layout must be a QGridLayout (got %s)'%type(pl))
-        
+            raise ValueError(
+                'layout must be a QGridLayout (got %s)' % type(pl))
+
         if self._row is None:
-            self._row = self.getPreferredRow()  #@TODO we should check that the Preferred row is empty in pl
+            # @TODO we should check that the Preferred row is empty in pl
+            self._row = self.getPreferredRow()
             if self._row < 0:
                 self._row = pl.rowCount()
-        #print 'ROW:',self, self.getRow()
-        
-        #insert self into the 0-column
-        pl.addWidget(self, self._row, 0) #this widget is invisible (except in design mode)
-        
-        #Create/update the subwidgets (this also inserts them in the layout)
-        if not self._designMode:  #in design mode, no subwidgets are created
+        # print 'ROW:',self, self.getRow()
+
+        # insert self into the 0-column
+        # this widget is invisible (except in design mode)
+        pl.addWidget(self, self._row, 0)
+
+        # Create/update the subwidgets (this also inserts them in the layout)
+        if not self._designMode:  # in design mode, no subwidgets are created
             self.updateLabelWidget()
             self.updateReadWidget()
             self.updateWriteWidget()
             self.updateUnitsWidget()
             self.updateExtraWidget()
-        
+
 #        self.updateCustomWidget()
-        
-        #do the base class stuff too    
-        Qt.QWidget.setParent(self,parent)
-        
+
+        # do the base class stuff too
+        Qt.QWidget.setParent(self, parent)
+
     def getAllowWrite(self):
         return self._allowWrite
-    
-    @Qt.pyqtSignature("setAllowWrite(bool)")
+
+    @Qt.pyqtSlot(bool)
     def setAllowWrite(self, mode):
         self._allowWrite = mode
-    
+
     def resetAllowWrite(self):
         self._allowWrite = True
-    
+
     def getPreferredRow(self):
         return self._preferredRow
-    
-    @Qt.pyqtSignature("setPreferredRow(int)")
-    def setPreferredRow(self,row):
-        self._preferredRow=row
-        
+
+    @Qt.pyqtSlot(int)
+    def setPreferredRow(self, row):
+        self._preferredRow = row
+
     def resetPreferredRow(self):
         self.setPreferredRow(-1)
-        
+
     def getRow(self):
         return self._row
-    
+
     def setMinimumHeight(self, minimumHeight):
         self._minimumHeight = minimumHeight
-        
+
     def minimumHeight(self):
         return self._minimumHeight
-    
+
     def getDefaultLabelWidgetClass(self):
         return DefaultLabelWidget
-     
+
     def getDefaultReadWidgetClass(self, returnAll=False):
         '''
         Returns the default class (or classes) to use as read widget for the
         current model.
-        
+
         :param returnAll: (bool) if True, the return value is a list of valid
                           classes instead of just one class
-        
+
         :return: (class or list<class>) the default class  to use for the read
                  widget (or, if returnAll==True, a list of classes that can show
                  the attribute ). If a list is returned, it will be loosely
@@ -411,68 +478,73 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
                  default one.
         '''
         modelobj = self.getModelObj()
-        if modelobj is None: 
-            if returnAll: return [ExpandingLabel]
-            else: return ExpandingLabel
-        
+        if modelobj is None:
+            if returnAll:
+                return [DefaultReadWidgetLabel]
+            else:
+                return DefaultReadWidgetLabel
+
         modeltype = self.getModelType()
-        if  modeltype == TaurusElementType.Attribute:
-            ##The model is an attribute
-            config = modelobj.getConfig()
-            #print "---------ATTRIBUTE OBJECT:----------\n",modelobj.read()
-            try: configType = config.getType()
-            except: configType = None
+        if modeltype == TaurusElementType.Attribute:
+            # The model is an attribute
+            # print "---------ATTRIBUTE OBJECT:----------\n",modelobj.read()
             try:
-                if config.isBoolean():
-                    result = [CenteredLed, ExpandingLabel]
+                if modelobj.isBoolean():
+                    result = [CenteredLed, DefaultReadWidgetLabel]
             except:
                 pass
-            if config.isScalar():
-                if  configType == PyTango.ArgType.DevBoolean:
-                    result = [CenteredLed, ExpandingLabel]
-                elif configType == PyTango.ArgType.DevState:
-                    result = [CenteredLed, ExpandingLabel]
-                elif str(self.getModel()).lower().endswith('/status'): #@todo: tango-centric!!
-                    result = [TaurusStatusLabel, ExpandingLabel]
+            if modelobj.data_format == DataFormat._0D:
+                if modelobj.type == DataType.Boolean:
+                    result = [CenteredLed, DefaultReadWidgetLabel]
+                elif modelobj.type == DataType.DevState:
+                    result = [CenteredLed, DefaultReadWidgetLabel]
+                elif str(self.getModel()).lower().endswith('/status'):  # @todo: tango-centric!!
+                    result = [TaurusStatusLabel, DefaultReadWidgetLabel]
                 else:
-                    result = [ExpandingLabel]
-            elif config.isSpectrum():
-                if PyTango.is_numerical_type(configType): #@todo: tango-centric!!
-                    result = [TaurusPlotButton, TaurusValuesTableButton, ExpandingLabel]
+                    result = [DefaultReadWidgetLabel]
+            elif modelobj.data_format == DataFormat._1D:
+                if modelobj.type in (DataType.Float, DataType.Integer):
+                    result = [TaurusPlotButton,
+                              TaurusValuesTableButton, DefaultReadWidgetLabel]
                 else:
-                    result = [TaurusValuesTableButton, ExpandingLabel]
-            elif config.isImage():
-                if PyTango.is_numerical_type(configType): #@todo: tango-centric!!
-                    try: 
-                        from taurus.qt.qtgui.extra_guiqwt import TaurusImageDialog #unused import but useful to determine if TaurusImageButton should be added
-                        result = [TaurusImageButton, TaurusValuesTableButton, ExpandingLabel]
+                    result = [TaurusValuesTableButton, DefaultReadWidgetLabel]
+            elif modelobj.data_format == DataFormat._2D:
+                if modelobj.type in (DataType.Float, DataType.Integer):
+                    try:
+                        # unused import but useful to determine if
+                        # TaurusImageButton should be added
+                        from taurus.qt.qtgui.extra_guiqwt import TaurusImageDialog
+                        result = [TaurusImageButton,
+                                  TaurusValuesTableButton, DefaultReadWidgetLabel]
                     except ImportError:
-                        result = [TaurusValuesTableButton, ExpandingLabel]
+                        result = [TaurusValuesTableButton,
+                                  DefaultReadWidgetLabel]
                 else:
-                    result = [TaurusValuesTableButton, ExpandingLabel]
+                    result = [TaurusValuesTableButton, DefaultReadWidgetLabel]
             else:
-                self.warning('Unsupported attribute type %s'%configType)
+                self.warning('Unsupported attribute type %s' % modelobj.type)
                 result = None
 
         elif modeltype == TaurusElementType.Device:
             result = [TaurusDevButton]
         else:
-            msg = "Unsupported model type ('%s')"%modeltype
+            msg = "Unsupported model type ('%s')" % modeltype
             self.warning(msg)
             raise ValueError(msg)
 
-            
-        if returnAll: return result
-        else: return result[0]
-        
+        if returnAll:
+            return result
+        else:
+            return result[0]
+
     def getDefaultWriteWidgetClass(self, returnAll=False):
         '''
         Returns the default class (or classes) to use as write widget for the
         current model.
-        
+
         :param returnAll: (bool) if True, the return value is a list of valid
                           classes instead of just one class
-        
+
         :return: (class or list<class>) the default class  to use for the write
                  widget (or, if returnAll==True, a list of classes that can show
                  the attribute ). If a list is returned, it will be loosely
@@ -481,101 +553,111 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
         '''
         modelclass = self.getModelClass()
         if self.isReadOnly() or (modelclass and modelclass.getTaurusElementType() != TaurusElementType.Attribute):
-            if returnAll: return []
-            else: return None
+            if returnAll:
+                return []
+            else:
+                return None
         modelobj = self.getModelObj()
         if modelobj is None:
-            if returnAll: return [TaurusValueLineEdit]
-            else: return TaurusValueLineEdit
-        config = modelobj.getConfig()
-        if config.isScalar():
-            configType = config.getType() 
-            if configType == PyTango.ArgType.DevBoolean:
+            if returnAll:
+                return [TaurusValueLineEdit]
+            else:
+                return TaurusValueLineEdit
+        modelType = modelobj.getType()
+        if modelobj.data_format == DataFormat._0D:
+            if modelType == DataType.Boolean:
                 result = [DefaultTaurusValueCheckBox, TaurusValueLineEdit]
-            #elif PyTango.is_numerical_type(configType ):
-            #    result = TaurusWheelEdit
             else:
-                result = [TaurusValueLineEdit, TaurusValueSpinBox, TaurusWheelEdit]
-        elif config.isSpectrum():
-            configType = config.getType()
-            if configType in (PyTango.ArgType.DevDouble, PyTango.ArgType.DevFloat, 
-                              PyTango.ArgType.DevInt, PyTango.ArgType.DevLong, 
-                              PyTango.ArgType.DevLong64, PyTango.ArgType.DevShort, 
-                              PyTango.ArgType.DevULong, PyTango.ArgType.DevULong64, 
-                              PyTango.ArgType.DevUShort):
-                result = [TaurusArrayEditorButton, TaurusValuesTableButton_W, TaurusValueLineEdit]
+                result = [TaurusValueLineEdit,
+                          TaurusValueSpinBox, TaurusWheelEdit]
+        elif modelobj.data_format == DataFormat._1D:
+            if modelType in (DataType.Float, DataType.Integer):
+                result = [TaurusArrayEditorButton,
+                          TaurusValuesTableButton_W, TaurusValueLineEdit]
             else:
                 result = [TaurusValuesTableButton_W, TaurusValueLineEdit]
-        elif config.isImage():
+        elif modelobj.data_format == DataFormat._2D:
             result = [TaurusValuesTableButton_W]
         else:
-            self.debug('Unsupported attribute type for writing: %s'% str(config.getType()))
+            self.debug('Unsupported attribute type for writing: %s' %
+                       str(DataType.whatis(modelType)))
             result = [None]
-            
-        if returnAll: return result
-        else: return result[0]
-    
+
+        if returnAll:
+            return result
+        else:
+            return result[0]
+
     def getDefaultUnitsWidgetClass(self):
-#        if self.getModelClass() != taurus.core.taurusattribute.TaurusAttribute:
-#            return DefaultUnitsWidget
+        #        if self.getModelClass() != taurus.core.taurusattribute.TaurusAttribute:
+        #            return DefaultUnitsWidget
         return DefaultUnitsWidget
-    
+
     def getDefaultCustomWidgetClass(self):
         modelclass = self.getModelClass()
         if modelclass and modelclass.getTaurusElementType() != TaurusElementType.Device:
             return None
         try:
-            key = self.getModelObj().getHWObj().info().dev_class
+            key = self.getModelObj().getDeviceProxy().info().dev_class  # TODO: Tango-centric
         except:
             return None
         return self.getCustomWidgetMap().get(key, None)
-    
+
     def getDefaultExtraWidgetClass(self):
         return None
-    
+
     def setCustomWidgetMap(self, cwmap):
         '''Sets a map map for custom widgets.
-        
+
         :param cwmap: (dict<str,Qt.QWidget>) a dictionary whose keys are device
                       class strings (see :class:`PyTango.DeviceInfo`) and
                       whose values are widget classes to be used
         '''
         self._customWidgetMap = cwmap
-        
+
     def getCustomWidgetMap(self):
         '''Returns the map used to create custom widgets.
-        
+
         :return: (dict<str,Qt.QWidget>) a dictionary whose keys are device
                  type strings (i.e. see :class:`PyTango.DeviceInfo`) and whose
                  values are widgets to be used
         '''
         return self._customWidgetMap
-     
+
     def onChangeLabelConfig(self):
-        keys = ['label', 'attr_name', 'attr_fullname', 'dev_alias', 'dev_name', 'dev_fullname']
+        keys = ['{attr.label}', '{attr.name}', '{attr.fullname}', '{dev.name}',
+                '{dev.fullname}']
         try:
             current = keys.index(self.labelConfig)
         except:
-            current= len(keys)
+            current = len(keys)
             keys.append(self.labelConfig)
-            
-        msg = 'Choose new source for the label. \n'+\
-              'You can also write a more complex text\n'+\
-              'using any of the proposed sources as a\n'+\
-              'placeholder by enclosing it in "< >" brackets'
-        labelConfig, ok = Qt.QInputDialog.getItem(self, 'Change Label', msg, keys, current, True)
+
+        msg = 'Choose the label format. \n' + \
+              'You may use Python format() syntax. The TaurusDevice object\n' + \
+              'can be referenced as "dev" and the TaurusAttribute object\n' + \
+              'as "attr"'
+
+        labelConfig, ok = Qt.QInputDialog.getItem(self, 'Change Label', msg,
+                                                  keys, current, True)
         if ok:
-            self.labelConfig=str(labelConfig)  
-             
+            self.labelConfig = str(labelConfig)
+
     def onChangeReadWidget(self):
-        classnames = ['None', 'Auto']+[c.__name__ for c in self.getDefaultReadWidgetClass(returnAll=True)]
-        cname, ok = Qt.QInputDialog.getItem(self, 'Change Read Widget', 'Choose a new read widget class', classnames, 1, True)
+        classnames = ['None', 'Auto'] + \
+            [c.__name__ for c in self.getDefaultReadWidgetClass(
+                returnAll=True)]
+        cname, ok = Qt.QInputDialog.getItem(
+            self, 'Change Read Widget', 'Choose a new read widget class', classnames, 1, True)
         if ok:
             self.setReadWidgetClass(str(cname))
-            
+
     def onChangeWriteWidget(self):
-        classnames = ['None', 'Auto']+[c.__name__ for c in self.getDefaultWriteWidgetClass(returnAll=True)]
-        cname, ok = Qt.QInputDialog.getItem(self, 'Change Write Widget', 'Choose a new write widget class', classnames, 1, True)
+        classnames = ['None', 'Auto'] + \
+            [c.__name__ for c in self.getDefaultWriteWidgetClass(
+                returnAll=True)]
+        cname, ok = Qt.QInputDialog.getItem(
+            self, 'Change Write Widget', 'Choose a new write widget class', classnames, 1, True)
         if ok:
             self.setWriteWidgetClass(str(cname))
 
@@ -583,7 +665,7 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
         '''get rid of a widget in a safe way'''
         widget.hide()
         widget.setParent(None)
-        if hasattr(widget,'setModel'):
+        if hasattr(widget, 'setModel'):
             widget.setModel(None)
         # COULD NOT INVESTIGATE DEEPER, BUT THE STARTUP-HANGING
         # HAPPENS WITH SOME SIGNALS RELATED WITH THE LINEEDIT...
@@ -592,216 +674,253 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
             widget.blockSignals(True)
         # THIS HACK REDUCES THE STARTUP-HANGING RATE
         widget.deleteLater()
-        
+
     def _newSubwidget(self, oldWidget, newClass):
         '''eliminates oldWidget and returns a new one.
         If newClass is None, None is returned
         If newClass is the same as the olWidget class, nothing happens'''
-        if oldWidget.__class__ == newClass: return oldWidget
+        if oldWidget.__class__ == newClass:
+            return oldWidget
         if oldWidget is not None:
             self._destroyWidget(oldWidget)
-        if newClass is None: result = None
-        else: result = newClass()
+        if newClass is None:
+            result = None
+        else:
+            result = newClass()
         return result
 
     def labelWidgetClassFactory(self, classID):
-        if self._customWidget is not None: return None
-        if classID is None or classID == 'None': return None
+        if self._customWidget is not None:
+            return None
+        if classID is None or classID == 'None':
+            return None
         classID = globals().get(classID, classID)
-        if isinstance(classID, type): return classID
-        elif str(classID) == 'Auto': return self.getDefaultLabelWidgetClass()
-        else: return TaurusWidgetFactory().getWidgetClass(classID)
+        if isinstance(classID, type):
+            return classID
+        elif str(classID) == 'Auto':
+            return self.getDefaultLabelWidgetClass()
+        else:
+            return TaurusWidgetFactory().getWidgetClass(classID)
 
     def readWidgetClassFactory(self, classID):
-        if self._customWidget is not None: return None
-        if classID is None or classID == 'None': return None
+        if self._customWidget is not None:
+            return None
+        if classID is None or classID == 'None':
+            return None
         classID = globals().get(classID, classID)
-        if isinstance(classID, type): ret = classID
-        elif str(classID) == 'Auto': ret = self.getDefaultReadWidgetClass()
-        else: ret = TaurusWidgetFactory().getWidgetClass(classID)
-        
+        if isinstance(classID, type):
+            ret = classID
+        elif str(classID) == 'Auto':
+            ret = self.getDefaultReadWidgetClass()
+        else:
+            ret = TaurusWidgetFactory().getWidgetClass(classID)
+
         if self._compact:
             R = ret
-            W = self.writeWidgetClassFactory(self.writeWidgetClassID, ignoreCompact=True)
-            if W is None: 
+            W = self.writeWidgetClassFactory(
+                self.writeWidgetClassID, ignoreCompact=True)
+            if W is None:
                 return R
             switcherClass = self.getSwitcherClass()
             switcherClass.readWClass = R
             switcherClass.writeWClass = W
             return switcherClass
         return ret
-    
+
     def writeWidgetClassFactory(self, classID, ignoreCompact=False):
-        if self._customWidget is not None: return None
-        if classID is None or classID == 'None': return None
-        if self._compact and not ignoreCompact: return None
+        if self._customWidget is not None:
+            return None
+        if classID is None or classID == 'None':
+            return None
+        if self._compact and not ignoreCompact:
+            return None
         classID = globals().get(classID, classID)
-        if isinstance(classID, type): return classID
-        elif str(classID) == 'Auto': return self.getDefaultWriteWidgetClass()
-        else: return TaurusWidgetFactory().getWidgetClass(classID)
-        
+        if isinstance(classID, type):
+            return classID
+        elif str(classID) == 'Auto':
+            return self.getDefaultWriteWidgetClass()
+        else:
+            return TaurusWidgetFactory().getWidgetClass(classID)
+
     def unitsWidgetClassFactory(self, classID):
-        if self._customWidget is not None: return None
-        if classID is None or classID == 'None': return None
+        if self._customWidget is not None:
+            return None
+        if classID is None or classID == 'None':
+            return None
         classID = globals().get(classID, classID)
-        if isinstance(classID, type): return classID
-        elif str(classID) == 'Auto': return self.getDefaultUnitsWidgetClass()
-        else: return TaurusWidgetFactory().getWidgetClass(classID)
-        
+        if isinstance(classID, type):
+            return classID
+        elif str(classID) == 'Auto':
+            return self.getDefaultUnitsWidgetClass()
+        else:
+            return TaurusWidgetFactory().getWidgetClass(classID)
+
     def customWidgetClassFactory(self, classID):
-        if classID is None or classID == 'None': return None
+        if classID is None or classID == 'None':
+            return None
         classID = globals().get(classID, classID)
-        if isinstance(classID, type): return classID
-        elif str(classID) == 'Auto': return self.getDefaultCustomWidgetClass()
-        else: return TaurusWidgetFactory().getWidgetClass(classID)
-        
+        if isinstance(classID, type):
+            return classID
+        elif str(classID) == 'Auto':
+            return self.getDefaultCustomWidgetClass()
+        else:
+            return TaurusWidgetFactory().getWidgetClass(classID)
+
     def extraWidgetClassFactory(self, classID):
-        if self._customWidget is not None: return None
-        if classID is None or classID == 'None': return None
+        if self._customWidget is not None:
+            return None
+        if classID is None or classID == 'None':
+            return None
         classID = globals().get(classID, classID)
-        if isinstance(classID, type): return classID
-        elif str(classID) == 'Auto': return self.getDefaultExtraWidgetClass()
-        else: return TaurusWidgetFactory().getWidgetClass(classID)
-        
+        if isinstance(classID, type):
+            return classID
+        elif str(classID) == 'Auto':
+            return self.getDefaultExtraWidgetClass()
+        else:
+            return TaurusWidgetFactory().getWidgetClass(classID)
+
     def updateLabelWidget(self):
-        #get the class for the widget and replace it if necessary
+        # get the class for the widget and replace it if necessary
         klass = self.labelWidgetClassFactory(self.labelWidgetClassID)
         self._labelWidget = self._newSubwidget(self._labelWidget, klass)
-        
-        #take care of the layout
-        self.addLabelWidgetToLayout() 
-        
+
+        # take care of the layout
+        self.addLabelWidgetToLayout()
+
         if self._labelWidget is not None:
-            #give the new widget a reference to its buddy TaurusValue object
-            self._labelWidget.taurusValueBuddy = weakref.ref(self) 
-            
-            #tweak the new widget
+            # give the new widget a reference to its buddy TaurusValue object
+            self._labelWidget.taurusValueBuddy = weakref.ref(self)
+
+            # tweak the new widget
             if self.minimumHeight() is not None:
                 self._labelWidget.setMinimumHeight(self.minimumHeight())
-            
-            #set the model for the subwidget
-            if hasattr(self._labelWidget,'setModel'):
-                self._labelWidget.setModel(self.getModelName())
-            
+
+            # set the model for the subwidget
+            if hasattr(self._labelWidget, 'setModel'):
+                self._labelWidget.setModel(self.getFullModelName())
+
     def updateReadWidget(self):
-        #get the class for the widget and replace it if necessary
+        # get the class for the widget and replace it if necessary
         try:
             klass = self.readWidgetClassFactory(self.readWidgetClassID)
             self._readWidget = self._newSubwidget(self._readWidget, klass)
-        except Exception,e:
+        except Exception, e:
             self._destroyWidget(self._readWidget)
             self._readWidget = Qt.QLabel('[Error]')
-            msg='Error creating read widget:\n'+str(e)
+            msg = 'Error creating read widget:\n' + str(e)
             self._readWidget.setToolTip(msg)
             self.debug(msg)
-            #self.traceback(30) #warning level=30
-        
-        #take care of the layout
-        self.addReadWidgetToLayout() 
-        
+            # self.traceback(30) #warning level=30
+
+        # take care of the layout
+        self.addReadWidgetToLayout()
+
         if self._readWidget is not None:
-            #give the new widget a reference to its buddy TaurusValue object
+            # give the new widget a reference to its buddy TaurusValue object
             self._readWidget.taurusValueBuddy = weakref.ref(self)
             if isinstance(self._readWidget, TaurusReadWriteSwitcher):
-                self._readWidget.readWidget.taurusValueBuddy = weakref.ref(self)
-                self._readWidget.writeWidget.taurusValueBuddy = weakref.ref(self)
-            
-            #tweak the new widget
+                self._readWidget.readWidget.taurusValueBuddy = weakref.ref(
+                    self)
+                self._readWidget.writeWidget.taurusValueBuddy = weakref.ref(
+                    self)
+
+            # tweak the new widget
             if self.minimumHeight() is not None:
                 self._readWidget.setMinimumHeight(self.minimumHeight())
-            
-            #set the model for the subwidget
-            if hasattr(self._readWidget,'setModel'):
-                self._readWidget.setModel(self.getModelName())
+
+            # set the model for the subwidget
+            if hasattr(self._readWidget, 'setModel'):
+                self._readWidget.setModel(self.getFullModelName())
 
     def updateWriteWidget(self):
-        #get the class for the widget and replace it if necessary
+        # get the class for the widget and replace it if necessary
         klass = self.writeWidgetClassFactory(self.writeWidgetClassID)
         self._writeWidget = self._newSubwidget(self._writeWidget, klass)
-        
-        #take care of the layout
-        self.addReadWidgetToLayout() #this is needed because the writeWidget affects to the readWritget layout
+
+        # take care of the layout
+        # this is needed because the writeWidget affects to the readWritget
+        # layout
+        self.addReadWidgetToLayout()
         self.addWriteWidgetToLayout()
-        
+
         if self._writeWidget is not None:
-            #give the new widget a reference to its buddy TaurusValue object
+            # give the new widget a reference to its buddy TaurusValue object
             self._writeWidget.taurusValueBuddy = weakref.ref(self)
-            
-            #tweak the new widget
-            ##hide getPendingOperations of the writeWidget so that containers don't get duplicate lists
-            #self._writeWidget._getPendingOperations = self._writeWidget.getPendingOperations 
-            #self._writeWidget.getPendingOperations = lambda : [] 
-            self.connect(self._writeWidget, Qt.SIGNAL('valueChanged'),self.updatePendingOpsStyle)
+
+            # tweak the new widget
+            # hide getPendingOperations of the writeWidget so that containers don't get duplicate lists
+            #self._writeWidget._getPendingOperations = self._writeWidget.getPendingOperations
+            #self._writeWidget.getPendingOperations = lambda : []
+            self._writeWidget.valueChangedSignal.connect(self.updatePendingOpsStyle)
             self._writeWidget.setDangerMessage(self.getDangerMessage())
-            self._writeWidget.setForceDangerousOperations(self.getForceDangerousOperations())
+            self._writeWidget.setForceDangerousOperations(
+                self.getForceDangerousOperations())
             if self.minimumHeight() is not None:
                 self._writeWidget.setMinimumHeight(self.minimumHeight())
-            
-            #set the model for the subwidget
-            if hasattr(self._writeWidget,'setModel'):
-                self._writeWidget.setModel(self.getModelName())
-        
+
+            # set the model for the subwidget
+            if hasattr(self._writeWidget, 'setModel'):
+                self._writeWidget.setModel(self.getFullModelName())
+
     def updateUnitsWidget(self):
-        #get the class for the widget and replace it if necessary
+        # get the class for the widget and replace it if necessary
         klass = self.unitsWidgetClassFactory(self.unitsWidgetClassID)
         self._unitsWidget = self._newSubwidget(self._unitsWidget, klass)
-        
-        #take care of the layout
-        self.addUnitsWidgetToLayout() 
-        
+
+        # take care of the layout
+        self.addUnitsWidgetToLayout()
+
         if self._unitsWidget is not None:
-            #give the new widget a reference to its buddy TaurusValue object
+            # give the new widget a reference to its buddy TaurusValue object
             self._unitsWidget.taurusValueBuddy = weakref.ref(self)
-            #tweak the new widget
+            # tweak the new widget
             if self.minimumHeight() is not None:
                 self._unitsWidget.setMinimumHeight(self.minimumHeight())
-            
-            #set the model for the subwidget
-            if hasattr(self._unitsWidget,'setModel'):
-                self._unitsWidget.setModel(self.getModelName())
-                
+
+            # set the model for the subwidget
+            if hasattr(self._unitsWidget, 'setModel'):
+                self._unitsWidget.setModel(self.getFullModelName())
+
     def updateCustomWidget(self):
-        #get the class for the widget and replace it if necessary
+        # get the class for the widget and replace it if necessary
         klass = self.customWidgetClassFactory(self.customWidgetClassID)
         self._customWidget = self._newSubwidget(self._customWidget, klass)
-        
-        #take care of the layout
+
+        # take care of the layout
         self.addCustomWidgetToLayout()
-        
-        if self._customWidget is not None:            
-            #set the model for the subwidget
-            if hasattr(self._customWidget,'setModel'):
-                self._customWidget.setModel(self.getModelName())
-                
+
+        if self._customWidget is not None:
+            # set the model for the subwidget
+            if hasattr(self._customWidget, 'setModel'):
+                self._customWidget.setModel(self.getFullModelName())
+
     def updateExtraWidget(self):
-        #get the class for the widget and replace it if necessary
+        # get the class for the widget and replace it if necessary
         klass = self.extraWidgetClassFactory(self.extraWidgetClassID)
         self._extraWidget = self._newSubwidget(self._extraWidget, klass)
-        
-        #take care of the layout
-        self.addExtraWidgetToLayout() 
-        
+
+        # take care of the layout
+        self.addExtraWidgetToLayout()
+
         if self._extraWidget is not None:
-            #give the new widget a reference to its buddy TaurusValue object
+            # give the new widget a reference to its buddy TaurusValue object
             self._extraWidget.taurusValueBuddy = weakref.ref(self)
-                        
-            #set the model for the subwidget
-            if hasattr(self._extraWidget,'setModel'):
-                self._extraWidget.setModel(self.getModelName())
-                
-                
+
+            # set the model for the subwidget
+            if hasattr(self._extraWidget, 'setModel'):
+                self._extraWidget.setModel(self.getFullModelName())
+
     def addLabelWidgetToLayout(self):
-        
+
         if self._labelWidget is not None and self.parent() is not None:
-            alignment = getattr(self._labelWidget, 'layoutAlignment', 
+            alignment = getattr(self._labelWidget, 'layoutAlignment',
                                 Qt.Qt.AlignmentFlag(0))
             self.parent().layout().addWidget(self._labelWidget, self._row, 1, 1,
                                              1, alignment)
 
-    
     def addReadWidgetToLayout(self):
         if self._readWidget is not None and self.parent() is not None:
-            alignment = getattr(self._readWidget, 'layoutAlignment', 
+            alignment = getattr(self._readWidget, 'layoutAlignment',
                                 Qt.Qt.AlignmentFlag(0))
             if self._writeWidget is None:
                 self.parent().layout().addWidget(self._readWidget, self._row,
@@ -809,29 +928,28 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
             else:
                 self.parent().layout().addWidget(self._readWidget, self._row,
                                                  2, 1, 1, alignment)
-                    
+
     def addWriteWidgetToLayout(self):
         if self._writeWidget is not None and self.parent() is not None:
-            alignment = getattr(self._writeWidget, 'layoutAlignment', 
+            alignment = getattr(self._writeWidget, 'layoutAlignment',
                                 Qt.Qt.AlignmentFlag(0))
             self.parent().layout().addWidget(self._writeWidget, self._row,
                                              3, 1, 1, alignment)
 
-    
     def addUnitsWidgetToLayout(self):
         if self._unitsWidget is not None and self.parent() is not None:
-            alignment = getattr(self._unitsWidget, 'layoutAlignment', 
+            alignment = getattr(self._unitsWidget, 'layoutAlignment',
                                 Qt.Qt.AlignmentFlag(0))
             self.parent().layout().addWidget(self._unitsWidget, self._row,
                                              4, 1, 1, alignment)
 
     def addCustomWidgetToLayout(self):
         if self._customWidget is not None and self.parent() is not None:
-            alignment = getattr(self._customWidget, 'layoutAlignment', 
+            alignment = getattr(self._customWidget, 'layoutAlignment',
                                 Qt.Qt.AlignmentFlag(0))
             self.parent().layout().addWidget(self._customWidget, self._row,
                                              1, 1, -1, alignment)
-    
+
     def addExtraWidgetToLayout(self):
         parent = self.parent()
         if parent is not None:
@@ -843,16 +961,16 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
                 alignment = getattr(self._extraWidget, 'layoutAlignment',
                                     Qt.Qt.AlignmentFlag(0))
                 parent.layout().addWidget(self._extraWidget, self._row,
-                                            5, 1, 1, alignment)
+                                          5, 1, 1, alignment)
 
-    @Qt.pyqtSignature("parentModelChanged(const QString &)")
+    @Qt.pyqtSlot('QString')
     def parentModelChanged(self, parentmodel_name):
         """Invoked when the parent model changes
-        
+
         :param parentmodel_name: (str) the new name of the parent model
         """
         TaurusBaseWidget.parentModelChanged(self, parentmodel_name)
-        if not self._designMode:     #in design mode, no subwidgets are created
+        if not self._designMode:  # in design mode, no subwidgets are created
             self.updateCustomWidget()
             self.updateLabelWidget()
             self.updateReadWidget()
@@ -860,84 +978,84 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
             self.updateUnitsWidget()
             self.updateExtraWidget()
 
-    @Qt.pyqtSignature("setLabelWidget(QString)")
-    def setLabelWidgetClass(self,classID):
+    @Qt.pyqtSlot('QString', name='setLabelWidget')
+    def setLabelWidgetClass(self, classID):
         '''substitutes the current widget by a new one. classID can be one of:
         None, 'Auto', a TaurusWidget class name, or any class'''
         self.labelWidgetClassID = classID
         self.updateLabelWidget()
-            
+
     def getLabelWidgetClass(self):
         return self.labelWidgetClassID
-    
+
     def resetLabelWidgetClass(self):
         self.labelWidgetClassID = 'Auto'
-    
-    @Qt.pyqtSignature("setReadWidget(QString)")
-    def setReadWidgetClass(self,classID):
+
+    @Qt.pyqtSlot('QString', name='setReadWidget')
+    def setReadWidgetClass(self, classID):
         '''substitutes the current widget by a new one. classID can be one of:
         None, 'Auto', a TaurusWidget class name, or any class'''
         self.readWidgetClassID = classID
         self.updateReadWidget()
-            
+
     def getReadWidgetClass(self):
         return self.readWidgetClassID
-    
+
     def resetReadWidgetClass(self):
         self.readWidgetClassID = 'Auto'
-        
-    @Qt.pyqtSignature("setWriteWidget(QString)")
-    def setWriteWidgetClass(self,classID):
+
+    @Qt.pyqtSlot('QString', name='setWriteWidget')
+    def setWriteWidgetClass(self, classID):
         '''substitutes the current widget by a new one. classID can be one of:
         None, 'Auto', a TaurusWidget class name, or any class'''
         self.writeWidgetClassID = classID
         self.updateWriteWidget()
-    
+
     def getWriteWidgetClass(self):
         return self.writeWidgetClassID
-    
+
     def resetWriteWidgetClass(self):
         self.writeWidgetClassID = 'Auto'
-        
-    @Qt.pyqtSignature("setUnitsWidget(QString)")
-    def setUnitsWidgetClass(self,classID):
+
+    @Qt.pyqtSlot('QString', name='setUnitsWidget')
+    def setUnitsWidgetClass(self, classID):
         '''substitutes the current widget by a new one. classID can be one of:
         None, 'Auto', a TaurusWidget class name, or any class'''
         self.unitsWidgetClassID = classID
         self.updateUnitsWidget()
-    
+
     def getUnitsWidgetClass(self):
         return self.unitsWidgetClassID
-    
+
     def resetUnitsWidgetClass(self):
         self.unitsWidgetClassID = 'Auto'
-    
-    @Qt.pyqtSignature("setCustomWidget(QString)")
-    def setCustomWidgetClass(self,classID):
+
+    @Qt.pyqtSlot('QString', name='setCustomWidget')
+    def setCustomWidgetClass(self, classID):
         '''substitutes the current widget by a new one. classID can be one of:
         None, 'Auto', a TaurusWidget class name, or any class'''
         self.customWidgetClassID = classID
         self.updateCustomWidget()
-    
+
     def getCustomWidgetClass(self):
         return self.customWidgetClassID
-    
+
     def resetCustomWidgetClass(self):
         self.customWidgetClassID = 'Auto'
-        
-    @Qt.pyqtSignature("setExtraWidget(QString)")
-    def setExtraWidgetClass(self,classID):
+
+    @Qt.pyqtSlot('QString', name='setExtraWidget')
+    def setExtraWidgetClass(self, classID):
         '''substitutes the current widget by a new one. classID can be one of:
         None, 'Auto', a TaurusWidget class name, or any class'''
         self.extraWidgetClassID = classID
         self.updateExtraWidget()
-    
+
     def getExtraWidgetClass(self):
         return self.extraWidgetClassID
-    
+
     def resetExtraWidgetClass(self):
         self.extraWidgetClassID = 'Auto'
-        
+
     def setCompact(self, compact):
         if compact == self._compact:
             return
@@ -948,11 +1066,13 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
 
     def isCompact(self):
         return self._compact
-        
+
     def isReadOnly(self):
-        if not self.getAllowWrite(): return True 
+        if not self.getAllowWrite():
+            return True
         modelObj = self.getModelObj()
-        if modelObj is None: return False 
+        if modelObj is None:
+            return False
         return not modelObj.isWritable()
 
     def getModelClass(self):
@@ -969,63 +1089,68 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
     def createConfig(self, allowUnpickable=False):
         '''
         extending  :meth:`TaurusBaseWidget.createConfig` to store also the class names for subwidgets
-               
-        :param alllowUnpickable:  (bool) 
-        
+
+        :param alllowUnpickable:  (bool)
+
         :return: (dict<str,object>) configurations (which can be loaded with :meth:`applyConfig`).
-        
-        .. seealso: :meth:`TaurusBaseWidget.createConfig`, :meth:`applyConfig` 
+
+        .. seealso: :meth:`TaurusBaseWidget.createConfig`, :meth:`applyConfig`
         '''
-        configdict = TaurusBaseWidget.createConfig(self, allowUnpickable=allowUnpickable)
-        #store the subwidgets classIDs and configs
+        configdict = TaurusBaseWidget.createConfig(
+            self, allowUnpickable=allowUnpickable)
+        # store the subwidgets classIDs and configs
         for key in ('LabelWidget', 'ReadWidget', 'WriteWidget', 'UnitsWidget', 'CustomWidget', 'ExtraWidget'):
-            classID = getattr(self, 'get%sClass'%key)() # calls self.getLabelWidgetClass, self.getReadWidgetClass,...
+            # calls self.getLabelWidgetClass, self.getReadWidgetClass,...
+            classID = getattr(self, 'get%sClass' % key)()
             if isinstance(classID, (str, Qt.QString)) or allowUnpickable:
                 #configdict[key] = classID
-                configdict[key] = {'classid':classID}
-                widget = getattr(self, key[0].lower()+key[1:])()
+                configdict[key] = {'classid': classID}
+                widget = getattr(self, key[0].lower() + key[1:])()
                 if isinstance(widget, BaseConfigurableClass):
                     configdict[key]['delegate'] = widget.createConfig()
             else:
-                self.info('createConfig: %s not saved because it is not Pickable (%s)'%(key, str(classID)))
+                self.info('createConfig: %s not saved because it is not Pickable (%s)' % (
+                    key, str(classID)))
 
         return configdict
-    
+
     def applyConfig(self, configdict, **kwargs):
         """extending :meth:`TaurusBaseWidget.applyConfig` to restore the subwidget's classes
-        
+
         :param configdict: (dict)
-        
+
         .. seealso:: :meth:`TaurusBaseWidget.applyConfig`, :meth:`createConfig`
         """
-        #first do the basic stuff...
+        # first do the basic stuff...
         TaurusBaseWidget.applyConfig(self, configdict, **kwargs)
-        #restore the subwidgets classIDs
+        # restore the subwidgets classIDs
         for key in ('LabelWidget', 'ReadWidget', 'WriteWidget', 'UnitsWidget', 'CustomWidget', 'ExtraWidget'):
             if key in configdict:
                 widget_configdict = configdict[key]
-                getattr(self, 'set%sClass'%key)(widget_configdict.get('classid', None))
+                getattr(self, 'set%sClass' % key)(
+                    widget_configdict.get('classid', None))
                 if widget_configdict.has_key('delegate'):
-                    widget = getattr(self, key[0].lower()+key[1:])()
+                    widget = getattr(self, key[0].lower() + key[1:])()
                     if isinstance(widget, BaseConfigurableClass):
-                        widget.applyConfig(widget_configdict['delegate'], **kwargs)
-                
-    @Qt.pyqtSignature("setModel(QString)")
+                        widget.applyConfig(widget_configdict[
+                                           'delegate'], **kwargs)
+
+    @Qt.pyqtSlot('QString')
     def setModel(self, model):
         """extending :meth:`TaurusBaseWidget.setModel` to change the modelclass
         dynamically and to update the subwidgets"""
         self.__modelClass = taurus.Manager().findObjectClass(model or '')
-        TaurusBaseWidget.setModel(self,model)
-        if not self._designMode:     #in design mode, no subwidgets are created
+        TaurusBaseWidget.setModel(self, model)
+        if not self._designMode:  # in design mode, no subwidgets are created
             self.updateCustomWidget()
             self.updateLabelWidget()
             self.updateReadWidget()
             self.updateWriteWidget()
             self.updateUnitsWidget()
             self.updateExtraWidget()
-            
+
     def handleEvent(self, evt_src, evt_type, evt_value):
-        """Reimplemented from :meth:`TaurusBaseWidget.handleEvent` 
+        """Reimplemented from :meth:`TaurusBaseWidget.handleEvent`
         to update subwidgets on config events
         """
         if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config and not self._designMode:
@@ -1035,94 +1160,107 @@ class TaurusValue(Qt.QWidget, TaurusBaseWidget):
             self.updateWriteWidget()
             self.updateUnitsWidget()
             self.updateExtraWidget()
-            
+
     def isValueChangedByUser(self):
         try:
             return self._writeWidget.isValueChangedByUser()
         except AttributeError:
             return False
-    
+
     def setDangerMessage(self, dangerMessage=None):
         TaurusBaseWidget.setDangerMessage(self, dangerMessage)
         try:
             return self._writeWidget.setDangerMessage(dangerMessage)
         except AttributeError:
             pass
-    
+
     def setForceDangerousOperations(self, yesno):
         TaurusBaseWidget.setForceDangerousOperations(self, yesno)
         try:
             return self._writeWidget.setForceDangerousOperations(yesno)
         except AttributeError:
             pass
-        
+
     def hasPendingOperations(self):
         '''self.getPendingOperations will always return an empty list, but still
         self.hasPendingOperations will look at the writeWidget's operations.
         If you want to ask the TaurusValue for its pending operations, call
         self.writeWidget().getPendingOperations()'''
         w = self.writeWidget(followCompact=True)
-        if w is None: return False
+        if w is None:
+            return False
         return w.hasPendingOperations()
-                
+
     def updatePendingOpsStyle(self):
-        if self._labelWidget is None: return
+        if self._labelWidget is None:
+            return
         if self.hasPendingOperations():
             self._labelWidget.setStyleSheet(
-                '%s {border-style: solid ; border-width: 1px; border-color: blue; color: blue; border-radius:4px;}'%self._labelWidget.__class__.__name__)
+                '%s {border-style: solid ; border-width: 1px; border-color: blue; color: blue; border-radius:4px;}' % self._labelWidget.__class__.__name__)
         else:
             self._labelWidget.setStyleSheet(
-                '%s {border-style: solid; border-width: 1px; border-color: transparent; color: black;  border-radius:4px;}'%self._labelWidget.__class__.__name__)
-            
+                '%s {border-style: solid; border-width: 1px; border-color: transparent; color: black;  border-radius:4px;}' % self._labelWidget.__class__.__name__)
+
     def getLabelConfig(self):
         return self._labelConfig
-    
-    @Qt.pyqtSignature("setLabelConfig(QString)")
+
+    @Qt.pyqtSlot('QString')
     def setLabelConfig(self, config):
         self._labelConfig = config
         self.updateLabelWidget()
-        
+
     def resetLabelConfig(self):
-        self._labelConfig = 'label'
+        self._labelConfig = '{attr.label}'
         self.updateLabelWidget()
-        
+
     def getSwitcherClass(self):
-        '''Returns the TaurusValue switcher class (used in compact mode).        
-        Override this method if you want to use a custom switcher in 
+        '''Returns the TaurusValue switcher class (used in compact mode).
+        Override this method if you want to use a custom switcher in
         TaurusValue subclasses.
         '''
         class TVSwitcher(TaurusReadWriteSwitcher):
             pass
         return TVSwitcher
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         return None
         #ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         #ret['module'] = 'taurus.qt.qtgui.panel'
-        #ret['icon'] = ":/designer/label.png"
-        #return ret
-        
+        #ret['icon'] = "designer:label.png"
+        # return ret
+
     ########################################################
-    ## Qt properties (for designer)
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,  setModel, TaurusBaseWidget.resetModel)
-    preferredRow = Qt.pyqtProperty("int", getPreferredRow, setPreferredRow, resetPreferredRow)
-    labelWidgetClass = Qt.pyqtProperty("QString", getLabelWidgetClass, setLabelWidgetClass, resetLabelWidgetClass)
-    readWidgetClass = Qt.pyqtProperty("QString", getReadWidgetClass, setReadWidgetClass, resetReadWidgetClass)
-    writeWidgetClass = Qt.pyqtProperty("QString", getWriteWidgetClass, setWriteWidgetClass, resetWriteWidgetClass)
-    unitsWidgetClass = Qt.pyqtProperty("QString", getUnitsWidgetClass, setUnitsWidgetClass, resetUnitsWidgetClass)
-    extraWidgetClass = Qt.pyqtProperty("QString", getExtraWidgetClass, setExtraWidgetClass, resetExtraWidgetClass)
-    labelConfig = Qt.pyqtProperty("QString", getLabelConfig, setLabelConfig, resetLabelConfig)
-    allowWrite = Qt.pyqtProperty("bool", getAllowWrite, setAllowWrite, resetAllowWrite)
-    modifiableByUser = Qt.pyqtProperty("bool", TaurusBaseWidget.isModifiableByUser, TaurusBaseWidget.setModifiableByUser, TaurusBaseWidget.resetModifiableByUser)
+    # Qt properties (for designer)
+    model = Qt.pyqtProperty(
+        "QString", TaurusBaseWidget.getModel,  setModel, TaurusBaseWidget.resetModel)
+    preferredRow = Qt.pyqtProperty(
+        "int", getPreferredRow, setPreferredRow, resetPreferredRow)
+    labelWidgetClass = Qt.pyqtProperty(
+        "QString", getLabelWidgetClass, setLabelWidgetClass, resetLabelWidgetClass)
+    readWidgetClass = Qt.pyqtProperty(
+        "QString", getReadWidgetClass, setReadWidgetClass, resetReadWidgetClass)
+    writeWidgetClass = Qt.pyqtProperty(
+        "QString", getWriteWidgetClass, setWriteWidgetClass, resetWriteWidgetClass)
+    unitsWidgetClass = Qt.pyqtProperty(
+        "QString", getUnitsWidgetClass, setUnitsWidgetClass, resetUnitsWidgetClass)
+    extraWidgetClass = Qt.pyqtProperty(
+        "QString", getExtraWidgetClass, setExtraWidgetClass, resetExtraWidgetClass)
+    labelConfig = Qt.pyqtProperty(
+        "QString", getLabelConfig, setLabelConfig, resetLabelConfig)
+    allowWrite = Qt.pyqtProperty(
+        "bool", getAllowWrite, setAllowWrite, resetAllowWrite)
+    modifiableByUser = Qt.pyqtProperty("bool", TaurusBaseWidget.isModifiableByUser,
+                                       TaurusBaseWidget.setModifiableByUser, TaurusBaseWidget.resetModifiableByUser)
 
 
 class TaurusValuesFrame(TaurusFrame):
     '''This is a container specialized into containing TaurusValue widgets.
     It should be used Only for TaurusValues'''
-    
+
     _model = []
-    @Qt.pyqtSignature("setModel(QStringList)")    
+
+    @Qt.pyqtSlot('QStringList')
     def setModel(self, model):
         self._model = model
         for tv in self.getTaurusValues():
@@ -1132,95 +1270,93 @@ class TaurusValuesFrame(TaurusFrame):
             taurusvalue.setMinimumHeight(20)
             taurusvalue.setModel(str(m))
             taurusvalue.setModifiableByUser(self.isModifiableByUser())
+
     def getModel(self):
         return self._model
-                
+
     def resetModel(self):
         self.setModel([])
-    
+
     def getTaurusValueByIndex(self, index):
         '''returns the TaurusValue item at the given index position'''
         return self.getTaurusValues()[index]
-    
+
     def getTaurusValues(self):
         '''returns the list of TaurusValue Objects contained by this frame'''
-        return [obj for obj in self.children() if isinstance(obj,TaurusValue)]
-    
+        return [obj for obj in self.children() if isinstance(obj, TaurusValue)]
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         '''we don't want this widget in designer'''
-        return None  
-    
+        return None
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-   
+
     model = Qt.pyqtProperty("QStringList", getModel, setModel, resetModel)
 
 
 #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 if __name__ == "__main__":
-    
+
     import sys
 
     app = Qt.QApplication(sys.argv)
     form = Qt.QMainWindow()
-    #ly=Qt.QVBoxLayout(form)
-    #container=Qt.QWidget()
+    # ly=Qt.QVBoxLayout(form)
+    # container=Qt.QWidget()
 #    container = TaurusValuesFrame()
     from taurus.qt.qtgui.panel import TaurusForm
     container = TaurusForm()
-    #ly.addWidget(container)
+    # ly.addWidget(container)
     form.setCentralWidget(container)
 
     try:
         from taurus.qt.qtgui.extra_pool import PoolMotorSlim, PoolChannel
-        container.setCustomWidgetMap({'SimuMotor':PoolMotorSlim,
-                                'Motor':PoolMotorSlim,
-                                'PseudoMotor':PoolMotorSlim,
-                                'PseudoCounter':PoolChannel,
-                                'CTExpChannel':PoolChannel,
-                                'ZeroDExpChannel':PoolChannel,
-                                'OneDExpChannel':PoolChannel,
-                                'TwoDExpChannel':PoolChannel})
+        container.setCustomWidgetMap({'SimuMotor': PoolMotorSlim,
+                                      'Motor': PoolMotorSlim,
+                                      'PseudoMotor': PoolMotorSlim,
+                                      'PseudoCounter': PoolChannel,
+                                      'CTExpChannel': PoolChannel,
+                                      'ZeroDExpChannel': PoolChannel,
+                                      'OneDExpChannel': PoolChannel,
+                                      'TwoDExpChannel': PoolChannel})
     except:
         pass
-    
-    ##set a model list  
-    if len(sys.argv)>1:
-        models=sys.argv[1:]
+
+    # set a model list
+    if len(sys.argv) > 1:
+        models = sys.argv[1:]
         container.setModel(models)
     else:
         models = []
-        
-    #models assigned for debugging.... comment out when releasing
-    #models=['bl97/pc/dummy-01/Current','bl97/pysignalsimulator/1/value1','bl97/pc/dummy-02/RemoteMode','bl97/pc/dummy-02/CurrentSetpoint','bl97/pc/dummy-02/Current']
-    #models=['bl97/pc/dummy-01/Current']
-    #models=['bl97/pc/dummy-01/CurrentSetpoint','bl97/pc/dummy-02/Current','bl97/pc/dummy-02/RemoteMode','bl97/pysignalsimulator/1/value1']
-    #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 assigned for debugging.... comment out when releasing
+    # models=['bl97/pc/dummy-01/Current','bl97/pysignalsimulator/1/value1','bl97/pc/dummy-02/RemoteMode','bl97/pc/dummy-02/CurrentSetpoint','bl97/pc/dummy-02/Current']
+    # models=['bl97/pc/dummy-01/Current']
+    # models=['bl97/pc/dummy-01/CurrentSetpoint','bl97/pc/dummy-02/Current','bl97/pc/dummy-02/RemoteMode','bl97/pysignalsimulator/1/value1']
+    # 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.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.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)
     form.show()
 
-        
-    
-    #show an Attributechooser dialog if no model was given
+    # show an Attributechooser dialog if no model was given
     if models == []:
         from taurus.qt.qtgui.panel import TaurusModelChooser
         modelChooser = TaurusModelChooser()
-        form.connect(modelChooser, Qt.SIGNAL("updateModels"), container.setModel)
+        modelChooser.updateModels.connect(container.setModel)
         modelChooser.show()
-    
+
     sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/panel/test/__init__.py b/lib/taurus/qt/qtgui/panel/test/__init__.py
index 9503bca..b5a5672 100644
--- a/lib/taurus/qt/qtgui/panel/test/__init__.py
+++ b/lib/taurus/qt/qtgui/panel/test/__init__.py
@@ -2,23 +2,23 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
diff --git a/lib/taurus/qt/qtgui/panel/test/test_taurusform.py b/lib/taurus/qt/qtgui/panel/test/test_taurusform.py
index 641d037..495ccf5 100644
--- a/lib/taurus/qt/qtgui/panel/test/test_taurusform.py
+++ b/lib/taurus/qt/qtgui/panel/test/test_taurusform.py
@@ -1,24 +1,24 @@
 #!/usr/bin/env python
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -41,15 +41,15 @@ class TaurusFormTest(GenericWidgetTestCase, unittest.TestCase):
                   ['sys/tg_test/1/wave'],
                   [],
                   '',
-                  ['eval://1'],
+                  ['eval:1'],
                   None,
                   ['sys/tg_test/1/%s' % a for a in (
                    'short_scalar', 'double_array',
                    'uchar_image_ro', 'string_spectrum',
                    'no_value', 'throw_exception')],
                   [''],
-                  'sys/tg_test/1,eval://1',
-                  'sys/tg_test/1/short_image eval://rand(16)',
+                  'sys/tg_test/1,eval:1',
+                  'sys/tg_test/1/short_image eval:rand(16)',
                   [None]
                   ]
 
@@ -65,7 +65,6 @@ class TaurusAttrFormTest(GenericWidgetTestCase, unittest.TestCase):
     modelnames = ['sys/tg_test/1', None]
 
 
-
 # if __name__ == "__main__":
 #     unittest.main()
 #    suite = unittest.defaultTestLoader.loadTestsFromTestCase(TaurusFormTest)
diff --git a/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py b/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py
index 8a93bcc..32e373e 100644
--- a/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py
+++ b/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py
@@ -2,61 +2,86 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """Test for taurus.qt.qtgui.panel.taurusvalue"""
 
 from taurus.external import unittest
-from taurus.qt.qtgui.test import  BaseWidgetTestCase
-from taurus.qt.qtgui.panel import TaurusValue 
+from taurus.test import insertTest
+from taurus.qt.qtgui.test import BaseWidgetTestCase
+from taurus.qt.qtgui.panel import TaurusValue
+from taurus.core.tango.test import TangoSchemeTestLauncher
 
-class TestTaurusValue(BaseWidgetTestCase, unittest.TestCase):
-    '''Specific test for the TaurusValue widget'''    
+DEV_NAME = TangoSchemeTestLauncher.DEV_NAME
+
+
+ at insertTest(helper_name='texts',
+            model='tango:' + DEV_NAME + '/double_scalar',
+            expected=('double_scalar', '1.23', '0.0 mm', 'mm'),
+            # expected=('double_scalar', '1.23', '0.0', 'mm'),
+            # TODO: change taurusvalue's line edit to hide units
+            )
+class TaurusValueTest(TangoSchemeTestLauncher, BaseWidgetTestCase,
+                      unittest.TestCase):
+    '''
+    Specific tests for TaurusValue
+    '''
     _klass = TaurusValue
 
-    def setUp(self):
-        '''Do all what is done in BaseWidgetTestCase.setUp and also set a 
-        model and show the widget'''
-        
-        #Make sure the basics are taken care of (QApplication, etc)
-        BaseWidgetTestCase.setUp(self)
-        self._widget.setModel('eval://1')
-        self._widget.show()
- 
-    def tearDown(self):
-        '''Set Model to None'''
-        self._widget.setModel(None)
-        unittest.TestCase.tearDown(self)
- 
     def test_bug126(self):
         '''Verify that case is not lost when customizing a label (bug#126)'''
         w = self._widget
+        # self._widget.setModel('eval:1')
+        self._widget.setModel('tango:' + DEV_NAME + '/double_scalar')
         label = 'MIXEDcase'
         w.setLabelConfig(label)
-        self._app.processEvents() #required
+        self._app.processEvents()  # required
         shownLabel = str(w.labelWidget().text())
         msg = 'Shown label ("%s") differs from set label ("%s")' % (shownLabel,
                                                                     label)
         self.assertEqual(label, shownLabel, msg)
+        self.assertMaxDeprecations(0)
+
+    def texts(self, model=None, expected=None, fgRole=None, maxdepr=0):
+        '''Checks the texts for scalar attributes'''
+        self._widget.setModel(model)
+        if fgRole is not None:
+            self._widget.setFgRole(fgRole)
+        self._app.processEvents()
+        got = (str(self._widget.labelWidget().text()),
+               str(self._widget.readWidget().text()),
+               str(self._widget.writeWidget().displayText()),
+               str(self._widget.unitsWidget().text()),
+               )
+        msg = ('wrong text for "%s":\n expected: %s\n got: %s' %
+               (model, expected, got))
+        self.assertEqual(got, expected, msg)
+        self.assertMaxDeprecations(maxdepr)
+
+    def tearDown(self):
+        '''Set Model to None'''
+        self._widget.setModel(None)
+        TangoSchemeTestLauncher.tearDown(self)
+        unittest.TestCase.tearDown(self)
 
 if __name__ == '__main__':
     pass
diff --git a/lib/taurus/qt/qtgui/panel/ui/QDataExportDialog.ui b/lib/taurus/qt/qtgui/panel/ui/QDataExportDialog.ui
old mode 100644
new mode 100755
diff --git a/lib/taurus/qt/qtgui/panel/ui/QDoubleListDlg.ui b/lib/taurus/qt/qtgui/panel/ui/QDoubleListDlg.ui
old mode 100644
new mode 100755
diff --git a/lib/taurus/qt/qtgui/panel/ui/QRawDataWidget.ui b/lib/taurus/qt/qtgui/panel/ui/QRawDataWidget.ui
old mode 100644
new mode 100755
diff --git a/lib/taurus/qt/qtgui/panel/ui/TaurusAttributeChooser.ui b/lib/taurus/qt/qtgui/panel/ui/TaurusAttributeChooser.ui
deleted file mode 100644
index 4298c20..0000000
--- a/lib/taurus/qt/qtgui/panel/ui/TaurusAttributeChooser.ui
+++ /dev/null
@@ -1,246 +0,0 @@
-<ui version="4.0" >
- <class>AttrCh</class>
- <widget class="QWidget" name="AttrCh" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>371</width>
-    <height>469</height>
-   </rect>
-  </property>
-  <property name="minimumSize" >
-   <size>
-    <width>0</width>
-    <height>0</height>
-   </size>
-  </property>
-  <property name="windowTitle" >
-   <string>Form</string>
-  </property>
-  <layout class="QVBoxLayout" >
-   <item>
-    <layout class="QHBoxLayout" >
-     <item>
-      <widget class="QLabel" name="label_1" >
-       <property name="minimumSize" >
-        <size>
-         <width>54</width>
-         <height>20</height>
-        </size>
-       </property>
-       <property name="whatsThis" >
-        <string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Enter here the path for search a device.</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Format:</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Domain/Family/Member</p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></string>
-       </property>
-       <property name="text" >
-        <string>Enter a path:</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QLineEdit" name="lineEdit" >
-       <property name="sizePolicy" >
-        <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="minimumSize" >
-        <size>
-         <width>0</width>
-         <height>0</height>
-        </size>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" >
-     <item>
-      <layout class="QVBoxLayout" >
-       <item>
-        <widget class="QLabel" name="label_2" >
-         <property name="whatsThis" >
-          <string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">List of Devices.</p></body></html></string>
-         </property>
-         <property name="text" >
-          <string>Devices:</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QListWidget" name="devList" >
-         <property name="minimumSize" >
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </item>
-     <item>
-      <layout class="QVBoxLayout" >
-       <item>
-        <widget class="QLabel" name="label_3" >
-         <property name="whatsThis" >
-          <string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">List of the device attributes.</p></body></html></string>
-         </property>
-         <property name="text" >
-          <string>Attributes:</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QListWidget" name="attrList" >
-         <property name="minimumSize" >
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-         <property name="selectionMode" >
-          <enum>QAbstractItemView::ExtendedSelection</enum>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" >
-     <item>
-      <spacer>
-       <property name="orientation" >
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" >
-        <size>
-         <width>51</width>
-         <height>23</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QToolButton" name="addButton" >
-       <property name="toolTip" >
-        <string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add selected attribute(s) from the <span style=" font-style:italic;">Attribute List</span> to the <span style=" font-style:italic;">Chosen Attributes</span></p></body></html></string>
-       </property>
-       <property name="text" >
-        <string>Add</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QToolButton" name="removeButton" >
-       <property name="toolTip" >
-        <string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remove selected attribute(s) from the <span style=" font-style:italic;">Chosen Attributes</span></p></body></html></string>
-       </property>
-       <property name="text" >
-        <string>Remove</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QToolButton" name="cancelButton" >
-       <property name="toolTip" >
-        <string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Clear the <span style=" font-style:italic;">Chosen Attributes</span> list</p></body></html></string>
-       </property>
-       <property name="text" >
-        <string>Clear</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QVBoxLayout" >
-     <item>
-      <widget class="QLabel" name="label_4" >
-       <property name="minimumSize" >
-        <size>
-         <width>0</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="whatsThis" >
-        <string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">List of all the attributes selected.</p></body></html></string>
-       </property>
-       <property name="text" >
-        <string>Chosen attributes:</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QListWidget" name="final_List" >
-       <property name="minimumSize" >
-        <size>
-         <width>0</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="selectionMode" >
-        <enum>QAbstractItemView::ExtendedSelection</enum>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="updateButton" >
-       <property name="minimumSize" >
-        <size>
-         <width>75</width>
-         <height>41</height>
-        </size>
-       </property>
-       <property name="toolTip" >
-        <string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Update the attribute(s)</p></body></html></string>
-       </property>
-       <property name="whatsThis" >
-        <string><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Update with the choosen attributes.</p></body></html></string>
-       </property>
-       <property name="text" >
-        <string>Apply</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/lib/taurus/qt/qtgui/panel/ui/TaurusConfigurationPanel.ui b/lib/taurus/qt/qtgui/panel/ui/TaurusConfigurationPanel.ui
index e10f8a4..c36d546 100644
--- a/lib/taurus/qt/qtgui/panel/ui/TaurusConfigurationPanel.ui
+++ b/lib/taurus/qt/qtgui/panel/ui/TaurusConfigurationPanel.ui
@@ -38,7 +38,7 @@
          </widget>
         </item>
         <item row="0" column="1" >
-         <widget class="TaurusConfigLineEdit" name="valueMinConfig" />
+         <widget class="TangoConfigLineEdit" name="valueMinConfig" />
         </item>
         <item row="1" column="0" >
          <widget class="QLabel" name="rangeMaxLabel" >
@@ -48,7 +48,7 @@
          </widget>
         </item>
         <item row="1" column="1" >
-         <widget class="TaurusConfigLineEdit" name="valueMaxConfig" />
+         <widget class="TangoConfigLineEdit" name="valueMaxConfig" />
         </item>
        </layout>
       </widget>
@@ -76,7 +76,7 @@
          </widget>
         </item>
         <item row="0" column="1" >
-         <widget class="TaurusConfigLineEdit" name="alarmMinConfig" />
+         <widget class="TangoConfigLineEdit" name="alarmMinConfig" />
         </item>
         <item row="1" column="0" >
          <widget class="QLabel" name="alarmMaxLabel" >
@@ -86,7 +86,7 @@
          </widget>
         </item>
         <item row="1" column="1" >
-         <widget class="TaurusConfigLineEdit" name="alarmMaxConfig" />
+         <widget class="TangoConfigLineEdit" name="alarmMaxConfig" />
         </item>
        </layout>
        <zorder>alarmMinLabel</zorder>
@@ -118,7 +118,7 @@
          </widget>
         </item>
         <item row="0" column="1" >
-         <widget class="TaurusConfigLineEdit" name="warningMinConfig" />
+         <widget class="TangoConfigLineEdit" name="warningMinConfig" />
         </item>
         <item row="1" column="0" >
          <widget class="QLabel" name="warningMaxLabel" >
@@ -128,7 +128,7 @@
          </widget>
         </item>
         <item row="1" column="1" >
-         <widget class="TaurusConfigLineEdit" name="warningMaxConfig" />
+         <widget class="TangoConfigLineEdit" name="warningMaxConfig" />
         </item>
        </layout>
       </widget>
@@ -233,7 +233,7 @@
     </widget>
    </item>
    <item row="2" column="1" colspan="2" >
-    <widget class="TaurusConfigLineEdit" name="labelConfig" />
+    <widget class="TangoConfigLineEdit" name="labelConfig" />
    </item>
    <item row="3" column="0" >
     <widget class="QLabel" name="unitLabel" >
@@ -243,7 +243,7 @@
     </widget>
    </item>
    <item row="3" column="1" colspan="2" >
-    <widget class="TaurusConfigLineEdit" name="unitConfig" />
+    <widget class="TangoConfigLineEdit" name="unitConfig" />
    </item>
    <item row="4" column="0" >
     <widget class="QLabel" name="displayUnitLabel" >
@@ -253,7 +253,7 @@
     </widget>
    </item>
    <item row="4" column="1" colspan="2" >
-    <widget class="TaurusConfigLineEdit" name="displayUnitConfig" />
+    <widget class="TangoConfigLineEdit" name="displayUnitConfig" />
    </item>
    <item row="5" column="0" >
     <widget class="QLabel" name="standardUnitLabel" >
@@ -263,7 +263,7 @@
     </widget>
    </item>
    <item row="5" column="1" colspan="2" >
-    <widget class="TaurusConfigLineEdit" name="standardUnitConfig" />
+    <widget class="TangoConfigLineEdit" name="standardUnitConfig" />
    </item>
    <item row="6" column="0" >
     <widget class="QLabel" name="formatLabel" >
@@ -273,7 +273,7 @@
     </widget>
    </item>
    <item row="6" column="1" colspan="2" >
-    <widget class="TaurusConfigLineEdit" name="formatConfig" />
+    <widget class="TangoConfigLineEdit" name="formatConfig" />
    </item>
    <item row="7" column="0" colspan="2" >
     <widget class="QLabel" name="descriptionLabel" >
@@ -289,7 +289,7 @@
     </widget>
    </item>
    <item row="8" column="0" colspan="3" >
-    <widget class="TaurusConfigLineEdit" name="descriptionConfig" />
+    <widget class="TangoConfigLineEdit" name="descriptionConfig" />
    </item>
    <item row="12" column="0" colspan="4" >
     <spacer name="verticalSpacer_2" >
@@ -337,9 +337,9 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>TaurusConfigLineEdit</class>
+   <class>TangoConfigLineEdit</class>
    <extends>QLineEdit</extends>
-   <header>taurus.qt.qtgui.input</header>
+   <header>taurus.qt.qtgui.panel</header>
   </customwidget>
   <customwidget>
    <class>TaurusGroupBox</class>
diff --git a/lib/taurus/qt/qtgui/panel/ui/TaurusDevPanel.ui b/lib/taurus/qt/qtgui/panel/ui/TaurusDevPanel.ui
old mode 100644
new mode 100755
diff --git a/lib/taurus/qt/qtgui/panel/ui/TaurusFilterPanel.ui b/lib/taurus/qt/qtgui/panel/ui/TaurusFilterPanel.ui
old mode 100644
new mode 100755
diff --git a/lib/taurus/qt/qtgui/plot/__init__.py b/lib/taurus/qt/qtgui/plot/__init__.py
index f7b4795..9a80113 100644
--- a/lib/taurus/qt/qtgui/plot/__init__.py
+++ b/lib/taurus/qt/qtgui/plot/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -31,7 +31,7 @@ This module is part of Taurus Widgets. It contains specialized widgets for 2D pl
 in Taurus. It depends on the `PyQwt module <http://pyqwt.sourceforge.net/>`_
 """
 
-from .qwtdialog import *
+from .qwtdialog import TaurusPlotConfigDialog
 from .scales import *
 from .taurusplot import *
 from .taurustrend import *
@@ -40,4 +40,4 @@ from .taurusarrayedit import TaurusArrayEditor
 from .curvesAppearanceChooserDlg import CurveAppearanceProperties, CurvesAppearanceChooser
 from .curveprops import CurvePropertiesView
 from .monitor import TaurusMonitorTiny
-from .curveStatsDlg import CurveStatsDialog
\ No newline at end of file
+from .curveStatsDlg import CurveStatsDialog
diff --git a/lib/taurus/qt/qtgui/plot/arrayedit.py b/lib/taurus/qt/qtgui/plot/arrayedit.py
index 016d138..6fec5ab 100644
--- a/lib/taurus/qt/qtgui/plot/arrayedit.py
+++ b/lib/taurus/qt/qtgui/plot/arrayedit.py
@@ -2,67 +2,70 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-arrayedit.py: Widget for editing a spectrum/array via control points 
+arrayedit.py: Widget for editing a spectrum/array via control points
 """
 
 
 import numpy
 from taurus.external.qt import Qt, Qwt5
 from taurus.qt.qtgui.util.ui import UILoadable
-from curvesAppearanceChooserDlg import CurveAppearanceProperties 
+from curvesAppearanceChooserDlg import CurveAppearanceProperties
 
 
 @UILoadable
 class ControllerBox(Qt.QWidget):
-    
+
+    selected = Qt.pyqtSignal(int)
+
     def __init__(self, parent=None, x=0, y=0, corr=0):
         Qt.QWidget.__init__(self, parent)
         self.loadUi()
         self._x = x
         self.setY(y)
-        self.box.setTitle('x=%6g'%self._x)
+        self.box.setTitle('x=%6g' % self._x)
         self.corrSB.setValue(corr)
-        self.ctrlObj = self.corrSB.ctrlObj = self.lCopyBT.ctrlObj= self.rCopyBT.ctrlObj = self.lScaleBT.ctrlObj = self.rScaleBT.ctrlObj = self
-        self.corrSB.focusInEvent = self.corrSB_focusInEvent #reimplementing the focusInEvent method for the spinbox
+        self.ctrlObj = self.corrSB.ctrlObj = self.lCopyBT.ctrlObj = self.rCopyBT.ctrlObj = self.lScaleBT.ctrlObj = self.rScaleBT.ctrlObj = self
+        # reimplementing the focusInEvent method for the spinbox
+        self.corrSB.focusInEvent = self.corrSB_focusInEvent
         self.box.mousePressEvent = self.mousePressEvent
         #self.connect(self.corrSB, Qt.SIGNAL('valueChanged(double)'), self.enableScale)
-        
+
     def mousePressEvent(self, event):
-        self.emit(Qt.SIGNAL('selected'),self._x)
-        #print 'SELECTED', self
+        self.selected.emit(self._x)
+        # print 'SELECTED', self
         #Qt.QDoubleSpinBox.focusInEvent(self.corrSB, event)
-    
+
     def corrSB_focusInEvent(self, event):
-        self.emit(Qt.SIGNAL('selected'),self._x)
-        #print 'GOT FOCUS', self
+        self.selected.emit(self._x)
+        # print 'GOT FOCUS', self
         Qt.QDoubleSpinBox.focusInEvent(self.corrSB, event)
-        
+
     def setY(self, y):
         self._y = y
         self.enableScale()
-    
+
     def enableScale(self, *args):
         enable = (self._y + self.corrSB.value()) != 0
         self.lScaleBT.setEnabled(enable)
@@ -71,70 +74,71 @@ class ControllerBox(Qt.QWidget):
 
 @UILoadable
 class EditCPointsDialog(Qt.QDialog):
-    
+
     def __init__(self, parent=None, x=0):
         Qt.QDialog.__init__(self, parent)
-        self.setupUi(self)
+        self.loadUi()
+
 
 @UILoadable
 class AddCPointsDialog(Qt.QDialog):
-    
+
     def __init__(self, parent=None, x=0):
         Qt.QDialog.__init__(self, parent)
         self.loadUi()
-        
+
 
 @UILoadable
 class ArrayEditor(Qt.QWidget):
-    
+
     def __init__(self, parent=None):
         Qt.QWidget.__init__(self, parent)
         self.loadUi()
-        
+
         self._controllers = []
-        
-        #construct the layout for controllers container
+
+        # construct the layout for controllers container
         self.ctrlLayout = Qt.QHBoxLayout(self.controllersContainer)
-        self.ctrlLayout.setContentsMargins ( 5, 0, 5, 0 )
+        self.ctrlLayout.setContentsMargins(5, 0, 5, 0)
         self.ctrlLayout.setSpacing(1)
 
-        #implement scroll bars for the controllers container
+        # implement scroll bars for the controllers container
         self.scrollArea = Qt.QScrollArea(self)
         self.scrollArea.setWidget(self.controllersContainer)
         self.scrollArea.setVerticalScrollBarPolicy(Qt.Qt.ScrollBarAlwaysOff)
         self.scrollArea.setWidgetResizable(True)
         self.cpointsGroupBox.layout().insertWidget(0, self.scrollArea)
-        
-        #initialize data
+
+        # initialize data
         cpoints = 2
         self.x = numpy.arange(256, dtype='double')
         self.y = numpy.zeros(256, dtype='double')
-        self.xp = numpy.linspace(self.x[0],self.x[-1], cpoints)
+        self.xp = numpy.linspace(self.x[0], self.x[-1], cpoints)
         self.corrp = numpy.zeros(cpoints)
         self.yp = numpy.interp(self.xp, self.x, self.y)
         self.corr = numpy.zeros(self.x.size)
-        
-        #markers
-        self.markerPos=self.xp[0]
+
+        # markers
+        self.markerPos = self.xp[0]
         self.marker1 = Qwt5.QwtPlotMarker()
         self.marker1.setSymbol(Qwt5.QwtSymbol(Qwt5.QwtSymbol.Rect,
-                                  Qt.QBrush(Qt.Qt.NoBrush),
-                                  Qt.QPen(Qt.Qt.green),
-                                  Qt.QSize(8,8)))
+                                              Qt.QBrush(Qt.Qt.NoBrush),
+                                              Qt.QPen(Qt.Qt.green),
+                                              Qt.QSize(8, 8)))
         self.marker1.attach(self.plot1)
         self.marker2 = Qwt5.QwtPlotMarker()
         self.marker2.setSymbol(Qwt5.QwtSymbol(Qwt5.QwtSymbol.Rect,
-                                  Qt.QBrush(Qt.Qt.NoBrush),
-                                  Qt.QPen(Qt.Qt.green),
-                                  Qt.QSize(8,8)))
+                                              Qt.QBrush(Qt.Qt.NoBrush),
+                                              Qt.QPen(Qt.Qt.green),
+                                              Qt.QSize(8, 8)))
         self.marker2.attach(self.plot2)
-        
-        #cpointsPickers
+
+        # cpointsPickers
         self._cpointMovingIndex = None
         self._cpointsPicker1 = Qwt5.QwtPicker(self.plot1.canvas())
         self._cpointsPicker1.setSelectionFlags(Qwt5.QwtPicker.PointSelection)
         self._cpointsPicker2 = Qwt5.QwtPicker(self.plot2.canvas())
-        self._cpointsPicker2.setSelectionFlags(Qwt5.QwtPicker.PointSelection )
+        self._cpointsPicker2.setSelectionFlags(Qwt5.QwtPicker.PointSelection)
         self._cpointsPicker1.widgetMousePressEvent = self.plot1MousePressEvent
         self._cpointsPicker1.widgetMouseReleaseEvent = self.plot1MouseReleaseEvent
         self._cpointsPicker2.widgetMousePressEvent = self.plot2MousePressEvent
@@ -143,358 +147,404 @@ class ArrayEditor(Qt.QWidget):
         self._cpointsPicker2.widgetMouseDoubleClickEvent = self.plot2MouseDoubleClickEvent
         self._populatePlots()
         self.resetCorrection()
-        self._selectedController =self._controllers[0]
-        
+        self._selectedController = self._controllers[0]
+
         self._addCPointsDialog = AddCPointsDialog(self)
-        
-        #Launch low-priority initializations (to speed up load time)
-        #Qt.QTimer.singleShot(0, <method>)
-        
-        #connections
-        self.connect(self.addCPointsBT, Qt.SIGNAL('clicked (bool)'), self._addCPointsDialog.show)
-        self.connect(self._addCPointsDialog.editBT, Qt.SIGNAL('clicked (bool)'), self.showEditCPointsDialog)
-        self.connect(self._addCPointsDialog.cleanBT, Qt.SIGNAL('clicked (bool)'), self.resetCorrection)
-        self.connect(self._addCPointsDialog.addSingleCPointBT, Qt.SIGNAL('clicked (bool)'), self.onAddSingleCPointBT)
-        self.connect(self._addCPointsDialog.addRegEspCPointsBT, Qt.SIGNAL('clicked (bool)'), self.onAddRegEspCPointsBT)
-    
+
+        # Launch low-priority initializations (to speed up load time)
+        # Qt.QTimer.singleShot(0, <method>)
+
+        # connections
+        self.addCPointsBT.clicked[()].connect(self._addCPointsDialog.show)
+        self._addCPointsDialog.editBT.clicked[()].connect(self.showEditCPointsDialog)
+        self._addCPointsDialog.cleanBT.clicked[()].connect(self.resetCorrection)
+        self._addCPointsDialog.addSingleCPointBT.clicked[()].connect(self.onAddSingleCPointBT)
+        self._addCPointsDialog.addRegEspCPointsBT.clicked[()].connect(self.onAddRegEspCPointsBT)
+
     def plot1MousePressEvent(self, event):
         self.plotMousePressEvent(event, self.plot1)
-        
+
     def plot2MousePressEvent(self, event):
         self.plotMousePressEvent(event, self.plot2)
-        
+
     def plotMousePressEvent(self, event, taurusplot):
-        picked, pickedCurveName, pickedIndex =  taurusplot.pickDataPoint(event.pos(), scope=20, showMarker=False, targetCurveNames=['Control Points'])
+        picked, pickedCurveName, pickedIndex = taurusplot.pickDataPoint(
+            event.pos(), scope=20, showMarker=False, targetCurveNames=['Control Points'])
         if picked is not None:
             self.changeCPointSelection(picked.x())
             self.makeControllerVisible(self._controllers[pickedIndex])
-            self._cpointMovingIndex =  pickedIndex
+            self._cpointMovingIndex = pickedIndex
             self._movingStartYPos = event.y()
             taurusplot.canvas().setCursor(Qt.Qt.SizeVerCursor)
-            
+
     def plot1MouseReleaseEvent(self, event):
         self.plotMouseReleaseEvent(event, self.plot1)
-        
+
     def plot2MouseReleaseEvent(self, event):
         self.plotMouseReleaseEvent(event, self.plot2)
-        
+
     def plotMouseReleaseEvent(self, event, taurusplot):
-        if self._cpointMovingIndex is None: return #if no cpoint was picked, do nothing on release
-        #no motion s performed if the y position is unchanged or if the mouse release is out of the canvas
-        validMotion = (self._movingStartYPos != event.pos().y()) and taurusplot.canvas().rect().contains(event.pos())
+        if self._cpointMovingIndex is None:
+            return  # if no cpoint was picked, do nothing on release
+        # no motion s performed if the y position is unchanged or if the mouse
+        # release is out of the canvas
+        validMotion = (self._movingStartYPos != event.pos().y()
+                       ) and taurusplot.canvas().rect().contains(event.pos())
         if validMotion:
-            #calculate the new correction
-            newCorr = taurusplot.invTransform(taurusplot.getCurve('Control Points').yAxis(), event.y())
+            # calculate the new correction
+            newCorr = taurusplot.invTransform(
+                taurusplot.getCurve('Control Points').yAxis(), event.y())
             if taurusplot is self.plot1:
-                newCorr -= self.yp[self._cpointMovingIndex] 
-            #apply new correction
+                newCorr -= self.yp[self._cpointMovingIndex]
+            # apply new correction
             self._controllers[self._cpointMovingIndex].corrSB.setValue(newCorr)
-        #reset the moving state
+        # reset the moving state
         self._cpointMovingIndex = None
         taurusplot.canvas().setCursor(Qt.Qt.CrossCursor)
-        
+
     def plot1MouseDoubleClickEvent(self, event):
         self.plotMouseDoubleClickEvent(event, self.plot1)
-        
+
     def plot2MouseDoubleClickEvent(self, event):
         self.plotMouseDoubleClickEvent(event, self.plot2)
-        
+
     def plotMouseDoubleClickEvent(self, event, taurusplot):
-        picked, pickedCurveName, pickedIndex =  taurusplot.pickDataPoint(event.pos(), scope=20, showMarker=False, targetCurveNames=['Control Points'])
-        if picked is not None: return #we dont want to create a control point too close of an existing one
-        xp = taurusplot.invTransform(taurusplot.getCurve('Control Points').xAxis(), event.x())
-        if xp<self.xp[0] or xp>self.xp[-1]: return #we dont want to create control points out of the curve range
-        if Qt.QMessageBox.question(self, 'Create Control Point?', 'Insert a new control point at x=%g?'%xp, 'Yes', 'No') == 0:
+        picked, pickedCurveName, pickedIndex = taurusplot.pickDataPoint(
+            event.pos(), scope=20, showMarker=False, targetCurveNames=['Control Points'])
+        if picked is not None:
+            return  # we dont want to create a control point too close of an existing one
+        xp = taurusplot.invTransform(taurusplot.getCurve(
+            'Control Points').xAxis(), event.x())
+        if xp < self.xp[0] or xp > self.xp[-1]:
+            return  # we dont want to create control points out of the curve range
+        if Qt.QMessageBox.question(self, 'Create Control Point?', 'Insert a new control point at x=%g?' % xp, 'Yes', 'No') == 0:
             self.insertController(xp)
             self.changeCPointSelection(xp)
-            Qt.QTimer.singleShot(1, self.makeControllerVisible) #singleshot is used as a hack to get out of the eventhandler
-            
-    def makeControllerVisible(self, ctrl = None):
-        if ctrl is None: ctrl = self._selectedController
+            # singleshot is used as a hack to get out of the eventhandler
+            Qt.QTimer.singleShot(1, self.makeControllerVisible)
+
+    def makeControllerVisible(self, ctrl=None):
+        if ctrl is None:
+            ctrl = self._selectedController
         self.scrollArea.ensureWidgetVisible(ctrl)
-        
+
     def connectToController(self, ctrl):
-        self.connect(ctrl, Qt.SIGNAL('selected'), self.changeCPointSelection)
-        self.connect(ctrl.corrSB, Qt.SIGNAL('valueChanged (double)'), self.onCorrSBChanged)
-        self.connect(ctrl.lCopyBT, Qt.SIGNAL('clicked (bool)'), self.onLCopy)
-        self.connect(ctrl.rCopyBT, Qt.SIGNAL('clicked (bool)'), self.onRCopy)
-        self.connect(ctrl.lScaleBT, Qt.SIGNAL('clicked (bool)'), self.onLScale)
-        self.connect(ctrl.rScaleBT, Qt.SIGNAL('clicked (bool)'), self.onRScale)
-    
-    
+        ctrl.selected.connect(self.changeCPointSelection)
+        ctrl.corrSB.valueChanged.connect(self.onCorrSBChanged)
+        ctrl.lCopyBT.clicked[()].connect(self.onLCopy)
+        ctrl.rCopyBT.clicked[()].connect(self.onRCopy)
+        ctrl.lScaleBT.clicked[()].connect(self.onLScale)
+        ctrl.rScaleBT.clicked[()].connect(self.onRScale)
+
     def onAddSingleCPointBT(self):
-        x=self._addCPointsDialog.singleCPointXSB.value()
+        x = self._addCPointsDialog.singleCPointXSB.value()
         self.insertController(x)
-    
+
     def onAddRegEspCPointsBT(self):
         cpoints = self._addCPointsDialog.regEspCPointsSB.value()
-        positions = numpy.linspace(self.x[0],self.x[-1], cpoints+2)[1:-1]
-        for xp in positions: self.insertController(xp)
-    
+        positions = numpy.linspace(self.x[0], self.x[-1], cpoints + 2)[1:-1]
+        for xp in positions:
+            self.insertController(xp)
+
     def showEditCPointsDialog(self):
         dialog = EditCPointsDialog(self)
         table = dialog.tableTW
         table.setRowCount(self.xp.size)
-        for i,(xp,corrp) in enumerate(zip(self.xp, self.corrp)):
-            table.setItem(i,0, Qt.QTableWidgetItem(str(xp)))
-            table.setItem(i,1, Qt.QTableWidgetItem(str(corrp)))
-        
-        #show dialog and update values if it is accepted
+        for i, (xp, corrp) in enumerate(zip(self.xp, self.corrp)):
+            table.setItem(i, 0, Qt.QTableWidgetItem(str(xp)))
+            table.setItem(i, 1, Qt.QTableWidgetItem(str(corrp)))
+
+        # show dialog and update values if it is accepted
         if dialog.exec_():
-            #delete previous controllers
-            for c in self._controllers: c.setParent(None)
+            # delete previous controllers
+            for c in self._controllers:
+                c.setParent(None)
+                c.deleteLater()
             self._controllers = []
-            #and create them anew
+            # and create them anew
             new_xp = numpy.zeros(table.rowCount())
             new_corrp = numpy.zeros(table.rowCount())
             try:
                 for i in xrange(table.rowCount()):
-                    new_xp[i] = float(table.item(i,0).text())
-                    new_corrp[i] = float(table.item(i,1).text())
+                    new_xp[i] = float(table.item(i, 0).text())
+                    new_corrp[i] = float(table.item(i, 1).text())
                 self.setCorrection(new_xp, new_corrp)
             except:
-                Qt.QMessageBox.warning(self, 'Invalid data', 'Some values were not valid. Edition is ignored.')
+                Qt.QMessageBox.warning(
+                    self, 'Invalid data', 'Some values were not valid. Edition is ignored.')
+
     def _getInsertionIndex(self, xp):
-        i=0
-        while (self.xp[i]<xp):i+=1
+        i = 0
+        while (self.xp[i] < xp):
+            i += 1
         return i
-    
+
     def insertControllers(self, xplist):
-        for xp in xplist: self.insertController(xp)        
-        
-    def insertController(self, xp, index = None):
-        if xp in self.xp: return None
-        if index is None: index = self._getInsertionIndex(xp)
-        #updating data (not in the most efficient way, but at least is clean)
+        for xp in xplist:
+            self.insertController(xp)
+
+    def insertController(self, xp, index=None):
+        if xp in self.xp:
+            return None
+        if index is None:
+            index = self._getInsertionIndex(xp)
+        # updating data (not in the most efficient way, but at least is clean)
         old_xp = self.xp
-        self.xp = numpy.concatenate((self.xp[:index],(xp,), self.xp[index:]))
+        self.xp = numpy.concatenate((self.xp[:index], (xp,), self.xp[index:]))
         self.yp = numpy.interp(self.xp, self.x, self.y)
-        self.corrp = numpy.interp(self.xp, old_xp, self.corrp) #the new correction is obtained by interpolation from the neighbouring ones
-        #creating the controller
-        ctrl = ControllerBox(parent=None, x=xp, y=self.yp[index], corr=self.corrp[index])
+        # the new correction is obtained by interpolation from the neighbouring
+        # ones
+        self.corrp = numpy.interp(self.xp, old_xp, self.corrp)
+        # creating the controller
+        ctrl = ControllerBox(parent=None, x=xp, y=self.yp[
+                             index], corr=self.corrp[index])
         self.ctrlLayout.insertWidget(index, ctrl)
         self._controllers.insert(index, ctrl)
         self.connectToController(ctrl)
         self.updatePlots()
         return index
-     
+
     def delController(self, index):
-        self._controllers.pop(index).setParent(None)
-        self.xp = numpy.concatenate((self.xp[:index], self.xp[index+1:]))
+        c = self._controllers.pop(index)
+        c.setParent(None)
+        c.deleteLater()
+        self.xp = numpy.concatenate((self.xp[:index], self.xp[index + 1:]))
         self.yp = numpy.interp(self.xp, self.x, self.y)
-        self.corrp = numpy.concatenate((self.corrp[:index], self.corrp[index+1:]))
+        self.corrp = numpy.concatenate(
+            (self.corrp[:index], self.corrp[index + 1:]))
 
     def _populatePlots(self):
-        #Curves appearance
-        self._yAppearance= CurveAppearanceProperties(
+        # Curves appearance
+        self._yAppearance = CurveAppearanceProperties(
             sStyle=Qwt5.QwtSymbol.NoSymbol,
             lStyle=Qt.Qt.SolidLine,
             lWidth=2,
             lColor='black',
             cStyle=Qwt5.QwtPlotCurve.Lines,
             yAxis=Qwt5.QwtPlot.yLeft)
-        
-        self._correctedAppearance= CurveAppearanceProperties(
+
+        self._correctedAppearance = CurveAppearanceProperties(
             sStyle=Qwt5.QwtSymbol.NoSymbol,
             lStyle=Qt.Qt.DashLine,
             lWidth=1,
             lColor='blue',
             cStyle=Qwt5.QwtPlotCurve.Lines,
             yAxis=Qwt5.QwtPlot.yLeft)
-        
-        self._cpointsAppearance= CurveAppearanceProperties(
+
+        self._cpointsAppearance = CurveAppearanceProperties(
             sStyle=Qwt5.QwtSymbol.Rect,
             sSize=5,
             sColor='blue',
             sFill=True,
             lStyle=Qt.Qt.NoPen,
             yAxis=Qwt5.QwtPlot.yLeft)
-        
-        self._corrAppearance= CurveAppearanceProperties(
+
+        self._corrAppearance = CurveAppearanceProperties(
             sStyle=Qwt5.QwtSymbol.NoSymbol,
             lStyle=Qt.Qt.SolidLine,
             lWidth=1,
             lColor='blue',
             cStyle=Qwt5.QwtPlotCurve.Lines,
             yAxis=Qwt5.QwtPlot.yLeft)
-        
-        self.plot1.attachRawData({'x':self.x, 'y':self.y, 'title':'Master'})
-        self.plot1.setCurveAppearanceProperties({'Master':self._yAppearance})
-        
-        self.plot1.attachRawData({'x':self.xp, 'y':self.yp+self.corrp, 'title':'Control Points'})
-        self.plot1.setCurveAppearanceProperties({'Control Points':self._cpointsAppearance})
-        
-        self.plot1.attachRawData({'x':self.x, 'y':self.y+self.corr, 'title':'Corrected'})
-        self.plot1.setCurveAppearanceProperties({'Corrected':self._correctedAppearance})
-        
-        self.plot2.attachRawData({'x':self.x, 'y':self.corr, 'title':'Correction'})
-        self.plot2.setCurveAppearanceProperties({'Correction':self._corrAppearance})
-        
-        self.plot2.attachRawData({'x':self.xp, 'y':self.corrp, 'title':'Control Points'})
-        self.plot2.setCurveAppearanceProperties({'Control Points':self._cpointsAppearance})
-        
+
+        self.plot1.attachRawData({'x': self.x, 'y': self.y, 'title': 'Master'})
+        self.plot1.setCurveAppearanceProperties({'Master': self._yAppearance})
+
+        self.plot1.attachRawData(
+            {'x': self.xp, 'y': self.yp + self.corrp, 'title': 'Control Points'})
+        self.plot1.setCurveAppearanceProperties(
+            {'Control Points': self._cpointsAppearance})
+
+        self.plot1.attachRawData(
+            {'x': self.x, 'y': self.y + self.corr, 'title': 'Corrected'})
+        self.plot1.setCurveAppearanceProperties(
+            {'Corrected': self._correctedAppearance})
+
+        self.plot2.attachRawData(
+            {'x': self.x, 'y': self.corr, 'title': 'Correction'})
+        self.plot2.setCurveAppearanceProperties(
+            {'Correction': self._corrAppearance})
+
+        self.plot2.attachRawData(
+            {'x': self.xp, 'y': self.corrp, 'title': 'Control Points'})
+        self.plot2.setCurveAppearanceProperties(
+            {'Control Points': self._cpointsAppearance})
+
     def updatePlots(self):
-        self.plot1.getCurve('Control Points').setData(self.xp, self.yp + self.corrp)
+        self.plot1.getCurve('Control Points').setData(
+            self.xp, self.yp + self.corrp)
         self.plot1.getCurve('Corrected').setData(self.x, self.y + self.corr)
         self.plot2.getCurve('Correction').setData(self.x, self.corr)
         self.plot2.getCurve('Control Points').setData(self.xp, self.corrp)
         index = self._getInsertionIndex(self.markerPos)
-        self.marker1.setValue(self.xp[index],self.yp[index]+self.corrp[index])
-        self.marker2.setValue(self.xp[index],self.corrp[index])
+        self.marker1.setValue(self.xp[index], self.yp[
+                              index] + self.corrp[index])
+        self.marker2.setValue(self.xp[index], self.corrp[index])
         self.plot1.replot()
         self.plot2.replot()
-        
+
     def onLCopy(self, checked):
         sender = self.sender().ctrlObj
         index = self._getInsertionIndex(sender._x)
-        v=sender.corrSB.value()
+        v = sender.corrSB.value()
         for ctrl in self._controllers[:index]:
             ctrl.corrSB.setValue(v)
-    
+
     def onRCopy(self, checked):
-        sender=self.sender().ctrlObj
+        sender = self.sender().ctrlObj
         index = self._getInsertionIndex(sender._x)
-        v=sender.corrSB.value()
-        for ctrl in self._controllers[index+1:]:
+        v = sender.corrSB.value()
+        for ctrl in self._controllers[index + 1:]:
             ctrl.corrSB.setValue(v)
-        
+
     def onLScale(self, checked):
-        sender=self.sender().ctrlObj
+        sender = self.sender().ctrlObj
         index = self._getInsertionIndex(sender._x)
-        #y=numpy.interp(self.xp, self.x, self.y) #values of the master at the control points
+        # y=numpy.interp(self.xp, self.x, self.y) #values of the master at the
+        # control points
         if self.yp[index] == 0:
-            Qt.QMessageBox.warning(self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling')
+            Qt.QMessageBox.warning(
+                self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling')
             return
-        v=sender.corrSB.value()/(self.yp[index])
-        for i in range(0,index):
-            self._controllers[i].corrSB.setValue(v*self.yp[i])
-            
+        v = sender.corrSB.value() / (self.yp[index])
+        for i in range(0, index):
+            self._controllers[i].corrSB.setValue(v * self.yp[i])
+
     def onRScale(self, checked):
-        sender=self.sender().ctrlObj
+        sender = self.sender().ctrlObj
         index = self._getInsertionIndex(sender._x)
-        #y=numpy.interp(self.xp, self.x, self.y) #values of the master at the control points
+        # y=numpy.interp(self.xp, self.x, self.y) #values of the master at the
+        # control points
         if self.yp[index] == 0:
-            Qt.QMessageBox.warning(self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling')
+            Qt.QMessageBox.warning(
+                self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling')
             return
-        v=sender.corrSB.value()/(self.yp[index])
-        for i in range(index+1,self.xp.size):
-            self._controllers[i].corrSB.setValue(v*self.yp[i])
-                
-        
+        v = sender.corrSB.value() / (self.yp[index])
+        for i in range(index + 1, self.xp.size):
+            self._controllers[i].corrSB.setValue(v * self.yp[i])
+
     def changeCPointSelection(self, newpos):
         index = self._getInsertionIndex(newpos)
         old_index = self._getInsertionIndex(self.markerPos)
         self.markerPos = self.xp[index]
-        self.marker1.setValue(self.xp[index],self.yp[index]+self.corrp[index])
-        self.marker2.setValue(self.xp[index],self.corrp[index])
+        self.marker1.setValue(self.xp[index], self.yp[
+                              index] + self.corrp[index])
+        self.marker2.setValue(self.xp[index], self.corrp[index])
         self.plot1.replot()
         self.plot2.replot()
         self._controllers[old_index].corrSB.setStyleSheet('')
         self._controllers[index].corrSB.setStyleSheet('background:lightgreen')
         self._selectedController = self._controllers[index]
-        
+
     def onCorrSBChanged(self, value=None):
         '''recalculates the position and value of the control points (self.xp and self.corrp)
         as well as the correction curve (self.corr)'''
         ctrl = self.sender().ctrlObj
         self.corrp[self._getInsertionIndex(ctrl._x)] = value
-        self.corr = numpy.interp(self.x, self.xp, self.corrp) # recalculate the correction curve
+        # recalculate the correction curve
+        self.corr = numpy.interp(self.x, self.xp, self.corrp)
         self.updatePlots()
-        
+
     def setMaster(self, x, y, keepCP=False, keepCorr=False):
-        #make sure that x,y are numpy arrays and that the values are sorted for x
-        x,y = numpy.array(x), numpy.array(y)
+        # make sure that x,y are numpy arrays and that the values are sorted
+        # for x
+        x, y = numpy.array(x), numpy.array(y)
         if x.shape != y.shape or x.size == 0 or y.size == 0:
-            raise ValueError('The master curve is not valid' )
+            raise ValueError('The master curve is not valid')
         sortedindexes = numpy.argsort(x)
         self.x, self.y = x[sortedindexes], y[sortedindexes]
         self.plot1.getCurve('Master').setData(self.x, self.y)
         xp = None
         corrp = None
         if self.x[0] == self.xp[0] and self.x[-1] == self.x[-1]:
-            if keepCP: xp = self.xp
-            if keepCorr: corrp = self.corrp
+            if keepCP:
+                xp = self.xp
+            if keepCorr:
+                corrp = self.corrp
         self.setCorrection(xp, corrp)
-        self._addCPointsDialog.singleCPointXSB.setRange(self.x[0],self.x[-1])
+        self._addCPointsDialog.singleCPointXSB.setRange(self.x[0], self.x[-1])
 
     def getMaster(self):
         '''returns x,m where x and m are numpy arrays representing the
         abcissas and ordinates for the master, respectively'''
-        return self.x.copy(),self.y.copy()
-        
+        return self.x.copy(), self.y.copy()
+
     def resetMaster(self):
         x = numpy.arange(256, dtype='double')
         y = numpy.zeros(256, dtype='double')
-        self.setMaster(x,y)
-            
+        self.setMaster(x, y)
+
     def getCorrected(self):
         '''returns x,c where x and c are numpy arrays representing the
         abcissas and ordinates for the corrected curve, respectively'''
-        return self.x.copy(), self.y+self.corr
-        
+        return self.x.copy(), self.y + self.corr
+
     def getCorrection(self):
         '''returns xp,cp where xp and cp are numpy arrays representing the
         abcissas and ordinates for the correction points, respectively'''
         return self.xp.copy(), self.corrp.copy()
-        
+
     def setCorrection(self, xp=None, corrp=None):
         '''sets control points at the points specified by xp and with the
         values specified by corrp. Example::
-        
+
             setCorrection([1,2,8,9], [0,0,0,0])
-        
+
         would set 4 control points with initial value 0 at x=1, 2, 8 and 9s
         '''
-        for c in self._controllers: c.setParent(None) #destroy previous controllers
+        for c in self._controllers:
+            c.setParent(None)  # destroy previous controllers
+            c.deleteLater()
         self._controllers = []
         if xp is None:
             xp = numpy.array((self.x[0], self.x[-1]))
             corrp = numpy.zeros(2)
-        if corrp is None: corrp = numpy.zeros(xp.size)
-        #make sure that the extremes are there
+        if corrp is None:
+            corrp = numpy.zeros(xp.size)
+        # make sure that the extremes are there
         if xp[0] > self.x[0]:
             xp = numpy.concatenate(((self.x[0],), xp))
             corrp = numpy.concatenate(((self.corrp[0],), corrp))
         if xp[-1] < self.x[-1]:
             xp = numpy.concatenate((xp, (self.x[-1],)))
-            corrp = numpy.concatenate((corrp, (self.corrp[-1],)))   
-        
-        #now create everything
-        self.xp = numpy.unique(xp) #make sure there are no repetitions and that it is sorted
-        self.corrp = numpy.interp(self.xp, xp, corrp) #in case of repeated xp, take only one corrp
+            corrp = numpy.concatenate((corrp, (self.corrp[-1],)))
+
+        # now create everything
+        # make sure there are no repetitions and that it is sorted
+        self.xp = numpy.unique(xp)
+        # in case of repeated xp, take only one corrp
+        self.corrp = numpy.interp(self.xp, xp, corrp)
         self.yp = numpy.interp(self.xp, self.x, self.y)
-        for i,(x,c) in enumerate(zip(xp,corrp)):
+        for i, (x, c) in enumerate(zip(xp, corrp)):
             ctrl = ControllerBox(parent=None, x=xp[i], y=self.yp[i])
             self.ctrlLayout.insertWidget(i, ctrl)
             self._controllers.insert(i, ctrl)
             self.connectToController(ctrl)
-        self.corr = numpy.interp(self.x, self.xp, self.corrp) # recalculate the correction curve
+        # recalculate the correction curve
+        self.corr = numpy.interp(self.x, self.xp, self.corrp)
         self.updatePlots()
         self.changeCPointSelection(self.xp[0])
-        
+
     def resetCorrection(self):
         self.setCorrection()
         #self.xp = numpy.linspace(self.x[0],self.x[-1], self.cpoints)
         #self.corrp = numpy.zeros(self.cpoints)
-        #self._populateControllers()
+        # self._populateControllers()
 
 
-    
-       
 if __name__ == "__main__":
     import sys
     app = Qt.QApplication(sys.argv)
     form = ArrayEditor()
     #x = numpy.arange(100)-20
     #y = -(x-50)**2+50**2
-    x = numpy.linspace(0.1,0.9,100)
-    y = (x)**2-5*x
-    form.setMaster(x,y)
-    #form.setCorrection([1,30,70,90,100],[0,44,88,22,-100])
+    x = numpy.linspace(0.1, 0.9, 100)
+    y = (x) ** 2 - 5 * x
+    form.setMaster(x, y)
+    # form.setCorrection([1,30,70,90,100],[0,44,88,22,-100])
     form.show()
-    #sys.exit(app.exec_())
-    status=app.exec_()
-    #x,y=form.getCorrected()
-    #print "CORRECTED:",x,y
+    # sys.exit(app.exec_())
+    status = app.exec_()
+    # x,y=form.getCorrected()
+    # print "CORRECTED:",x,y
     sys.exit(status)
-
diff --git a/lib/taurus/qt/qtgui/plot/curveStatsDlg.py b/lib/taurus/qt/qtgui/plot/curveStatsDlg.py
index 997a7f0..86d2a6b 100644
--- a/lib/taurus/qt/qtgui/plot/curveStatsDlg.py
+++ b/lib/taurus/qt/qtgui/plot/curveStatsDlg.py
@@ -2,36 +2,35 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-curvesAppearanceChooserDlg.py: 
-    A Qt dialog for choosing plot appearance (symbols and lines) 
+curvesAppearanceChooserDlg.py:
+    A Qt dialog for choosing plot appearance (symbols and lines)
     for a QwtPlot-derived widget (like Taurusplot)
 """
 
 from taurus.external.qt import Qt, Qwt5
 from datetime import datetime
-from taurus.qt.qtgui.resource import getIcon, getThemeIcon
 from taurus.qt.qtgui.util.ui import UILoadable
 
 
@@ -40,102 +39,105 @@ class CurveStatsDialog(Qt.QDialog):
     """
     A dialog for configuring and displaying statistics from  curves of a plot
     """
-    
-    statColumns = ('points','min', 'max', 'mean', 'std', 'rms')
+
+    closed = Qt.pyqtSignal()
+
+    statColumns = ('points', 'min', 'max', 'mean', 'std', 'rms')
+
     def __init__(self, parent=None):
-        super(CurveStatsDialog,self).__init__(parent)
+        super(CurveStatsDialog, self).__init__(parent)
         self.loadUi()
-        
+
         plot = parent
         xIsTime = plot.getXIsTime()
         self.ui.minDTE.setVisible(xIsTime)
         self.ui.maxDTE.setVisible(xIsTime)
         self.ui.minSB.setVisible(not xIsTime)
         self.ui.maxSB.setVisible(not xIsTime)
-        
+
         self.ui.minSB.setMinimum(float('-inf'))
         self.ui.minSB.setMaximum(float('inf'))
         self.ui.maxSB.setMinimum(float('-inf'))
         self.ui.maxSB.setMaximum(float('inf'))
-        
-        icon = getIcon(':/actions/system-search.svg')
+
+        icon = Qt.QIcon('actions:system-search.svg')
         self.ui.selectMinPB.setIcon(icon)
         self.ui.selectMaxPB.setIcon(icon)
-        
-        
+
         self.refreshCurves()
-        
-        cbs = (self.ui.npointsStatCB, self.ui.minStatCB, self.ui.maxStatCB, 
+
+        cbs = (self.ui.npointsStatCB, self.ui.minStatCB, self.ui.maxStatCB,
                self.ui.meanStatCB, self.ui.stdStatCB, self.ui.rmsStatCB)
         self._checkboxToColMap = dict(zip(cbs, xrange(len(self.statColumns))))
-        
-        self.minPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom, 
-                                         Qwt5.QwtPlot.yLeft,
-                                         Qwt5.QwtPicker.PointSelection,
-                                         Qwt5.QwtPicker.VLineRubberBand,
-                                         Qwt5.QwtPicker.AlwaysOn, plot.canvas())
-        
-        self.maxPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom, 
-                                         Qwt5.QwtPlot.yLeft,
-                                         Qwt5.QwtPicker.PointSelection,
-                                         Qwt5.QwtPicker.VLineRubberBand,
-                                         Qwt5.QwtPicker.AlwaysOn, plot.canvas())
-        
+
+        self.minPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom,
+                                            Qwt5.QwtPlot.yLeft,
+                                            Qwt5.QwtPicker.PointSelection,
+                                            Qwt5.QwtPicker.VLineRubberBand,
+                                            Qwt5.QwtPicker.AlwaysOn, plot.canvas())
+
+        self.maxPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom,
+                                            Qwt5.QwtPlot.yLeft,
+                                            Qwt5.QwtPicker.PointSelection,
+                                            Qwt5.QwtPicker.VLineRubberBand,
+                                            Qwt5.QwtPicker.AlwaysOn, plot.canvas())
+
         self.minPicker.setEnabled(False)
         self.maxPicker.setEnabled(False)
-        
-        #initialize min and max display
+
+        # initialize min and max display
         xmin = plot.axisScaleDiv(Qwt5.QwtPlot.xBottom).lowerBound()
         xmax = plot.axisScaleDiv(Qwt5.QwtPlot.xBottom).upperBound()
-        
+
         self.minMarker = Qwt5.QwtPlotMarker()
         self.minMarker.setLineStyle(Qwt5.QwtPlotMarker.VLine)
         self.minMarker.setLinePen(Qt.QPen(Qt.Qt.green, 3))
         self.minMarker.setXValue(xmin)
         self.minMarker.attach(plot)
         self.minMarker.hide()
-        
+
         self.maxMarker = Qwt5.QwtPlotMarker()
         self.maxMarker.setLineStyle(Qwt5.QwtPlotMarker.VLine)
         self.maxMarker.setLinePen(Qt.QPen(Qt.Qt.red, 3))
         self.maxMarker.setXValue(xmax)
         self.maxMarker.attach(plot)
         self.maxMarker.hide()
-        
+
         if xIsTime:
             self.ui.minDTE.setDateTime(self._timestamptToQDateTime(xmin))
             self.ui.maxDTE.setDateTime(self._timestamptToQDateTime(xmax))
         else:
             self.ui.minSB.setValue(xmin)
             self.ui.maxSB.setValue(xmax)
-        
-        refreshAction = Qt.QAction(getThemeIcon('view-refresh'), "Refresh available curves", self.ui.statsTW)
+
+        refreshAction = Qt.QAction(Qt.QIcon.fromTheme(
+            'view-refresh'), "Refresh available curves", self.ui.statsTW)
         refreshAction.setShortcut(Qt.Qt.Key_F5)
-        self.connect(refreshAction, Qt.SIGNAL("triggered()"), self.refreshCurves)
+        refreshAction.triggered[()].connect(self.refreshCurves)
         self.ui.statsTW.addAction(refreshAction)
-        
-        #connections
+
+        # connections
         for cb in cbs:
-            self.connect(cb, Qt.SIGNAL('toggled(bool)'), self.onStatToggled)
-        self.connect(self.ui.calculatePB, Qt.SIGNAL('clicked()'),self.onCalculate)
-        self.connect(self.ui.selectMinPB, Qt.SIGNAL('clicked()'),self.onSelectMin)
-        self.connect(self.ui.selectMaxPB, Qt.SIGNAL('clicked()'),self.onSelectMax)
-        self.connect(self.minPicker, Qt.SIGNAL('selected(QwtDoublePoint)'), self.minSelected)
-        self.connect(self.maxPicker, Qt.SIGNAL('selected(QwtDoublePoint)'), self.maxSelected)
-        self.connect(self.ui.minSB, Qt.SIGNAL('valueChanged(double)'), self.onMinChanged)
-        self.connect(self.ui.minDTE, Qt.SIGNAL('dateTimeChanged(QDateTime)'), self.onMinChanged)
-        self.connect(self.ui.maxSB, Qt.SIGNAL('valueChanged(double)'), self.onMaxChanged)
-        self.connect(self.ui.maxDTE, Qt.SIGNAL('dateTimeChanged(QDateTime)'), self.onMaxChanged)
-        self.connect(self.ui.minCB, Qt.SIGNAL('toggled(bool)'), self.onMinChanged)
-        self.connect(self.ui.maxCB, Qt.SIGNAL('toggled(bool)'), self.onMaxChanged)
-        
+            cb.toggled.connect(self.onStatToggled)
+        self.ui.calculatePB.clicked.connect(self.onCalculate)
+        self.ui.selectMinPB.clicked.connect(self.onSelectMin)
+        self.ui.selectMaxPB.clicked.connect(self.onSelectMax)
+        self.minPicker.selected.connect(self.minSelected)
+        self.maxPicker.selected.connect(self.maxSelected)
+        self.ui.minSB.valueChanged.connect(self.onMinChanged)
+        self.ui.minDTE.dateTimeChanged.connect(self.onMinChanged)
+        self.ui.maxSB.valueChanged.connect(self.onMaxChanged)
+        self.ui.maxDTE.dateTimeChanged.connect(self.onMaxChanged)
+        self.ui.minCB.toggled.connect(self.onMinChanged)
+        self.ui.maxCB.toggled.connect(self.onMaxChanged)
+
     def _timestamptToQDateTime(self, ts):
         dt = datetime.fromtimestamp(ts)
-        return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond/1000)
-    
+        return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond / 1000)
+
     def _QDateTimeToTimestamp(self, qdt):
-        return qdt.toTime_t() + qdt.time().msec()/1000.
-    
+        return qdt.toTime_t() + qdt.time().msec() / 1000.
+
     def onSelectMin(self):
         '''slot called when the user clicks on the selectMin button'''
         plot = self.parent()
@@ -143,7 +145,7 @@ class CurveStatsDialog(Qt.QDialog):
         plot.canvas().setCursor(Qt.Qt.SplitHCursor)
         self.minPicker.setEnabled(True)
         self.hide()
-        
+
     def minSelected(self, pos):
         '''slot called when the user has selected a min value from the plot'''
         self.show()
@@ -152,14 +154,16 @@ class CurveStatsDialog(Qt.QDialog):
         plot = self.parent()
         xmin = pos.x()
         if plot.getXIsTime():
-            self.ui.minDTE.setDateTime(self._timestamptToQDateTime(xmin)) #this triggers a call to onMinChanged()
+            # this triggers a call to onMinChanged()
+            self.ui.minDTE.setDateTime(self._timestamptToQDateTime(xmin))
         else:
-            self.ui.minSB.setValue(xmin) #this triggers a call to onMinChanged()
+            # this triggers a call to onMinChanged()
+            self.ui.minSB.setValue(xmin)
         self.restorePlot(keepMarkers=True)
-        
+
     def onMinChanged(self, x):
-        '''slot called when the min value is changed''' 
-        plot = self.parent()     
+        '''slot called when the min value is changed'''
+        plot = self.parent()
         if isinstance(x, bool):
             self.minMarker.setVisible(x)
         else:
@@ -167,7 +171,7 @@ class CurveStatsDialog(Qt.QDialog):
                 x = self._QDateTimeToTimestamp(x)
             self.minMarker.setXValue(x)
         plot.replot()
-        
+
     def onSelectMax(self):
         '''slot called when the user clicks on the selectMax button'''
         self.minPicker.setEnabled(False)
@@ -176,7 +180,7 @@ class CurveStatsDialog(Qt.QDialog):
         plot.canvas().setCursor(Qt.Qt.SplitHCursor)
         self.maxPicker.setEnabled(True)
         self.hide()
-        
+
     def maxSelected(self, pos):
         '''slot called when the user has selected a min value from the plot'''
         self.show()
@@ -185,14 +189,16 @@ class CurveStatsDialog(Qt.QDialog):
         plot = self.parent()
         xmax = pos.x()
         if plot.getXIsTime():
-            self.ui.maxDTE.setDateTime(self._timestamptToQDateTime(xmax)) #this triggers a call to onMaxChanged()
+            # this triggers a call to onMaxChanged()
+            self.ui.maxDTE.setDateTime(self._timestamptToQDateTime(xmax))
         else:
-            self.ui.maxSB.setValue(xmax) #this triggers a call to onMaxChanged()
+            # this triggers a call to onMaxChanged()
+            self.ui.maxSB.setValue(xmax)
         self.restorePlot(keepMarkers=True)
-                             
+
     def onMaxChanged(self, x):
         '''slot called when the max value is changed'''
-        plot = self.parent()     
+        plot = self.parent()
         if isinstance(x, bool):
             self.maxMarker.setVisible(x)
         else:
@@ -200,16 +206,16 @@ class CurveStatsDialog(Qt.QDialog):
                 x = self._QDateTimeToTimestamp(x)
             self.maxMarker.setXValue(x)
         plot.replot()
-        
+
     def onStatToggled(self, checked):
         '''slot called when any of the stat checkboxes is toggled'''
         cb = self.sender()
         col = self._checkboxToColMap[cb]
         if checked:
             self.ui.statsTW.showColumn(col)
-        else: 
+        else:
             self.ui.statsTW.hideColumn(col)
-        
+
     def refreshCurves(self):
         '''resets the table re-reading the curves from the plot'''
         plot = self.parent()
@@ -218,19 +224,19 @@ class CurveStatsDialog(Qt.QDialog):
         self.ui.statsTW.setHorizontalHeaderLabels(self.statColumns)
         self.curveNames = plot.getCurveNamesSorted()
         self.ui.statsTW.setRowCount(len(self.curveNames))
-        for row,name in enumerate(self.curveNames):
+        for row, name in enumerate(self.curveNames):
             title = plot.getCurveTitle(name)
             item = Qt.QTableWidgetItem(title)
             self.ui.statsTW.setVerticalHeaderItem(row, item)
-    
+
     def getSelectedRows(self):
         '''returns a list of row numbers corresponding to the selected rows of the table'''
         selected = []
         for rg in self.ui.statsTW.selectedRanges():
-            for row in xrange(rg.topRow(), rg.topRow()+rg.rowCount()):
+            for row in xrange(rg.topRow(), rg.topRow() + rg.rowCount()):
                 selected.append(row)
         return selected
-        
+
     def onCalculate(self):
         '''
         slot called when the calculate button is pressed. Performs the
@@ -239,56 +245,64 @@ class CurveStatsDialog(Qt.QDialog):
         '''
         plot = self.parent()
         table = self.ui.statsTW
-        
-        xmin,xmax = None,None
+
+        xmin, xmax = None, None
         if self.ui.minCB.isChecked():
             if plot.getXIsTime():
-                xmin = self.ui.minDTE.dateTime().toTime_t() + self.ui.minDTE.time().msec()/1000.
+                xmin = self.ui.minDTE.dateTime().toTime_t() + self.ui.minDTE.time().msec() / \
+                    1000.
             else:
                 xmin = self.ui.minSB.value()
         if self.ui.maxCB.isChecked():
             if plot.getXIsTime():
-                xmax = self.ui.maxDTE.dateTime().toTime_t() + self.ui.maxDTE.time().msec()/1000.
+                xmax = self.ui.maxDTE.dateTime().toTime_t() + self.ui.maxDTE.time().msec() / \
+                    1000.
             else:
                 xmax = self.ui.maxSB.value()
-        limits = xmin,xmax
-        
+        limits = xmin, xmax
+
         selectedRows = self.getSelectedRows()
         if len(selectedRows) == 0:
             selectedRows = range(len(self.curveNames))
         selectedCurves = [self.curveNames[i] for i in selectedRows]
-        statsdict = plot.getCurveStats(limits=limits, curveNames=selectedCurves)
-    
-        for row, name in zip(selectedRows,selectedCurves):
+        statsdict = plot.getCurveStats(
+            limits=limits, curveNames=selectedCurves)
+
+        for row, name in zip(selectedRows, selectedCurves):
             stats = statsdict.get(name, {})
-            
+
             minxy = stats.get('min')
             if minxy is None:
                 text = "---"
             elif plot.xIsTime:
-                text = "t=%s \ny=%g"%(datetime.fromtimestamp(minxy[0]).isoformat(),minxy[1])
+                text = "t=%s \ny=%g" % (datetime.fromtimestamp(
+                    minxy[0]).isoformat(), minxy[1])
             else:
-                text = "x=%g \ny=%g"%minxy
-            table.setItem(row,self.statColumns.index('min'), Qt.QTableWidgetItem(text))            
-            
+                text = "x=%g \ny=%g" % minxy
+            table.setItem(row, self.statColumns.index(
+                'min'), Qt.QTableWidgetItem(text))
+
             maxxy = stats.get('max')
             if maxxy is None:
                 text = "---"
             elif plot.xIsTime:
-                text = "t=%s \ny=%g"%(datetime.fromtimestamp(maxxy[0]).isoformat(),maxxy[1])
+                text = "t=%s \ny=%g" % (datetime.fromtimestamp(
+                    maxxy[0]).isoformat(), maxxy[1])
             else:
-                text = "x=%g \ny=%g"%maxxy
-            table.setItem(row,self.statColumns.index('max'), Qt.QTableWidgetItem(text))
-                          
+                text = "x=%g \ny=%g" % maxxy
+            table.setItem(row, self.statColumns.index(
+                'max'), Qt.QTableWidgetItem(text))
+
             for s in ('points', 'mean', 'std', 'rms'):
                 r = stats.get(s)
-                if r is None: 
+                if r is None:
                     text = "---"
                 else:
-                    text = "%g"%r
-                table.setItem(row, self.statColumns.index(s), Qt.QTableWidgetItem(text))
+                    text = "%g" % r
+                table.setItem(row, self.statColumns.index(s),
+                              Qt.QTableWidgetItem(text))
         table.resizeColumnsToContents()
-    
+
     def restorePlot(self, keepMarkers=False):
         '''leaves the parent plot in its original state'''
         plot = self.parent()
@@ -298,19 +312,15 @@ class CurveStatsDialog(Qt.QDialog):
             self.minMarker.detach()
             self.maxMarker.detach()
         plot.replot()
-        
+
     def closeEvent(self, event):
         '''See :meth:`Qwidget.closeEvent`'''
         self.restorePlot()
-        self.emit(Qt.SIGNAL('closed'))
-        
+        self.closed.emit()
+
     def showEvent(self, event):
         '''See :meth:`Qwidget.showEvent`'''
         plot = self.parent()
-        self.minMarker.attach(plot)       
-        self.maxMarker.attach(plot)        
+        self.minMarker.attach(plot)
+        self.maxMarker.attach(plot)
         plot.replot()
-            
-        
-                
-
diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py
old mode 100644
new mode 100755
index 91345ba..02ca37d
--- a/lib/taurus/qt/qtgui/plot/curveprops.py
+++ b/lib/taurus/qt/qtgui/plot/curveprops.py
@@ -2,381 +2,435 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
 curveprops: Model and view for curve properties
 """
-__all__=['CurveConf','CurvesTableModel','ExtendedSelectionModel','CurvePropertiesView']
+__all__ = ['CurveConf', 'CurvesTableModel',
+           'ExtendedSelectionModel', 'CurvePropertiesView']
 #raise NotImplementedError('Under Construction!')
 
-import copy, re
+import copy
+import re
 
 from taurus.external.qt import Qt, Qwt5
 import taurus
 import taurus.core
-from taurus.qt.qtgui.resource import getThemeIcon
 from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE
 from taurus.qt.qtgui.util.ui import UILoadable
 
 from curvesAppearanceChooserDlg import NamedLineStyles, ReverseNamedLineStyles, \
-                                       NamedCurveStyles, ReverseNamedCurveStyles, \
-                                       NamedSymbolStyles, ReverseNamedSymbolStyles, \
-                                       NamedColors, CurveAppearanceProperties
+    NamedCurveStyles, ReverseNamedCurveStyles, \
+    NamedSymbolStyles, ReverseNamedSymbolStyles, \
+    NamedColors, CurveAppearanceProperties
 
 
-#URI regexp including slices in fragment (adapted from http://www.ietf.org/rfc/rfc2396.txt (appendix B))
+# URI regexp including slices in fragment (adapted from http://www.ietf.org/rfc/rfc2396.txt (appendix B))
 #   '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*)(\[[0-9,:]*?\]))?'
-#     12            3  4          5       6  7        8 9   A  
+#     12            3  4          5       6  7        8 9   A
 #
-#we base the nexus and ascii file regexps on this one, keeping the group numbers
-#The different components of an URI can be obtained from this regexp using match.group(n1,n2,...), where:
-#COMPONENT    GROUP_number
-#scheme       2
-#authority    4
-#path         5
-#query        7
-#fragment     9
-#slice        10 (0xA)
-                        
-NEXUS_SRC = re.compile(r'^((nxfile|nxdata):)(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*)(\[[0-9,: ]*?\]))?')
-ASCII_SRC = re.compile(r'^((file):)(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*)(\[[0-9,: ]*?\]))?')                                                                           
-
-
-#set some named constants
-#columns:
+# we base the nexus and ascii file regexps on this one, keeping the group numbers
+# The different components of an URI can be obtained from this regexp using match.group(n1,n2,...), where:
+# COMPONENT    GROUP_number
+# scheme       2
+# authority    4
+# path         5
+# query        7
+# fragment     9
+# slice        10 (0xA)
+
+NEXUS_SRC = re.compile(
+    r'^((nxfile|nxdata):)(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*)(\[[0-9,: ]*?\]))?')
+ASCII_SRC = re.compile(
+    r'^((file):)(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*)(\[[0-9,: ]*?\]))?')
+
+
+# set some named constants
+# columns:
 NUMCOLS = 4
 X, Y, TITLE, VIS = range(NUMCOLS)
-SRC_ROLE =  Qt.Qt.UserRole + 1
+SRC_ROLE = Qt.Qt.UserRole + 1
 PROPS_ROLE = Qt.Qt.UserRole + 2
 
-ATTRNAMEVALIDATOR = taurus.core.taurusvalidator.AttributeNameValidator()
+# TODO: Tango-centric (use agnostic validation)
+from taurus.core.tango.tangovalidator import TangoAttributeNameValidator
+ATTRNAMEVALIDATOR = TangoAttributeNameValidator()
+
 
 class Component(object):
+
     def __init__(self, src):
         self.src = src
         self.display = ''
         self.icon = Qt.QIcon()
         self.ok = True
         self._attrnamevalidator = ATTRNAMEVALIDATOR
-        self._dbCache = taurus.Database()
+        self._dbCache = taurus.Authority()
         self.setSrc(src)
-    
+
     def update(self):
         self.setSrc(self.src)
-    
+
     def setSrc(self, src):
         self.src, self.display, self.icon, self.ok = self.processSrc(src)
-        
+
     def processSrc(self, src):
         '''returns src,display,icon,ok'''
         src = unicode(src)
-        #empty
+        # empty
         if src == '':
-            return '', '', Qt.QIcon(),True
-        #for formulas
+            return '', '', Qt.QIcon(), True
+        # for formulas
         if src.startswith('='):
             #@todo: evaluate/validate the expression
-            return src, src[1:].strip(), getThemeIcon('accessories-calculator'),True
-        #for tango attributes
+            return src, src[1:].strip(), Qt.QIcon.fromTheme('accessories-calculator'), True
+        # for tango attributes
         if self._attrnamevalidator.isValid(src):
-            pars = self._attrnamevalidator.getParams(src)
-            dev = self._dbCache.getDevice(pars['devicename'])
+            pars = self._attrnamevalidator.getUriGroups(src)
+            dev = self._dbCache.getDevice(pars['devname'])
             if dev is None:
-                return src, src, getThemeIcon('network-error'),False
-            attr = dev.getAttribute(pars['attributename'])
+                return src, src, Qt.QIcon.fromTheme('network-error'), False
+            attr = dev.getAttribute(pars['_shortattrname'])
             if attr is None:
-                return src, pars['attributename'], getThemeIcon('network-error'),False            
-            return src, attr.name(), getThemeIcon('network-server'),True
-        #for nexus files
-        m = re.match(NEXUS_SRC,src)
+                return src, pars['_shortattrname'], Qt.QIcon.fromTheme('network-error'), False
+            return src, attr.name(), Qt.QIcon.fromTheme('network-server'), True
+        # for nexus files
+        m = re.match(NEXUS_SRC, src)
         if m is not None:
-            host,path,nxpath,slice = m.group(4,5,9,10) 
+            host, path, nxpath, slice = m.group(4, 5, 9, 10)
             #@todo:open file and check the data is accessible
-            return src, nxpath, getThemeIcon('x-office-spreadsheet'), True
-        #for ascii files
-        m = re.match(ASCII_SRC,src)
+            return src, nxpath, Qt.QIcon.fromTheme('x-office-spreadsheet'), True
+        # for ascii files
+        m = re.match(ASCII_SRC, src)
         if m is not None:
-            host,path, = m.group(4,5)
+            host, path, = m.group(4, 5)
         #@todo: open and check the file
-        #If nothing matches...
-        return src, src, getThemeIcon('dialog-warning'), False
+        # If nothing matches...
+        return src, src, Qt.QIcon.fromTheme('dialog-warning'), False
+
 
 class CurveConf(object):
-    def __init__(self, xsrc='', ysrc='', properties=None, title='', vis=Qwt5.QwtPlot.yLeft ):
-        if properties is None: properties = CurveAppearanceProperties()
-        self.properties=properties
-        self.title=title
-        self.vis=vis
+
+    def __init__(self, xsrc='', ysrc='', properties=None, title='', vis=Qwt5.QwtPlot.yLeft):
+        if properties is None:
+            properties = CurveAppearanceProperties()
+        self.properties = properties
+        self.title = title
+        self.vis = vis
         self.x = Component(xsrc)
         self.y = Component(ysrc)
-        
+
     def __repr__(self):
-        ret = "CurveConf(xsrc='%s', ysrc='%s', title='%s')"%(self.x.src, self.y.src, self.title)
+        ret = "CurveConf(xsrc='%s', ysrc='%s', title='%s')" % (
+            self.x.src, self.y.src, self.title)
         return ret
-        
 
 
 class CurvesTableModel(Qt.QAbstractTableModel):
     ''' A model to manage information about curves to be plotted an their appearance
     '''
 
-    def __init__(self,curves=None):
-        if curves is None: curves=[]
-        super(CurvesTableModel,self).__init__()
+    dataChanged = Qt.pyqtSignal('QModelIndex', 'QModelIndex')
+
+    def __init__(self, curves=None):
+        if curves is None:
+            curves = []
+        super(CurvesTableModel, self).__init__()
         self.ncolumns = NUMCOLS
         self.curves = curves
-    
-    def addCurve(self, curveconf ):
+
+    def addCurve(self, curveconf):
         self.curves.append(curveconf)
-        
+
     def dumpData(self):
-#        return copy.deepcopy(self.curves)
+        #        return copy.deepcopy(self.curves)
         return copy.copy(self.curves)
 #        return self.curves
-    
-    def rowCount(self,index=Qt.QModelIndex()):
+
+    def rowCount(self, index=Qt.QModelIndex()):
         return len(self.curves)
-    
-    def columnCount(self,index=Qt.QModelIndex()):
+
+    def columnCount(self, index=Qt.QModelIndex()):
         return self.ncolumns
-        
+
     def data(self, index, role=Qt.Qt.DisplayRole):
         if not index.isValid() or not (0 <= index.row() < self.rowCount()):
             return Qt.QVariant()
-        row=index.row()
+        row = index.row()
         column = index.column()
-        #Display Role
+        # Display Role
         if role == Qt.Qt.DisplayRole:
-            if column == X: return Qt.QVariant(Qt.QString(self.curves[row].x.display))
-            elif column == Y: return Qt.QVariant(Qt.QString(self.curves[row].y.display))
-            elif column == TITLE: return Qt.QVariant(Qt.QString(self.curves[row].title))
-            elif column == VIS: return Qt.QVariant(Qt.QString(self.curves[row].vis))
-            else: return Qt.QVariant()
+            if column == X:
+                return Qt.QVariant(Qt.QString(self.curves[row].x.display))
+            elif column == Y:
+                return Qt.QVariant(Qt.QString(self.curves[row].y.display))
+            elif column == TITLE:
+                return Qt.QVariant(Qt.QString(self.curves[row].title))
+            elif column == VIS:
+                return Qt.QVariant(Qt.QString(self.curves[row].vis))
+            else:
+                return Qt.QVariant()
         elif role == Qt.Qt.DecorationRole:
-            if column == X: return Qt.QVariant(self.curves[row].x.icon)
-            elif column == Y: return Qt.QVariant(self.curves[row].y.icon)
-            elif column == TITLE: return Qt.QVariant(Qt.QColor(self.curves[row].properties.lColor or 'black'))
-            else: return Qt.QVariant()
+            if column == X:
+                return Qt.QVariant(self.curves[row].x.icon)
+            elif column == Y:
+                return Qt.QVariant(self.curves[row].y.icon)
+            elif column == TITLE:
+                return Qt.QVariant(Qt.QColor(self.curves[row].properties.lColor or 'black'))
+            else:
+                return Qt.QVariant()
         elif role == Qt.Qt.TextColorRole:
-            if column == X: Qt.QVariant(Qt.QColor(self.curves[row].x.ok and 'green' or 'red'))
-            elif column == Y: Qt.QVariant(Qt.QColor(self.curves[row].y.ok and 'green' or 'red'))
-            else: return Qt.QVariant()
+            if column == X:
+                Qt.QVariant(
+                    Qt.QColor(self.curves[row].x.ok and 'green' or 'red'))
+            elif column == Y:
+                Qt.QVariant(
+                    Qt.QColor(self.curves[row].y.ok and 'green' or 'red'))
+            else:
+                return Qt.QVariant()
         elif role == SRC_ROLE:
-            if column == X: return Qt.QVariant(Qt.QString(self.curves[row].x.src))
-            elif column == Y: return Qt.QVariant(Qt.QString(self.curves[row].y.src))
-            else: return Qt.QVariant()
+            if column == X:
+                return Qt.QVariant(Qt.QString(self.curves[row].x.src))
+            elif column == Y:
+                return Qt.QVariant(Qt.QString(self.curves[row].y.src))
+            else:
+                return Qt.QVariant()
         elif role == PROPS_ROLE:
             return self.curves[row].properties
         elif role == Qt.Qt.ToolTipRole:
-            if column == X: return Qt.QVariant(Qt.QString(self.curves[row].x.src))
-            elif column == Y: return Qt.QVariant(Qt.QString(self.curves[row].y.src))
-            else: return Qt.QVariant()
+            if column == X:
+                return Qt.QVariant(Qt.QString(self.curves[row].x.src))
+            elif column == Y:
+                return Qt.QVariant(Qt.QString(self.curves[row].y.src))
+            else:
+                return Qt.QVariant()
         if role == Qt.Qt.EditRole:
-            if column == X: return Qt.QVariant(Qt.QString(self.curves[row].x.src))
-            elif column == Y: return Qt.QVariant(Qt.QString(self.curves[row].y.src))
-            elif column == TITLE: return Qt.QVariant(Qt.QString(self.curves[row].title))
-            else: return Qt.QVariant()
-        #Alignment 
+            if column == X:
+                return Qt.QVariant(Qt.QString(self.curves[row].x.src))
+            elif column == Y:
+                return Qt.QVariant(Qt.QString(self.curves[row].y.src))
+            elif column == TITLE:
+                return Qt.QVariant(Qt.QString(self.curves[row].title))
+            else:
+                return Qt.QVariant()
+        # Alignment
 #         elif role == Qt.Qt.TextAlignmentRole:
 #             return QVariant(int(Qt.AlignHCenter|Qt.AlignVCenter))
-        #Text Color
+        # Text Color
 #        elif role == Qt.Qt.TextColorRole:
-#            return Qt.QVariant(Qt.QColor(self.curves[row].properties.lColor or 'black'))
+# return Qt.QVariant(Qt.QColor(self.curves[row].properties.lColor or
+# 'black'))
         return Qt.QVariant()
-    
+
     def headerData(self, section, orientation, role=Qt.Qt.DisplayRole):
         if role == Qt.Qt.TextAlignmentRole:
             if orientation == Qt.Qt.Horizontal:
-                return Qt.QVariant(int(Qt.Qt.AlignLeft|Qt.Qt.AlignVCenter))
-            return Qt.QVariant(int(Qt.Qt.AlignRight|Qt.Qt.AlignVCenter))
+                return Qt.QVariant(int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter))
+            return Qt.QVariant(int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter))
         if role != Qt.Qt.DisplayRole:
             return Qt.QVariant()
-        #So this is DisplayRole...
+        # So this is DisplayRole...
         if orientation == Qt.Qt.Horizontal:
-            if section == X: return Qt.QVariant("X source")
-            elif section == Y: return Qt.QVariant("Y Source")
-            elif section == TITLE: return Qt.QVariant("Title")
-            elif section == VIS: return Qt.QVariant("Shown at")
+            if section == X:
+                return Qt.QVariant("X source")
+            elif section == Y:
+                return Qt.QVariant("Y Source")
+            elif section == TITLE:
+                return Qt.QVariant("Title")
+            elif section == VIS:
+                return Qt.QVariant("Shown at")
             return Qt.QVariant()
         else:
-            return Qt.QVariant(Qt.QString.number(section+1))
-        
-    def flags(self, index): #use this to set the editable flag when fix is selected
+            return Qt.QVariant(Qt.QString.number(section + 1))
+
+    def flags(self, index):  # use this to set the editable flag when fix is selected
         if not index.isValid():
             return Qt.Qt.ItemIsEnabled
         column = index.column()
-        if column in (X,Y):
-            return Qt.Qt.ItemFlags(Qt.Qt.ItemIsEnabled |Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsDropEnabled | Qt.Qt.ItemIsSelectable)
+        if column in (X, Y):
+            return Qt.Qt.ItemFlags(Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsDropEnabled | Qt.Qt.ItemIsSelectable)
         elif column == TITLE:
             return Qt.Qt.ItemFlags(Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsDragEnabled)
-        return Qt.Qt.ItemFlags(Qt.Qt.ItemIsEnabled |Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsDragEnabled)
-                     
+        return Qt.Qt.ItemFlags(Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsDragEnabled)
+
     def setData(self, index, value=None, role=Qt.Qt.EditRole):
         if index.isValid() and (0 <= index.row() < self.rowCount()):
             row = index.row()
             curve = self.curves[row]
             if role == PROPS_ROLE:
-                self.curves[row].properties = value 
-                self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),self.index(row,0), self.index(row,self.ncolumns-1))
+                self.curves[row].properties = value
+                self.dataChanged.emit(self.index(
+                    row, 0), self.index(row, self.ncolumns - 1))
             else:
                 column = index.column()
                 value = Qt.from_qvariant(value, unicode)
-                if column == X: curve.x.setSrc(value)
-                elif column == Y: curve.y.setSrc(value)
-                elif column == TITLE: curve.title = value
-                elif column == VIS: curve.vis = value
-                self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),index, index)
+                if column == X:
+                    curve.x.setSrc(value)
+                elif column == Y:
+                    curve.y.setSrc(value)
+                elif column == TITLE:
+                    curve.title = value
+                elif column == VIS:
+                    curve.vis = value
+                self.dataChanged.emit(index, index)
             return True
         return False
-    
-    def insertRows(self, position=None,rows=1,parentindex=None):
-        if position is None: position = self.rowCount()
-        if parentindex is None: parentindex = Qt.QModelIndex()
-        self.beginInsertRows(parentindex, position, position + rows -1)
+
+    def insertRows(self, position=None, rows=1, parentindex=None):
+        if position is None:
+            position = self.rowCount()
+        if parentindex is None:
+            parentindex = Qt.QModelIndex()
+        self.beginInsertRows(parentindex, position, position + rows - 1)
         slice = [CurveConf() for i in range(rows)]
-        self.curves = self.curves[:position]+slice+self.curves[position:]
+        self.curves = self.curves[:position] + slice + self.curves[position:]
         self.endInsertRows()
         return True
-        
-    def removeRows(self, position,rows=1,parentindex=None):
-        if parentindex is None: parentindex = Qt.QModelIndex()
+
+    def removeRows(self, position, rows=1, parentindex=None):
+        if parentindex is None:
+            parentindex = Qt.QModelIndex()
         self.beginRemoveRows(parentindex, position, position + rows - 1)
-        self.curves = self.curves[:position]+self.curves[position+rows:]
+        self.curves = self.curves[:position] + self.curves[position + rows:]
         self.endRemoveRows()
         self.reset()
         return True
-    
+
     def mimeTypes(self):
         result = list(Qt.QAbstractTableModel.mimeTypes(self))
         result += [TAURUS_ATTR_MIME_TYPE, 'text/plain']
         return result
-    
+
     def dropMimeData(self, data, action, row, column, parent):
         if row == -1:
-            if parent.isValid(): row = parent.row()
-            else: row = parent.rowCount()
+            if parent.isValid():
+                row = parent.row()
+            else:
+                row = parent.rowCount()
         if column == -1:
-            if parent.isValid(): column = parent.column()
-            else: column = parent.columnCount()
+            if parent.isValid():
+                column = parent.column()
+            else:
+                column = parent.columnCount()
         if data.hasFormat(TAURUS_ATTR_MIME_TYPE):
-            self.setData(self.index(row,column), 
+            self.setData(self.index(row, column),
                          value=Qt.QVariant(str(data.data(TAURUS_ATTR_MIME_TYPE))))
             return True
         elif data.hasFormat(TAURUS_MODEL_LIST_MIME_TYPE):
             models = str(data.data(TAURUS_MODEL_LIST_MIME_TYPE)).split()
             if len(models) == 1:
-                self.setData(self.index(row,column), 
+                self.setData(self.index(row, column),
                              value=Qt.QVariant(models[0]))
                 return True
             else:
-                self.insertRows(row,len(models))
-                for i,m in enumerate(models):
-                    self.setData(self.index(row+i,column), 
+                self.insertRows(row, len(models))
+                for i, m in enumerate(models):
+                    self.setData(self.index(row + i, column),
                                  value=Qt.QVariant(m))
                 return True
         elif data.hasText():
-            self.setData(self.index(row,column), Qt.QVariant(data.text()))
+            self.setData(self.index(row, column), Qt.QVariant(data.text()))
             return True
         return False
-    
+
     def mimeData(self, indexes):
         mimedata = Qt.QAbstractTableModel.mimeData(self, indexes)
-        if len(indexes)==1:
-#            txt = Qt.from_qvariant(self.data(indexes[0], str)
-#            mimedata.setData(TAURUS_ATTR_MIME_TYPE, txt)
+        if len(indexes) == 1:
+            #            txt = Qt.from_qvariant(self.data(indexes[0], str)
+            #            mimedata.setData(TAURUS_ATTR_MIME_TYPE, txt)
             txt = Qt.from_qvariant(self.data(indexes[0], role=SRC_ROLE), str)
             mimedata.setText(txt)
         return mimedata
-        #mimedata.setData()
-
-
-
+        # mimedata.setData()
 
 
 class ExtendedSelectionModel(Qt.QItemSelectionModel):
     '''A QItemSelectionModel subclass that provides :meth:`partiallySelectedRows`'''
+
     def partiallySelectedRows(self):
         '''
         Returns the row numbers of those rows for which at least one column is selected.
-                    
+
         :return: (list<QModelIndex>) a list of indexes corresponding to the
                  first column of the (partially) selected curves
-        '''  
+        '''
         temp = []
         for index in self.selectedIndexes():
             row = index.row()
             if row not in temp:
                 temp.append(row)
-        
+
         model = self.model()
         return [model.index(row, 0) for row in temp]
 
 
 @UILoadable(with_ui='ui')
 class CurvePropertiesView(Qt.QAbstractItemView):
-    '''This widget is a view on a CurvesTableModel. It displays and allows to change the 
+    '''This widget is a view on a CurvesTableModel. It displays and allows to change the
     properties of selected curve(s). Note that this widget does not allow to
     change selection by itself, but rather relies on some other view on the same
     model (like a QTableView) to alter the selection.
     '''
+
     def __init__(self, parent=None, designMode=False):
-        super(CurvePropertiesView,self).__init__(parent)
+        super(CurvePropertiesView, self).__init__(parent)
         self.loadUi()
-        
-        self.ui.sStyleCB.insertItems(0,sorted(NamedSymbolStyles.values()))
-        self.ui.lStyleCB.insertItems(0,NamedLineStyles.values())
-        self.ui.cStyleCB.insertItems(0,NamedCurveStyles.values())
+
+        self.ui.sStyleCB.insertItems(0, sorted(NamedSymbolStyles.values()))
+        self.ui.lStyleCB.insertItems(0, NamedLineStyles.values())
+        self.ui.cStyleCB.insertItems(0, NamedCurveStyles.values())
         self.ui.sColorCB.addItem("")
         self.ui.lColorCB.addItem("")
         for color in NamedColors:
-            icon=self._colorIcon(color)
+            icon = self._colorIcon(color)
             self.ui.sColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color)))
             self.ui.lColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color)))
-        
+
         self._emptyProps = CurveAppearanceProperties()
         self.showProperties(self._emptyProps)
-        
-        #Connections
-        self.connect(self.ui.sStyleCB,Qt.SIGNAL("currentIndexChanged(const QString&)"),self._onSymbolStyleChanged)
-        self.connect(self.ui.sStyleCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onPropertyControlChanged)
-        self.connect(self.ui.lStyleCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onPropertyControlChanged)
-        self.connect(self.ui.lStyleCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onPropertyControlChanged)
-        self.connect(self.ui.lColorCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onPropertyControlChanged)
-        self.connect(self.ui.sColorCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onPropertyControlChanged)
-        self.connect(self.ui.cStyleCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onPropertyControlChanged)
-        self.connect(self.ui.sSizeSB,Qt.SIGNAL("valueChanged(int)"),self.onPropertyControlChanged)
-        self.connect(self.ui.lWidthSB,Qt.SIGNAL("valueChanged(int)"),self.onPropertyControlChanged)
-        self.connect(self.ui.sFillCB,Qt.SIGNAL("stateChanged(int)"),self.onPropertyControlChanged)
-        self.connect(self.ui.cFillCB,Qt.SIGNAL("stateChanged(int)"),self.onPropertyControlChanged)
-   
-    #------------------------------------------------------------------------------ 
-    #Reimplemented functions from base class
-                  
+
+        # Connections
+        self.ui.sStyleCB.currentIndexChanged.connect(self._onSymbolStyleChanged)
+        self.ui.sStyleCB.currentIndexChanged.connect(self.onPropertyControlChanged)
+        self.ui.lStyleCB.currentIndexChanged.connect(self.onPropertyControlChanged)
+        self.ui.lStyleCB.currentIndexChanged.connect(self.onPropertyControlChanged)
+        self.ui.lColorCB.currentIndexChanged.connect(self.onPropertyControlChanged)
+        self.ui.sColorCB.currentIndexChanged.connect(self.onPropertyControlChanged)
+        self.ui.cStyleCB.currentIndexChanged.connect(self.onPropertyControlChanged)
+        self.ui.sSizeSB.valueChanged.connect(self.onPropertyControlChanged)
+        self.ui.lWidthSB.valueChanged.connect(self.onPropertyControlChanged)
+        self.ui.sFillCB.stateChanged.connect(self.onPropertyControlChanged)
+        self.ui.cFillCB.stateChanged.connect(self.onPropertyControlChanged)
+
+    #-------------------------------------------------------------------------
+    # Reimplemented functions from base class
+
     def dataChanged(self, topleft, bottomright):
         '''Reimplemented. See :meth:`Qt.QAbstractItemView.dataChanged` '''
         Qt.QAbstractItemView.dataChanged(self, topleft, bottomright)
-        
-        #update what the controls are showing only if the changed data affects what is selected
+
+        # update what the controls are showing only if the changed data affects
+        # what is selected
         minrow = topleft.row()
         maxrow = bottomright.row()
         for index in self.selectionModel().partiallySelectedRows():
@@ -384,51 +438,53 @@ class CurvePropertiesView(Qt.QAbstractItemView):
             if row > minrow and row < maxrow:
                 self.updateControls()
                 return
-            
+
     def selectionChanged(self, selected, deselected):
         '''Reimplemented. See :meth:`Qt.QAbstractItemView.selectionChanged` '''
         Qt.QAbstractItemView.selectionChanged(self, selected, deselected)
         self.updateControls()
-    
+
     def indexAt(self, *args, **kwargs):
         ''' dummy reimplementation'''
         return Qt.QModelIndex()
-        
+
     def visualRect(self, *args, **kwargs):
         ''' dummy reimplementation'''
         return Qt.QRect()
-    
+
     def verticalOffset(self, *args, **kwargs):
         ''' dummy reimplementation'''
         return 0
-    
+
     def horizontalOffset(self, *args, **kwargs):
         ''' dummy reimplementation'''
         return 0
+
     def visualRegionForSelection(self, *args, **kwargs):
         ''' dummy reimplementation'''
         return Qt.QRegion()
-    
+
     def scrollTo(self, *args, **kwargs):
         ''' dummy reimplementation'''
         pass
-    
-    #------------------------------------------------------------------------------ 
-    
+
+    #-------------------------------------------------------------------------
+
     def _onSymbolStyleChanged(self, text):
         '''Slot called when the Symbol style is changed, to ensure that symbols
         are visible if you choose them
-        
+
         :param text: (str) the new symbol style label
         '''
-        text=str(text)
-        if self.ui.sSizeSB.value()<2 and not text in ["","No symbol"]:
-            self.ui.sSizeSB.setValue(3) #a symbol size of 0 is invisible and 1 means you should use cStyle=dots
-            
-        
+        text = str(text)
+        if self.ui.sSizeSB.value() < 2 and not text in ["", "No symbol"]:
+            # a symbol size of 0 is invisible and 1 means you should use
+            # cStyle=dots
+            self.ui.sSizeSB.setValue(3)
+
     def blockControlsSignals(self, block):
         '''blocks/unblocks the signals from all the properties controls
-        
+
         :param block: (bool) If True, signals are blocked. If False they are unblocked
         '''
         self.ui.sStyleCB.blockSignals(block)
@@ -439,38 +495,39 @@ class CurvePropertiesView(Qt.QAbstractItemView):
         self.ui.lWidthSB.blockSignals(block)
         self.ui.sFillCB.blockSignals(block)
         self.ui.cFillCB.blockSignals(block)
-        self.ui.sColorCB.blockSignals(block)  
-        
+        self.ui.sColorCB.blockSignals(block)
+
     def updateControls(self):
         '''Updates the state of the properties controls to reflect the selection
         '''
         selectedCurves = self.selectionModel().partiallySelectedRows()
         self.showProperties(self._emptyProps)
-        if len(selectedCurves) < 1: 
+        if len(selectedCurves) < 1:
             return
         modeldata = self.model().data
         props = [modeldata(index, PROPS_ROLE) for index in selectedCurves]
-        mergedprop = CurveAppearanceProperties.merge(props, conflict=CurveAppearanceProperties.inConflict_none)      
+        mergedprop = CurveAppearanceProperties.merge(
+            props, conflict=CurveAppearanceProperties.inConflict_none)
         self.showProperties(mergedprop)
-    
-        
-    def onPropertyControlChanged(self,*args):
-        '''slot called whenever one of the controls is changed ''' 
+
+    def onPropertyControlChanged(self, *args):
+        '''slot called whenever one of the controls is changed '''
         shownprop = self.getShownProperties()
         data = self.model().data
         setData = self.model().setData
         for index in self.selectionModel().partiallySelectedRows():
             prop = data(index, PROPS_ROLE)
             if prop.conflictsWith(shownprop):
-                updatedprop = CurveAppearanceProperties.merge([prop,shownprop], conflict=CurveAppearanceProperties.inConflict_update_a)                   
+                updatedprop = CurveAppearanceProperties.merge(
+                    [prop, shownprop], conflict=CurveAppearanceProperties.inConflict_update_a)
                 setData(index, updatedprop, PROPS_ROLE)
-        
-    def showProperties(self,prop, blockSignals=True):
-        '''Updates the control widgets to show the given properties. 
-         
+
+    def showProperties(self, prop, blockSignals=True):
+        '''Updates the control widgets to show the given properties.
+
          ..note:: that the signals of the controls may be temporally blocked to
                   prevent loops. See the `blockSignals` parameter.
-        
+
         :param prop: (CurveAppearanceProperties) the properties object
                      containing what should be shown. If a given property is set
                      to None, the corresponding widget will show a "neutral"
@@ -478,93 +535,132 @@ class CurvePropertiesView(Qt.QAbstractItemView):
         :param blockSignals: (bool) If True (default) the signals of the control widgets
                              are blocked while updating them to avoid loops.
         '''
-        if blockSignals: self.blockControlsSignals(True)
-        #set the Style comboboxes
-        self.ui.sStyleCB.setCurrentIndex(self.ui.sStyleCB.findText(NamedSymbolStyles[prop.sStyle]))
-        self.ui.lStyleCB.setCurrentIndex(self.ui.lStyleCB.findText(NamedLineStyles[prop.lStyle]))
-        self.ui.cStyleCB.setCurrentIndex(self.ui.cStyleCB.findText(NamedCurveStyles[prop.cStyle]))
-        #set sSize and lWidth spinboxes. if prop.sSize is None, it puts -1 (which is the special value for these switchhboxes)
-        self.ui.sSizeSB.setValue(max(prop.sSize,-1)) 
-        self.ui.lWidthSB.setValue(max(prop.lWidth,-1))
-        #Set the Color combo boxes. The item at index 0 is the empty one in the comboboxes Manage unknown colors by including them
-        if prop.sColor is None: index=0 
-        else:  index=self.ui.sColorCB.findData(Qt.QVariant(Qt.QColor(prop.sColor)))
-        if index==-1: #if the color is not one of the supported colors, add it to the combobox
-            index=self.ui.sColorCB.count()  #set the index to what will be the added one
-            self.ui.sColorCB.addItem(self._colorIcon(Qt.QColor(prop.sColor)), "", Qt.QVariant(Qt.QColor(prop.sColor)))
+        if blockSignals:
+            self.blockControlsSignals(True)
+        # set the Style comboboxes
+        self.ui.sStyleCB.setCurrentIndex(
+            self.ui.sStyleCB.findText(NamedSymbolStyles[prop.sStyle]))
+        self.ui.lStyleCB.setCurrentIndex(
+            self.ui.lStyleCB.findText(NamedLineStyles[prop.lStyle]))
+        self.ui.cStyleCB.setCurrentIndex(
+            self.ui.cStyleCB.findText(NamedCurveStyles[prop.cStyle]))
+        # set sSize and lWidth spinboxes. if prop.sSize is None, it puts -1
+        # (which is the special value for these switchhboxes)
+        self.ui.sSizeSB.setValue(max(prop.sSize, -1))
+        self.ui.lWidthSB.setValue(max(prop.lWidth, -1))
+        # Set the Color combo boxes. The item at index 0 is the empty one in
+        # the comboboxes Manage unknown colors by including them
+        if prop.sColor is None:
+            index = 0
+        else:
+            index = self.ui.sColorCB.findData(
+                Qt.QVariant(Qt.QColor(prop.sColor)))
+        if index == -1:  # if the color is not one of the supported colors, add it to the combobox
+            index = self.ui.sColorCB.count()  # set the index to what will be the added one
+            self.ui.sColorCB.addItem(self._colorIcon(
+                Qt.QColor(prop.sColor)), "", Qt.QVariant(Qt.QColor(prop.sColor)))
         self.ui.sColorCB.setCurrentIndex(index)
-        if prop.lColor is None: index=0 
-        else:  index=self.ui.lColorCB.findData(Qt.QVariant(Qt.QColor(prop.lColor)))
-        if index==-1: #if the color is not one of the supported colors, add it to the combobox
-            index=self.ui.lColorCB.count()  #set the index to what will be the added one
-            self.ui.lColorCB.addItem(self._colorIcon(Qt.QColor(prop.lColor)), "", Qt.QVariant(Qt.QColor(prop.lColor)))
+        if prop.lColor is None:
+            index = 0
+        else:
+            index = self.ui.lColorCB.findData(
+                Qt.QVariant(Qt.QColor(prop.lColor)))
+        if index == -1:  # if the color is not one of the supported colors, add it to the combobox
+            index = self.ui.lColorCB.count()  # set the index to what will be the added one
+            self.ui.lColorCB.addItem(self._colorIcon(
+                Qt.QColor(prop.lColor)), "", Qt.QVariant(Qt.QColor(prop.lColor)))
         self.ui.lColorCB.setCurrentIndex(index)
-        #set the Fill Checkbox. The prop.sFill value can be in 3 states: True, False and None
-        if prop.sFill is None: checkState=Qt.Qt.PartiallyChecked 
-        elif prop.sFill: checkState=Qt.Qt.Checked
-        else: checkState=Qt.Qt.Unchecked
+        # set the Fill Checkbox. The prop.sFill value can be in 3 states: True,
+        # False and None
+        if prop.sFill is None:
+            checkState = Qt.Qt.PartiallyChecked
+        elif prop.sFill:
+            checkState = Qt.Qt.Checked
+        else:
+            checkState = Qt.Qt.Unchecked
         self.ui.sFillCB.setCheckState(checkState)
-        #set the Area Fill Checkbox. The prop.cFill value can be in 3 states: True, False and None
-        if prop.cFill is None: checkState=Qt.Qt.PartiallyChecked 
-        elif prop.cFill: checkState=Qt.Qt.Checked
-        else: checkState=Qt.Qt.Unchecked
+        # set the Area Fill Checkbox. The prop.cFill value can be in 3 states:
+        # True, False and None
+        if prop.cFill is None:
+            checkState = Qt.Qt.PartiallyChecked
+        elif prop.cFill:
+            checkState = Qt.Qt.Checked
+        else:
+            checkState = Qt.Qt.Unchecked
         self.ui.cFillCB.setCheckState(checkState)
-        if blockSignals: self.blockControlsSignals(False)
-    
+        if blockSignals:
+            self.blockControlsSignals(False)
+
     def getShownProperties(self):
-        """Returns a copy of the currently shown properties 
-        
+        """Returns a copy of the currently shown properties
+
         :return: (CurveAppearanceProperties)
         """
-        prop=CurveAppearanceProperties()
-        #get the values from the Style comboboxes. Note that the empty string ("") translates into None
-        prop.sStyle=ReverseNamedSymbolStyles[str(self.ui.sStyleCB.currentText())] 
-        prop.lStyle=ReverseNamedLineStyles[str(self.ui.lStyleCB.currentText())]
-        prop.cStyle=ReverseNamedCurveStyles[str(self.ui.cStyleCB.currentText())]
-        #get sSize and lWidth from the spinboxes
-        prop.sSize=self.ui.sSizeSB.value()
-        prop.lWidth=self.ui.lWidthSB.value()
-        if prop.sSize<0: prop.sSize=None
-        if prop.lWidth<0: prop.lWidth=None
-        #Get the Color combo boxes. The item at index 0 is the empty one in the comboboxes
-        index=self.ui.sColorCB.currentIndex()
-        if index==0:prop.sColor=None
-        else:prop.sColor=Qt.QColor(self.ui.sColorCB.itemData(index))
-        index=self.ui.lColorCB.currentIndex()
-        if index==0:prop.lColor=None
-        else:prop.lColor=Qt.QColor(self.ui.lColorCB.itemData(index))
-        #get the sFill from the Checkbox.
-        checkState=self.ui.sFillCB.checkState()
-        if checkState==Qt.Qt.PartiallyChecked: prop.sFill=None
-        else: prop.sFill=bool(checkState)
-        #get the cFill from the Checkbox.
-        checkState=self.ui.cFillCB.checkState()
-        if checkState==Qt.Qt.PartiallyChecked: prop.cFill=None
-        else: prop.cFill=bool(checkState)
-        #store the props 
+        prop = CurveAppearanceProperties()
+        # get the values from the Style comboboxes. Note that the empty string
+        # ("") translates into None
+        prop.sStyle = ReverseNamedSymbolStyles[
+            str(self.ui.sStyleCB.currentText())]
+        prop.lStyle = ReverseNamedLineStyles[
+            str(self.ui.lStyleCB.currentText())]
+        prop.cStyle = ReverseNamedCurveStyles[
+            str(self.ui.cStyleCB.currentText())]
+        # get sSize and lWidth from the spinboxes
+        prop.sSize = self.ui.sSizeSB.value()
+        prop.lWidth = self.ui.lWidthSB.value()
+        if prop.sSize < 0:
+            prop.sSize = None
+        if prop.lWidth < 0:
+            prop.lWidth = None
+        # Get the Color combo boxes. The item at index 0 is the empty one in
+        # the comboboxes
+        index = self.ui.sColorCB.currentIndex()
+        if index == 0:
+            prop.sColor = None
+        else:
+            prop.sColor = Qt.QColor(self.ui.sColorCB.itemData(index))
+        index = self.ui.lColorCB.currentIndex()
+        if index == 0:
+            prop.lColor = None
+        else:
+            prop.lColor = Qt.QColor(self.ui.lColorCB.itemData(index))
+        # get the sFill from the Checkbox.
+        checkState = self.ui.sFillCB.checkState()
+        if checkState == Qt.Qt.PartiallyChecked:
+            prop.sFill = None
+        else:
+            prop.sFill = bool(checkState)
+        # get the cFill from the Checkbox.
+        checkState = self.ui.cFillCB.checkState()
+        if checkState == Qt.Qt.PartiallyChecked:
+            prop.cFill = None
+        else:
+            prop.cFill = bool(checkState)
+        # store the props
         return copy.deepcopy(prop)
 
-    def _colorIcon(self,color,w=10,h=10):
+    def _colorIcon(self, color, w=10, h=10):
         '''returns an icon consisting of a rectangle of the given color
-        
+
         :param color: (QColor or something accepted by QColor creator) The color for the icon
         :param w: (int) width of the icon
         :param h: (int) height of the icon
-        
+
         :return: (QIcon)
         '''
-        #to do: create a border
-        pixmap=Qt.QPixmap(w,h)
+        # to do: create a border
+        pixmap = Qt.QPixmap(w, h)
         pixmap.fill(Qt.QColor(color))
         return Qt.QIcon(pixmap)
-    
-    
+
+
 def main():
     app = Qt.QApplication(sys.argv)
-    
-    curves=[CurveConf(xsrc='', ysrc='tango://host:1000/a/b/c/d', properties=None, title="tangocurve", vis=Qwt5.QwtPlot.yLeft ),
-                CurveConf(xsrc='=[1,2,3]', ysrc='=#2.x**2', properties=None, title="parab", vis=Qwt5.QwtPlot.yLeft)
-                ]
+
+    curves = [CurveConf(xsrc='', ysrc='tango://host:1000/a/b/c/d', properties=None, title="tangocurve", vis=Qwt5.QwtPlot.yLeft),
+              CurveConf(xsrc='=[1,2,3]', ysrc='=#2.x**2',
+                        properties=None, title="parab", vis=Qwt5.QwtPlot.yLeft)
+              ]
     form = CurvePropertiesView()
     form.setModel(CurvesTableModel(curves))
     form.show()
@@ -573,4 +669,4 @@ def main():
 
 if __name__ == "__main__":
     import sys
-    main()    
+    main()
diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
index ebb043e..51d6a0c 100644
--- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
+++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py
@@ -2,30 +2,30 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-curvesAppearanceChooserDlg.py: 
-    A Qt dialog for choosing plot appearance (symbols and lines) 
+curvesAppearanceChooserDlg.py:
+    A Qt dialog for choosing plot appearance (symbols and lines)
     for a QwtPlot-derived widget (like Taurusplot)
 """
 
@@ -33,55 +33,58 @@ import copy
 
 from taurus.external.qt import Qt, Qwt5
 from taurus.core.util.containers import CaselessDict
-from taurus.qt.qtgui.resource import getIcon
 from taurus.qt.qtgui.util.ui import UILoadable
 
 
-NamedLineStyles={None:"",
-                Qt.Qt.NoPen:"No line",
-                Qt.Qt.SolidLine:"_____",
-                Qt.Qt.DashLine:"_ _ _",
-                Qt.Qt.DotLine:".....",
-                Qt.Qt.DashDotLine:"_._._",
-                Qt.Qt.DashDotDotLine:".._..",
-                }
-ReverseNamedLineStyles={}
-for k,v in NamedLineStyles.iteritems(): ReverseNamedLineStyles[v]=k
-
-NamedCurveStyles={None:"",
-                Qwt5.QwtPlotCurve.NoCurve:"No curve",
-                Qwt5.QwtPlotCurve.Lines:"Lines",
-                Qwt5.QwtPlotCurve.Sticks:"Sticks",
-                Qwt5.QwtPlotCurve.Steps:"Steps",
-                Qwt5.QwtPlotCurve.Dots:"Dots"
-                }
-ReverseNamedCurveStyles={}
-for k,v in NamedCurveStyles.iteritems(): ReverseNamedCurveStyles[v]=k
-
-NamedSymbolStyles={
-                None:"",
-                Qwt5.QwtSymbol.NoSymbol:"No symbol",
-                Qwt5.QwtSymbol.Ellipse:"Circle",
-                Qwt5.QwtSymbol.Rect:"Square",
-                Qwt5.QwtSymbol.Diamond:"Diamond",
-                Qwt5.QwtSymbol.Triangle:"Triangle",
-                Qwt5.QwtSymbol.DTriangle:"Down Triangle",
-                Qwt5.QwtSymbol.UTriangle:"Up triangle",
-                Qwt5.QwtSymbol.LTriangle:"Left Triangle",
-                Qwt5.QwtSymbol.RTriangle:"Right Triangle",
-                Qwt5.QwtSymbol.Cross:"Cross",
-                Qwt5.QwtSymbol.XCross:"XCross",
-                Qwt5.QwtSymbol.HLine:"Horizontal line",
-                Qwt5.QwtSymbol.VLine:"Vertical line",
-                Qwt5.QwtSymbol.Star1:"Star1",
-                Qwt5.QwtSymbol.Star2:"Star2",
-                Qwt5.QwtSymbol.Hexagon:"Hexagon"
-                }
-
-ReverseNamedSymbolStyles={}
-for k,v in NamedSymbolStyles.iteritems(): ReverseNamedSymbolStyles[v]=k
-
-NamedColors=["Black","Red","Blue","Magenta","Green","Cyan","Yellow","Gray","White"]
+NamedLineStyles = {None: "",
+                   Qt.Qt.NoPen: "No line",
+                   Qt.Qt.SolidLine: "_____",
+                   Qt.Qt.DashLine: "_ _ _",
+                   Qt.Qt.DotLine: ".....",
+                   Qt.Qt.DashDotLine: "_._._",
+                   Qt.Qt.DashDotDotLine: ".._..",
+                   }
+ReverseNamedLineStyles = {}
+for k, v in NamedLineStyles.iteritems():
+    ReverseNamedLineStyles[v] = k
+
+NamedCurveStyles = {None: "",
+                    Qwt5.QwtPlotCurve.NoCurve: "No curve",
+                    Qwt5.QwtPlotCurve.Lines: "Lines",
+                    Qwt5.QwtPlotCurve.Sticks: "Sticks",
+                    Qwt5.QwtPlotCurve.Steps: "Steps",
+                    Qwt5.QwtPlotCurve.Dots: "Dots"
+                    }
+ReverseNamedCurveStyles = {}
+for k, v in NamedCurveStyles.iteritems():
+    ReverseNamedCurveStyles[v] = k
+
+NamedSymbolStyles = {
+    None: "",
+    Qwt5.QwtSymbol.NoSymbol: "No symbol",
+    Qwt5.QwtSymbol.Ellipse: "Circle",
+    Qwt5.QwtSymbol.Rect: "Square",
+    Qwt5.QwtSymbol.Diamond: "Diamond",
+    Qwt5.QwtSymbol.Triangle: "Triangle",
+    Qwt5.QwtSymbol.DTriangle: "Down Triangle",
+    Qwt5.QwtSymbol.UTriangle: "Up triangle",
+    Qwt5.QwtSymbol.LTriangle: "Left Triangle",
+    Qwt5.QwtSymbol.RTriangle: "Right Triangle",
+    Qwt5.QwtSymbol.Cross: "Cross",
+    Qwt5.QwtSymbol.XCross: "XCross",
+    Qwt5.QwtSymbol.HLine: "Horizontal line",
+    Qwt5.QwtSymbol.VLine: "Vertical line",
+    Qwt5.QwtSymbol.Star1: "Star1",
+    Qwt5.QwtSymbol.Star2: "Star2",
+    Qwt5.QwtSymbol.Hexagon: "Hexagon"
+}
+
+ReverseNamedSymbolStyles = {}
+for k, v in NamedSymbolStyles.iteritems():
+    ReverseNamedSymbolStyles[v] = k
+
+NamedColors = ["Black", "Red", "Blue", "Magenta",
+               "Green", "Cyan", "Yellow", "Gray", "White"]
 
 
 @UILoadable
@@ -90,63 +93,69 @@ class CurvesAppearanceChooser(Qt.QWidget):
     A widget for choosing plot appearance for one or more curves.
     The current curves properties are passed using the setCurves() method using
     a dictionary with the following structure::
-    
+
         curvePropDict={name1:prop1, name2:prop2,...}
-        
+
     where propX is an instance of :class:`CurveAppearanceProperties`
     When applying, a signal is emitted and the chosen properties are made
     available in a similar dictionary. """
 
     NAME_ROLE = Qt.Qt.UserRole
-    
+
+    controlChanged = Qt.pyqtSignal()
+    curveAppearanceChanged = Qt.pyqtSignal(object, list)
+    CurveTitleEdited = Qt.pyqtSignal('QString', 'QString')
+
     def __init__(self, parent=None, curvePropDict={}, showButtons=False, autoApply=False, designMode=False):
-        #try:
-            super(CurvesAppearanceChooser,self).__init__(parent)
-            self.loadUi()
-            self.autoApply=autoApply
-            self.sStyleCB.insertItems(0,sorted(NamedSymbolStyles.values()))
-            self.lStyleCB.insertItems(0,NamedLineStyles.values())
-            self.cStyleCB.insertItems(0,NamedCurveStyles.values())
-            self.sColorCB.addItem("")
-            self.lColorCB.addItem("")
-            if not showButtons:
-                self.applyBT.hide()
-                self.resetBT.hide()
-            for color in NamedColors:
-                icon=self._colorIcon(color)
-                self.sColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color)))
-                self.lColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color)))
-            self.__itemsDict = CaselessDict()
-            self.setCurves(curvePropDict)
-            self.bckgndBT.setIcon(getIcon(":/color-fill.svg")) #set the icon for the background button (stupid designer limitations forces to do it programatically)
-
-            #connections.
-            # Note: The assignToY1BT and assignToY2BT buttons are not connected to anything
-            #       Their signals are handled by the Config dialog because we haven't got access to the curve objects here
-            Qt.QObject.connect(self.curvesLW,Qt.SIGNAL("itemSelectionChanged()"),self.onSelectedCurveChanged)
-            Qt.QObject.connect(self.curvesLW,Qt.SIGNAL("itemChanged(QListWidgetItem *)"),self.onItemChanged)
-            Qt.QObject.connect(self.applyBT,Qt.SIGNAL("clicked()"),self.onApply)
-            Qt.QObject.connect(self.resetBT,Qt.SIGNAL("clicked()"),self.onReset)
-            Qt.QObject.connect(self.sStyleCB,Qt.SIGNAL("currentIndexChanged(const QString&)"),self._onSymbolStyleChanged)
-
-            Qt.QObject.connect(self.sStyleCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onControlChanged)
-            Qt.QObject.connect(self.lStyleCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onControlChanged)
-            Qt.QObject.connect(self.sColorCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onControlChanged)
-            Qt.QObject.connect(self.lColorCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onControlChanged)
-            Qt.QObject.connect(self.cStyleCB,Qt.SIGNAL("currentIndexChanged(int)"),self.onControlChanged)
-            Qt.QObject.connect(self.sSizeSB,Qt.SIGNAL("valueChanged(int)"),self.onControlChanged)
-            Qt.QObject.connect(self.lWidthSB,Qt.SIGNAL("valueChanged(int)"),self.onControlChanged)
-            Qt.QObject.connect(self.sFillCB,Qt.SIGNAL("stateChanged(int)"),self.onControlChanged)
-            Qt.QObject.connect(self.cFillCB,Qt.SIGNAL("stateChanged(int)"),self.onControlChanged)
-        #except Exception, e:
-            #print "CURVE APPEARANCE EXCEPTION:",str(e)
-            
-            
+        # try:
+        super(CurvesAppearanceChooser, self).__init__(parent)
+        self.loadUi()
+        self.autoApply = autoApply
+        self.sStyleCB.insertItems(0, sorted(NamedSymbolStyles.values()))
+        self.lStyleCB.insertItems(0, NamedLineStyles.values())
+        self.cStyleCB.insertItems(0, NamedCurveStyles.values())
+        self.sColorCB.addItem("")
+        self.lColorCB.addItem("")
+        if not showButtons:
+            self.applyBT.hide()
+            self.resetBT.hide()
+        for color in NamedColors:
+            icon = self._colorIcon(color)
+            self.sColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color)))
+            self.lColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color)))
+        self.__itemsDict = CaselessDict()
+        self.setCurves(curvePropDict)
+        # set the icon for the background button (stupid designer limitations
+        # forces to do it programatically)
+        self.bckgndBT.setIcon(Qt.QIcon(":color-fill.svg"))
+
+        # connections.
+        # Note: The assignToY1BT and assignToY2BT buttons are not connected to anything
+        # Their signals are handled by the Config dialog because we haven't got
+        # access to the curve objects here
+        self.curvesLW.itemSelectionChanged.connect(self.onSelectedCurveChanged)
+        self.curvesLW.itemChanged.connect(self.onItemChanged)
+        self.applyBT.clicked.connect(self.onApply)
+        self.resetBT.clicked.connect(self.onReset)
+        self.sStyleCB.currentIndexChanged.connect(self._onSymbolStyleChanged)
+
+        self.sStyleCB.currentIndexChanged.connect(self.onControlChanged)
+        self.lStyleCB.currentIndexChanged.connect(self.onControlChanged)
+        self.sColorCB.currentIndexChanged.connect(self.onControlChanged)
+        self.lColorCB.currentIndexChanged.connect(self.onControlChanged)
+        self.cStyleCB.currentIndexChanged.connect(self.onControlChanged)
+        self.sSizeSB.valueChanged.connect(self.onControlChanged)
+        self.lWidthSB.valueChanged.connect(self.onControlChanged)
+        self.sFillCB.stateChanged.connect(self.onControlChanged)
+        self.cFillCB.stateChanged.connect(self.onControlChanged)
+        # except Exception, e:
+        # print "CURVE APPEARANCE EXCEPTION:",str(e)
+
     def setCurves(self, curvePropDict):
         '''Populates the list of curves from the properties dictionary. It uses
         the curve title for display, and stores the curve name as the item data
         (with role=CurvesAppearanceChooser.NAME_ROLE)
-        
+
         :param curvePropDict:   (dict) a dictionary whith keys=curvenames and
                                 values= :class:`CurveAppearanceProperties` object
         '''
@@ -154,199 +163,238 @@ class CurvesAppearanceChooser(Qt.QWidget):
         self._curvePropDictOrig = copy.deepcopy(curvePropDict)
         self.curvesLW.clear()
         self.__itemsDict = CaselessDict()
-        for name,prop in self.curvePropDict.iteritems():
-            item = Qt.QListWidgetItem(Qt.QString(prop.title), self.curvesLW) #create and insert the item
+        for name, prop in self.curvePropDict.iteritems():
+            # create and insert the item
+            item = Qt.QListWidgetItem(Qt.QString(prop.title), self.curvesLW)
             self.__itemsDict[name] = item
             item.setData(self.NAME_ROLE, Qt.QVariant(Qt.QString(name)))
-            item.setToolTip("<b>Curve Name:</b> %s"%name)
-            item.setFlags(Qt.Qt.ItemIsEnabled|Qt.Qt.ItemIsSelectable|Qt.Qt.ItemIsUserCheckable|Qt.Qt.ItemIsDragEnabled|Qt.Qt.ItemIsEditable)
+            item.setToolTip("<b>Curve Name:</b> %s" % name)
+            item.setFlags(Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsSelectable |
+                          Qt.Qt.ItemIsUserCheckable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsEditable)
         self.curvesLW.setCurrentRow(0)
-    
+
     def onItemChanged(self, item):
         '''slot used when an item data has changed'''
         name = Qt.from_qvariant(item.data(self.NAME_ROLE), str)
         previousTitle = self.curvePropDict[name].title
         currentTitle = item.text()
-        if previousTitle!=currentTitle:
+        if previousTitle != currentTitle:
             self.curvePropDict[name].title = currentTitle
-            self.curvesLW.emit(Qt.SIGNAL('CurveTitleEdited'), name, currentTitle)
-    
+            self.CurveTitleEdited.emit(name, currentTitle)
+
     def updateTitles(self, newTitlesDict=None):
         '''
         Updates the titles of the curves that are displayed in the curves list.
-        
+
         :param newTitlesDict: (dict<str,str>) dictionary with key=curve_name and
                               value=title
         '''
-        if newTitlesDict is None: return
-        for name,title in newTitlesDict.iteritems():
+        if newTitlesDict is None:
+            return
+        for name, title in newTitlesDict.iteritems():
             self.curvePropDict[name].title = title
             self.__itemsDict[name].setText(title)
-            
-    
+
     def getSelectedCurveNames(self):
         '''Returns the curve names for the curves selected at the curves list.
-        
+
         *Note*: The names may differ from the displayed text, which
         corresponds to the curve titles (this method is what you likely need if
         you want to get keys to use in curves or curveProp dicts).
-        
+
         :return: (string_list) the names of the selected curves
-        '''     
+        '''
         return [Qt.from_qvariant(item.data(self.NAME_ROLE), str) for item in self.curvesLW.selectedItems()]
-        
-      
-    def showProperties(self,prop=None):
+
+    def showProperties(self, prop=None):
         '''Updates the dialog to show the given properties.
-        
+
         :param prop: (CurveAppearanceProperties) the properties object
                      containing what should be shown. If a given property is set
                      to None, the corresponding widget will show a "neutral"
                      display
         '''
-        if prop is None: prop=self._shownProp
-        #set the Style comboboxes
-        self.sStyleCB.setCurrentIndex(self.sStyleCB.findText(NamedSymbolStyles[prop.sStyle]))
-        self.lStyleCB.setCurrentIndex(self.lStyleCB.findText(NamedLineStyles[prop.lStyle]))
-        self.cStyleCB.setCurrentIndex(self.cStyleCB.findText(NamedCurveStyles[prop.cStyle]))
-        #set sSize and lWidth spinboxes. if prop.sSize is None, it puts -1 (which is the special value for these switchhboxes)
-        self.sSizeSB.setValue(max(prop.sSize,-1)) 
-        self.lWidthSB.setValue(max(prop.lWidth,-1))
-        #Set the Color combo boxes. The item at index 0 is the empty one in the comboboxes Manage unknown colors by including them
-        if prop.sColor is None: index=0 
-        else:  index=self.sColorCB.findData(Qt.QVariant(Qt.QColor(prop.sColor)))
-        if index==-1: #if the color is not one of the supported colors, add it to the combobox
-            index=self.sColorCB.count()  #set the index to what will be the added one
-            self.sColorCB.addItem(self._colorIcon(Qt.QColor(prop.sColor)), "", Qt.QVariant(Qt.QColor(prop.sColor)))
+        if prop is None:
+            prop = self._shownProp
+        # set the Style comboboxes
+        self.sStyleCB.setCurrentIndex(
+            self.sStyleCB.findText(NamedSymbolStyles[prop.sStyle]))
+        self.lStyleCB.setCurrentIndex(
+            self.lStyleCB.findText(NamedLineStyles[prop.lStyle]))
+        self.cStyleCB.setCurrentIndex(
+            self.cStyleCB.findText(NamedCurveStyles[prop.cStyle]))
+        # set sSize and lWidth spinboxes. if prop.sSize is None, it puts -1
+        # (which is the special value for these switchhboxes)
+        self.sSizeSB.setValue(max(prop.sSize, -1))
+        self.lWidthSB.setValue(max(prop.lWidth, -1))
+        # Set the Color combo boxes. The item at index 0 is the empty one in
+        # the comboboxes Manage unknown colors by including them
+        if prop.sColor is None:
+            index = 0
+        else:
+            index = self.sColorCB.findData(Qt.QVariant(Qt.QColor(prop.sColor)))
+        if index == -1:  # if the color is not one of the supported colors, add it to the combobox
+            index = self.sColorCB.count()  # set the index to what will be the added one
+            self.sColorCB.addItem(self._colorIcon(
+                Qt.QColor(prop.sColor)), "", Qt.QVariant(Qt.QColor(prop.sColor)))
         self.sColorCB.setCurrentIndex(index)
-        if prop.lColor is None: index=0 
-        else:  index=self.lColorCB.findData(Qt.QVariant(Qt.QColor(prop.lColor)))
-        if index==-1: #if the color is not one of the supported colors, add it to the combobox
-            index=self.lColorCB.count()  #set the index to what will be the added one
-            self.lColorCB.addItem(self._colorIcon(Qt.QColor(prop.lColor)), "", Qt.QVariant(Qt.QColor(prop.lColor)))
+        if prop.lColor is None:
+            index = 0
+        else:
+            index = self.lColorCB.findData(Qt.QVariant(Qt.QColor(prop.lColor)))
+        if index == -1:  # if the color is not one of the supported colors, add it to the combobox
+            index = self.lColorCB.count()  # set the index to what will be the added one
+            self.lColorCB.addItem(self._colorIcon(
+                Qt.QColor(prop.lColor)), "", Qt.QVariant(Qt.QColor(prop.lColor)))
         self.lColorCB.setCurrentIndex(index)
-        #set the Fill Checkbox. The prop.sFill value can be in 3 states: True, False and None
-        if prop.sFill is None: checkState=Qt.Qt.PartiallyChecked 
-        elif prop.sFill: checkState=Qt.Qt.Checked
-        else: checkState=Qt.Qt.Unchecked
-        #set the Area Fill Checkbox. The prop.cFill value can be in 3 states: True, False and None
-        if prop.cFill is None: checkState=Qt.Qt.PartiallyChecked 
-        elif prop.cFill: checkState=Qt.Qt.Checked
-        else: checkState=Qt.Qt.Unchecked
+        # set the Fill Checkbox. The prop.sFill value can be in 3 states: True,
+        # False and None
+        if prop.sFill is None:
+            checkState = Qt.Qt.PartiallyChecked
+        elif prop.sFill:
+            checkState = Qt.Qt.Checked
+        else:
+            checkState = Qt.Qt.Unchecked
+        # set the Area Fill Checkbox. The prop.cFill value can be in 3 states:
+        # True, False and None
+        if prop.cFill is None:
+            checkState = Qt.Qt.PartiallyChecked
+        elif prop.cFill:
+            checkState = Qt.Qt.Checked
+        else:
+            checkState = Qt.Qt.Unchecked
         self.cFillCB.setCheckState(checkState)
-    
-    def onControlChanged(self,*args):
+
+    def onControlChanged(self, *args):
         '''slot to be called whenever a control widget is changed. It emmits a
         'controlChanged signal and applies the change if in autoapply mode.
         It ignores any arguments passed'''
-        
-        self.emit(Qt.SIGNAL("controlChanged"))
-        if self.autoApply: self.onApply()
+
+        self.controlChanged.emit()
+        if self.autoApply:
+            self.onApply()
 
     def onSelectedCurveChanged(self):
         """Updates the shown properties when the curve selection changes"""
-        plist=[self.curvePropDict[name] for name in self.getSelectedCurveNames()] 
-        if len(plist)==0: plist=[CurveAppearanceProperties()]
-        self._shownProp=CurveAppearanceProperties.merge(plist)
+        plist = [self.curvePropDict[name]
+                 for name in self.getSelectedCurveNames()]
+        if len(plist) == 0:
+            plist = [CurveAppearanceProperties()]
+        self._shownProp = CurveAppearanceProperties.merge(plist)
         self.showProperties(self._shownProp)
-    
+
     def _onSymbolStyleChanged(self, text):
         '''Slot called when the Symbol style is changed, to ensure that symbols
         are visible if you choose them
-        
+
         :param text: (str) the new symbol style label
         '''
-        text=str(text)
-        if self.sSizeSB.value()<2 and not text in ["","No symbol"]:
-            self.sSizeSB.setValue(3) #a symbol size of 0 is invisible and 1 means you should use cStyle=dots
+        text = str(text)
+        if self.sSizeSB.value() < 2 and not text in ["", "No symbol"]:
+            # a symbol size of 0 is invisible and 1 means you should use
+            # cStyle=dots
+            self.sSizeSB.setValue(3)
 
     def getShownProperties(self):
         """Returns a copy of the currently shown properties and updates
         self._shownProp
-        
+
         :return: (CurveAppearanceProperties)
         """
-        prop=CurveAppearanceProperties()
-        #get the values from the Style comboboxes. Note that the empty string ("") translates into None
-        prop.sStyle=ReverseNamedSymbolStyles[str(self.sStyleCB.currentText())] 
-        prop.lStyle=ReverseNamedLineStyles[str(self.lStyleCB.currentText())]
-        prop.cStyle=ReverseNamedCurveStyles[str(self.cStyleCB.currentText())]
-        #get sSize and lWidth from the spinboxes
-        prop.sSize=self.sSizeSB.value()
-        prop.lWidth=self.lWidthSB.value()
-        if prop.sSize<0: prop.sSize=None
-        if prop.lWidth<0: prop.lWidth=None
-        #Get the Color combo boxes. The item at index 0 is the empty one in the comboboxes
-        index=self.sColorCB.currentIndex()
-        if index==0:prop.sColor=None
-        else:prop.sColor=Qt.QColor(self.sColorCB.itemData(index))
-        index=self.lColorCB.currentIndex()
-        if index==0:prop.lColor=None
-        else:prop.lColor=Qt.QColor(self.lColorCB.itemData(index))
-        #get the sFill from the Checkbox.
-        checkState=self.sFillCB.checkState()
-        if checkState==Qt.Qt.PartiallyChecked: prop.sFill=None
-        else: prop.sFill=bool(checkState)
-        #get the cFill from the Checkbox.
-        checkState=self.cFillCB.checkState()
-        if checkState==Qt.Qt.PartiallyChecked: prop.cFill=None
-        else: prop.cFill=bool(checkState)
-        #store the props 
-        self._shownProp=copy.deepcopy(prop)
+        prop = CurveAppearanceProperties()
+        # get the values from the Style comboboxes. Note that the empty string
+        # ("") translates into None
+        prop.sStyle = ReverseNamedSymbolStyles[
+            str(self.sStyleCB.currentText())]
+        prop.lStyle = ReverseNamedLineStyles[str(self.lStyleCB.currentText())]
+        prop.cStyle = ReverseNamedCurveStyles[str(self.cStyleCB.currentText())]
+        # get sSize and lWidth from the spinboxes
+        prop.sSize = self.sSizeSB.value()
+        prop.lWidth = self.lWidthSB.value()
+        if prop.sSize < 0:
+            prop.sSize = None
+        if prop.lWidth < 0:
+            prop.lWidth = None
+        # Get the Color combo boxes. The item at index 0 is the empty one in
+        # the comboboxes
+        index = self.sColorCB.currentIndex()
+        if index == 0:
+            prop.sColor = None
+        else:
+            prop.sColor = Qt.QColor(self.sColorCB.itemData(index))
+        index = self.lColorCB.currentIndex()
+        if index == 0:
+            prop.lColor = None
+        else:
+            prop.lColor = Qt.QColor(self.lColorCB.itemData(index))
+        # get the sFill from the Checkbox.
+        checkState = self.sFillCB.checkState()
+        if checkState == Qt.Qt.PartiallyChecked:
+            prop.sFill = None
+        else:
+            prop.sFill = bool(checkState)
+        # get the cFill from the Checkbox.
+        checkState = self.cFillCB.checkState()
+        if checkState == Qt.Qt.PartiallyChecked:
+            prop.cFill = None
+        else:
+            prop.cFill = bool(checkState)
+        # store the props
+        self._shownProp = copy.deepcopy(prop)
         return copy.deepcopy(prop)
-        
+
     def onApply(self):
         """Apply does 2 things:
-        
+
             - It updates `self.curvePropDict` using the current values
               choosen in the dialog
             - It emits a curveAppearanceChanged signal that indicates the names
               of the curves that changed and the new properties. (The names and
               the properties are returned by the function as well)
-            
+
         :return: (tuple<CurveAppearanceProperties,list>) a tuple containing the
                  curve properties and a list of the selected curve names (as a
                  list<str>)
         """
-        names= self.getSelectedCurveNames()
-        prop=self.getShownProperties()
-        #Update self.curvePropDict for selected properties
+        names = self.getSelectedCurveNames()
+        prop = self.getShownProperties()
+        # Update self.curvePropDict for selected properties
         for n in names:
-            self.curvePropDict[n]=CurveAppearanceProperties.merge([self.curvePropDict[n],prop],
-                                                                  conflict=CurveAppearanceProperties.inConflict_update_a)
-        #emit a (PyQt) signal telling what properties (first argument) need to be applied to which curves (second argument)
-        self.emit(Qt.SIGNAL("curveAppearanceChanged"),prop,names)
-        #return both values
-        return prop,names
-        
+            self.curvePropDict[n] = CurveAppearanceProperties.merge([self.curvePropDict[n], prop],
+                                                                    conflict=CurveAppearanceProperties.inConflict_update_a)
+        # emit a (PyQt) signal telling what properties (first argument) need to
+        # be applied to which curves (second argument)
+        self.curveAppearanceChanged.emit(prop, names)
+        # return both values
+        return prop, names
+
     def onReset(self):
         '''slot to be called when the reset action is triggered. It reverts to
         the original situation'''
         self.setCurves(self._curvePropDictOrig)
         self.curvesLW.clearSelection()
-        
-    def _colorIcon(self,color,w=10,h=10):
-        #to do: create a border
-        pixmap=Qt.QPixmap(w,h)
+
+    def _colorIcon(self, color, w=10, h=10):
+        # to do: create a border
+        pixmap = Qt.QPixmap(w, h)
         pixmap.fill(Qt.QColor(color))
         return Qt.QIcon(pixmap)
-        
-        
+
 
 class CurveAppearanceProperties(object):
     '''An object describing the appearance of a TaurusCurve'''
-    
+
     def __init__(self, sStyle=None, sSize=None, sColor=None, sFill=None,
                  lStyle=None, lWidth=None, lColor=None, cStyle=None,
                  yAxis=None, cFill=None, title=None, visible=None):
         """
         Creator of :class:`CurveAppearanceProperties`
         Possible keyword arguments are:
-            - sStyle= symbolstyle 
+            - sStyle= symbolstyle
             - sSize= int
             - sColor= color
             - sFill= bool
-            - lStyle= linestyle 
+            - lStyle= linestyle
             - lWidth= int
             - lColor= color
             - cStyle= curvestyle
@@ -354,8 +402,8 @@ class CurveAppearanceProperties(object):
             - yAxis= axis
             - visible = bool
             - title= title
-            
-        Where: 
+
+        Where:
             - color is a color that QColor() understands (i.e. a
               Qt.Qt.GlobalColor, a color name, or a Qt.Qcolor)
             - symbolstyle is one of Qwt5.QwtSymbol.Style
@@ -369,7 +417,7 @@ class CurveAppearanceProperties(object):
         self.sSize = sSize
         self.sColor = sColor
         self.sFill = sFill
-        self.lStyle = lStyle 
+        self.lStyle = lStyle
         self.lWidth = lWidth
         self.lColor = lColor
         self.cStyle = cStyle
@@ -377,46 +425,49 @@ class CurveAppearanceProperties(object):
         self.yAxis = yAxis
         self.title = title
         self.visible = visible
-        self.propertyList = ["sStyle","sSize","sColor","sFill","lStyle","lWidth",
-                             "lColor","cStyle","cFill","yAxis", "title", "visible"]
-        
+        self.propertyList = ["sStyle", "sSize", "sColor", "sFill", "lStyle", "lWidth",
+                             "lColor", "cStyle", "cFill", "yAxis", "title", "visible"]
+
     def _print(self):
         """Just for debug"""
-        print "-"*77
-        for k in self.propertyList: print k+"= ",self.__getattribute__(k) 
-        print "-"*77
-            
+        print "-" * 77
+        for k in self.propertyList:
+            print k + "= ", self.__getattribute__(k)
+        print "-" * 77
+
     @staticmethod
-    def inConflict_update_a(a,b):
-        """This  function can be passed to CurvesAppearance.merge() 
-        if one wants to update prop1 with prop2 except for those 
+    def inConflict_update_a(a, b):
+        """This  function can be passed to CurvesAppearance.merge()
+        if one wants to update prop1 with prop2 except for those
         attributes of prop2 that are set to None"""
-        if b is None: return a
-        else: return b
-        
+        if b is None:
+            return a
+        else:
+            return b
+
     @staticmethod
-    def inConflict_none(a,b):
+    def inConflict_none(a, b):
         """In case of conflict, returns None"""
         return None
 
     def conflictsWith(self, other, strict=True):
-        """returns a list of attribute names that are in conflict between this self and other""" 
+        """returns a list of attribute names that are in conflict between this self and other"""
         result = []
         for aname in self.propertyList:
             vself = getattr(self, aname)
-            vother =  getattr(other, aname)
+            vother = getattr(other, aname)
             if (vself != vother) and (strict or not(vself is None or vother is None)):
                 result.append(aname)
         return result
-        
-    @classmethod    
+
+    @classmethod
     def merge(self, plist, attributes=None, conflict=None):
         """returns a CurveAppearanceProperties object formed by merging a list
         of other CurveAppearanceProperties objects
-        
+
         **Note:** This is a class method, so it can be called without previously
         instantiating an object
-        
+
         :param plist: (sequence<CurveAppearanceProperties>) objects to be merged
         :param attributes: (sequence<str>) the name of the attributes to
                            consider for the merge. If None, all the attributes
@@ -425,38 +476,44 @@ class CurveAppearanceProperties(object):
                          different attribute)and returns a value that solves the
                          conflict. If None is given, any conflicting attribute
                          will be set to None.
-        
+
         :return: (CurveAppearanceProperties) merged properties
         """
-        
-        n=len(plist)
-        if n<1: raise ValueError("plist must contain at least 1 member")
-        plist=copy.deepcopy(plist)
-        if n==1: return plist[0]
-        if attributes is None: attributes=["sStyle","sSize","sColor","sFill","lStyle","lWidth","lColor","cStyle","cFill","yAxis","title"]
-        if conflict is None: conflict=CurveAppearanceProperties.inConflict_none
-        p=CurveAppearanceProperties()
+
+        n = len(plist)
+        if n < 1:
+            raise ValueError("plist must contain at least 1 member")
+        plist = copy.deepcopy(plist)
+        if n == 1:
+            return plist[0]
+        if attributes is None:
+            attributes = ["sStyle", "sSize", "sColor", "sFill", "lStyle",
+                          "lWidth", "lColor", "cStyle", "cFill", "yAxis", "title"]
+        if conflict is None:
+            conflict = CurveAppearanceProperties.inConflict_none
+        p = CurveAppearanceProperties()
         for a in attributes:
-            alist=[p.__getattribute__(a) for p in plist]
-            p.__setattr__(a,alist[0])
+            alist = [p.__getattribute__(a) for p in plist]
+            p.__setattr__(a, alist[0])
             for ai in alist[1:]:
-                if alist[0]!=ai:
-#                    print "MERGING:",alist[0],ai,conflict(alist[0],ai)
-                    p.__setattr__(a,conflict(alist[0],ai))
+                if alist[0] != ai:
+                    # print "MERGING:",alist[0],ai,conflict(alist[0],ai)
+                    p.__setattr__(a, conflict(alist[0], ai))
                     break
         return p
-            
-    def applyToCurve(self,curve):
+
+    def applyToCurve(self, curve):
         """applies the current properties to a given curve
         If a property is set to None, it is not applied to the curve"""
-        raise DeprecationWarning("CurveAppearanceProperties.applyToCurve() is deprecated. Use TaurusCurve.setAppearanceProperties() instead")
+        raise DeprecationWarning(
+            "CurveAppearanceProperties.applyToCurve() is deprecated. Use TaurusCurve.setAppearanceProperties() instead")
         curve.setAppearanceProperties(self)
-        
+
 #        s=curve.symbol()
 #        if self.sStyle is not None: s.setStyle(symbol[self.sStyle])
 #        if self.sSize is not None: s.setSize(self.sSize)
 #        if self.sColor is not None: s.brush().setColor(Qt.QColor(self.sColor))
-#        if self.sFill is not None: 
+#        if self.sFill is not None:
 #            if self.sFill: s.brush().setStyle(Qt.Qt.SolidPattern)
 #            else: s.brush().setStyle(Qt.Qt.NoBrush)
 #        p=curve.pen()
@@ -465,7 +522,7 @@ class CurveAppearanceProperties(object):
 #        if self.lColor is not None: p.setColor(Qt.QColor(self.lColor))
 #        curveStyle=curve.style()
 #        if self.cStyle is not None: curveStyle.setStyle(self.cStyle)
-#        if self.cFill is not None: 
+#        if self.cFill is not None:
 #            if self.cFill:
 #                color = p.color()
 #                color.setAlphaF(0.5)
@@ -476,5 +533,3 @@ class CurveAppearanceProperties(object):
 #                c.brush().setStyle(Qt.Qt.NoBrush)
 #        if self.yAxis is not None: curve.setYAxis(self.yAxis)
 #        if self.title is not None: curve.setTitle(Qwt5.QwtText(self.title))
-
-
diff --git a/lib/taurus/qt/qtgui/plot/monitor.py b/lib/taurus/qt/qtgui/plot/monitor.py
index 343e8a9..2d45073 100644
--- a/lib/taurus/qt/qtgui/plot/monitor.py
+++ b/lib/taurus/qt/qtgui/plot/monitor.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -38,20 +38,21 @@ class TaurusMonitorTiny(TaurusTrend):
     toolbar). It is inspired by the SysMon applet in old KDE3.
 
     .. seealso:: :class:`TaurusTrend`,
-                 :ref:`TaurusTrend User's Interface Guide <trend_ui>`, 
+                 :ref:`TaurusTrend User's Interface Guide <trend_ui>`,
                  :ref:`The TaurusTrend coding examples <examples_taurustrend>`
     '''
-    DEFAULT_MAX_BUFFER_SIZE = 8192 #(8K events))
-    def __init__(self, parent = None, designMode = False):
-        TaurusTrend.__init__(self, parent = parent, designMode = designMode)
-        
-        
+    DEFAULT_MAX_BUFFER_SIZE = 8192  # (8K events))
+
+    def __init__(self, parent=None, designMode=False):
+        TaurusTrend.__init__(self, parent=parent, designMode=designMode)
+
         self.setXIsTime(True)
-        self.setAxisScale(self.xBottom, 0, 5*60) #set a 5 minutes range by default
+        # set a 5 minutes range by default
+        self.setAxisScale(self.xBottom, 0, 5 * 60)
         self.setXDynScale(True)
-        
+
         self.setCanvasBackground(Qt.Qt.black)
-        
+
         self.showLegend(False)
         self.enableAxis(self.xBottom, False)
         self.enableAxis(self.xTop, False)
@@ -59,23 +60,23 @@ class TaurusMonitorTiny(TaurusTrend):
         self.enableAxis(self.yRight, False)
         self.setAllowZoomers(False)
         self.toggleDataInspectorMode(enable=True)
-        self.setMaximumSize(60,60)
+        self.setMaximumSize(60, 60)
 
     def autoShowYAxes(self):
         '''reimplemented to avoid auto-enabling of axes'''
         pass
-    
+
     def event(self, event):
-#        if event.type() == Qt.QEvent.ToolTip: print "!!!!!!!", event.type()
+        # if event.type() == Qt.QEvent.ToolTip: print "!!!!!!!", event.type()
         if event.type() == Qt.QEvent.ToolTip:
-#            info = self.getMonitorInfo()
-#            self.setToolTip(info)
+            #            info = self.getMonitorInfo()
+            #            self.setToolTip(info)
             event.accept()
         return TaurusTrend.event(self, event)
-    
+
 #    def getMonitorInfo(self):
 #        time = datetime.datetime.now().isoformat()
-##        for 
+# for
 #        return time
 #        #print "!!!!!!!!!", event.type()
 #    #def mouse
@@ -84,42 +85,45 @@ class TaurusMonitorTiny(TaurusTrend):
 if __name__ == "__main__":
     import sys
     app = Qt.QApplication(sys.argv)
-    
-    args=sys.argv[1:]
-    
+
+    args = sys.argv[1:]
+
     KLASS = TaurusTrend
     SHOW = True
     EXPORT = None
     CONFIG = None
     MODELS = []
     XISTIME = True
-    
-    ## MANAGING ARGUMENTS 
-    #----------------------------------------------    
+
+    # MANAGING ARGUMENTS
+    #----------------------------------------------
     for a in args:
-        if a == "-xt":  #argument "-xt" means interprete X values as time
+        if a == "-xt":  # argument "-xt" means interprete X values as time
             XISTIME = True
-        elif a == "-xe":  #argument "-xe" means interprete X values as events
+        elif a == "-xe":  # argument "-xe" means interprete X values as events
             XISTIME = False
-        elif a.startswith('-config='): #argument "-conf=FILENAME" launches TaurusTrend/Plot with a predefined config file
+        # argument "-conf=FILENAME" launches TaurusTrend/Plot with a predefined
+        # config file
+        elif a.startswith('-config='):
             CONFIG = a.split('=')[-1]
-        elif a.startswith('-'): #whatever other argument starting by "-"
-            print "\n Usage: \n%s [-xe|-xt] [-config=configfilename] [model1 [model2] ...]\n"%sys.argv[0]
+        elif a.startswith('-'):  # whatever other argument starting by "-"
+            print "\n Usage: \n%s [-xe|-xt] [-config=configfilename] [model1 [model2] ...]\n" % sys.argv[0]
             sys.exit(1)
-        else: #anything that is not a parameter is interpreted as a model
+        else:  # anything that is not a parameter is interpreted as a model
             MODELS.append(a)
     #----------------------------------------------
-    
-    form =  TaurusMonitorTiny()    
+
+    form = TaurusMonitorTiny()
     form.setXIsTime(XISTIME)
-    if CONFIG is not None: form.loadConfig(CONFIG)
-    #form.setDefaultCurvesTitle("<dev_full_name><[trend_index]>")
-    if MODELS: form.setModel(MODELS)  
-     
-    
+    if CONFIG is not None:
+        form.loadConfig(CONFIG)
+    # form.setDefaultCurvesTitle("<dev_full_name><[trend_index]>")
+    if MODELS:
+        form.setModel(MODELS)
+
     if SHOW:
         form.show()
-        #if no models are passed, show the data import dialog
+        # if no models are passed, show the data import dialog
         if len(MODELS) == 0 and CONFIG is None:
             form.showDataImportDlg()
     sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/plot/qwtdialog.py b/lib/taurus/qt/qtgui/plot/qwtdialog.py
index 4c1424a..eaf0a59 100644
--- a/lib/taurus/qt/qtgui/plot/qwtdialog.py
+++ b/lib/taurus/qt/qtgui/plot/qwtdialog.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -27,13 +27,15 @@
 qwtdialog.py: Dialogs for Taurusplot
 """
 
+__all__ = ["TaurusPlotConfigDialog"]
+
 import time
 
 from taurus.external.qt import Qt, Qwt5
 from taurus.qt.qtgui.util.ui import UILoadable
 
 
-#class TaurusPlotConfigCapable:
+# class TaurusPlotConfigCapable:
 #    """This class is aimed to act as an interface for class TaurusPlot. Every class that uses
 #    TaurusPlotConfigDialog class (as TaurusPlot does) should inherit TaurusPlotConfigCapable class
 #    and overwrite the methods defined below in order to avoid firing exceptions"""
@@ -62,91 +64,100 @@ class TaurusPlotConfigDialog(Qt.QDialog):
 
     def __init__(self, parent=None, flags=Qt.Qt.WindowFlags()):
         self.parent = parent
-        #if parent==None or not isinstance(parent, TaurusPlotConfigCapable):
+        # if parent==None or not isinstance(parent, TaurusPlotConfigCapable):
         #    raise NotImplementedError, "Parent object doesn't implement TaurusPlotConfigCapable class"
-        #call qt designer generated functions to initialize GUI
+        # call qt designer generated functions to initialize GUI
         Qt.QDialog.__init__(self, parent, flags)
         self.loadUi()
-        
-        #insert the CurvesAppearanceWidget 
+
+        # insert the CurvesAppearanceWidget
         #(@TODO:must be changed to be done directly in the ui, but I couldn't make the widget available to TaurusDesigner)
         from curvesAppearanceChooserDlg import CurvesAppearanceChooser
-        layout=Qt.QVBoxLayout()
-        self.curvesAppearanceChooser=CurvesAppearanceChooser(None)
+        layout = Qt.QVBoxLayout()
+        self.curvesAppearanceChooser = CurvesAppearanceChooser(None)
         layout.addWidget(self.curvesAppearanceChooser)
         self.ui.curveAppearanceGB.setLayout(layout)
-        
-        #set the values for the CurvesAppearanceChooser
-        self.curvesAppearanceChooser.setCurves(self.parent.getCurveAppearancePropertiesDict())
-        
-        #insert valid values into mode combobox (linear or logarihtmic) and set selected one in combobox
-        self.ui.xModeComboBox.insertItem(0,"Linear")
-        self.ui.xModeComboBox.insertItem(1,"Logarithmic")
-        self.ui.y1ModeComboBox.insertItem(0,"Linear")
-        self.ui.y1ModeComboBox.insertItem(1,"Logarithmic")
-        self.ui.y2ModeComboBox.insertItem(0,"Linear")
-        self.ui.y2ModeComboBox.insertItem(1,"Logarithmic")
-
-        #insert valid values into peaks combobox (max, min or both) and set selected one in combobox
-        self.ui.peaksComboBox.insertItem(0,"Both")
-        self.ui.peaksComboBox.insertItem(1,"Max")
-        self.ui.peaksComboBox.insertItem(2,"Min")
-        self.ui.peaksComboBox.insertItem(3,"None")
-        
-        #Init X axis group
+
+        # set the values for the CurvesAppearanceChooser
+        self.curvesAppearanceChooser.setCurves(
+            self.parent.getCurveAppearancePropertiesDict())
+
+        # insert valid values into mode combobox (linear or logarihtmic) and
+        # set selected one in combobox
+        self.ui.xModeComboBox.insertItem(0, "Linear")
+        self.ui.xModeComboBox.insertItem(1, "Logarithmic")
+        self.ui.y1ModeComboBox.insertItem(0, "Linear")
+        self.ui.y1ModeComboBox.insertItem(1, "Logarithmic")
+        self.ui.y2ModeComboBox.insertItem(0, "Linear")
+        self.ui.y2ModeComboBox.insertItem(1, "Logarithmic")
+
+        # insert valid values into peaks combobox (max, min or both) and set
+        # selected one in combobox
+        self.ui.peaksComboBox.insertItem(0, "Both")
+        self.ui.peaksComboBox.insertItem(1, "Max")
+        self.ui.peaksComboBox.insertItem(2, "Min")
+        self.ui.peaksComboBox.insertItem(3, "None")
+
+        # Init X axis group
         self.ui.xRangeCB.setVisible(False)
         self.ui.xLabelRange.setVisible(False)
         if self.parent.getXIsTime():
-            # adapt the X axis group for time-based measurements 
+            # adapt the X axis group for time-based measurements
             self.ui.xRangeCB.addItems(["",
-                                         "1 m",
-                                         "1 h",
-                                         "1 d",
-                                         "1 w",
-                                         "30 d",
-                                         "1 y"])            
-            self.ui.xGroupBox.setTitle("Time") 
+                                       "1 m",
+                                       "1 h",
+                                       "1 d",
+                                       "1 w",
+                                       "30 d",
+                                       "1 y"])
+            self.ui.xGroupBox.setTitle("Time")
             self.ui.xLabelMin.setText("Start")
             self.ui.xLabelMax.setText("End")
-            timetooltip="""It accepts both absolute data-times (e.g. "25/10/1917 21:45:01") \n"""\
-                        """or relative ones with format <+|-><number><s|m|h|d|w|y> (e.g. "-12h").\n"""\
-                        """The keyword "now" is also accepted."""
+            timetooltip = """It accepts both absolute data-times (e.g. "25/10/1917 21:45:01") \n"""\
+                """or relative ones with format <+|-><number><s|m|h|d|w|y> (e.g. "-12h").\n"""\
+                """The keyword "now" is also accepted."""
             self.ui.xEditMin.setToolTip(timetooltip)
             self.ui.xEditMax.setToolTip(timetooltip)
         else:
             # The default settings are ok for non-time plots
-            self.ui.xEditMin.setValidator(Qt.QDoubleValidator(self)) 
+            self.ui.xEditMin.setValidator(Qt.QDoubleValidator(self))
             self.ui.xEditMax.setValidator(Qt.QDoubleValidator(self))
             self.ui.xRangeCB.setValidator(Qt.QDoubleValidator(self))
             self.ui.xRangeCB.addItems(["",
-                                         "10",
-                                         "100",
-                                         "1000",
-                                         "10000",
-                                         "100000",
-                                         "1000000"])
-          
+                                       "10",
+                                       "100",
+                                       "1000",
+                                       "10000",
+                                       "100000",
+                                       "1000000"])
+
         self.ui.xDynScaleCheckBox.setChecked(self.parent.getXDynScale())
-        auto=self.parent.axisAutoScale(Qwt5.QwtPlot.xBottom)
+        auto = self.parent.axisAutoScale(Qwt5.QwtPlot.xBottom)
         self.ui.xAutoGroupBox.setChecked(not auto)
-        
-        self.setXDynScale(self.parent.getXDynScale()) #this call already initialises the edit boxes of the X axis
-        self.ui.xDynScaleCheckBox.setVisible(self.parent.isXDynScaleSupported())
-        
-        #Init Y axes groups
+
+        # this call already initialises the edit boxes of the X axis
+        self.setXDynScale(self.parent.getXDynScale())
+        self.ui.xDynScaleCheckBox.setVisible(
+            self.parent.isXDynScaleSupported())
+
+        # Init Y axes groups
         self._populateYAxisScales()
-        self.ui.y1AutoGroupBox.setChecked(not self.parent.axisAutoScale(Qwt5.QwtPlot.yLeft))
-        self.ui.y2AutoGroupBox.setChecked(not self.parent.axisAutoScale(Qwt5.QwtPlot.yRight))
-        
-        #set validators for Y min/max edits
+        self.ui.y1AutoGroupBox.setChecked(
+            not self.parent.axisAutoScale(Qwt5.QwtPlot.yLeft))
+        self.ui.y2AutoGroupBox.setChecked(
+            not self.parent.axisAutoScale(Qwt5.QwtPlot.yRight))
+
+        # set validators for Y min/max edits
         self.ui.y1EditMin.setValidator(Qt.QDoubleValidator(self))
         self.ui.y1EditMax.setValidator(Qt.QDoubleValidator(self))
         self.ui.y2EditMin.setValidator(Qt.QDoubleValidator(self))
         self.ui.y2EditMax.setValidator(Qt.QDoubleValidator(self))
-        
-        #populate initial axis mode (linear or logarithmic) values from plot. Warning!: we're using
-        #qwt QwtPlot.axis enum type to relate our GUI combo name and qwt axis name (enum type).
-        axes = [self.ui.y1ModeComboBox, self.ui.y2ModeComboBox, self.ui.xModeComboBox]
+
+        # populate initial axis mode (linear or logarithmic) values from plot. Warning!: we're using
+        # qwt QwtPlot.axis enum type to relate our GUI combo name and qwt axis
+        # name (enum type).
+        axes = [self.ui.y1ModeComboBox,
+                self.ui.y2ModeComboBox, self.ui.xModeComboBox]
         for axis in range(len(axes)):
             scaleType = self.parent.getAxisTransformationType(axis)
             if scaleType == Qwt5.QwtScaleTransformation.Linear:
@@ -157,11 +168,11 @@ class TaurusPlotConfigDialog(Qt.QDialog):
                 raise TypeError, "TaurusPlotConfigDialog::__init__(): unexpected axis scale type (linear or logarihtmic expected)"
         self.ui.xModeComboBox.setEnabled(not self.parent.getXIsTime())
 
-        #determine which axes are visible
+        # determine which axes are visible
         if not self.parent.axisEnabled(Qwt5.QwtPlot.xBottom):
             self.ui.xGroupBox.setVisible(False)
-            
-        #populate initial peaks from parent
+
+        # populate initial peaks from parent
         if self.parent._showMaxPeaks and self.parent._showMinPeaks:
             self.ui.peaksComboBox.setCurrentIndex(0)
         elif self.parent._showMaxPeaks:
@@ -171,165 +182,189 @@ class TaurusPlotConfigDialog(Qt.QDialog):
         else:
             self.ui.peaksComboBox.setCurrentIndex(3)
 
-        #connect signals
-        self.connect(self.ui.buttonBox.button(Qt.QDialogButtonBox.Close), Qt.SIGNAL("clicked()"), self.hide)
-        self.connect(self.ui.buttonBox.button(Qt.QDialogButtonBox.Apply), Qt.SIGNAL("clicked()"), self.apply)
-        self.connect(self.ui.xAutoGroupBox,  Qt.SIGNAL("toggled (bool)"),self.toggledAutoScale)
-        self.connect(self.ui.y1AutoGroupBox, Qt.SIGNAL("toggled (bool)"),self.toggledAutoScale)
-        self.connect(self.ui.y2AutoGroupBox, Qt.SIGNAL("toggled (bool)"),self.toggledAutoScale)
+        # connect signals
+        self.ui.buttonBox.button(
+            Qt.QDialogButtonBox.Close).clicked.connect(self.hide)
+        self.ui.buttonBox.button(
+            Qt.QDialogButtonBox.Apply).clicked.connect(self.apply)
+        self.ui.xAutoGroupBox.toggled.connect(self.toggledAutoScale)
+        self.ui.y1AutoGroupBox.toggled.connect(self.toggledAutoScale)
+        self.ui.y2AutoGroupBox.toggled.connect(self.toggledAutoScale)
 #        self.connect(self.ui.xEditMin,  Qt.SIGNAL("returnPressed()"),self.apply)
 #        self.connect(self.ui.xEditMax,  Qt.SIGNAL("returnPressed()"),self.apply)
 #        self.connect(self.ui.y1EditMin, Qt.SIGNAL("returnPressed()"),self.apply)
 #        self.connect(self.ui.y1EditMax, Qt.SIGNAL("returnPressed()"),self.apply)
 #        self.connect(self.ui.y2EditMin, Qt.SIGNAL("returnPressed()"),self.apply)
 #        self.connect(self.ui.y2EditMax, Qt.SIGNAL("returnPressed()"),self.apply)
-        self.connect(self.ui.xModeComboBox, Qt.SIGNAL("currentIndexChanged(const QString&)"),self.modeComboChanged)
-        self.connect(self.ui.xDynScaleCheckBox, Qt.SIGNAL("toggled (bool)"),self.setXDynScale)
+        self.ui.xModeComboBox.currentIndexChanged.connect(self.modeComboChanged)
+        self.ui.xDynScaleCheckBox.toggled.connect(self.setXDynScale)
         #self.connect(self.ui.xRangeCB, Qt.SIGNAL("currentIndexChanged(const QString&)"),self.apply)
-        self.connect(self.ui.y1ModeComboBox, Qt.SIGNAL("currentIndexChanged(const QString&)"),self.modeComboChanged)
-        self.connect(self.ui.y2ModeComboBox, Qt.SIGNAL("currentIndexChanged(const QString&)"),self.modeComboChanged)
-        self.connect(self.ui.peaksComboBox, Qt.SIGNAL("currentIndexChanged(int)"),self.peaksComboChanged)
-        #self.connect(self.curvesAppearanceChooser, Qt.SIGNAL("controlChanged"),self.apply) #"autoapply" mode for *all* the curve appearance controls
-        self.connect(self.curvesAppearanceChooser.assignToY1BT, Qt.SIGNAL("clicked()"),self.setCurvesYAxis)
-        self.connect(self.curvesAppearanceChooser.assignToY2BT, Qt.SIGNAL("clicked()"),self.setCurvesYAxis)
-        self.connect(self.curvesAppearanceChooser.bckgndBT, Qt.SIGNAL("clicked()"),self.changeBackgroundColor)
-        self.connect(self.curvesAppearanceChooser.changeTitlesBT, Qt.SIGNAL("clicked()"),self.onChangeTitles)
-        self.connect(self.curvesAppearanceChooser.curvesLW, Qt.SIGNAL("CurveTitleEdited"),self.onCurveTitleEdited)
-        
-        #finally adjust size
+        self.ui.y1ModeComboBox.currentIndexChanged.connect(self.modeComboChanged)
+        self.ui.y2ModeComboBox.currentIndexChanged.connect(self.modeComboChanged)
+        self.ui.peaksComboBox.currentIndexChanged.connect(self.peaksComboChanged)
+        # self.connect(self.curvesAppearanceChooser,
+        # Qt.SIGNAL("controlChanged"),self.apply) #"autoapply" mode for *all*
+        # the curve appearance controls
+        self.curvesAppearanceChooser.assignToY1BT.clicked[()].connect(self.setCurvesYAxis)
+        self.curvesAppearanceChooser.assignToY2BT.clicked[()].connect(self.setCurvesYAxis)
+        self.curvesAppearanceChooser.bckgndBT.clicked.connect(self.changeBackgroundColor)
+        self.curvesAppearanceChooser.changeTitlesBT.clicked.connect(self.onChangeTitles)
+        self.curvesAppearanceChooser.CurveTitleEdited.connect(self.onCurveTitleEdited)
+
+        # finally adjust size
         self.adjustSize()
-    
+
     def _populateXAxisScales(self):
         xMin = self.parent.axisScaleDiv(Qwt5.QwtPlot.xBottom).lowerBound()
         xMax = self.parent.axisScaleDiv(Qwt5.QwtPlot.xBottom).upperBound()
         if self.parent.getXIsTime():
-                self.ui.xEditMin.setText(time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(int(xMin))))
-                self.ui.xEditMax.setText(time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(int(xMax))))
+            self.ui.xEditMin.setText(time.strftime(
+                '%Y/%m/%d %H:%M:%S', time.localtime(int(xMin))))
+            self.ui.xEditMax.setText(time.strftime(
+                '%Y/%m/%d %H:%M:%S', time.localtime(int(xMax))))
         else:
-                self.ui.xEditMin.setText(str(xMin))
-                self.ui.xEditMax.setText(str(xMax))
-    
+            self.ui.xEditMin.setText(str(xMin))
+            self.ui.xEditMax.setText(str(xMax))
+
     def _populateYAxisScales(self, axis=None):
-        if axis is None or axis==Qwt5.QwtPlot.yLeft:
-            self.ui.y1EditMin.setText(str(self.parent.axisScaleDiv(Qwt5.QwtPlot.yLeft).lowerBound()))
-            self.ui.y1EditMax.setText(str(self.parent.axisScaleDiv(Qwt5.QwtPlot.yLeft).upperBound()))
-        if axis is None or axis==Qwt5.QwtPlot.yRight:
-            self.ui.y2EditMin.setText(str(self.parent.axisScaleDiv(Qwt5.QwtPlot.yRight).lowerBound()))
-            self.ui.y2EditMax.setText(str(self.parent.axisScaleDiv(Qwt5.QwtPlot.yRight).upperBound()))
-    
-    def deltatime2str(self,dt, fuzzy=False):
+        if axis is None or axis == Qwt5.QwtPlot.yLeft:
+            self.ui.y1EditMin.setText(
+                str(self.parent.axisScaleDiv(Qwt5.QwtPlot.yLeft).lowerBound()))
+            self.ui.y1EditMax.setText(
+                str(self.parent.axisScaleDiv(Qwt5.QwtPlot.yLeft).upperBound()))
+        if axis is None or axis == Qwt5.QwtPlot.yRight:
+            self.ui.y2EditMin.setText(
+                str(self.parent.axisScaleDiv(Qwt5.QwtPlot.yRight).lowerBound()))
+            self.ui.y2EditMax.setText(
+                str(self.parent.axisScaleDiv(Qwt5.QwtPlot.yRight).upperBound()))
+
+    def deltatime2str(self, dt, fuzzy=False):
         '''converts a time diff in secs to a string.
         If fuzzy=True it returns an approx time diff in s, min, hours or days'''
-        dt=float(dt)
-        if not fuzzy:return "%g s"%dt
-        if dt<2: return "%3.3g s"%dt
-        elif dt<120 : return "%g s"%round(dt,0)
-        elif dt<7200: return "%g m"%round(dt/60,0)
-        elif dt<172800: return "%g h"%round(dt/3600,0)
-        else: return "%g d"%round(dt/86400,0)
-    
-    def str2deltatime(self,strtime):
+        dt = float(dt)
+        if not fuzzy:
+            return "%g s" % dt
+        if dt < 2:
+            return "%3.3g s" % dt
+        elif dt < 120:
+            return "%g s" % round(dt, 0)
+        elif dt < 7200:
+            return "%g m" % round(dt / 60, 0)
+        elif dt < 172800:
+            return "%g h" % round(dt / 3600, 0)
+        else:
+            return "%g d" % round(dt / 86400, 0)
+
+    def str2deltatime(self, strtime):
         '''Translates a time string to seconds
         examples of valid relative times are: "now", "NOW", "Now", "-1d", "3w", "- 3.6e3 s",...
         examples of non-valid relative times:, "now + 2h", "-5", "3H" (unit names are case-sensitive)
         '''
-        strtime=str(strtime).strip()
-        timeunits={'s':1, 'm':60, 'h':3600, 'd':3600*24, 'w': 3600*24*7, 'y':3600*24*365}
-        if strtime.lower()=="now": return time.time()
+        strtime = str(strtime).strip()
+        timeunits = {'s': 1, 'm': 60, 'h': 3600, 'd': 3600 *
+                     24, 'w': 3600 * 24 * 7, 'y': 3600 * 24 * 365}
+        if strtime.lower() == "now":
+            return time.time()
         if strtime[-1] in timeunits.keys():
-            try: return float(strtime[:-1])*timeunits[strtime[-1]]
-            except Exception,e:
-                print '[str2deltatime] No format could be applied to "%s"'%strtime
+            try:
+                return float(strtime[:-1]) * timeunits[strtime[-1]]
+            except Exception, e:
+                print '[str2deltatime] No format could be applied to "%s"' % strtime
                 return None
         else:
-            print '[str2deltatime] Non-supported unit "%s"'%strtime[-1]
+            print '[str2deltatime] Non-supported unit "%s"' % strtime[-1]
             return None
-        
-    def strtime2epoch(self,strtime):
+
+    def strtime2epoch(self, strtime):
         '''
         Translates a str into an epoch value. It accepts "absolute" time notation as well as
         "relative to current time notation" (by expliciting a "+" or "-" prefix)
         (see str2deltatime for relative time notation).
-        
+
         examples of valid absolute times: "2008-3-25 14:21:59", "25/03/08 14:21", "03-25-2008",...
-        
+
         It returns None if strtime couldn't be interpreted
         '''
         import time
-        t=None
-        strtime=str(strtime).strip()
-        
-        #try with relative time keywords
-        if strtime[0] in ['+','-']:
-            reltime=self.str2deltatime(strtime)
-            if reltime is not None: return time.time()+reltime
-            
-        if strtime.lower()=="now": return time.time()
-        
-        #try with absolute time
-        hour_fts = ['%H:%M:%S','%H:%M','']#,"%M'",'%S"'
-        date_fts = ['%Y-%m-%d','%y-%m-%d','%Y/%m/%d','%y/%m/%d','%d-%m-%Y','%d/%m/%Y','%m-%d-%Y','%m/%d/%Y']
-        
+        t = None
+        strtime = str(strtime).strip()
+
+        # try with relative time keywords
+        if strtime[0] in ['+', '-']:
+            reltime = self.str2deltatime(strtime)
+            if reltime is not None:
+                return time.time() + reltime
+
+        if strtime.lower() == "now":
+            return time.time()
+
+        # try with absolute time
+        hour_fts = ['%H:%M:%S', '%H:%M', '']  # ,"%M'",'%S"'
+        date_fts = ['%Y-%m-%d', '%y-%m-%d', '%Y/%m/%d', '%y/%m/%d',
+                    '%d-%m-%Y', '%d/%m/%Y', '%m-%d-%Y', '%m/%d/%Y']
+
         tfs = []
         for d in date_fts:
             for h in hour_fts:
                 if h:
-                    tfs.append('%s %s'%(d,h))
+                    tfs.append('%s %s' % (d, h))
                 else:
                     tfs.append(d)
-                    
+
         for tf in tfs:
             try:
-                #print 'trying ',tf
-                t = time.strptime(strtime,tf)
-                if t[0]<1970:
+                # print 'trying ',tf
+                t = time.strptime(strtime, tf)
+                if t[0] < 1970:
                     lt = time.localtime()
                     #    (2008,  9,    23,  15,  44,   24,    1,   267, 1)
-                    t = (lt[0],lt[1],lt[2],t[3],t[4],lt[5],lt[6],lt[7],lt[8])
+                    t = (lt[0], lt[1], lt[2], t[3], t[
+                         4], lt[5], lt[6], lt[7], lt[8])
                     break
-            except Exception,e:
+            except Exception, e:
                 pass
         if t:
             return time.mktime(t)
         else:
-            print 'No format could be applied to "%s"'%strtime
+            print 'No format could be applied to "%s"' % strtime
             return None
-        
 
     def validate(self):
         '''validates the inputs in the dialog.
         If validation is ok, it returns a tuple containing min/max values for each axis (None if they are autoscaled)
         If validation failed, it returns False.
-        
+
         .. note::
             the values of the max/min boxes are already validated thanks to their attached QDoubleValidators
             (except for xMin/xMax in time Mode, but this case is handled by strtime2epoch)
         '''
-        xMin=xMax=y1Min=y1Max=y2Min=y2Max=None
-        
-        #Validating X axis values
-        xMin=self.parent.axisScaleDiv(Qwt5.QwtPlot.xBottom).lowerBound()
-        xMax=self.parent.axisScaleDiv(Qwt5.QwtPlot.xBottom).upperBound()
+        xMin = xMax = y1Min = y1Max = y2Min = y2Max = None
+
+        # Validating X axis values
+        xMin = self.parent.axisScaleDiv(Qwt5.QwtPlot.xBottom).lowerBound()
+        xMax = self.parent.axisScaleDiv(Qwt5.QwtPlot.xBottom).upperBound()
         if self.ui.xDynScaleCheckBox.isChecked():
             if self.parent.getXIsTime():
-                rg = abs(self.str2deltatime(str(self.ui.xRangeCB.currentText())))
-                ok1= (rg is not None)
+                rg = abs(self.str2deltatime(
+                    str(self.ui.xRangeCB.currentText())))
+                ok1 = (rg is not None)
             else:
                 try:
                     rg, ok1 = float(self.ui.xRangeCB.currentText()), True
                 except:
                     rg, ok1 = 0.0, False
-            xMin=xMax-rg
+            xMin = xMax - rg
             if not ok1 or (xMin >= xMax):
-                Qt.QMessageBox.warning(self, "Invalid parameters for X axis range")
+                Qt.QMessageBox.warning(
+                    self, "Invalid parameters for X axis range")
                 return False
         elif self.ui.xAutoGroupBox.isChecked():
-            if self.parent.getXIsTime(): #time mode
+            if self.parent.getXIsTime():  # time mode
                 xMin = self.strtime2epoch(self.ui.xEditMin.text())
                 xMax = self.strtime2epoch(self.ui.xEditMax.text())
-                ok1= (xMin is not None)
-                ok2= (xMax is not None)
-            else: #XY mode
+                ok1 = (xMin is not None)
+                ok2 = (xMax is not None)
+            else:  # XY mode
                 try:
                     xMin, ok1 = float(self.ui.xEditMin.text()), True
                 except:
@@ -340,10 +375,10 @@ class TaurusPlotConfigDialog(Qt.QDialog):
                     xMax, ok2 = 0.0, False
             if not (ok1 and ok2) or (xMin >= xMax):
                 Qt.QMessageBox.warning(self, "Invalid parameters for X axis",
-                                        "Min value must be strictly less than max value")
+                                       "Min value must be strictly less than max value")
                 return False
-            
-        #Validating Y1 axis values
+
+        # Validating Y1 axis values
         if self.ui.y1AutoGroupBox.isChecked():
             try:
                 y1Min, ok1 = float(self.ui.y1EditMin.text()), True
@@ -355,10 +390,10 @@ class TaurusPlotConfigDialog(Qt.QDialog):
                 y1Max, ok2 = 0.0, False
             if not(ok1 and ok2) or (y1Min >= y1Max):
                 Qt.QMessageBox.warning(self, "Invalid parameters for Y1 axis",
-                                        "Min value must be strictly less than max value")
+                                       "Min value must be strictly less than max value")
                 return False
-        
-        #Validating Y2 axis values
+
+        # Validating Y2 axis values
         if self.ui.y2AutoGroupBox.isChecked():
             try:
                 y2Min, ok1 = float(self.ui.y2EditMin.text()), True
@@ -370,40 +405,43 @@ class TaurusPlotConfigDialog(Qt.QDialog):
                 y2Max, ok2 = 0.0, False
             if not (ok1 and ok2) or (y2Min >= y2Max):
                 Qt.QMessageBox.warning(self, "Invalid parameters for Y2 axis",
-                                        "Min value must be strictly less than max value")
+                                       "Min value must be strictly less than max value")
                 return False
-        
-        #if we reached this point, the input is valid
-        return (xMin,xMax,y1Min,y1Max,y2Min,y2Max)
+
+        # if we reached this point, the input is valid
+        return (xMin, xMax, y1Min, y1Max, y2Min, y2Max)
 
     def apply(self):
         """This will apply the values set in the dialog. Note that some of them
         are not necessary to be set, since they're already are set when changing the item selected"""
-        
-        #Apply the changes from the curves Appearance widget (they are already validated).
-        prop,names=self.curvesAppearanceChooser.onApply()
-        self.parent.onCurveAppearanceChanged(prop,names)
-                
-        #validate the rest of the inputs
-        v=self.validate()
-        if not v: return
-        xMin,xMax,y1Min,y1Max,y2Min,y2Max=v
-        
-        self.parent.setAxisScale(Qwt5.QwtPlot.xBottom,xMin, xMax)
+
+        # Apply the changes from the curves Appearance widget (they are already
+        # validated).
+        prop, names = self.curvesAppearanceChooser.onApply()
+        self.parent.onCurveAppearanceChanged(prop, names)
+
+        # validate the rest of the inputs
+        v = self.validate()
+        if not v:
+            return
+        xMin, xMax, y1Min, y1Max, y2Min, y2Max = v
+
+        self.parent.setAxisScale(Qwt5.QwtPlot.xBottom, xMin, xMax)
         self.parent.setAxisScale(Qwt5.QwtPlot.yLeft, y1Min, y1Max)
         self.parent.setAxisScale(Qwt5.QwtPlot.yRight, y2Min, y2Max)
-            
-        self.parent._xMax,self.parent._xMin=xMax,xMin
-            
+
+        self.parent._xMax, self.parent._xMin = xMax, xMin
+
     def toggledAutoScale(self, toggled):
         """This will catch the group boxes check/uncheck event, and will enable autoscale in case
         the event has been unchecking 'disable autoscale'"""
-        #get and check who fired the signal
+        # get and check who fired the signal
         groupBox = self.sender()
         if groupBox is None or not isinstance(groupBox, Qt.QGroupBox):
-            self.error("TaurusPlotConfig::toggledAutoScale(): event is not recognized")
+            self.error(
+                "TaurusPlotConfig::toggledAutoScale(): event is not recognized")
             return
-        #set the axis autoscale in the corresponding axis
+        # set the axis autoscale in the corresponding axis
         if groupBox.objectName() == "xAutoGroupBox" and not toggled:
             self.parent.setAxisAutoScale(Qwt5.QwtPlot.xBottom)
         elif groupBox.objectName() == "y1AutoGroupBox" and not toggled:
@@ -414,29 +452,36 @@ class TaurusPlotConfigDialog(Qt.QDialog):
     def modeComboChanged(self, itemSelected):
         """This will catch the combo box selection change and will set the corresponding axis scale to
         the value passed as parameter"""
-        #get and check who fired the signal
+        # get and check who fired the signal
         comboBox = self.sender()
         if comboBox is None or not isinstance(comboBox, Qt.QComboBox):
-            self.error("TaurusPlotConfig::modeComboChanged(): event is not recognized")
+            self.error(
+                "TaurusPlotConfig::modeComboChanged(): event is not recognized")
             return
         else:
-                #set the scale for the corresponding axis
-                if comboBox.objectName() == "xModeComboBox":
-                    if not self.parent.getXIsTime():
-                        self.parent.setAxisScaleType(Qwt5.QwtPlot.xBottom,itemSelected)
-                elif comboBox.objectName() == "y1ModeComboBox":
-                    self.parent.setAxisScaleType(Qwt5.QwtPlot.yLeft,itemSelected)
-                elif comboBox.objectName() == "y2ModeComboBox":
-                    self.parent.setAxisScaleType(Qwt5.QwtPlot.yRight,itemSelected)
-                else:
-                    self.error("TaurusPlotConfig::modeComboChanged() invalid axis: " + comboBox.objectName())
-    
-    def setXDynScale(self,checked):
+                # set the scale for the corresponding axis
+            if comboBox.objectName() == "xModeComboBox":
+                if not self.parent.getXIsTime():
+                    self.parent.setAxisScaleType(
+                        Qwt5.QwtPlot.xBottom, itemSelected)
+            elif comboBox.objectName() == "y1ModeComboBox":
+                self.parent.setAxisScaleType(Qwt5.QwtPlot.yLeft, itemSelected)
+            elif comboBox.objectName() == "y2ModeComboBox":
+                self.parent.setAxisScaleType(Qwt5.QwtPlot.yRight, itemSelected)
+            else:
+                self.error(
+                    "TaurusPlotConfig::modeComboChanged() invalid axis: " + comboBox.objectName())
+
+    def setXDynScale(self, checked):
         if checked:
-            if self.parent.getXIsTime(): rg=self.deltatime2str(self.parent.getXAxisRange(),fuzzy=True)
-            else: rg="%g"%self.parent.getXAxisRange()
+            if self.parent.getXIsTime():
+                rg = self.deltatime2str(
+                    self.parent.getXAxisRange(), fuzzy=True)
+            else:
+                rg = "%g" % self.parent.getXAxisRange()
             self.ui.xRangeCB.setEditText(rg)
-            self.ui.xAutoGroupBox.setChecked(True) #disable autoscale for the X axis
+            # disable autoscale for the X axis
+            self.ui.xAutoGroupBox.setChecked(True)
         else:
             self._populateXAxisScales()
         self.parent.setXDynScale(checked)
@@ -456,48 +501,49 @@ class TaurusPlotConfigDialog(Qt.QDialog):
             maxPeak = minPeak = False
         self.parent.showMaxPeaks(maxPeak)
         self.parent.showMinPeaks(minPeak)
-            
-    def showCalendar(self,target):
+
+    def showCalendar(self, target):
         return
         self.qcalendar = Qt.QCalendarWidget()
         self.qcalendar.show()
-    
+
     def setCurvesYAxis(self, curvesNamesList=None, axis=None):
         """ calls the parent's setCurvesYAxis method but it automatically determines the parameters if not given"""
         if curvesNamesList is None:
             curvesNamesList = self.curvesAppearanceChooser.getSelectedCurveNames()
         if axis is None:
-            sender=self.sender()
+            sender = self.sender()
             if sender is self.curvesAppearanceChooser.assignToY1BT:
-                axis=Qwt5.QwtPlot.yLeft
+                axis = Qwt5.QwtPlot.yLeft
             elif sender is self.curvesAppearanceChooser.assignToY2BT:
-                axis=Qwt5.QwtPlot.yRight
+                axis = Qwt5.QwtPlot.yRight
             else:
-                raise ValueError("Cannot determine axis from %s"%sender)        
-        #call the parent's setCurvesYAxis()
-        self.parent.setCurvesYAxis(curvesNamesList,axis)
-        #update the axis scale edits
+                raise ValueError("Cannot determine axis from %s" % sender)
+        # call the parent's setCurvesYAxis()
+        self.parent.setCurvesYAxis(curvesNamesList, axis)
+        # update the axis scale edits
         self._populateYAxisScales(axis)
-        
+
     def changeBackgroundColor(self):
         """Launches a dialog for choosing the parent's canvas background color"""
         plot = self.parent
-        color = Qt.QColorDialog.getColor(plot.canvasBackground (), self)
+        color = Qt.QColorDialog.getColor(plot.canvasBackground(), self)
         if Qt.QColor.isValid(color):
             plot.setCanvasBackground(color)
             plot.replot()
-            
+
     def onChangeTitles(self):
         '''Calls The parent's changeCurvesTitlesDialog method, with the selected
         curves list as the parameter
         '''
         curveNamesList = self.curvesAppearanceChooser.getSelectedCurveNames()
-        newTitlesDict = self.parent.changeCurvesTitlesDialog(curveNamesList=curveNamesList)
+        newTitlesDict = self.parent.changeCurvesTitlesDialog(
+            curveNamesList=curveNamesList)
         self.curvesAppearanceChooser.updateTitles(newTitlesDict)
-        
+
     def onCurveTitleEdited(self, name, newTitle):
         '''slot used when a curve title is edited
-        
+
         :param name: (str) curve name
         :param name: (QString) new title
         '''
diff --git a/lib/taurus/qt/qtgui/plot/qwtplot.py b/lib/taurus/qt/qtgui/plot/qwtplot.py
index e7c4b7d..abb6240 100644
--- a/lib/taurus/qt/qtgui/plot/qwtplot.py
+++ b/lib/taurus/qt/qtgui/plot/qwtplot.py
@@ -2,30 +2,30 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
-print "*"*77
+print "*" * 77
 print \
-"""
+    """
 If you are seeing this, it is because you tried to access qwtplot.py directly.
 All funcionality has been moved to taurusplot.py, taurustrend.py and scales.py
 
@@ -35,4 +35,4 @@ importing them from taurus.qt.qtgui.plot
 If you were trying to launch a stand-alone Taurusplot or TaurusTrend from a script,
 you should update such script.
 """
-print "*"*77
+print "*" * 77
diff --git a/lib/taurus/qt/qtgui/plot/scales.py b/lib/taurus/qt/qtgui/plot/scales.py
index 36d085c..e28993e 100644
--- a/lib/taurus/qt/qtgui/plot/scales.py
+++ b/lib/taurus/qt/qtgui/plot/scales.py
@@ -2,40 +2,40 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
 scales.py: Custom scales used by taurus.qt.qtgui.plot module
 """
-__all__=["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", 
-         "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", 
-         "FixedLabelsScaleDraw"]
+__all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine",
+           "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw",
+           "FixedLabelsScaleDraw"]
 
 import numpy
 from datetime import datetime, timedelta
 from time import mktime
 from taurus.external.qt import Qt, Qwt5
 
-    
+
 def _getDefaultAxisLabelsAlignment(axis, rotation):
     '''return a "smart" alignment for the axis labels depending on the axis
     and the label rotation
@@ -46,183 +46,204 @@ def _getDefaultAxisLabelsAlignment(axis, rotation):
     :return: (Qt.Alignment) an alignment
     '''
     if axis == Qwt5.QwtPlot.xBottom:
-        if rotation == 0 : return Qt.Qt.AlignHCenter|Qt.Qt.AlignBottom
-        elif rotation < 0: return Qt.Qt.AlignLeft|Qt.Qt.AlignBottom
-        else:              return Qt.Qt.AlignRight|Qt.Qt.AlignBottom
+        if rotation == 0:
+            return Qt.Qt.AlignHCenter | Qt.Qt.AlignBottom
+        elif rotation < 0:
+            return Qt.Qt.AlignLeft | Qt.Qt.AlignBottom
+        else:
+            return Qt.Qt.AlignRight | Qt.Qt.AlignBottom
     elif axis == Qwt5.QwtPlot.yLeft:
-        if rotation == 0 : return Qt.Qt.AlignLeft|Qt.Qt.AlignVCenter
-        elif rotation < 0: return Qt.Qt.AlignLeft|Qt.Qt.AlignBottom
-        else:              return Qt.Qt.AlignLeft|Qt.Qt.AlignTop
+        if rotation == 0:
+            return Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter
+        elif rotation < 0:
+            return Qt.Qt.AlignLeft | Qt.Qt.AlignBottom
+        else:
+            return Qt.Qt.AlignLeft | Qt.Qt.AlignTop
     elif axis == Qwt5.QwtPlot.yRight:
-        if rotation == 0 : return Qt.Qt.AlignRight|Qt.Qt.AlignVCenter
-        elif rotation < 0: return Qt.Qt.AlignRight|Qt.Qt.AlignTop
-        else:              return Qt.Qt.AlignRight|Qt.Qt.AlignBottom
+        if rotation == 0:
+            return Qt.Qt.AlignRight | Qt.Qt.AlignVCenter
+        elif rotation < 0:
+            return Qt.Qt.AlignRight | Qt.Qt.AlignTop
+        else:
+            return Qt.Qt.AlignRight | Qt.Qt.AlignBottom
     elif axis == Qwt5.QwtPlot.xTop:
-        if rotation == 0 : return Qt.Qt.AlignHCenter|Qt.Qt.AlignTop
-        elif rotation < 0: return Qt.Qt.AlignLeft|Qt.Qt.AlignTop
-        else:              return Qt.Qt.AlignRight|Qt.Qt.AlignTop
+        if rotation == 0:
+            return Qt.Qt.AlignHCenter | Qt.Qt.AlignTop
+        elif rotation < 0:
+            return Qt.Qt.AlignLeft | Qt.Qt.AlignTop
+        else:
+            return Qt.Qt.AlignRight | Qt.Qt.AlignTop
+
 
 class FancyScaleDraw(Qwt5.QwtScaleDraw):
-    
-        '''This is a scaleDraw with a tuneable palette and label formats'''
-        def __init__(self, format = None, palette = None):
-            Qwt5.QwtScaleDraw.__init__(self)
-            self._labelFormat = format
-            self._palette = palette
-            
-        def setPalette(self, palette):
-            '''pass a QPalette or None to use default'''
-            self._palette = palette
-            
-        def getPalette(self):
-            return self._palette
-            
-        def setLabelFormat(self, format):
-            '''pass a format string (e.g. "%g") or None to use default (it uses the locale)'''
-            self._labelFormat = format
-            self.invalidateCache() #to force repainting of the labels
-        
-        def getLabelFormat(self):
-            '''pass a format string (e.g. "%g") or None to use default (it uses the locale)'''
-            return self._labelFormat
-        
-        def label(self, val):
-            if str(self._labelFormat) == "": return Qwt5.QwtText()
-            if self._labelFormat is None:
-                return Qwt5.QwtScaleDraw.label(self, val)
-            else:
-                return Qwt5.QwtText(self._labelFormat%val)
-        
-        def draw(self, painter, palette):
-            if self._palette is None:
-                Qwt5.QwtScaleDraw.draw(self, painter, palette)
-            else:
-                Qwt5.QwtScaleDraw.draw(self, painter, self._palette)
-        
+
+    '''This is a scaleDraw with a tuneable palette and label formats'''
+
+    def __init__(self, format=None, palette=None):
+        Qwt5.QwtScaleDraw.__init__(self)
+        self._labelFormat = format
+        self._palette = palette
+
+    def setPalette(self, palette):
+        '''pass a QPalette or None to use default'''
+        self._palette = palette
+
+    def getPalette(self):
+        return self._palette
+
+    def setLabelFormat(self, format):
+        '''pass a format string (e.g. "%g") or None to use default (it uses the locale)'''
+        self._labelFormat = format
+        self.invalidateCache()  # to force repainting of the labels
+
+    def getLabelFormat(self):
+        '''pass a format string (e.g. "%g") or None to use default (it uses the locale)'''
+        return self._labelFormat
+
+    def label(self, val):
+        if str(self._labelFormat) == "":
+            return Qwt5.QwtText()
+        if self._labelFormat is None:
+            return Qwt5.QwtScaleDraw.label(self, val)
+        else:
+            return Qwt5.QwtText(self._labelFormat % val)
+
+    def draw(self, painter, palette):
+        if self._palette is None:
+            Qwt5.QwtScaleDraw.draw(self, painter, palette)
+        else:
+            Qwt5.QwtScaleDraw.draw(self, painter, self._palette)
+
 
 class DateTimeScaleEngine(Qwt5.QwtLinearScaleEngine):
+
     def __init__(self, scaleDraw=None):
         Qwt5.QwtLinearScaleEngine.__init__(self)
         self.setScaleDraw(scaleDraw)
-        
+
     def setScaleDraw(self, scaleDraw):
         self._scaleDraw = scaleDraw
-        
+
     def scaleDraw(self):
         return self._scaleDraw
-        
+
     def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize):
         ''' Reimplements Qwt5.QwtLinearScaleEngine.divideScale
-        
+
         **Important**: The stepSize parameter is **ignored**.
-        
+
         :return: (Qwt5.QwtScaleDiv) a scale division whose ticks are aligned with
                  the natural time units '''
-        
-        #if stepSize != 0:
+
+        # if stepSize != 0:
         #    scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize)
         #    scaleDiv.datetimeLabelFormat = "%Y/%m/%d %H:%M%S.%f"
         #    return scaleDiv
-            
+
         interval = Qwt5.QwtDoubleInterval(x1, x2).normalized()
         if interval.width() <= 0:
             return Qwt5.QwtScaleDiv()
-            
-        dt1=datetime.fromtimestamp(interval.minValue())
-        dt2=datetime.fromtimestamp(interval.maxValue())
-        
-        if dt1.year<1900 or dt2.year>9999 : #limits in time.mktime and datetime
+
+        dt1 = datetime.fromtimestamp(interval.minValue())
+        dt2 = datetime.fromtimestamp(interval.maxValue())
+
+        if dt1.year < 1900 or dt2.year > 9999:  # limits in time.mktime and datetime
             return Qwt5.QwtScaleDiv()
-        
+
         majticks = []
         medticks = []
         minticks = []
-        
-        dx=interval.width()
-        
-        if dx > 63072001: # = 3600s*24*(365+366) = 2 years (counting a leap year)
+
+        dx = interval.width()
+
+        # = 3600s*24*(365+366) = 2 years (counting a leap year)
+        if dx > 63072001:
             format = "%Y"
-            for y in range(dt1.year+1,dt2.year):
+            for y in range(dt1.year + 1, dt2.year):
                 dt = datetime(year=y, month=1, day=1)
                 majticks.append(mktime(dt.timetuple()))
-        
-        elif dx > 5270400: # = 3600s*24*61 = 61 days
+
+        elif dx > 5270400:  # = 3600s*24*61 = 61 days
             format = "%Y %b"
             d = timedelta(days=31)
-            dt = dt1.replace(day=1, hour=0, minute=0, second=0, microsecond=0)+d 
-            while(dt<dt2):
-                dt = dt.replace(day=1) #make sure that we are on day 1 (even if always sum 31 days)
-                majticks.append(mktime(dt.timetuple()))    
+            dt = dt1.replace(day=1, hour=0, minute=0,
+                             second=0, microsecond=0) + d
+            while(dt < dt2):
+                # make sure that we are on day 1 (even if always sum 31 days)
+                dt = dt.replace(day=1)
+                majticks.append(mktime(dt.timetuple()))
                 dt += d
-        
-        elif dx > 172800: # 3600s24*2 = 2 days
+
+        elif dx > 172800:  # 3600s24*2 = 2 days
             format = "%b/%d"
             d = timedelta(days=1)
             dt = dt1.replace(hour=0, minute=0, second=0, microsecond=0) + d
-            while(dt<dt2):
+            while(dt < dt2):
                 majticks.append(mktime(dt.timetuple()))
                 dt += d
-                
-        elif dx > 7200: # 3600s*2 = 2hours
+
+        elif dx > 7200:  # 3600s*2 = 2hours
             format = "%b/%d-%Hh"
             d = timedelta(hours=1)
             dt = dt1.replace(minute=0, second=0, microsecond=0) + d
-            while(dt<dt2):
+            while(dt < dt2):
                 majticks.append(mktime(dt.timetuple()))
                 dt += d
-                
-        elif dx > 1200: # 60s*20 =20 minutes
+
+        elif dx > 1200:  # 60s*20 =20 minutes
             format = "%H:%M"
             d = timedelta(minutes=10)
-            dt = dt1.replace(minute=(dt1.minute//10)*10, second=0, microsecond=0) + d 
-            while(dt<dt2):
+            dt = dt1.replace(minute=(dt1.minute // 10) * 10,
+                             second=0, microsecond=0) + d
+            while(dt < dt2):
                 majticks.append(mktime(dt.timetuple()))
                 dt += d
-            
-        elif dx > 120: # =60s*2 = 2 minutes
+
+        elif dx > 120:  # =60s*2 = 2 minutes
             format = "%H:%M"
             d = timedelta(minutes=1)
             dt = dt1.replace(second=0, microsecond=0) + d
-            while(dt<dt2):
+            while(dt < dt2):
                 majticks.append(mktime(dt.timetuple()))
                 dt += d
-            
-        elif dx > 20: # 20 s
+
+        elif dx > 20:  # 20 s
             format = "%H:%M:%S"
             d = timedelta(seconds=10)
-            dt = dt1.replace(second=(dt1.second//10)*10, microsecond=0) + d 
-            while(dt<dt2):
+            dt = dt1.replace(second=(dt1.second // 10) * 10, microsecond=0) + d
+            while(dt < dt2):
                 majticks.append(mktime(dt.timetuple()))
                 dt += d
-                
-        elif dx > 2: # 2s
+
+        elif dx > 2:  # 2s
             format = "%H:%M:%S"
-            majticks=range(int(x1)+1, int(x2))
-            
-        else: #less than 2s (show microseconds)
-            scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize)
+            majticks = range(int(x1) + 1, int(x2))
+
+        else:  # less than 2s (show microseconds)
+            scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale(
+                self, x1, x2, maxMajSteps, maxMinSteps, stepSize)
             self.scaleDraw().setDatetimeLabelFormat("%S.%f")
             return scaleDiv
-        
-        #make sure to comply with maxMajTicks 
-        L= len(majticks)
+
+        # make sure to comply with maxMajTicks
+        L = len(majticks)
         if L > maxMajSteps:
-            majticks = majticks[::int(numpy.ceil(float(L)/maxMajSteps))] 
-        
+            majticks = majticks[::int(numpy.ceil(float(L) / maxMajSteps))]
+
         scaleDiv = Qwt5.QwtScaleDiv(interval, minticks, medticks, majticks)
         self.scaleDraw().setDatetimeLabelFormat(format)
-        if x1>x2:
+        if x1 > x2:
             scaleDiv.invert()
-        
-        ##START DEBUG
-        #print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-        #for tk in  scaleDiv.ticks(scaleDiv.MajorTick):
+
+        # START DEBUG
+        # print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+        # for tk in  scaleDiv.ticks(scaleDiv.MajorTick):
         #    print datetime.fromtimestamp(tk).isoformat()
-        #print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
-        ##END DEBUG
-        
+        # print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+        # END DEBUG
+
         return scaleDiv
-    
+
     @staticmethod
     def getDefaultAxisLabelsAlignment(axis, rotation):
         '''return a "smart" alignment for the axis labels depending on the axis
@@ -235,15 +256,15 @@ class DateTimeScaleEngine(Qwt5.QwtLinearScaleEngine):
         '''
         return _getDefaultAxisLabelsAlignment(axis, rotation)
 
-    @staticmethod        
-    def enableInAxis(plot, axis, scaleDraw =None, rotation=None):
+    @staticmethod
+    def enableInAxis(plot, axis, scaleDraw=None, rotation=None):
         '''convenience method that will enable this engine in the given
         axis. Note that it changes the ScaleDraw as well.
-         
-        :param plot: (Qwt5.QwtPlot) the plot to change 
-        :param axis: (Qwt5.QwtPlot.Axis) the id of the axis 
-        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given, 
-                          the current ScaleDraw for the plot will be used if 
+
+        :param plot: (Qwt5.QwtPlot) the plot to change
+        :param axis: (Qwt5.QwtPlot.Axis) the id of the axis
+        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given,
+                          the current ScaleDraw for the plot will be used if
                           possible, and a :class:`TaurusTimeScaleDraw` will be set if not
         :param rotation: (float or None) The rotation of the labels (in degrees, clockwise-positive)
         '''
@@ -254,91 +275,95 @@ class DateTimeScaleEngine(Qwt5.QwtLinearScaleEngine):
         plot.setAxisScaleDraw(axis, scaleDraw)
         plot.setAxisScaleEngine(axis, DateTimeScaleEngine(scaleDraw))
         if rotation is not None:
-            alignment = DateTimeScaleEngine.getDefaultAxisLabelsAlignment(axis, rotation)
+            alignment = DateTimeScaleEngine.getDefaultAxisLabelsAlignment(
+                axis, rotation)
             plot.setAxisLabelRotation(axis, rotation)
             plot.setAxisLabelAlignment(axis, alignment)
-        
-    @staticmethod 
+
+    @staticmethod
     def disableInAxis(plot, axis, scaleDraw=None, scaleEngine=None):
         '''convenience method that will disable this engine in the given
         axis. Note that it changes the ScaleDraw as well.
-         
+
         :param plot: (Qwt5.QwtPlot) the plot to change
         :param axis: (Qwt5.QwtPlot.Axis) the id of the axis
-        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given, 
+        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given,
                           a :class:`FancyScaleDraw` will be set
-        :param scaleEngine: (Qwt5.QwtScaleEngine) Scale draw to use. If None given, 
+        :param scaleEngine: (Qwt5.QwtScaleEngine) Scale draw to use. If None given,
                           a :class:`Qwt5.QwtLinearScaleEngine` will be set
         '''
         if scaleDraw is None:
-            scaleDraw=FancyScaleDraw()
+            scaleDraw = FancyScaleDraw()
         if scaleEngine is None:
             scaleEngine = Qwt5.QwtLinearScaleEngine()
         plot.setAxisScaleEngine(axis, scaleEngine)
-        plot.setAxisScaleDraw(axis, scaleDraw) 
-    
-  
+        plot.setAxisScaleDraw(axis, scaleDraw)
+
+
 class TaurusTimeScaleDraw(FancyScaleDraw):
-    
+
     def __init__(self, *args):
         FancyScaleDraw.__init__(self, *args)
-    
+
     def setDatetimeLabelFormat(self, format):
         self._datetimeLabelFormat = format
-    
+
     def datetimeLabelFormat(self):
         return self._datetimeLabelFormat
-    
+
     def label(self, val):
-        if str(self._labelFormat) == "": return Qwt5.QwtText()
+        if str(self._labelFormat) == "":
+            return Qwt5.QwtText()
         # From val to a string with time
         t = datetime.fromtimestamp(val)
-        try: #If the scaleDiv was created by a DateTimeScaleEngine it has a _datetimeLabelFormat 
-            s = t.strftime(self._datetimeLabelFormat) 
+        try:  # If the scaleDiv was created by a DateTimeScaleEngine it has a _datetimeLabelFormat
+            s = t.strftime(self._datetimeLabelFormat)
         except AttributeError, e:
             print "Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)"
             s = t.isoformat(' ')
         return Qwt5.QwtText(s)
-    
+
 
 class DeltaTimeScaleEngine(Qwt5.QwtLinearScaleEngine):
+
     def __init__(self, scaleDraw=None):
         Qwt5.QwtLinearScaleEngine.__init__(self)
         self.setScaleDraw(scaleDraw)
-        
+
     def setScaleDraw(self, scaleDraw):
         self._scaleDraw = scaleDraw
-        
+
     def scaleDraw(self):
         return self._scaleDraw
 
     def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize):
         ''' Reimplements Qwt5.QwtLinearScaleEngine.divideScale
-                
+
         :return: (Qwt5.QwtScaleDiv) a scale division whose ticks are aligned with
                  the natural delta time units '''
         interval = Qwt5.QwtDoubleInterval(x1, x2).normalized()
         if interval.width() <= 0:
             return Qwt5.QwtScaleDiv()
         d_range = interval.width()
-        if d_range < 2: # 2s
+        if d_range < 2:  # 2s
             return Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize)
-        elif d_range < 20: # 20 s
+        elif d_range < 20:  # 20 s
             s = 1
-        elif d_range < 120: # =60s*2 = 2 minutes
+        elif d_range < 120:  # =60s*2 = 2 minutes
             s = 10
-        elif d_range < 1200: # 60s*20 =20 minutes
+        elif d_range < 1200:  # 60s*20 =20 minutes
             s = 60
-        elif d_range < 7200: # 3600s*2 = 2 hours
+        elif d_range < 7200:  # 3600s*2 = 2 hours
             s = 600
-        elif d_range < 172800: # 3600s24*2 = 2 days
+        elif d_range < 172800:  # 3600s24*2 = 2 days
             s = 3600
-        else: 
-            s = 86400 #1 day
-        #calculate a step size that respects the base step (s) and also enforces the maxMajSteps
-        stepSize = s * int(numpy.ceil(float(d_range//s)/maxMajSteps))
+        else:
+            s = 86400  # 1 day
+        # calculate a step size that respects the base step (s) and also
+        # enforces the maxMajSteps
+        stepSize = s * int(numpy.ceil(float(d_range // s) / maxMajSteps))
         return Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize)
-    
+
     @staticmethod
     def getDefaultAxisLabelsAlignment(axis, rotation):
         '''return a "smart" alignment for the axis labels depending on the axis
@@ -350,16 +375,16 @@ class DeltaTimeScaleEngine(Qwt5.QwtLinearScaleEngine):
         :return: (Qt.Alignment) an alignment
         '''
         return _getDefaultAxisLabelsAlignment(axis, rotation)
-        
-    @staticmethod        
-    def enableInAxis(plot, axis, scaleDraw =None, rotation=None):
+
+    @staticmethod
+    def enableInAxis(plot, axis, scaleDraw=None, rotation=None):
         '''convenience method that will enable this engine in the given
         axis. Note that it changes the ScaleDraw as well.
-         
-        :param plot: (Qwt5.QwtPlot) the plot to change 
-        :param axis: (Qwt5.QwtPlot.Axis) the id of the axis 
-        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given, 
-                          the current ScaleDraw for the plot will be used if 
+
+        :param plot: (Qwt5.QwtPlot) the plot to change
+        :param axis: (Qwt5.QwtPlot.Axis) the id of the axis
+        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given,
+                          the current ScaleDraw for the plot will be used if
                           possible, and a :class:`TaurusTimeScaleDraw` will be set if not
         :param rotation: (float or None) The rotation of the labels (in degrees, clockwise-positive)
         '''
@@ -370,66 +395,67 @@ class DeltaTimeScaleEngine(Qwt5.QwtLinearScaleEngine):
         plot.setAxisScaleDraw(axis, scaleDraw)
         plot.setAxisScaleEngine(axis, DeltaTimeScaleEngine(scaleDraw))
         if rotation is not None:
-            alignment = DeltaTimeScaleEngine.getDefaultAxisLabelsAlignment(axis, rotation)
+            alignment = DeltaTimeScaleEngine.getDefaultAxisLabelsAlignment(
+                axis, rotation)
             plot.setAxisLabelRotation(axis, rotation)
             plot.setAxisLabelAlignment(axis, alignment)
-        
-    @staticmethod 
+
+    @staticmethod
     def disableInAxis(plot, axis, scaleDraw=None, scaleEngine=None):
         '''convenience method that will disable this engine in the given
         axis. Note that it changes the ScaleDraw as well.
-         
+
         :param plot: (Qwt5.QwtPlot) the plot to change
         :param axis: (Qwt5.QwtPlot.Axis) the id of the axis
-        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given, 
+        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given,
                           a :class:`FancyScaleDraw` will be set
-        :param scaleEngine: (Qwt5.QwtScaleEngine) Scale draw to use. If None given, 
+        :param scaleEngine: (Qwt5.QwtScaleEngine) Scale draw to use. If None given,
                           a :class:`Qwt5.QwtLinearScaleEngine` will be set
         '''
         if scaleDraw is None:
-            scaleDraw=FancyScaleDraw()
+            scaleDraw = FancyScaleDraw()
         if scaleEngine is None:
             scaleEngine = Qwt5.QwtLinearScaleEngine()
         plot.setAxisScaleEngine(axis, scaleEngine)
-        plot.setAxisScaleDraw(axis, scaleDraw) 
-    
-  
+        plot.setAxisScaleDraw(axis, scaleDraw)
+
+
 class DeltaTimeScaleDraw(FancyScaleDraw):
-    
+
     def __init__(self, *args):
         FancyScaleDraw.__init__(self, *args)
-    
+
     def label(self, val):
         if val >= 0:
-            s = "+%s"%str(timedelta(seconds=val))
+            s = "+%s" % str(timedelta(seconds=val))
         else:
-            s = "-%s"%str(timedelta(seconds=-val))
+            s = "-%s" % str(timedelta(seconds=-val))
         return Qwt5.QwtText(s)
-    
- 
-    
+
+
 class FixedLabelsScaleEngine(Qwt5.QwtLinearScaleEngine):
+
     def __init__(self, positions):
         '''labels is a sequence of (pos,label) tuples where pos is the point
         at wich to draw the label and label is given as a python string (or QwtText)'''
         Qwt5.QwtScaleEngine.__init__(self)
         self._positions = positions
-        #self.setAttribute(self.Floating,True)
-        
+        # self.setAttribute(self.Floating,True)
+
     def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize=0.0):
         div = Qwt5.QwtScaleDiv(x1, x2, self._positions, [], [])
         div.setTicks(Qwt5.QwtScaleDiv.MajorTick, self._positions)
         return div
-    
-    @staticmethod        
-    def enableInAxis(plot, axis, scaleDraw =None):
+
+    @staticmethod
+    def enableInAxis(plot, axis, scaleDraw=None):
         '''convenience method that will enable this engine in the given
         axis. Note that it changes the ScaleDraw as well.
-         
-        :param plot: (Qwt5.QwtPlot) the plot to change 
-        :param axis: (Qwt5.QwtPlot.Axis) the id of the axis 
-        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given, 
-                          the current ScaleDraw for the plot will be used if 
+
+        :param plot: (Qwt5.QwtPlot) the plot to change
+        :param axis: (Qwt5.QwtPlot.Axis) the id of the axis
+        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given,
+                          the current ScaleDraw for the plot will be used if
                           possible, and a :class:`FixedLabelsScaleDraw` will be set if not
         '''
         if scaleDraw is None:
@@ -438,51 +464,52 @@ class FixedLabelsScaleEngine(Qwt5.QwtLinearScaleEngine):
                 scaleDraw = FixedLabelsScaleDraw()
         plot.setAxisScaleDraw(axis, scaleDraw)
         plot.setAxisScaleEngine(axis, FixedLabelsScaleEngine(scaleDraw))
-        
-    @staticmethod 
+
+    @staticmethod
     def disableInAxis(plot, axis, scaleDraw=None, scaleEngine=None):
         '''convenience method that will disable this engine in the given
         axis. Note that it changes the ScaleDraw as well.
-         
+
         :param plot: (Qwt5.QwtPlot) the plot to change
         :param axis: (Qwt5.QwtPlot.Axis) the id of the axis
-        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given, 
+        :param scaleDraw: (Qwt5.QwtScaleDraw) Scale draw to use. If None given,
                           a :class:`FancyScaleDraw` will be set
-        :param scaleEngine: (Qwt5.QwtScaleEngine) Scale draw to use. If None given, 
+        :param scaleEngine: (Qwt5.QwtScaleEngine) Scale draw to use. If None given,
                           a :class:`Qwt5.QwtLinearScaleEngine` will be set
         '''
         if scaleDraw is None:
-            scaleDraw=FancyScaleDraw()
+            scaleDraw = FancyScaleDraw()
         if scaleEngine is None:
             scaleEngine = Qwt5.QwtLinearScaleEngine()
         plot.setAxisScaleEngine(axis, scaleEngine)
-        plot.setAxisScaleDraw(axis, scaleDraw) 
+        plot.setAxisScaleDraw(axis, scaleDraw)
 
 
 class FixedLabelsScaleDraw(FancyScaleDraw):
+
     def __init__(self, positions, labels):
         '''This is a custom ScaleDraw that shows labels at given positions (and nowhere else)
         positions is a sequence of points for which labels are defined.
         labels is a sequence strings (or QwtText)
         Note that the lengths of positions and labels must match'''
-        
+
         if len(positions) != len(labels):
             raise ValueError('lengths of positions and labels do not match')
-        
+
         FancyScaleDraw.__init__(self)
         self._positions = positions
         self._labels = labels
-        #self._positionsarray = numpy.array(self._positions) #this is stored just in case
-        
+        # self._positionsarray = numpy.array(self._positions) #this is stored
+        # just in case
+
     def label(self, val):
         try:
-            index = self._positions.index(val) #try to find an exact match
+            index = self._positions.index(val)  # try to find an exact match
         except:
-            index = None #It won't show any label
-            #use the index of the closest position
+            index = None  # It won't show any label
+            # use the index of the closest position
             #index = (numpy.abs(self._positionsarray - val)).argmin()
         if index is not None:
             return Qwt5.QwtText(self._labels[index])
-        else: Qwt5.QwtText()
-        
-
+        else:
+            Qwt5.QwtText()
diff --git a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py
index cbc9c20..2af8463 100644
--- a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py
+++ b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py
@@ -2,29 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 taurus.external.qt import Qt
 import taurus
 import numpy
@@ -32,38 +31,39 @@ import numpy
 from taurus.qt.qtgui.container import TaurusWidget
 from arrayedit import ArrayEditor
 
+
 class TaurusArrayEditor(TaurusWidget):
-    
-    def __init__(self, parent = None, designMode = False):
-        TaurusWidget.__init__(self, parent = parent, designMode = designMode)
-        
+
+    def __init__(self, parent=None, designMode=False):
+        TaurusWidget.__init__(self, parent=parent, designMode=designMode)
+
         self._xAttr = None
         self._yAttr = None
-        
+
         self._arrayEditor = ArrayEditor()
-        self.fromFileBT= Qt.QPushButton('Read From File')
-        self.toFileBT= Qt.QPushButton('Write To File')
-        self.fromAttrBT= Qt.QPushButton('Read From Device')
-        self.toAttrBT= Qt.QPushButton('Write To Device')
-        
+        self.fromFileBT = Qt.QPushButton('Read From File')
+        self.toFileBT = Qt.QPushButton('Write To File')
+        self.fromAttrBT = Qt.QPushButton('Read From Device')
+        self.toAttrBT = Qt.QPushButton('Write To Device')
+
         self.fromAttrBT.setEnabled(False)
         self.toAttrBT.setEnabled(False)
-        
-        layout= Qt.QGridLayout(self)
-        layout.addWidget(self._arrayEditor,0,0,1,4)
-        layout.addWidget(self.fromFileBT,1,0)
-        layout.addWidget(self.toFileBT,1,1)
-        layout.addWidget(self.fromAttrBT,1,2)
-        layout.addWidget(self.toAttrBT,1,3)
-        
-        self.connect(self.fromFileBT, Qt.SIGNAL("clicked()"), self.onFromFile)
-        self.connect(self.toFileBT, Qt.SIGNAL("clicked()"), self.onToFile)
-        self.connect(self.fromAttrBT, Qt.SIGNAL("clicked()"), self.onFromAttr)
-        self.connect(self.toAttrBT, Qt.SIGNAL("clicked()"), self.onToAttr)
-    
+
+        layout = Qt.QGridLayout(self)
+        layout.addWidget(self._arrayEditor, 0, 0, 1, 4)
+        layout.addWidget(self.fromFileBT, 1, 0)
+        layout.addWidget(self.toFileBT, 1, 1)
+        layout.addWidget(self.fromAttrBT, 1, 2)
+        layout.addWidget(self.toAttrBT, 1, 3)
+
+        self.fromFileBT.clicked[()].connect(self.onFromFile)
+        self.toFileBT.clicked[()].connect(self.onToFile)
+        self.fromAttrBT.clicked[()].connect(self.onFromAttr)
+        self.toAttrBT.clicked[()].connect(self.onToAttr)
+
     def arrayEditor(self):
         return self._arrayEditor
-        
+
     def setModel(self, model):
         '''returns True if a curve could be set from the attribute. Flase otherwise'''
         if not model:
@@ -72,25 +72,26 @@ class TaurusArrayEditor(TaurusWidget):
             return
         attrs = str(model).split("|")
         self._yAttr = taurus.Attribute(attrs[-1])
-        if self._yAttr is None or len(attrs) not in (1,2):
-            self.error('Invalid model for %s'%str(self.__class__))
+        if self._yAttr is None or len(attrs) not in (1, 2):
+            self.error('Invalid model for %s' % str(self.__class__))
             self.fromAttrBT.setEnabled(False)
             return
-        if len(attrs) == 1: self._xAttr = None
-        else: self._xAttr = taurus.Attribute(attrs[0])        
-        
-        #set the master curve from the attribute(s)
+        if len(attrs) == 1:
+            self._xAttr = None
+        else:
+            self._xAttr = taurus.Attribute(attrs[0])
+
+        # set the master curve from the attribute(s)
         ok = self.onFromAttr(quiet=True)
-        
-        #enable/disable the attribute I/O buttons
+
+        # enable/disable the attribute I/O buttons
         self.fromAttrBT.setEnabled(True)
-        enableWrite = (self._xAttr is None or self._xAttr.isWritable()) and self._yAttr.isWritable()
+        enableWrite = (self._xAttr is None or self._xAttr.isWritable()
+                       ) and self._yAttr.isWritable()
         self.toAttrBT.setEnabled(True)
-        
+
         return ok
-        
-        
-    
+
     def onFromFile(self, filename=None, **kwargs):
         '''imports Master curve from a two-column ASCII file.
         The first colum will be interpreted to be the abcissas.
@@ -101,83 +102,106 @@ class TaurusArrayEditor(TaurusWidget):
         skiprows=0, usecols=None, unpack=False}
         see help from numpy.loadtxt for more info on the kwargs'''
         if filename is None:
-            filename = Qt.QFileDialog.getOpenFileName( self, 'Choose input file', '', 'Ascii file (*)')
-        if not filename: return False
-        filename=str(filename)
+            filename = Qt.QFileDialog.getOpenFileName(
+                self, 'Choose input file', '', 'Ascii file (*)')
+        if not filename:
+            return False
+        filename = str(filename)
         try:
-            M=numpy.loadtxt(filename, **kwargs)
-            if len(M.shape)!=2: raise Exception()
-            x=M[:,0]
-            y=M[:,1]
+            M = numpy.loadtxt(filename, **kwargs)
+            if len(M.shape) != 2:
+                raise Exception()
+            x = M[:, 0]
+            y = M[:, 1]
         except:
-            self.error('Invalid input file "%s"'%filename)
-            Qt.QMessageBox.warning (self, 'Invalid input file', 'Unknown format in selected file.\n Hint: The file must be two-column ASCII')
-            return 
-        self._arrayEditor.setMaster(x,y)
-    
+            self.error('Invalid input file "%s"' % filename)
+            Qt.QMessageBox.warning(
+                self, 'Invalid input file', 'Unknown format in selected file.\n Hint: The file must be two-column ASCII')
+            return
+        self._arrayEditor.setMaster(x, y)
+
     def onToFile(self):
-        '''writes the Corrected curve to an ascii file''' 
+        '''writes the Corrected curve to an ascii file'''
         if self._arrayEditor.plot1.exportAscii(curves=['Corrected']):
-            x,y=self._arrayEditor.getCorrected()
-            self._arrayEditor.setMaster(x,y,keepCP=True)
-    
+            x, y = self._arrayEditor.getCorrected()
+            self._arrayEditor.setMaster(x, y, keepCP=True)
+
     def onFromAttr(self, quiet=False):
         '''reads the Master curve from the attributes set by model.
         '''
-        if self._yAttr is None: return False #@TODO: launch a dialog for choosing the x and y attributes
-        try:      
-            y=numpy.array(self._yAttr.read().value)
-            if self._xAttr is None: x = numpy.arange(y.size)
-            else: x = numpy.array(self._xAttr.read().value)
-        except Exception,e:
-            self.error('Error reading from attribute(s): %s'%(str(e)))
+        if self._yAttr is None:
+            return False  # @TODO: launch a dialog for choosing the x and y attributes
+        try:
+            y = numpy.array(self._yAttr.read().rvalue)
+            if self._xAttr is None:
+                x = numpy.arange(y.size)
+            else:
+                x = numpy.array(self._xAttr.read().rvalue)
+        except Exception, e:
+            self.error('Error reading from attribute(s): %s' % (str(e)))
             if not quiet:
-                Qt.QMessageBox.warning (self, 'Error Reading Attribute', 'Cannot read master curve')
+                Qt.QMessageBox.warning(
+                    self, 'Error Reading Attribute', 'Cannot read master curve')
             return False
-        
-        if quiet or Qt.QMessageBox.question(self, 'Read from attributes?', 'Read Master curve from attributes?'):   
+
+        if quiet:
+            should_set = True
+        else:
+            answer = Qt.QMessageBox.question(
+                    self, 'Read from attributes?',
+                    'Read Master curve from attributes?',
+                    Qt.QMessageBox.Yes|Qt.QMessageBox.No
+            )
+            should_set = (answer == Qt.QMessageBox.Yes == answer)
+
+        if should_set:
             try:
-                self._arrayEditor.setMaster(x,y)
+                self._arrayEditor.setMaster(x, y)
             except ValueError:
                 self.error('Cannot set master curve from attributes')
                 if not quiet:
-                    Qt.QMessageBox.warning (self, 'Error', 'Cannot set master curve from attributes')
+                    Qt.QMessageBox.warning(self, 'Error',
+                            'Cannot set master curve from attributes')
                 return False
         return True
-    
+
     def onToAttr(self, quiet=False):
         '''writes the Corrected curve to the attributes set by the model'''
-        if self._yAttr is None: return #@TODO: launch a dialog for choosing the x and y attributes
-        x,y=self._arrayEditor.getCorrected()
+        if self._yAttr is None:
+            return  # @TODO: launch a dialog for choosing the x and y attributes
+        x, y = self._arrayEditor.getCorrected()
         try:
             self._yAttr.write(y)
-            if self._xAttr is not None: self._xAttr.write(x)
-            #checking that the write was actually ok (this should be changed when taurus provides a mechanism for this)
-            if numpy.any(self._yAttr.read(cache=False).w_value != y):
-                raise IOError('Unexpected Write error: %s'%self._yAttr.getFullName())
-            if  self._xAttr is not None and numpy.any(self._xAttr.read(cache=False).w_value != x):
-                raise IOError('Unexpected Write error: %s'%self._xAttr.getFullName())
-        except Exception,e:
-            self.error('Error writing to attribute(s): %s'%(str(e)))
+            if self._xAttr is not None:
+                self._xAttr.write(x)
+            # checking that the write was actually ok (this should be changed
+            # when taurus provides a mechanism for this)
+            if numpy.any(self._yAttr.read(cache=False).wvalue != y):
+                raise IOError('Unexpected Write error: %s' %
+                              self._yAttr.getFullName())
+            if self._xAttr is not None and numpy.any(self._xAttr.read(cache=False).wvalue != x):
+                raise IOError('Unexpected Write error: %s' %
+                              self._xAttr.getFullName())
+        except Exception, e:
+            self.error('Error writing to attribute(s): %s' % (str(e)))
             if not quiet:
-                Qt.QMessageBox.warning (self, 'Error Writing attribute', 'Cannot write corrected curve to attribute')
+                Qt.QMessageBox.warning(
+                    self, 'Error Writing attribute', 'Cannot write corrected curve to attribute')
             return
-        self._arrayEditor.setMaster(x,y,keepCP=True)
+        self._arrayEditor.setMaster(x, y, keepCP=True)
         if not quiet:
-            Qt.QMessageBox.information (self, 'Success', 'Corrected curve has been written')
-            
+            Qt.QMessageBox.information(
+                self, 'Success', 'Corrected curve has been written')
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         """Returns pertinent information in order to be able to build a valid
         QtDesigner widget plugin
-        
+
         :return: (dict) a map with pertinent designer information"""
         ret = TaurusWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.plot'
         ret['group'] = 'Taurus Input'
-        ret['icon'] =':/designer/arrayedit.png'
+        ret['icon'] = 'designer:arrayedit.png'
         ret['container'] = False
         return ret
-
-
-
diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py
index 8239488..d6b0b10 100644
--- a/lib/taurus/qt/qtgui/plot/taurusplot.py
+++ b/lib/taurus/qt/qtgui/plot/taurusplot.py
@@ -2,31 +2,32 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
 taurusplot.py: Generic graphical plotting widget for Taurus
 """
-__all__=["TaurusCurve", "TaurusCurveMarker", "TaurusXValues", "TaurusPlot", "isodatestr2float"]
+__all__ = ["TaurusCurve", "TaurusCurveMarker",
+           "TaurusXValues", "TaurusPlot", "isodatestr2float"]
 
 import os
 import copy
@@ -35,75 +36,84 @@ import time
 import numpy
 from taurus.external.qt import Qt, Qwt5
 
-import PyTango
-
+import taurus
 import taurus.core
+from taurus.core.taurusmanager import getSchemeFromName
+from taurus.core.taurusbasetypes import DataFormat
+# TODO: Tango-centric
 from taurus.core.util.containers import LoopList, CaselessDict, CaselessList
 from taurus.core.util.safeeval import SafeEvaluator
+from taurus.qt.qtcore.util.signal import baseSignal
 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,\
-                           DateTimeScaleEngine, FixedLabelsScaleEngine, FixedLabelsScaleDraw
+    DateTimeScaleEngine, FixedLabelsScaleEngine, FixedLabelsScaleDraw
 from curvesAppearanceChooserDlg import CurveAppearanceProperties
-from taurus.qt.qtgui.resource import getThemeIcon
+
 
 def isodatestr2float(s, sep='_'):
     '''
     converts a date string in iso format to a timestamp (seconds since epoch)
     with microseconds precision
     '''
-    d = datetime.strptime(s,'%Y-%m-%d'+sep+'%H:%M:%S.%f')
-    return time.mktime(d.timetuple()) + d.microsecond*1e-6
-    
+    d = datetime.strptime(s, '%Y-%m-%d' + sep + '%H:%M:%S.%f')
+    return time.mktime(d.timetuple()) + d.microsecond * 1e-6
+
 
 #import threading
 class DummyLock(object):
+
     def acquire(self):
         pass
+
     def release(self):
         pass
 
-##for debugging. Comment out in production
+# for debugging. Comment out in production
 #from taurus.core.util.log import TraceIt, DebugIt, InfoIt, WarnIt
 
 
 DFT_CURVE_PENS = [Qt.QPen(Qt.Qt.red),
-                 Qt.QPen(Qt.Qt.blue),
-                 Qt.QPen(Qt.Qt.green),
-                 Qt.QPen(Qt.Qt.magenta),
-                 Qt.QPen(Qt.Qt.cyan),
-                 Qt.QPen(Qt.Qt.yellow),
-                 Qt.QPen(Qt.Qt.black)]
+                  Qt.QPen(Qt.Qt.blue),
+                  Qt.QPen(Qt.Qt.green),
+                  Qt.QPen(Qt.Qt.magenta),
+                  Qt.QPen(Qt.Qt.cyan),
+                  Qt.QPen(Qt.Qt.yellow),
+                  Qt.QPen(Qt.Qt.black)]
 
 for __p in DFT_CURVE_PENS:
-    __p.setWidth(1) # TODO: we would like this to be 2, but bug #171 forces 1
+    __p.setWidth(1)  # TODO: we would like this to be 2, but bug #171 forces 1
+
 
 class TaurusZoomer(Qwt5.QwtPlotZoomer):
     '''A QwtPlotZoomer that displays the label assuming that X values are timestamps'''
+
     def __init__(self, *args):
         Qwt5.QwtPlotZoomer.__init__(self, *args)
         self._xIsTime = False
-        
+
     def setXIsTime(self, xistime):
         '''If xistime is True, the x values will be interpreted as timestamps
-        
+
         :param xistime: (bool)
         '''
         self._xIsTime = xistime
-        
+
     def trackerText(self, pos):
         '''reimplemented from :meth:`Qwt5.QwtPicker.trackerText`'''
         pos = self.invTransform(pos)
         if self._xIsTime:
             x = datetime.fromtimestamp(pos.x()).isoformat(' ')
         else:
-            x = '%g'%pos.x()
-        y = '%g'%pos.y()
-        return Qwt5.QwtText(', '.join((x,y)))
-    
+            x = '%g' % pos.x()
+        y = '%g' % pos.y()
+        return Qwt5.QwtText(', '.join((x, y)))
+
+
 class TaurusCurveMarker(Qwt5.QwtPlotMarker, TaurusBaseComponent):
     '''Taurus-enabled custom version of QwtPlotMarker
     '''
+
     def __init__(self, name, parent=None, labelOpacity=0.7):
         self.call__init__wo_kw(Qwt5.QwtPlotMarker)
         self.call__init__(TaurusBaseComponent, self.__class__.__name__)
@@ -112,12 +122,14 @@ class TaurusCurveMarker(Qwt5.QwtPlotMarker, TaurusBaseComponent):
         self.setLabelAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignBottom)
         text = Qwt5.QwtText('')
         text.setColor(Qt.Qt.black)
-        text.setBackgroundBrush(Qt.QBrush(Qt.QColor(0,255,0,int(255*labelOpacity)))) #a semi-transparent green background for the label
+        # a semi-transparent green background for the label
+        text.setBackgroundBrush(
+            Qt.QBrush(Qt.QColor(0, 255, 0, int(255 * labelOpacity))))
         self.setLabel(text)
         self.setSymbol(Qwt5.QwtSymbol(Qwt5.QwtSymbol.Diamond,
-                                  Qt.QBrush(Qt.Qt.yellow),
-                                  Qt.QPen(Qt.Qt.green),
-                                  Qt.QSize(7,7)))
+                                      Qt.QBrush(Qt.Qt.yellow),
+                                      Qt.QPen(Qt.Qt.green),
+                                      Qt.QSize(7, 7)))
 
     def alignLabel(self):
         '''Sets the label alignment in a "smart" way (depending on the current
@@ -125,17 +137,18 @@ class TaurusCurveMarker(Qwt5.QwtPlotMarker, TaurusBaseComponent):
         '''
         xmap = self.plot().canvasMap(self.xAxis())
         ymap = self.plot().canvasMap(self.yAxis())
-        xmiddlepoint = xmap.p1() + xmap.pDist()/2 #p1,p2 are left,right here
-        ymiddlepoint = ymap.p2() + ymap.pDist()/2 #p1,p2 are bottom,top here (and pixel coords start from top!)
+        xmiddlepoint = xmap.p1() + xmap.pDist() / 2  # p1,p2 are left,right here
+        # p1,p2 are bottom,top here (and pixel coords start from top!)
+        ymiddlepoint = ymap.p2() + ymap.pDist() / 2
         xPaintPos = xmap.transform(self.xValue())
         yPaintPos = ymap.transform(self.yValue())
 
-        if xPaintPos > xmiddlepoint: #the point in the right side
+        if xPaintPos > xmiddlepoint:  # the point in the right side
             hAlign = Qt.Qt.AlignLeft
         else:
             hAlign = Qt.Qt.AlignRight
 
-        if yPaintPos > ymiddlepoint: #the point is in the bottom side
+        if yPaintPos > ymiddlepoint:  # the point is in the bottom side
             vAlign = Qt.Qt.AlignTop
         else:
             vAlign = Qt.Qt.AlignBottom
@@ -147,9 +160,9 @@ class TaurusXValues(TaurusBaseComponent):
     '''
     Class for managing abscissas values in a TaurusCurve
     '''
-    def __init__(self, name, parent = None):
+
+    def __init__(self, name, parent=None):
         self._xValues = None
-        self._signalGen = Qt.QObject()
         self.call__init__(TaurusBaseComponent, self.__class__.__name__)
         self._listeners = []
         self.setModel(name)
@@ -163,38 +176,26 @@ class TaurusXValues(TaurusBaseComponent):
         model = src if src is not None else self.getModelObj()
         if model is None:
             self._xValues = numpy.zeros(0)
-            for l in self._listeners : l.fireEvent(model, evt_type, val)
+            for l in self._listeners:
+                l.fireEvent(model, evt_type, val)
             return
 
         format = getattr(val, 'data_format', model.getDataFormat())
-        if format == PyTango.AttrDataFormat.SPECTRUM:
-            value =  val if val is not None else self.getModelValueObj()
+        if format == DataFormat._1D:
+            value = val if val is not None else self.getModelValueObj()
             if value:
                 self._xValues = numpy.array(value.value)
             else:
                 self._xValues = numpy.zeros(0)
-        for l in self._listeners : l.fireEvent(src, evt_type, val) #all listeners are notified via fireEvent when the X changes
-
-    def preAttach(self):
-        """reimplemented because this cannot use signals(they are not
-        QObjects). see :meth:`TaurusBaseComponent.preAttach`"""
-        self._signalGen.connect(self._signalGen, Qt.SIGNAL('taurusEvent'), self.filterEvent)
-
-    def preDetach(self):
-        """reimplemented because this cannot use signals(they are not QObjects).
-        See :meth:`TaurusBaseComponent.preDetach`"""
-        self._signalGen.disconnect(self._signalGen, Qt.SIGNAL('taurusEvent'), self.filterEvent)
+        for l in self._listeners:
+            # all listeners are notified via fireEvent when the X changes
+            l.fireEvent(src, evt_type, val)
 
-    def fireEvent(self,  evt_src, evt_type, evt_value):
-        """reimplemented because this cannot use signals(they are not QObjects).
-        see :meth:`TaurusBaseComponent.fireEvent`"""
-        self._signalGen.emit(Qt.SIGNAL('taurusEvent'),  evt_src, evt_type, evt_value)
-
-    def registerDataChanged(self,listener):
+    def registerDataChanged(self, listener):
         '''see :meth:`TaurusBaseComponent.registerDataChanged`'''
         self._listeners.append(listener)
 
-    def unregisterDataChanged(self,listener):
+    def unregisterDataChanged(self, listener):
         '''see :meth:`TaurusBaseComponent.unregisterDataChanged`'''
         self._listeners.remove(listener)
 
@@ -240,13 +241,18 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
     information about which TaurusCurves are attached. Therefore the programmer
     should never attach/detach a TaurusCurve manually.
     '''
-    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):
+    consecutiveDroppedEventsWarning = 3  # number consecutive of dropped events before issuing a warning (-1 for disabling)
+    # absolute number of dropped events before issuing a warning (-1 for
+    # disabling)
+    droppedEventsWarning = -1
+
+    dataChanged = baseSignal('dataChanged', 'QString')
+
+    def __init__(self, name, xname=None, parent=None, rawData=None, optimized=False):
 
         Qwt5.QwtPlotCurve.__init__(self)
         TaurusBaseComponent.__init__(self, 'TaurusCurve')
-        self._rawData=rawData
+        self._rawData = rawData
         self._xValues = None
         self._yValues = None
         self._showMaxPeak = False
@@ -256,11 +262,10 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         self._history = []
         self._titleText = '<label>'
         self.setXValuesBuilder()
-        self._signalGen = Qt.QObject()
         self._maxPeakMarker = TaurusCurveMarker(name, self)
         self._minPeakMarker = TaurusCurveMarker(name, self)
         self.__curveName = name
-        self.isRawData= not(rawData is None)
+        self.isRawData = not(rawData is None)
         self.droppedEventsCount = 0
         self.consecutiveDroppedEventsCount = 0
         if optimized:
@@ -274,7 +279,6 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         else:
             self.__xFromAttr = None
 
-
         if name and not self.isRawData:
             try:
                 self.setModel(name)
@@ -282,10 +286,10 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
                 self.error("Problems when adding curve " + str(name))
                 self.traceback()
 
-                
+
 #    @staticmethod
 #    def defaultMarkerFormatter(self,curve,label,i,x,y,xIsTime):
-#        """ 
+#        """
 #        Returns the text to be shown in  plot tooltips/markers.
 #        :param curve: the name of the curve
 #        :param label: the label to be displayed
@@ -294,16 +298,16 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
 #        :param y: y axis position
 #        :param xIsTime: To adapt format to time if needed
 #        :return: (str)
-#        """           
+#        """
 #        #@todo: Check: is this method ever called??? It seems it is not since it is buggy and we don't see problems
 #        if self.getXIsTime():
 #            infotxt = "'%s'[%i]:\n\t (t=%s, y=%.3g)"%(pickedCurveName,pickedIndex,datetime.fromtimestamp(picked.x()).ctime(),picked.y())
 #        else:
-#            infotxt = "'%s'[%i]:\n\t (x=%.3g, y=%.3g)"%(pickedCurveName,pickedIndex,picked.x(),picked.y())   
+#            infotxt = "'%s'[%i]:\n\t (x=%.3g, y=%.3g)"%(pickedCurveName,pickedIndex,picked.x(),picked.y())
 #        return infotxt
-#                
+#
 #    def setMarkerFormatter(self,formatter):
-#        """ 
+#        """
 #        Sets formatter method for plot tooltips/markers.
 #        The method must have at least 4 arguments:
 #        :param curve: the name of the curve
@@ -312,17 +316,17 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
 #        :param x: x axis position
 #        :param y: y axis position
 #        :param xIsTime: To adapt format to time if needed
-#        """        
+#        """
 #        self._markerFormatter = formatter
-#        
+#
 #    def markerFormatter(self):
-#        """ 
+#        """
 #        Returns the method used to format plot tooltips
-#        
+#
 #        :return: (function)
 #        """
 #        return self._formatter
-        
+
     def getCurveName(self):
         '''Returns the name of the curve (in the case of non RawDataCurves, it
         is the same as the model name)
@@ -343,7 +347,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         self._titleText = titletext
         self.updateTitle()
 
-    def titleText(self, compiled = False):
+    def titleText(self, compiled=False):
         '''Returns the titleText string. If compiled == True, the returned string
         will be processed through compileTitleText
 
@@ -355,7 +359,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         .. seealso:: :meth:`compileTitleText`
         '''
         if compiled:
-            return self.compileTitleText(self._titleText )
+            return self.compileTitleText(self._titleText)
         else:
             return self._titleText
 
@@ -368,7 +372,7 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         self.itemChanged()
 
     def compileTitleText(self, titletext):
-        '''Substitutes the known placeholders by the current equivalent values
+        """Substitutes the known placeholders by the current equivalent values
         for a titleText.
 
         *Note*: Some placeholders may not make sense for certain curves (e.g.
@@ -382,41 +386,48 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
                             - <label> the attribute label (default)
                             - <model> the model name
                             - <attr_name> attribute name
-                            - <attr_fullname> full attribute name (for backwards compatibility, <attr_full_name> is also accepted)
+                            - <attr_fullname> full attribute name (for backwards
+                              compatibility, <attr_full_name> is also accepted)
                             - <dev_alias> device alias
                             - <dev_name> device name
-                            - <dev_fullname> full device name (for backwards compatibility, <dev_full_name> is also accepted)
+                            - <dev_fullname> full device name (for backwards
+                              compatibility, <dev_full_name> is also accepted)
                             - <current_title> The current title
 
         :return: (str) a title string where the placeholders have been
                  substituted by their corresponding values
-        '''
-        #All TaurusCurves can deal with at least these placeholders
-        titletext = titletext.replace('<current_title>',str(self.title().text()))
-        titletext = titletext.replace('<model>',self.getModel())
+        """
+        # All TaurusCurves can deal with at least these placeholders
+        titletext = titletext.replace('<current_title>',
+                                      str(self.title().text()))
+        titletext = titletext.replace('<model>', self.getModel())
         attr = self.getModelObj()
         if attr is None:
             return titletext
-        #TaurusCurves for which we can get the Attribute...
-        titletext = titletext.replace('<label>',attr.label or '---')
-        titletext = titletext.replace('<attr_name>',attr.name or '---')
-        titletext = titletext.replace('<attr_fullname>',attr.getFullName() or '---')
-        titletext = titletext.replace('<attr_full_name>',attr.getFullName() or '---')
-        titletext = titletext.replace('<dev_alias>',attr.dev_alias or '---')
-        titletext = titletext.replace('<dev_name>',attr.dev_name or '---')
+        # TaurusCurves for which we can get the Attribute...
+        titletext = titletext.replace('<label>', attr.label or '---')
+        titletext = titletext.replace('<attr_name>', attr.name or '---')
+        titletext = titletext.replace('<attr_fullname>',
+                                      attr.getFullName() or '---')
+        titletext = titletext.replace('<attr_full_name>',
+                                      attr.getFullName() or '---')
 
         dev = attr.getParentObj()
-        if dev is None:
-            return titletext
-        #TaurusCurves for which we can get the Device object...
-        titletext = titletext.replace('<dev_fullname>',dev.getFullName() or '---')
-        titletext = titletext.replace('<dev_full_name>',dev.getFullName() or '---')
+        if dev is not None:
+            # TaurusCurves for which we can get the Device object...
+            titletext = titletext.replace('<dev_alias>',
+                                          dev.getSimpleName() or '---')
+            titletext = titletext.replace('<dev_name>',
+                                          dev.getNormalName() or '---')
+            titletext = titletext.replace('<dev_fullname>',
+                                          dev.getFullName() or '---')
+            titletext = titletext.replace('<dev_full_name>',
+                                          dev.getFullName() or '---')
         return titletext
 
-
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
     # Convenience attach/detach methods
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    # -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
 
     def attachMarkers(self, plot):
         '''attach markers to the plot
@@ -464,25 +475,6 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
     # Overwrite from TaurusBaseComponent
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-#    def preAttach(self):
-#        """implemented because TaurusCurves cannot use signals(they are not QObjects)
-#        See :meth:`TaurusBaseComponent.preAttach`"""
-#        self._signalGen.connect(self._signalGen, Qt.SIGNAL('taurusEvent'), self.filterEvent)
-#
-#    def preDetach(self):
-#        """implemented because TaurusCurves cannot use signals(they are not QObjects)
-#        See :meth:`TaurusBaseComponent.preDetach`"""
-#        self._signalGen.disconnect(self._signalGen, Qt.SIGNAL('taurusEvent'), self.filterEvent)
-#
-#    def fireEvent(self,  evt_src, evt_type, evt_value):
-#        """implemented because TaurusCurves cannot use signals(they are not QObjects)
-#        See :meth:`TaurusBaseComponent.fireEvent`"""
-#        self._signalGen.emit(Qt.SIGNAL('taurusEvent'),  evt_src, evt_type, evt_value)
-
-    def getSignaller(self):
-        '''See :meth:`TaurusBaseComponent.getSignaller` '''
-        return self._signalGen   
-
     def getModelClass(self):
         '''See :meth:`TaurusBaseComponent.getModelClass`'''
         return taurus.core.taurusattribute.TaurusAttribute
@@ -549,15 +541,16 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         if model is None:
             self._xValues = numpy.zeros(0)
             self._yValues = numpy.zeros(0)
-            self._signalGen.emit(Qt.SIGNAL("dataChanged(const QString &)"), str(self.getModel()))
+            self.dataChanged.emit(str(self.getModel()))
             return
 
         if evt_type == taurus.core.taurusbasetypes.TaurusEventType.Config:
             self.updateTitle()
 
-        value = val if isinstance(val, (PyTango.DeviceAttribute, taurus.core.taurusbasetypes.TaurusAttrValue)) else self.getModelValueObj()
-        if not isinstance(value, (PyTango.DeviceAttribute, taurus.core.taurusbasetypes.TaurusAttrValue)):
-            self._onDroppedEvent(reason="Could not get DeviceAttribute value")
+        value = val if isinstance(
+            val, taurus.core.taurusbasetypes.TaurusAttrValue) else self.getModelValueObj()
+        if not isinstance(value, taurus.core.taurusbasetypes.TaurusAttrValue):
+            self._onDroppedEvent(reason="Could not get attribute value")
             return
         try:
             self.setXYFromModel(value)
@@ -565,11 +558,11 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
             self._onDroppedEvent(reason=str(e))
             return
         self._updateMarkers()
-        self._signalGen.emit(Qt.SIGNAL("dataChanged(const QString &)"), str(self.getModel()))
-        
+        self.dataChanged.emit(str(self.getModel()))
+
     def _onDroppedEvent(self, reason='Unknown'):
         '''inform the user about a dropped event
-        
+
         :param reason: (str) The reason of the drop
         '''
         self.debug("Droping event. Reason %s", reason)
@@ -578,59 +571,72 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         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)
+            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)
+            # disable the consecutive Dropped events warning (we do not want it
+            # if we got this one)
+            self.consecutiveDroppedEventsWarning = -1
         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:        
+            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)
+            # disable the consecutive Dropped events warning
+            self.consecutiveDroppedEventsWarning = -1
+        if mustwarn:
             self.warning(msg)
-            p = self.plot() 
+            p = self.plot()
             if p:
                 c = p.canvas()
-                msg2 = "Errors reading %s (%s)"%(self.titleText(compiled=True), self.modelName)
+                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)
+            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() 
+            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'''
         if self.isVisible():
             if self._showMaxPeak:
-                try: maxpoint = [self._xValues[self._yValues.argmax()],self._yValues.max()]
-                except: maxpoint = [0, 0]
+                try:
+                    maxpoint = [self._xValues[
+                        self._yValues.argmax()], self._yValues.max()]
+                except:
+                    maxpoint = [0, 0]
                 self._maxPeakMarker.setValue(*maxpoint)
                 label = self._maxPeakMarker.label()
                 if self.plot().getXIsTime():
-                    label.setText("Max. " + str(self.title().text()) + " " + repr(maxpoint[1]) + ' at t = ' + datetime.fromtimestamp(maxpoint[0]).ctime())
+                    label.setText("Max. " + str(self.title().text()) + " " + repr(
+                        maxpoint[1]) + ' at t = ' + datetime.fromtimestamp(maxpoint[0]).ctime())
                 else:
-                    label.setText("Max. " + str(self.title().text()) + " " + repr(maxpoint[1]) + ' at x = ' + repr(maxpoint[0]))
-                    
+                    label.setText("Max. " + str(self.title().text()) + " " +
+                                  repr(maxpoint[1]) + ' at x = ' + repr(maxpoint[0]))
+
                 self._maxPeakMarker.setLabel(label)
             if self._showMinPeak:
-                try: minpoint = [self._xValues[self._yValues.argmin()],self._yValues.min()]
-                except: minpoint = [0,0]
+                try:
+                    minpoint = [self._xValues[
+                        self._yValues.argmin()], self._yValues.min()]
+                except:
+                    minpoint = [0, 0]
                 self._minPeakMarker.setValue(*minpoint)
                 label = self._minPeakMarker.label()
                 if self.plot().getXIsTime():
-                    label.setText("Min. " + str(self.title().text()) + " " + repr(minpoint[1]) + ' at t = ' + datetime.fromtimestamp(minpoint[0]).ctime())
+                    label.setText("Min. " + str(self.title().text()) + " " + repr(
+                        minpoint[1]) + ' at t = ' + datetime.fromtimestamp(minpoint[0]).ctime())
                 else:
-                    label.setText("Min. " + str(self.title().text()) + " " + repr(minpoint[1]) + ' at x = ' + repr(minpoint[0]))
+                    label.setText("Min. " + str(self.title().text()) + " " +
+                                  repr(minpoint[1]) + ' at x = ' + repr(minpoint[0]))
                 self._minPeakMarker.setLabel(label)
 
     def setXYFromModel(self, value):
@@ -638,38 +644,47 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         given model. This method can be reimplemented by subclasses of Taurusplot
         that behave differently (e.g. TaurusTrend)
 
-        :param value: (PyTango.DeviceAttribute) the value object from the model
+        :param value: (TaurusAttrValue) the value object from the model
         """
-        if value.data_format == PyTango.AttrDataFormat.SPECTRUM:
+        attr = self.getModelObj()
+        if attr.data_format == DataFormat._1D:
+            # TODO: Adapt all values to be plotted to the same Unit
             if value:
-                self._yValues = numpy.array(value.value)
+                self._yValues = numpy.array(value.rvalue.magnitude)
             else:
                 self._yValues = numpy.zeros(0)
             self._xValues = self.getXValues()
         else:
-            raise ValueError("""TaurusCurve only supports SPECTRUM attributes(a %s was passed).
-                             \n Note: if you want a trend plot, use TaurusTrendCurve instead of TaurusCurve."""%str(value.data_format))
+            raise ValueError('TaurusCurve only supports SPECTRUM attributes '
+                             '(a %s was passed). \n'
+                             'Note: if you want a trend plot, use '
+                             'TaurusTrendCurve instead of '
+                             'TaurusCurve.' % str(DataFormat[attr.data_format]))
 
-    def setPaused(self, paused = True):
+    def setPaused(self, paused=True):
         '''Pauses itself and other listeners depending on it
 
         .. seealso:: :meth:`TaurusBaseComponent.setPaused`
         '''
         TaurusBaseComponent.setPaused(self, paused)
         for ob in (self.__xFromAttr, self._maxPeakMarker, self._minPeakMarker):
-            try: ob.setPaused(paused)
-            except AttributeError: pass
+            try:
+                ob.setPaused(paused)
+            except AttributeError:
+                pass
 
-    def setAppearanceProperties(self,prop):
+    def setAppearanceProperties(self, prop):
         """Applies the given CurveAppearanceProperties object (prop) to the curve.
         If a given property is set to None, it is not applied
 
         :param prop: (CurveAppearanceProperties)
         """
-        prop=copy.deepcopy(prop)
+        prop = copy.deepcopy(prop)
         s = Qwt5.QwtSymbol(self.symbol())
-        if prop.sStyle is not None: s.setStyle(Qwt5.QwtSymbol.Style(prop.sStyle))
-        if prop.sSize is not None: s.setSize(prop.sSize)
+        if prop.sStyle is not None:
+            s.setStyle(Qwt5.QwtSymbol.Style(prop.sStyle))
+        if prop.sSize is not None:
+            s.setSize(prop.sSize)
         if prop.sColor is not None:
             b = s.brush()
             p = s.pen()
@@ -688,47 +703,55 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
                 s.brush().setStyle(Qt.Qt.NoBrush)
                 s.setBrush(b)
         p = Qt.QPen(self.pen())
-        if prop.lStyle is not None: p.setStyle(prop.lStyle)
-        if prop.lWidth is not None: p.setWidth(prop.lWidth)
-        if prop.lColor is not None: p.setColor(Qt.QColor(prop.lColor))
-        if prop.cStyle is not None: self.setStyle(prop.cStyle)
+        if prop.lStyle is not None:
+            p.setStyle(prop.lStyle)
+        if prop.lWidth is not None:
+            p.setWidth(prop.lWidth)
+        if prop.lColor is not None:
+            p.setColor(Qt.QColor(prop.lColor))
+        if prop.cStyle is not None:
+            self.setStyle(prop.cStyle)
         if prop.cFill is not None:
             b = Qt.QBrush(self.brush())
-            if prop.cFill:  #The area under the curve is filled with the same color as the curve but with 50% transparency
+            if prop.cFill:  # The area under the curve is filled with the same color as the curve but with 50% transparency
                 color = p.color()
                 color.setAlphaF(0.5)
                 b.setColor(color)
                 b.setStyle(Qt.Qt.SolidPattern)
             else:
                 b.setStyle(Qt.Qt.NoBrush)
-            self.setBrush(b)            
-        if prop.yAxis is not None: self.setYAxis(prop.yAxis)
-        if getattr(prop,"visible",None) is not None: self.setVisible(prop.visible)
-        if prop.title is not None: self.setTitleText(prop.title)
+            self.setBrush(b)
+        if prop.yAxis is not None:
+            self.setYAxis(prop.yAxis)
+        if getattr(prop, "visible", None) is not None:
+            self.setVisible(prop.visible)
+        if prop.title is not None:
+            self.setTitleText(prop.title)
         self.setSymbol(s)
         self.setPen(p)
-        
 
     def getAppearanceProperties(self):
         """Returns the appearance properties of the curve (color, symbol, width,...).
 
         :return: (CurveAppearanceProperties)
         """
-        prop=CurveAppearanceProperties()
-        s=self.symbol()
-        prop.sStyle=s.style()
-        prop.sSize=s.size().width() #We are only supporting symbols with width==heigh
-        prop.sColor=s.brush().color()
-        prop.sFill= (s.brush().style() != Qt.Qt.NoBrush)
-        p=self.pen()
-        prop.lStyle=p.style()
-        prop.lWidth=p.width()
-        prop.lColor=p.color()
-        prop.cStyle=self.style()
-        prop.cFill= (self.brush().style() != Qt.Qt.NoBrush)
-        prop.yAxis=self.yAxis()
+        prop = CurveAppearanceProperties()
+        s = self.symbol()
+        prop.sStyle = s.style()
+        prop.sSize = s.size().width()  # We are only supporting symbols with width==heigh
+        prop.sColor = s.brush().color()
+        prop.sFill = (s.brush().style() != Qt.Qt.NoBrush)
+        p = self.pen()
+        prop.lStyle = p.style()
+        prop.lWidth = p.width()
+        prop.lColor = p.color()
+        prop.cStyle = self.style()
+        prop.cFill = (self.brush().style() != Qt.Qt.NoBrush)
+        prop.yAxis = self.yAxis()
         prop.visible = self.isVisible()
-        prop.title=self.title().text() #We are forced to save only the text (and not the QwtText) because Pickle chokes with the QwtText
+        # We are forced to save only the text (and not the QwtText) because
+        # Pickle chokes with the QwtText
+        prop.title = self.title().text()
         return copy.deepcopy(prop)
 
     def setYAxis(self, axis):
@@ -737,7 +760,9 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         :param axis: (Qwt5.QwtPlot.Axis) the axis to which it should associate
         """
         Qwt5.QwtPlotCurve.setYAxis(self, axis)
-        self.safeSetData() #this way we make sure that the filtering is correct (in case of change of scale type)
+        # this way we make sure that the filtering is correct (in case of
+        # change of scale type)
+        self.safeSetData()
 
     def setFilteredWhenLog(self, filtered=True):
         '''Set whether non-possitive values should be discarded or not when
@@ -766,26 +791,27 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         .. seealso:: :meth:`safeSetData`, :meth:`setFilteredWhenLog`
         '''
         if self.isFilteredWhenLog():
-            #filter out the nonpossitive elements if the scale is logarithmic
+            # filter out the nonpossitive elements if the scale is logarithmic
             if self.plot():
                 type_ = self.plot().getAxisTransformationType(self.xAxis())
                 if type_ == Qwt5.QwtScaleTransformation.Log10:
-                    x,y = numpy.array(x),numpy.array(y)
-                    valid = x>0 #this is an array of bools representing valid entries
-                    x , y = x[valid], y[valid]
+                    x, y = numpy.array(x), numpy.array(y)
+                    valid = x > 0  # this is an array of bools representing valid entries
+                    x, y = x[valid], y[valid]
                 type_ = self.plot().getAxisTransformationType(self.yAxis())
                 if type_ == Qwt5.QwtScaleTransformation.Log10:
-                    x,y = numpy.array(x),numpy.array(y)
-                    valid = y>0 #this is an array of bools representing valid entries
-                    x , y = x[valid], y[valid]
+                    x, y = numpy.array(x), numpy.array(y)
+                    valid = y > 0  # this is an array of bools representing valid entries
+                    x, y = x[valid], y[valid]
             else:
                 self.debug("Curve is not connected but still receiving data")
 
-        if len(x)!=len(y): 
-            self.warning("setData(x[%d],y[%d]): array sizes don't match!"%(len(x),len(y)))
+        if len(x) != len(y):
+            self.warning(
+                "setData(x[%d],y[%d]): array sizes don't match!" % (len(x), len(y)))
 
-        #now proceed as usual
-        Qwt5.QwtPlotCurve.setData(self, x,y)
+        # now proceed as usual
+        Qwt5.QwtPlotCurve.setData(self, x, y)
 
     def safeSetData(self):
         '''Calls setData with x= self._xValues and y=self._yValues
@@ -806,41 +832,41 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
         :return: (widget or None)
         '''
         p = self.plot()
-        while p and not isinstance(p,TaurusBaseComponent):
+        while p and not isinstance(p, TaurusBaseComponent):
             if isinstance(p, (Qt.QDialog, Qt.QMainWindow)):
                 p = None
-                break;
+                break
             p = p.parentWidget()
         return p
 
-    def registerDataChanged(self,listener,meth):
+    def registerDataChanged(self, listener, meth):
         ''' registers a listener to the DataChangedSignal of this curve
 
         :param listener: (QWidget) listener object
         :param meth: (callable) callback method
         '''
-        listener.connect(self._signalGen, Qt.SIGNAL("dataChanged(const QString &)"), meth)
+        self.dataChanged.connect(meth)
 
-    def unregisterDataChanged(self,listener,meth):
+    def unregisterDataChanged(self, listener, meth):
         '''unregisters the given listener and method from the DataChangedSignal
         of this curve
 
         :param listener: (QWidget) listener object
         :param meth: (callable) callback method
         '''
-        listener.disconnect(self._signalGen, Qt.SIGNAL("dataChanged(const QString &)"), meth)
+        self.dataChanged.disconnect(meth)
 
     def isReadOnly(self):
         '''see :meth:`TaurusBaseComponent.isReadOnly`'''
         return True
 
-    def getStats(self, limits=None, inclusive=(True,True), imin=None, imax=None, ignorenans=True):
+    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
         contains a copy of the data in the considered region. The keys of the
         returned dictionary correspond to:
-                 
+
                  -'x' : the abscissas for the considered points (numpy.array)
                  -'y' : the ordinates for the considered points (numpy.array)
                  -'points': number of considered points (int)
@@ -849,87 +875,93 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
                  -'mean' : arithmetic average of y (float)
                  -'std' : (biased)standard deviation of y (float)
                  -'rms' : root mean square of y (float)
-                 
+
         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 
+
+        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
         :param inclusive: (tuple<bool,bool>). A tuple consisting of the (lower flag, upper flag).
-                          These flags determine whether values exactly equal to the lower or 
+                          These flags determine whether values exactly equal to the lower or
                           upper limits are included. The default value is (True, True).
-        :param imin: (int) lowest index to be considered. If None is given, 
-                     the limit is not enforced 
+        :param imin: (int) lowest index to be considered. If None is given,
+                     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 
+        :param ignorenans: (bool) if True (defaul), the points with NaN values are stripped
                      before calculating the stats
-                     
+
         :return: (dict) A dict containing the stats.
         '''
-        
+
         data = self.data()
-        if imin is None: imin = 0
-        if imax is None: imax = data.size()
-        
+        if imin is None:
+            imin = 0
+        if imax is None:
+            imax = data.size()
+
         x = numpy.array([data.x(i) for i in xrange(imin, imax)])
         y = numpy.array([data.y(i) for i in xrange(imin, imax)])
-        
+
         if limits is not None:
-            xmin,xmax = limits
-            if xmax is None: xmax=numpy.inf
+            xmin, xmax = limits
+            if xmax is None:
+                xmax = numpy.inf
             if inclusive:
-                mask = (x>=xmin) * (x<=xmax)
+                mask = (x >= xmin) * (x <= xmax)
             else:
-                mask = (x>xmin) * (x<xmax)                
+                mask = (x > xmin) * (x < xmax)
             x = x[mask]
-            y = y[mask]    
-        
-        if ignorenans: 
-            mask = numpy.invert(numpy.isnan(x+y)) #we remove points where either x or y are Nan
+            y = y[mask]
+
+        if ignorenans:
+            # we remove points where either x or y are Nan
+            mask = numpy.invert(numpy.isnan(x + y))
             x = x[mask]
             y = y[mask]
-            
-        ret = {'x'    : x, 
-               'y'    : y,
+
+        ret = {'x': x,
+               'y': y,
                'points': x.size,
-               'min'  : None, 
-               'max'  : None,
-               'mean' : None,
-               'std'  : None,
-               'rms'  : None}
-        
-        if  x.size > 0:
+               'min': None,
+               'max': None,
+               'mean': None,
+               'std': None,
+               'rms': None}
+
+        if x.size > 0:
             argmin = y.argmin()
             argmax = y.argmax()
-            ret.update({'min'  : (x[argmin],y[argmin]), 
-                        'max'  : (x[argmax],y[argmax]),
-                        'mean' : y.mean(),
-                        'std'  : y.std(),
-                        'rms'  : numpy.sqrt(numpy.mean(y**2))})
+            ret.update({'min': (x[argmin], y[argmin]),
+                        'max': (x[argmax], y[argmax]),
+                        'mean': y.mean(),
+                        'std': y.std(),
+                        'rms': numpy.sqrt(numpy.mean(y ** 2))})
         return ret
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Methods necessary to show/hide peak values
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    def showMaxPeak(self,show):
+    def showMaxPeak(self, show):
         """Specififes if we want to show or not the max peak of the curve
 
         :param show: (bool)
         """
         self._showMaxPeak = show
-        #self.fireEvent(taurus.core.taurusbasetypes.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):
+    def showMinPeak(self, show):
         """Specififes if we want to show or not the min peak of the curve.
 
         :param show: (bool)
         """
         self._showMinPeak = show
-        #self.fireEvent(taurus.core.taurusbasetypes.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
@@ -937,11 +969,12 @@ class TaurusCurve(Qwt5.QwtPlotCurve, TaurusBaseComponent):
 
         :return: (Qwt5.QwtPlot.Axis or None)
         '''
-        if not self.isVisible(): return None
+        if not self.isVisible():
+            return None
         return self.yAxis()
 
 
-#class TaurusPlot(Qwt5.QwtPlot, Logger):
+# class TaurusPlot(Qwt5.QwtPlot, Logger):
 class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
     '''
     TaurusPlot is a general widget for plotting 1D data sets. It is an extended
@@ -986,9 +1019,14 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                  :ref:`TaurusPlot User's Interface Guide <taurusplot_ui>`,
                  :ref:`The TaurusPlot coding examples <examples_taurusplot>`
     '''
-    __pyqtSignals__ = ("dataChanged(const QString &)",)
 
-    def __init__(self, parent = None, designMode = False):
+    #: Override the default modelChanged('QString') signal
+    modelChanged = Qt.pyqtSignal()
+
+    dataChanged = Qt.pyqtSignal('QString')
+    CurvesYAxisChanged = Qt.pyqtSignal('QStringList', int)
+
+    def __init__(self, parent=None, designMode=False):
         name = "TaurusPlot"
         Qwt5.QwtPlot.__init__(self, parent)
         TaurusBaseWidget.__init__(self, name)
@@ -999,37 +1037,39 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         self._defaultCurvesTitle = '<label>'
         self._curvePens = LoopList(DFT_CURVE_PENS)
         self._gridPen = Qt.QPen(Qt.Qt.gray, 1)
-        self._supportedConfigVersions = ["tpc-1","tpc-1.1"] #the latest element of this list is considered the current version
+        # the latest element of this list is considered the current version
+        self._supportedConfigVersions = ["tpc-1", "tpc-1.1"]
 
 #        Logger.__init__(self)
 #        Qwt5.QwtPlot.__init__(self, parent)
 
-        #dictionary for default axes naming
-        self._axesnames = {Qwt5.QwtPlot.xBottom:'X',Qwt5.QwtPlot.xTop:'X2',
-                           Qwt5.QwtPlot.yLeft:'Y1', Qwt5.QwtPlot.yRight:'Y2'}
+        # dictionary for default axes naming
+        self._axesnames = {Qwt5.QwtPlot.xBottom: 'X', Qwt5.QwtPlot.xTop: 'X2',
+                           Qwt5.QwtPlot.yLeft: 'Y1', Qwt5.QwtPlot.yRight: 'Y2'}
         # cache for the values of the axis transformation
         self.__transformations = {}
 
-        #Data Import Dialog (it will only be initialised if required)
-        self.DataImportDlg=None
+        # Data Import Dialog (it will only be initialised if required)
+        self.DataImportDlg = None
 
-        #Values to be managed with/from the TaurusPlotConfigDialog time configuration
+        # Values to be managed with/from the TaurusPlotConfigDialog time
+        # configuration
         self._xIsTime = False
         self._xMax = None
         self._xMin = None
         self._xDynScale = False
         self._xDynScaleSupported = False
 
-        #enable dropping (see also dragEnterEvent and dropEvent methods)
+        # enable dropping (see also dragEnterEvent and dropEvent methods)
         self.setAcceptDrops(True)
 
         # book-keeping of attached tauruscurves
-        self.curves = CaselessDict()
+        self.curves = CaselessDict()  # TODO: Tango-centric
         #self.curves_lock = threading.RLock()
         self.curves_lock = DummyLock()
 
-        #background
-        #self.setCanvasBackground(Qt.Qt.white)
+        # background
+        # self.setCanvasBackground(Qt.Qt.white)
 
         # attach a grid
         self._grid = Qwt5.QwtPlotGrid()
@@ -1039,43 +1079,47 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         # configure axes
         for axis in [Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.yLeft, Qwt5.QwtPlot.yRight, Qwt5.QwtPlot.xTop]:
             self.setAxisScaleDraw(axis, FancyScaleDraw())
-        self.y2AxisPalette = Qt.QPalette(Qt.QColor("blue"),Qt.QColor("black"),Qt.QColor("blue"),Qt.QColor("blue"),Qt.QColor("blue"),Qt.QColor("blue"),Qt.QColor("blue"))
+        self.y2AxisPalette = Qt.QPalette(Qt.QColor("blue"), Qt.QColor("black"), Qt.QColor(
+            "blue"), Qt.QColor("blue"), Qt.QColor("blue"), Qt.QColor("blue"), Qt.QColor("blue"))
         self.axisScaleDraw(Qwt5.QwtPlot.yRight).setPalette(self.y2AxisPalette)
 
         # set initial show/hide peaks configuration
         self._showMaxPeaks = False
         self._showMinPeaks = False
 
-        # zoom. One zoomer for Y1 and another for Y2 (but only one will be active at each time)
+        # zoom. One zoomer for Y1 and another for Y2 (but only one will be
+        # active at each time)
         self._max_zoom_stack = 15
         self._zoomer1 = TaurusZoomer(self.canvas())
         self._zoomer2 = TaurusZoomer(self.canvas())
         self._zoomer2.setRubberBandPen(Qt.Qt.blue)
         self._zoomer2.setTrackerPen(Qt.Qt.blue)
-        self._zoomer2.setAxis(Qwt5.QwtPlot.xBottom,Qwt5.QwtPlot.yRight)
+        self._zoomer2.setAxis(Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.yRight)
         self._zoomer2.setEnabled(False)
         self._zoomer = self._zoomer1
         self._allowZoomers = True
         for z in (self._zoomer1, self._zoomer2):
             z.setMaxStackDepth(self._max_zoom_stack)
-            z.setKeyPattern(z.KeyHome, Qt.Qt.Key_unknown) #this disables the escape key for going to the top of the zoom stack (we use escape via an action for autoscaling)
+            # this disables the escape key for going to the top of the zoom
+            # stack (we use escape via an action for autoscaling)
+            z.setKeyPattern(z.KeyHome, Qt.Qt.Key_unknown)
 
         # point picker
         self._pointPicker = Qwt5.QwtPicker(self.canvas())
-        self._pointPicker.setSelectionFlags(Qwt5.QwtPicker.PointSelection )
+        self._pointPicker.setSelectionFlags(Qwt5.QwtPicker.PointSelection)
 
         self._pickedMarker = TaurusCurveMarker("Picked", labelOpacity=0.8)
         self._pickedCurveName = ""
-        self.connect(self._pointPicker, Qt.SIGNAL('selected(QwtPolygon)'), self.pickDataPoint)      
-        
-        #xRegion picker
-        self._xRegionPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom, 
+        self._pointPicker.selected.connect(self.pickDataPoint)
+
+        # xRegion picker
+        self._xRegionPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom,
                                                  Qwt5.QwtPlot.yLeft,
                                                  Qwt5.QwtPicker.PointSelection,
                                                  Qwt5.QwtPicker.VLineRubberBand,
                                                  Qwt5.QwtPicker.AlwaysOn, self.canvas())
         self._xRegionPicker.setEnabled(False)
-        self.connect(self._xRegionPicker, Qt.SIGNAL('selected(QwtDoublePoint)'), self._onXRegionEvent)
+        self._xRegionPicker.selected.connect(self._onXRegionEvent)
 
         # magnifier
         self._magnifier = Qwt5.QwtPlotMagnifier(self.canvas())
@@ -1083,144 +1127,152 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         # panner
         self._panner = Qwt5.QwtPlotPanner(self.canvas())
-        self._panner.setMouseButton(Qt.Qt.LeftButton,Qt.Qt.ControlModifier)
+        self._panner.setMouseButton(Qt.Qt.LeftButton, Qt.Qt.ControlModifier)
 
         # legend
         self._legendPos = Qwt5.QwtPlot.RightLegend
         self._showLegend = False
-        self._legendDecissionIsForever=False
+        self._legendDecissionIsForever = False
         self.updateLegend()
-        self.connect(self, Qt.SIGNAL('legendClicked(QwtPlotItem*)'),
-                     self.toggleCurveState)
+        self.legendClicked.connect(self.toggleCurveState)
 
-        #datainspector mode
+        # datainspector mode
         self._inspectorMode = False
         self.toggleDataInspectorMode(False)
-        
-        #optimization
+
+        # optimization
         self._optimizationEnabled = True
-        
-        #modifiable by user
+
+        # modifiable by user
         self.setModifiableByUser(True)
-        
-        #drag&drop
-        self.setSupportedMimeTypes([TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE])
 
-        #initialize actions
+        # drag&drop
+        self.setSupportedMimeTypes(
+            [TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE])
+
+        # initialize actions
         self.__initActions()
 
-        #final stuff
+        # final stuff
         self.setObjectName(name)
-        #self.defineStyle()
+        # self.defineStyle()
 
     def __initActions(self):
         '''Create and attach TaurusPlot actions'''
-        
-        #=======================================================================
-        ## This action is for debug only. Comment out when not debugging
+
+        #======================================================================
+        # 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._debugAction.setShortcut(Qt.Qt.Key_D)
         #self.connect(self._debugAction, Qt.SIGNAL("triggered()"), self.__debug)
-        #self.canvas().addAction(self._debugAction)
-        #=======================================================================
+        # self.canvas().addAction(self._debugAction)
+        #======================================================================
 
         self._dataInspectorAction = Qt.QAction("Data &Inspector mode", None)
         self._dataInspectorAction.setShortcut(Qt.Qt.Key_I)
         self._dataInspectorAction.setCheckable(True)
         self._dataInspectorAction.setChecked(self._pointPicker.isEnabled())
-        self.connect(self._dataInspectorAction, Qt.SIGNAL("toggled(bool)"), self.toggleDataInspectorMode)
+        self._dataInspectorAction.toggled[bool].connect(self.toggleDataInspectorMode)
 
         self._curveStatsAction = Qt.QAction("Calculate statistics", None)
         self._curveStatsAction.setShortcut(Qt.Qt.Key_S)
-        self.connect(self._curveStatsAction, Qt.SIGNAL("triggered()"), self.onCurveStatsAction)
+        self._curveStatsAction.triggered[()].connect(self.onCurveStatsAction)
 
         self._pauseAction = Qt.QAction("&Pause", None)
-        self._pauseAction.setShortcuts([Qt.Qt.Key_P,Qt.Qt.Key_Pause])
+        self._pauseAction.setShortcuts([Qt.Qt.Key_P, Qt.Qt.Key_Pause])
         self._pauseAction.setCheckable(True)
         self._pauseAction.setChecked(self.isPaused())
-        self.connect(self._pauseAction, Qt.SIGNAL("toggled(bool)"), self.setPaused)
+        self._pauseAction.toggled[bool].connect(self.setPaused)
 
         self._autoscaleAllAxisAction = Qt.QAction("Autoscale all axes", None)
         self._autoscaleAllAxisAction.setShortcut(Qt.Qt.Key_Escape)
-        self.connect(self._autoscaleAllAxisAction,  Qt.SIGNAL("triggered()"), self.autoScaleAllAxes)
+        self._autoscaleAllAxisAction.triggered[()].connect(self.autoScaleAllAxes)
 
         self._toggleZoomAxisAction = Qt.QAction("Toggle Zoom-aware axis", None)
         self._toggleZoomAxisAction.setShortcut(Qt.Qt.Key_Z)
-        self.connect(self._toggleZoomAxisAction,  Qt.SIGNAL("triggered()"), self.toggleZoomer)
+        self._toggleZoomAxisAction.triggered[()].connect(self.toggleZoomer)
 
         self._configDialogAction = Qt.QAction("Plot configuration...", None)
         self._configDialogAction.setShortcut(Qt.QKeySequence("Alt+C"))
-        self.connect(self._configDialogAction, Qt.SIGNAL("triggered()"), self.showConfigDialog)
+        self._configDialogAction.triggered[()].connect(self.showConfigDialog)
 
         self._inputDataAction = Qt.QAction("Input data selection...", None)
         self._inputDataAction.setShortcut(Qt.QKeySequence.New)
-        self.connect(self._inputDataAction, Qt.SIGNAL("triggered()"), self.showDataImportDlg)
+        self._inputDataAction.triggered[()].connect(self.showDataImportDlg)
 
         self._saveConfigAction = Qt.QAction("Save current settings...", None)
         self._saveConfigAction.setShortcut(Qt.QKeySequence.Save)
-        self.connect(self._saveConfigAction, Qt.SIGNAL("triggered()"), self.saveConfig)
+        self._saveConfigAction.triggered[()].connect(self.saveConfig)
 
-        self._loadConfigAction = Qt.QAction("&Retrieve saved settings...", None)
+        self._loadConfigAction = Qt.QAction(
+            "&Retrieve saved settings...", None)
         self._loadConfigAction.setShortcut(Qt.QKeySequence.Open)
-        self.connect(self._loadConfigAction, Qt.SIGNAL("triggered()"), self.loadConfig)
+        self._loadConfigAction.triggered[()].connect(self.loadConfig)
 
         self._showLegendAction = Qt.QAction("Show &Legend", None)
         self._showLegendAction.setShortcut(Qt.QKeySequence("Ctrl+L"))
         self._showLegendAction.setCheckable(True)
         self._showLegendAction.setChecked(self._showLegend)
-        self.connect(self._showLegendAction, Qt.SIGNAL("triggered(bool)"), self.showLegend)
+        self._showLegendAction.triggered[bool].connect(self.showLegend)
         self.canvas().addAction(self._showLegendAction)
 
         self._showMaxAction = Qt.QAction("Show Max", None)
         self._showMaxAction.setCheckable(True)
         self._showMaxAction.setChecked(self._showMaxPeaks)
-        self.connect(self._showMaxAction,  Qt.SIGNAL("toggled(bool)"), self.showMaxPeaks)
+        self._showMaxAction.toggled.connect(self.showMaxPeaks)
 
         self._showMinAction = Qt.QAction("Show Min", None)
         self._showMinAction.setCheckable(True)
         self._showMinAction.setChecked(self._showMinPeaks)
-        self.connect(self._showMinAction,  Qt.SIGNAL("toggled(bool)"), self.showMinPeaks)
+        self._showMinAction.toggled[bool].connect(self.showMinPeaks)
 
         self._printAction = Qt.QAction("&Print plot...", None)
-        self.connect(self._printAction, Qt.SIGNAL("triggered()"), self.exportPrint)
+        self._printAction.triggered[()].connect(self.exportPrint)
 
         self._exportPdfAction = Qt.QAction("Export plot to PD&F...", None)
-        self.connect(self._exportPdfAction, Qt.SIGNAL("triggered()"), self.exportPdf)
+        self._exportPdfAction.triggered[()].connect(self.exportPdf)
 
         self._exportAsciiAction = Qt.QAction("Export data to &ASCII...", None)
-        self.connect(self._exportAsciiAction, Qt.SIGNAL("triggered()"), self.exportAscii)
+        self._exportAsciiAction.triggered[()].connect(self.exportAscii)
 
-        self._setCurvesTitleAction = Qt.QAction("Change Curves Titles...", None)
-        self.connect(self._setCurvesTitleAction, Qt.SIGNAL("triggered()"), self.changeCurvesTitlesDialog)
-        
-        self._closeWindowAction =  Qt.QAction(getThemeIcon("process-stop"),'Close Plot', self)
-        self.connect(self._closeWindowAction, Qt.SIGNAL("triggered()"), self.close)
+        self._setCurvesTitleAction = Qt.QAction(
+            "Change Curves Titles...", None)
+        self._setCurvesTitleAction.triggered[()].connect(self.changeCurvesTitlesDialog)
 
-        #add all actions and limit the scope of the key shortcuts to the widget (default is Window)
+        self._closeWindowAction = Qt.QAction(
+            Qt.QIcon.fromTheme("process-stop"), 'Close Plot', self)
+        self._closeWindowAction.triggered[()].connect(self.close)
+
+        # add all actions and limit the scope of the key shortcuts to the
+        # widget (default is Window)
         for action in (self._dataInspectorAction, self._pauseAction, self._autoscaleAllAxisAction,
-                  self._toggleZoomAxisAction, self._configDialogAction, self._inputDataAction,
-                  self._saveConfigAction, self._loadConfigAction, self._showLegendAction,
-                  self._showMaxAction, self._showMinAction, self._printAction, self._exportPdfAction,
-                  self._exportAsciiAction, self._setCurvesTitleAction, self._curveStatsAction):
-            action.setShortcutContext(Qt.Qt.WidgetShortcut) #this is needed to avoid ambiguity when more than one TaurusPlot is used in the same window
-            self.canvas().addAction(action) #because of the line above, we must add the actions to the widget that gets the focus (the canvas instead of self)
-    
+                       self._toggleZoomAxisAction, self._configDialogAction, self._inputDataAction,
+                       self._saveConfigAction, self._loadConfigAction, self._showLegendAction,
+                       self._showMaxAction, self._showMinAction, self._printAction, self._exportPdfAction,
+                       self._exportAsciiAction, self._setCurvesTitleAction, self._curveStatsAction):
+            # this is needed to avoid ambiguity when more than one TaurusPlot
+            # is used in the same window
+            action.setShortcutContext(Qt.Qt.WidgetShortcut)
+            # because of the line above, we must add the actions to the widget
+            # that gets the focus (the canvas instead of self)
+            self.canvas().addAction(action)
+
     def dropEvent(self, event):
         '''reimplemented to support dropping of modelnames in taurusplots'''
-        mtype = self.handleMimeData(event.mimeData(),self.addModels)
+        mtype = self.handleMimeData(event.mimeData(), self.addModels)
         if mtype is None:
             self.info('Invalid model')
         else:
-            event.acceptProposedAction() 
-            
+            event.acceptProposedAction()
+
 #    def dropEvent(self, event):
 #        '''reimplemented to support dropping of modelnames in taurusplots'''
 #        supported = self.getSupportedMimeTypes()
-#        formats = event.mimeData().formats() 
+#        formats = event.mimeData().formats()
 #        for mtype in supported:
 #            if mtype in formats:
 #                modelname = str(event.mimeData().data(mtype))
-#                if modelname is None: 
+#                if modelname is None:
 #                    return
 #                try:
 #                    self.addModels([modelname])
@@ -1242,7 +1294,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         try:
             return self.__transformations[axis]
         except KeyError:
-            t =  self.axisScaleEngine(axis).transformation().type()
+            t = self.axisScaleEngine(axis).transformation().type()
             self.__transformations[axis] = t
             return t
 
@@ -1254,9 +1306,9 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
     def getCurveTitle(self, curvename):
         '''return the current title associated to a given curve name
-        
+
         :param curvename: (str) the name of the curve
-        
+
         :return:(str)
         '''
         self.curves_lock.acquire()
@@ -1269,7 +1321,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         finally:
             self.curves_lock.release()
         return title
-    
+
     def getCurveNames(self):
         '''returns the names of all TaurusCurves attached to the plot (in arbitrary
         order, if you need a sorted list, see :meth:`getCurveNamesSorted`).
@@ -1285,7 +1337,6 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
             self.curves_lock.release()
         return ret
 
-
     def getCurveNamesSorted(self):
         '''returns the names of the curves in z order (which is the one used in
         the legend, and in showing the curves).
@@ -1296,13 +1347,13 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         self.curves_lock.acquire()
         try:
-            names = [o.getCurveName() for o in self.itemList() if isinstance(o, TaurusCurve)]
+            names = [o.getCurveName()
+                     for o in self.itemList() if isinstance(o, TaurusCurve)]
         finally:
             self.curves_lock.release()
         return copy.deepcopy(names)
 
-
-    def sortCurves(self, ordered = None):
+    def sortCurves(self, ordered=None):
         '''Sorts the attached curves in a given z order. This affects both the
         ordering in the legend and the visibility order when curves overlap in
         the plotting area. The order is governed by the `ordered` parameter (or
@@ -1315,10 +1366,11 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         self.curves_lock.acquire()
         try:
             if ordered is None:
-                orderedObjs = sorted(self.curves.values(), key = lambda curve:curve.titleText(compiled=True))
+                orderedObjs = sorted(
+                    self.curves.values(), key=lambda curve: curve.titleText(compiled=True))
             else:
                 #current = self.curves.keys()
-                #if len(ordered) != len(current) or set(map(str.lower,current)) - set(map(str.lower, ordered)):
+                # if len(ordered) != len(current) or set(map(str.lower,current)) - set(map(str.lower, ordered)):
                 #    raise ValueError('Invalid value for the "ordered" parameter')
                 orderedObjs = [self.curves[n] for n in ordered]
             for curve in orderedObjs:
@@ -1341,15 +1393,16 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                 z.setEnabled(False)
             return
         if axis is None:
-            #find the axis of the currently disabled zoomer
+            # find the axis of the currently disabled zoomer
             for z in (self._zoomer1, self._zoomer2):
-                if not z.isEnabled():break
+                if not z.isEnabled():
+                    break
             axis = z.yAxis()
-        #enable the zoomer corresponding to axis and disable the other one
+        # enable the zoomer corresponding to axis and disable the other one
         for z in (self._zoomer1, self._zoomer2):
-            z.setEnabled(z.yAxis()==axis)
+            z.setEnabled(z.yAxis() == axis)
         self._zoomer = self.getZoomers(axis)[0]
-        self.debug('Now Zooming on %s'%unicode(self.getAxisName(axis)))
+        self.debug('Now Zooming on %s' % unicode(self.getAxisName(axis)))
         return self._zoomer.yAxis()
 
     def getAxisName(self, axis):
@@ -1361,10 +1414,11 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         :return: (unicode)
         '''
         name = unicode(self.axisTitle(axis).text())
-        if name == '': name = self._axesnames[axis]
+        if name == '':
+            name = self._axesnames[axis]
         return name
 
-    def setPaused(self, paused = True):
+    def setPaused(self, paused=True):
         '''delegates the pausing to the curves
 
         :param paused: (bool) if True, the plot will be paused
@@ -1382,9 +1436,10 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
     def __debug(self, *args, **kwargs):
         '''put code here that you want to debug'''
-        print "!!!!!!!!!!!!!!!1",self.pos()
-        Qt.QToolTip.showText(self.mapToGlobal(self.pos()), "ASDASDASDASD DASDAS ASDA", self)
-        
+        print "!!!!!!!!!!!!!!!1", self.pos()
+        Qt.QToolTip.showText(self.mapToGlobal(self.pos()),
+                             "ASDASDASDASD DASDAS ASDA", self)
+
         return
 
     def getDefaultAxisLabelsAlignment(self, axis, rotation):
@@ -1396,25 +1451,38 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         :return: (Qt.Alignment) an alignment
         '''
-        #print "!!!!", {Qwt5.QwtPlot.xBottom:"B" , Qwt5.QwtPlot.yLeft:"L", Qwt5.QwtPlot.yRight:"R", Qwt5.QwtPlot.xTop:"T"}[axis]
+        # print "!!!!", {Qwt5.QwtPlot.xBottom:"B" , Qwt5.QwtPlot.yLeft:"L",
+        # Qwt5.QwtPlot.yRight:"R", Qwt5.QwtPlot.xTop:"T"}[axis]
         if axis == Qwt5.QwtPlot.xBottom:
-            if rotation == 0 : return Qt.Qt.AlignHCenter|Qt.Qt.AlignBottom
-            elif rotation < 0: return Qt.Qt.AlignLeft|Qt.Qt.AlignBottom
-            else:              return Qt.Qt.AlignRight|Qt.Qt.AlignBottom
+            if rotation == 0:
+                return Qt.Qt.AlignHCenter | Qt.Qt.AlignBottom
+            elif rotation < 0:
+                return Qt.Qt.AlignLeft | Qt.Qt.AlignBottom
+            else:
+                return Qt.Qt.AlignRight | Qt.Qt.AlignBottom
         elif axis == Qwt5.QwtPlot.yLeft:
-            if rotation == 0 : return Qt.Qt.AlignLeft|Qt.Qt.AlignVCenter
-            elif rotation < 0: return Qt.Qt.AlignLeft|Qt.Qt.AlignBottom
-            else:              return Qt.Qt.AlignLeft|Qt.Qt.AlignTop
+            if rotation == 0:
+                return Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter
+            elif rotation < 0:
+                return Qt.Qt.AlignLeft | Qt.Qt.AlignBottom
+            else:
+                return Qt.Qt.AlignLeft | Qt.Qt.AlignTop
         elif axis == Qwt5.QwtPlot.yRight:
-            if rotation == 0 : return Qt.Qt.AlignRight|Qt.Qt.AlignVCenter
-            elif rotation < 0: return Qt.Qt.AlignRight|Qt.Qt.AlignTop
-            else:              return Qt.Qt.AlignRight|Qt.Qt.AlignBottom
+            if rotation == 0:
+                return Qt.Qt.AlignRight | Qt.Qt.AlignVCenter
+            elif rotation < 0:
+                return Qt.Qt.AlignRight | Qt.Qt.AlignTop
+            else:
+                return Qt.Qt.AlignRight | Qt.Qt.AlignBottom
         elif axis == Qwt5.QwtPlot.xTop:
-            if rotation == 0 : return Qt.Qt.AlignHCenter|Qt.Qt.AlignTop
-            elif rotation < 0: return Qt.Qt.AlignLeft|Qt.Qt.AlignTop
-            else:              return Qt.Qt.AlignRight|Qt.Qt.AlignTop
+            if rotation == 0:
+                return Qt.Qt.AlignHCenter | Qt.Qt.AlignTop
+            elif rotation < 0:
+                return Qt.Qt.AlignLeft | Qt.Qt.AlignTop
+            else:
+                return Qt.Qt.AlignRight | Qt.Qt.AlignTop
 
-    def setAxisCustomLabels(self, axis, pos_and_labels, rotation = 0, alignment = None):
+    def setAxisCustomLabels(self, axis, pos_and_labels, rotation=0, alignment=None):
         '''By calling this method, the scale vaues can be substituted  by custom
         labels at arbitrary positions. In general, it is a good idea to let the
         alignment to be autocalculated.
@@ -1428,14 +1496,14 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                                If None given, it will be autocalculated
 
         '''
-        positions, labels = zip(*pos_and_labels) #"unzipping"
+        positions, labels = zip(*pos_and_labels)  # "unzipping"
         positions = list(positions)
 
         self.setAxisScaleEngine(axis, FixedLabelsScaleEngine(positions))
 
         sd = FixedLabelsScaleDraw(positions, labels)
         sd.setLabelRotation(rotation)
-        if alignment is  None:
+        if alignment is None:
             alignment = self.getDefaultAxisLabelsAlignment(axis, rotation)
         sd.setLabelAlignment(alignment)
         self.setAxisScaleDraw(axis, sd)
@@ -1444,25 +1512,28 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
     def getPickedMarker(self):
         '''returns the marker for the picked points for this plot
-        
+
         :return: (TaurusCurveMarker)
         '''
         return self._pickedMarker
-    
+
     def getZoomers(self, axis=None):
         '''returns a list of the zoomer(s) associated to the given axis.
         If None is passed, it returns a list containing the current zoomer
 
         :param axis: (Qwt5.QwtPlot.Axis) the axis
         '''
-        if axis is None: return [self._zoomer]
-        elif axis == Qwt5.QwtPlot.yLeft: return [self._zoomer1]
-        elif axis == Qwt5.QwtPlot.yRight: return [self._zoomer2]
-        elif axis == Qwt5.QwtPlot.xBottom: return [self._zoomer1, self._zoomer2]
+        if axis is None:
+            return [self._zoomer]
+        elif axis == Qwt5.QwtPlot.yLeft:
+            return [self._zoomer1]
+        elif axis == Qwt5.QwtPlot.yRight:
+            return [self._zoomer2]
+        elif axis == Qwt5.QwtPlot.xBottom:
+            return [self._zoomer1, self._zoomer2]
         else:
             raise ValueError('Invalid axis for getZoomers()')
 
-
     def getGrid(self):
         ''' returns the grid of the plot
 
@@ -1474,7 +1545,8 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''deprecated method . Only here for backwards compatibility. It will be
         removed, eventually. Now you should use the TaurusPlot instance instead of
         TaurusPlot.getPlot()'''
-        self.info('DEPRECATION WARNING!: Calling TaurusPlot.getPlot() is deprecated. Use the TaurusPlot object itself instead')
+        self.info(
+            'DEPRECATION WARNING!: Calling TaurusPlot.getPlot() is deprecated. Use the TaurusPlot object itself instead')
         print self.sender()
         return self
 
@@ -1511,11 +1583,13 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         .. seealso:: :meth:`setAxisLabelFormat`
         '''
-        if format is None: formats = [xformat, y1format, y2format]
-        else: formats = [format]*3
-        axes =[Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.yLeft, Qwt5.QwtPlot.yRight]
-        for axis, format in zip(axes,formats) :
-            self.setAxisLabelFormat(axis,format)
+        if format is None:
+            formats = [xformat, y1format, y2format]
+        else:
+            formats = [format] * 3
+        axes = [Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.yLeft, Qwt5.QwtPlot.yRight]
+        for axis, format in zip(axes, formats):
+            self.setAxisLabelFormat(axis, format)
 
     def setAxisLabelFormat(self, axis, format=None):
         '''changes the format of an axis label. format is a python format string
@@ -1609,18 +1683,18 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         if legend:
             widget = legend.find(curve)
             if isinstance(curve, TaurusCurve):
-                title=curve.title()
-                #if hidding the curve, hide peaks also
+                title = curve.title()
+                # if hidding the curve, hide peaks also
                 # change legend color too
                 if on is False:
                     title.setColor(Qt.Qt.darkGray)
                     curve.showMaxPeak(False)
                     curve.showMinPeak(False)
                     curve.detachMarkers()
-                #if the curve is shown, show the markers as well (if required)
+                # if the curve is shown, show the markers as well (if required)
                 # and change the color in the legend too!
                 else:
-                    if curve.yAxis()==Qwt5.QwtPlot.yLeft:
+                    if curve.yAxis() == Qwt5.QwtPlot.yLeft:
                         title.setColor(Qt.Qt.black)
                     else:
                         title.setColor(Qt.Qt.darkBlue)
@@ -1636,7 +1710,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
     def toggleCurveState(self, curve):
         '''cycles through 3 possible states for a curve:
-        
+
             - invisible
             - attached to Y1
             - attached to Y2
@@ -1645,24 +1719,25 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         self.curves_lock.acquire()
         try:
-            #get the key in the self.curves directory
-            curveName=None
-            for curveName,c in self.curves.iteritems():
-                if c is curve: break
-            axis=curve.yAxis()
-            #Toggle state
+            # get the key in the self.curves directory
+            curveName = None
+            for curveName, c in self.curves.iteritems():
+                if c is curve:
+                    break
+            axis = curve.yAxis()
+            # Toggle state
             if not curve.isVisible():
-                self.setCurvesYAxis([curveName],Qwt5.QwtPlot.yLeft)
-            elif axis==Qwt5.QwtPlot.yLeft:
-                self.setCurvesYAxis([curveName],Qwt5.QwtPlot.yRight)
-            elif axis==Qwt5.QwtPlot.yRight:
+                self.setCurvesYAxis([curveName], Qwt5.QwtPlot.yLeft)
+            elif axis == Qwt5.QwtPlot.yLeft:
+                self.setCurvesYAxis([curveName], Qwt5.QwtPlot.yRight)
+            elif axis == Qwt5.QwtPlot.yRight:
                 self.showCurve(curve, False)
                 self.autoShowYAxes()
         finally:
             self.curves_lock.release()
         self.replot()
 
-    @Qt.pyqtSignature("dataChanged(const QString &)")
+    @Qt.pyqtSlot("QString", name="dataChanged")
     def curveDataChanged(self, name):
         '''slot that is called whenever a curve emits a dataChanged signal
 
@@ -1674,22 +1749,22 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         try:
             curve = self.curves.get(str(name))
             curve.safeSetData()
-            #self._zoomer.setZoomBase()
-            if self.getXDynScale(): #keep the scale width constant, but translate it to get the last value
-                max= curve._xValues[-1]
-                min=max-self.getXAxisRange()
+            # self._zoomer.setZoomBase()
+            if self.getXDynScale():  # keep the scale width constant, but translate it to get the last value
+                max = curve._xValues[-1]
+                min = max - self.getXAxisRange()
                 self.setAxisScale(Qwt5.QwtPlot.xBottom, min, max)
         finally:
             self.curves_lock.release()
-        self.emit(Qt.SIGNAL("dataChanged(const QString &)"), str(name))
+        self.dataChanged.emit(str(name))
         self.replot()
 
     def attachRawData(self, rawdata, properties=None, id=None):
         """attaches a curve to the plot formed from raw data that comes in a dict
 
         :param rawdata: (dict) A dictionary defining a rawdata curve. It has the
-                        following structure (all keys are optional, but either 
-                        "y" or "f(x)" must be present. Also, the value of x, y 
+                        following structure (all keys are optional, but either
+                        "y" or "f(x)" must be present. Also, the value of x, y
                         and f(x) can be None):
 
                         {"title":<str>, "x":list<float>, "y":list<float>,
@@ -1708,43 +1783,55 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         *Note*: using "name" in the rawdata dictionary is a still-supported-but-deprecated synonim of "title".
         """
         if properties is None:
-            properties=CurveAppearanceProperties(lColor=self._curvePens.next().color(), lWidth=2)
-        #Deprecation Warning:
+            properties = CurveAppearanceProperties(
+                lColor=self._curvePens.next().color(), lWidth=2)
+        # Deprecation Warning:
         if rawdata.has_key("pen") or rawdata.has_key("style"):
-            raise DeprecationWarning("'pen' or 'style' are no longer supported. Use the properties parameter instead")
+            raise DeprecationWarning(
+                "'pen' or 'style' are no longer supported. Use the properties parameter instead")
         if rawdata.has_key("name"):
             if rawdata.has_key("title"):
-                self.error('Inconsistence: both "name" and "title" passed for rawdata. Use "title" only')
+                self.error(
+                    'Inconsistence: both "name" and "title" passed for rawdata. Use "title" only')
             else:
-                self.warning('The use of "name" (=%s) for attaching rawdata is deprecated. Use "title" instead'%rawdata["name"])
+                self.warning(
+                    'The use of "name" (=%s) for attaching rawdata is deprecated. Use "title" instead' % rawdata["name"])
                 rawdata["title"] = rawdata["name"]
 
-        y = rawdata.get("y",None)
-        fx = rawdata.get("f(x)",None)
-        x = rawdata.get("x",None)
+        y = rawdata.get("y", None)
+        fx = rawdata.get("f(x)", None)
+        x = rawdata.get("x", None)
         if fx is None:
-            if y is None: raise ValueError('Either "f(x)" or "y" keys must be present') 
-            title = str(rawdata.get("title","rawdata"))
+            if y is None:
+                raise ValueError('Either "f(x)" or "y" keys must be present')
+            title = str(rawdata.get("title", "rawdata"))
             if x is None:
-                x = numpy.arange(len(y)) #if no x is given, the indices will be used
+                # if no x is given, the indices will be used
+                x = numpy.arange(len(y))
             else:
                 x = numpy.array(x)
         else:
-            if y is not None: raise ValueError('only one of "f(x)" or "y" keys can be present')
-            if x is None: raise ValueError('Missing "x" values') #we need x values in which to evaluate
-            title = str(rawdata.get("title",fx))
+            if y is not None:
+                raise ValueError(
+                    'only one of "f(x)" or "y" keys can be present')
+            if x is None:
+                # we need x values in which to evaluate
+                raise ValueError('Missing "x" values')
+            title = str(rawdata.get("title", fx))
             x = numpy.array(x)
-            sev = SafeEvaluator({'x':x})
+            sev = SafeEvaluator({'x': x})
             try:
                 y = sev.eval(fx)
             except:
-                self.warning("the function '%s' could not be evaluated (skipping)"%title) #TODO: deal with this exception properly.
+                # TODO: deal with this exception properly.
+                self.warning(
+                    "the function '%s' could not be evaluated (skipping)" % title)
                 return
         #@todo: support error bars
 #        ex=rawdata.get("ex",numpy.zeros(len(y)))
 #        ey=rawdata.get("ey",numpy.zeros(len(y)))
 
-        #at this point, both x and y must be valid
+        # at this point, both x and y must be valid
         y = numpy.array(y)
 
         if id is None:
@@ -1761,18 +1848,21 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                     curve.unregisterDataChanged(self, self.curveDataChanged)
                     curve.detach()
                     self.curves.pop(name)
-                self.debug('overwriting curve %s with raw data'%name)
-            self.debug('attaching raw data with name %s'%name)
-            curve = TaurusCurve(name, rawData=rawdata, optimized=self.isOptimizationEnabled())
-            #curve.fireEvent = lambda arg:None  #!!! reimplementing FireEvent on the fly! (ugly-lazy hack)
+                self.debug('overwriting curve %s with raw data' % name)
+            self.debug('attaching raw data with name %s' % name)
+            curve = TaurusCurve(name, rawData=rawdata,
+                                optimized=self.isOptimizationEnabled())
+            # curve.fireEvent = lambda arg:None  #!!! reimplementing FireEvent
+            # on the fly! (ugly-lazy hack)
             curve.attach(self)
             if self._showMaxPeaks:
                 curve.attachMaxMarker(self)
             if self._showMinPeaks:
                 curve.attachMinMarker(self)
             curve._xValues, curve._yValues = x, y
-            curve.setData(x,y)
-            curve.setTitle(title) #note that the title and the name may differ
+            curve.setData(x, y)
+            # note that the title and the name may differ
+            curve.setTitle(title)
             curve.setAppearanceProperties(properties)
             self.curves[name] = curve
             self.showCurve(curve, True)
@@ -1789,13 +1879,14 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         :param name: (str) name (identifier) of the curve to dettach
         '''
-        name=str(name)
-        self.debug("detaching raw data with name %s"%name)
+        name = str(name)
+        self.debug("detaching raw data with name %s" % name)
         self.curves_lock.acquire()
         try:
-            curve=self.curves.get(name)
+            curve = self.curves.get(name)
             if curve is None or not curve.isRawData:
-                self.error("detachRawData failed: '%s' is not a rawData curve"%name)
+                self.error(
+                    "detachRawData failed: '%s' is not a rawData curve" % name)
                 return
             curve.detach()
             self.curves.pop(name)
@@ -1811,7 +1902,8 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         """
         self.curves_lock.acquire()
         try:
-            names=[name for name in self.curves.keys() if self.curves[name].isRawData]
+            names = [name for name in self.curves.keys() if self.curves[
+                name].isRawData]
         finally:
             self.curves_lock.release()
 
@@ -1819,7 +1911,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
             self.detachRawData(name)
         return names
 
-    def getCurveData(self,curvename, numpy=False):
+    def getCurveData(self, curvename, numpy=False):
         """returns the data in the curve as two lists (x,y) of values
 
         :param curvename: (str) the curve name
@@ -1830,17 +1922,17 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         self.curves_lock.acquire()
         try:
             if self.curves.has_key(curvename):
-                data=self.curves[curvename].data()
-                x=[data.x(i) for i in xrange(data.size())]
-                y=[data.y(i) for i in xrange(data.size())]
+                data = self.curves[curvename].data()
+                x = [data.x(i) for i in xrange(data.size())]
+                y = [data.y(i) for i in xrange(data.size())]
             else:
-                self.error("Curve '%s' not found"%curvename)
+                self.error("Curve '%s' not found" % curvename)
                 raise KeyError()
         finally:
             self.curves_lock.release()
         if numpy:
-            x,y = numpy.array(x), numpy.array(y)
-        return x,y
+            x, y = numpy.array(x), numpy.array(y)
+        return x, y
 
     def updateCurves(self, names):
         '''
@@ -1856,12 +1948,10 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                         right hand value for the Y values)
         '''
 
-
         self.curves_lock.acquire()
         try:
             xnames, ynames = [], []
             for name in names:
-                name = name.lower()
                 n = name.split("|")
                 yname = n[-1]
                 xname = None
@@ -1870,18 +1960,20 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                 xnames.append(xname)
                 ynames.append(yname)
 
-            del_curves = [ name for name in self.curves.keys() if name not in ynames]
-            
-            #if all curves were removed, reset the color palette
+            del_curves = [name for name in self.curves.keys()
+                          if name not in ynames]
+
+            # if all curves were removed, reset the color palette
             if len(del_curves) == len(self.curves):
                 self._curvePens.setCurrentIndex(0)
 
-            for i,name in enumerate(ynames):
+            for i, name in enumerate(ynames):
                 xname = xnames[i]
                 name = str(name)
-                self.debug('updating curve %s'%name)
+                self.debug('updating curve %s' % name)
                 if not self.curves.has_key(name):
-                    curve = TaurusCurve(name, xname, self, optimized=self.isOptimizationEnabled())
+                    curve = TaurusCurve(name, xname, self,
+                                        optimized=self.isOptimizationEnabled())
                     curve.attach(self)
                     self.curves[name] = curve
                     self.showCurve(curve, True)
@@ -1901,7 +1993,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                 name = str(name)
                 #curve = self.curves.pop(name)
                 curve = self.curves.get(name)
-                if not curve.isRawData:   #The rawdata curves should not be dettached by updateCurves. Call detachRawdata insted
+                if not curve.isRawData:  # The rawdata curves should not be dettached by updateCurves. Call detachRawdata insted
                     curve.unregisterDataChanged(self, self.curveDataChanged)
                     curve.detach()
                     self.curves.pop(name)
@@ -1933,12 +2025,13 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
             if force or not self.legend():
                 self._legend = Qwt5.QwtLegend()
                 self._legend.setItemMode(Qwt5.QwtLegend.ClickableItem)
-                self._legend.setDisplayPolicy (Qwt5.QwtLegend.FixedIdentifier,
-                                                Qwt5.QwtLegendItem.ShowLine|
-                                                Qwt5.QwtLegendItem.ShowSymbol|
-                                                Qwt5.QwtLegendItem.ShowText)
+                self._legend.setDisplayPolicy(Qwt5.QwtLegend.FixedIdentifier,
+                                              Qwt5.QwtLegendItem.ShowLine |
+                                              Qwt5.QwtLegendItem.ShowSymbol |
+                                              Qwt5.QwtLegendItem.ShowText)
                 self.insertLegend(self._legend, self._legendPos)
-                self._legend.setToolTip("Clicking on a legend item changes\n the associated Y axis for the curve.")
+                self._legend.setToolTip(
+                    "Clicking on a legend item changes\n the associated Y axis for the curve.")
         else:
             self._legend = None
             self.insertLegend(None)
@@ -1952,7 +2045,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                         plotted) (default=True)
         '''
         if forever:
-            self._legendDecissionIsForever=forever
+            self._legendDecissionIsForever = forever
             self._showLegend = show
         else:
             if not self._legendDecissionIsForever:
@@ -1964,7 +2057,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''See :meth:`TaurusBaseComponent.getModelObj`'''
         return self.getCurve(self._modelNames[idx]).getModelObj()
 
-    #def defineStyle(self):
+    # def defineStyle(self):
     #    pass
 
     def minimumSizeHint(self):
@@ -1975,7 +2068,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''See :meth:`QWidget.sizeHint`'''
         return Qt.QSize(300, 200)
 
-    @Qt.pyqtSignature("modelChanged(const QString &)")
+    @Qt.pyqtSlot('QString', name='modelChanged')
     def parentModelChanged(self, parentmodel_name):
         '''See :meth:`TaurusBaseComponent.parentModelChanged`'''
         self.curves_lock.acquire()
@@ -1988,14 +2081,14 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
     def getParentTaurusComponent(self):
         '''See :meth:`TaurusBaseComponent.getParentTaurusComponent`'''
         p = self.parentWidget()
-        while p and not isinstance(p,TaurusBaseComponent):
+        while p and not isinstance(p, TaurusBaseComponent):
             if isinstance(p, Qt.QDialog) or isinstance(p, Qt.QMainWindow):
                 p = None
-                break;
+                break
             p = p.parentWidget()
         return p
 
-    #def keyPressEvent(self,keyEvent):
+    # def keyPressEvent(self,keyEvent):
     #    """This function will capture any key press and react on ESC key pressed to set autoscale on all axis"""
     #    #Leave this commented unless you want to debug
     #    #elif (keyEvent.key() == Qt.Qt.Key_D):
@@ -2008,17 +2101,20 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
     def closeEvent(self, event):
         '''See :meth:`Qwidget.closeEvent`'''
-        #make sure no dialogs are left open
+        # make sure no dialogs are left open
         if self.DataImportDlg is not None:
             self.DataImportDlg.close()
 
-    def contextMenuEvent(self,event):
+    def contextMenuEvent(self, event):
         """ This function is called when there is context menu event. See
         :meth:`Qwidget.closeEvent` A pop up menu will be shown with the
         available options. Different parts of the plot (canvas, axes,...) behave
         differently"""
 
-        #print "!!!!!!!!",  self.canvas().underMouse(), self.axisWidget(self.yLeft).underMouse(), self.axisWidget(self.yRight).underMouse(), self.axisWidget(self.xBottom).underMouse()
+        # print "!!!!!!!!",  self.canvas().underMouse(),
+        # self.axisWidget(self.yLeft).underMouse(),
+        # self.axisWidget(self.yRight).underMouse(),
+        # self.axisWidget(self.xBottom).underMouse()
         if self.canvas().underMouse():
             self._canvasContextMenu().exec_(event.globalPos())
         elif self.axisWidget(self.yLeft).underMouse():
@@ -2028,10 +2124,11 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         elif self.axisWidget(self.xBottom).underMouse():
             self._axisContextMenu(self.xBottom).exec_(event.globalPos())
         else:
-            #default catch-all #@TODO FOR SOME REASON, the underMouse() method used above fails sometimes !!!???
+            # default catch-all #@TODO FOR SOME REASON, the underMouse() method
+            # used above fails sometimes !!!???
             self._canvasContextMenu().exec_(event.globalPos())
         event.accept()
-        
+
     def _canvasContextMenu(self):
         """Returns a contextMenu for the canvas
 
@@ -2047,7 +2144,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         menu.addAction(self._setCurvesTitleAction)
         menu.addSeparator()
 
-        scalesSubMenu=menu.addMenu("&Scales")
+        scalesSubMenu = menu.addMenu("&Scales")
         scalesSubMenu.addAction(self._autoscaleAllAxisAction)
         scalesSubMenu.addSeparator()
         for axis in (Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.yLeft, Qwt5.QwtPlot.yRight):
@@ -2061,7 +2158,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         menu.addAction(self._dataInspectorAction)
 
         menu.addSeparator()
-        exportSubMenu=menu.addMenu("&Export && Print")
+        exportSubMenu = menu.addMenu("&Export && Print")
         menu.addAction(self._curveStatsAction)
         exportSubMenu.addAction(self._printAction)
         exportSubMenu.addAction(self._exportPdfAction)
@@ -2069,13 +2166,13 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         menu.addSeparator()
         menu.addAction(self._pauseAction)
-        
+
         if self.isWindow():
             menu.addAction(self._closeWindowAction)
 
         return menu
 
-    def _axisContextMenu(self,axis=None):
+    def _axisContextMenu(self, axis=None):
         '''Returns a context menu for the given axis
 
         :param axis: (Qwt5.QwtPlot.Axis) the axis
@@ -2084,29 +2181,33 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         menu = Qt.QMenu(self)
         axisname = self.getAxisName(axis)
-        menu.setTitle("Options for axis %s"%axisname)
+        menu.setTitle("Options for axis %s" % axisname)
 
-        autoScaleThisAxis = lambda : self.setAxisAutoScale(axis=axis)
-        autoscaleAction= menu.addAction("AutoScale %s"%axisname)
-        self.connect(autoscaleAction, Qt.SIGNAL("triggered()"), autoScaleThisAxis)
+        autoScaleThisAxis = lambda: self.setAxisAutoScale(axis=axis)
+        autoscaleAction = menu.addAction("AutoScale %s" % axisname)
+        autoscaleAction.triggered[()].connect(autoScaleThisAxis)
 
         if not self.getXIsTime():
-            switchThisAxis = lambda : self.setAxisScaleType(axis=axis, scale=None)
-            switchThisAxisAction= menu.addAction("Toggle linear/log for %s"%axisname)
-            self.connect(switchThisAxisAction, Qt.SIGNAL("triggered()"), switchThisAxis)
+            switchThisAxis = lambda: self.setAxisScaleType(
+                axis=axis, scale=None)
+            switchThisAxisAction = menu.addAction(
+                "Toggle linear/log for %s" % axisname)
+            switchThisAxisAction.triggered[()].connect(switchThisAxis)
 
         if axis in (Qwt5.QwtPlot.yLeft, Qwt5.QwtPlot.yRight):
-            zoomOnThisAxis = lambda : self.toggleZoomer(axis=axis)
-            zoomOnThisAxisAction= menu.addAction("Zoom-to-region acts on %s"%axisname)
-            self.connect(zoomOnThisAxisAction, Qt.SIGNAL("triggered()"), zoomOnThisAxis)
+            zoomOnThisAxis = lambda: self.toggleZoomer(axis=axis)
+            zoomOnThisAxisAction = menu.addAction(
+                "Zoom-to-region acts on %s" % axisname)
+            zoomOnThisAxisAction.triggered[()].connect(zoomOnThisAxis)
 
         elif axis in (Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.xTop):
             if self.isXDynScaleSupported():
-                xDynAction=menu.addAction("&Auto-scroll %s"%axisname)
-                xDynAction.setToolTip('If enabled, the scale of %s will be autoadjusted to provide a fixed window moving to show always the last value')
+                xDynAction = menu.addAction("&Auto-scroll %s" % axisname)
+                xDynAction.setToolTip(
+                    'If enabled, the scale of %s will be autoadjusted to provide a fixed window moving to show always the last value')
                 xDynAction.setCheckable(True)
                 xDynAction.setChecked(self.getXDynScale())
-                self.connect(xDynAction, Qt.SIGNAL("toggled(bool)"), self.setXDynScale)
+                xDynAction.toggled.connect(self.setXDynScale)
         return menu
 
     def showConfigDialog(self):
@@ -2115,7 +2216,8 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         """
         self._configDialog = TaurusPlotConfigDialog(self)
         self._configDialog.exec_()
-        del self._configDialog #destroy the dialog (it may probably not be used anymore)
+        # destroy the dialog (it may probably not be used anymore)
+        del self._configDialog
 
     def getCurveAppearancePropertiesDict(self):
         '''Returns the appearance properties of all curves in the plot.
@@ -2128,9 +2230,9 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         self.curves_lock.acquire()
         try:
-            propdict={}
-            for name,curve in self.curves.iteritems():
-                propdict[name]=copy.deepcopy(curve.getAppearanceProperties())
+            propdict = {}
+            for name, curve in self.curves.iteritems():
+                propdict[name] = copy.deepcopy(curve.getAppearanceProperties())
         finally:
             self.curves_lock.release()
         return propdict
@@ -2147,18 +2249,18 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         """
         self.curves_lock.acquire()
         try:
-            for name,prop in propDict.iteritems():
+            for name, prop in propDict.iteritems():
                 c = self.curves[name]
                 c.setAppearanceProperties(copy.deepcopy(prop))
-                visible = getattr(prop,'visible',True)
-                if visible is not None: 
+                visible = getattr(prop, 'visible', True)
+                if visible is not None:
                     self.showCurve(c, visible)
         finally:
             self.curves_lock.release()
         self.autoShowYAxes()
         self.replot()
 
-    def onCurveAppearanceChanged(self,prop,names):
+    def onCurveAppearanceChanged(self, prop, names):
         """Applies the properties given in prop to all the curves named in names.
         This functions is called from the config dialog when changes are applied.
 
@@ -2166,8 +2268,9 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         :param names: (sequence<str>) a sequence of names of curves to which the
                       properties should be applied
         """
-        propDict={}
-        for name in names: propDict[name]=prop
+        propDict = {}
+        for name in names:
+            propDict[name] = prop
         self.setCurveAppearanceProperties(propDict)
 
     def _createAxesDict(self):
@@ -2175,16 +2278,16 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         :return: (dict) Configurations that can be loaded with applyAxesConfig
         '''
-        xMin, xMax= self.getAxisScale(Qwt5.QwtPlot.xBottom)
-        y1Min, y1Max= self.getAxisScale(Qwt5.QwtPlot.yLeft)
-        y2Min, y2Max= self.getAxisScale(Qwt5.QwtPlot.yRight)
-        axesdict= {'xMin': xMin, 'xMax': xMax, 'y1Min': y1Min, 'y1Max': y1Max, 'y2Min': y2Min, 'y2Max': y2Max,
-                   'xMode': int(self.getAxisTransformationType(Qwt5.QwtPlot.xBottom)),
-                   'y1Mode':int(self.getAxisTransformationType(Qwt5.QwtPlot.yLeft)),
-                   'y2Mode':int(self.getAxisTransformationType(Qwt5.QwtPlot.yRight)),
-                   'xDyn': self.getXDynScale(),
-                   'xIsTime':self.getXIsTime()
-                   }
+        xMin, xMax = self.getAxisScale(Qwt5.QwtPlot.xBottom)
+        y1Min, y1Max = self.getAxisScale(Qwt5.QwtPlot.yLeft)
+        y2Min, y2Max = self.getAxisScale(Qwt5.QwtPlot.yRight)
+        axesdict = {'xMin': xMin, 'xMax': xMax, 'y1Min': y1Min, 'y1Max': y1Max, 'y2Min': y2Min, 'y2Max': y2Max,
+                    'xMode': int(self.getAxisTransformationType(Qwt5.QwtPlot.xBottom)),
+                    'y1Mode': int(self.getAxisTransformationType(Qwt5.QwtPlot.yLeft)),
+                    'y2Mode': int(self.getAxisTransformationType(Qwt5.QwtPlot.yRight)),
+                    'xDyn': self.getXDynScale(),
+                    'xIsTime': self.getXIsTime()
+                    }
         return axesdict
 
     def _createMiscDict(self):
@@ -2192,10 +2295,10 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         :return: (dict) configurations that can be loaded with applyMiscConfig
         '''
-        miscdict= {'defaultCurvesTitle':self.getDefaultCurvesTitle(),
-                   'canvasBackground':self.canvasBackground(),
-                   'orderedCurveNames': self.getCurveNamesSorted(),
-                   'plotTitle': unicode(self.title().text())}
+        miscdict = {'defaultCurvesTitle': self.getDefaultCurvesTitle(),
+                    'canvasBackground': self.canvasBackground(),
+                    'orderedCurveNames': self.getCurveNamesSorted(),
+                    'plotTitle': unicode(self.title().text())}
         return miscdict
 
     def checkConfigVersion(self, configdict, showDialog=False, supportedVersions=None):
@@ -2214,17 +2317,22 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         .. seealso:: :meth:`TaurusBaseComponent.checkConfigVersion`
         '''
-        if supportedVersions is None: supportedVersions = self._supportedConfigVersions
-        version = configdict.get("ConfigVersion","__UNVERSIONED__")
+        if supportedVersions is None:
+            supportedVersions = self._supportedConfigVersions
+        version = configdict.get("ConfigVersion", "__UNVERSIONED__")
         if version not in supportedVersions:
-            msg = 'Unsupported Config Version %s. (Supported: %s)'%(version, repr(supportedVersions))
+            msg = 'Unsupported Config Version %s. (Supported: %s)' % (
+                version, repr(supportedVersions))
             self.warning(msg)
-            if showDialog: Qt.QMessageBox.warning(self, "Wrong Configuration Version", msg, Qt.QMessageBox.Ok)
+            if showDialog:
+                Qt.QMessageBox.warning(
+                    self, "Wrong Configuration Version", msg, Qt.QMessageBox.Ok)
             return False
         return True
 
     def createConfigDict(self, allowUnpickable=False, curvenames=None):
-        self.info("Deprecation warning: createConfigDict is deprecated. Please use createConfig instead")
+        self.info(
+            "Deprecation warning: createConfigDict is deprecated. Please use createConfig instead")
         return self.createConfig(allowUnpickable=False, curvenames=None)
 
     def createConfig(self, allowUnpickable=False, curvenames=None, **kwargs):
@@ -2256,24 +2364,27 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         miscdict = self._createMiscDict()
         self.curves_lock.acquire()
         try:
-            if curvenames is None: curvenames=self.curves.keys()
+            if curvenames is None:
+                curvenames = self.curves.keys()
+            curvenames = self._lowerIfInsensitive(curvenames)
             for name in curvenames:
                 curve = self.curves.get(name)
-                propdict[name]=copy.deepcopy(curve.getAppearanceProperties())
+                propdict[name] = copy.deepcopy(curve.getAppearanceProperties())
                 if curve.isRawData:
-                    rawdatadict[name]=curve.getRawData()
+                    rawdatadict[name] = curve.getRawData()
                 else:
-                    tangodict[name]=curve.getModel()
-        except Exception,e:
-            self.error('Exception while gathering curves configuration info'+str(e))
+                    tangodict[name] = curve.getModel()
+        except Exception, e:
+            self.error(
+                'Exception while gathering curves configuration info' + str(e))
         finally:
             self.curves_lock.release()
         curvenames = CaselessList(curvenames)
         model = CaselessList([m for m in self.getModel() if m in curvenames])
-        configdict={"Axes":axesdict, "Misc":miscdict, "RawData":rawdatadict,
-                    "TangoCurves":tangodict, "CurveProp":propdict,
-                    "ConfigVersion":self._supportedConfigVersions[-1],
-                    "model":model}
+        configdict = {"Axes": axesdict, "Misc": miscdict, "RawData": rawdatadict,
+                      "TangoCurves": tangodict, "CurveProp": propdict,
+                      "ConfigVersion": self._supportedConfigVersions[-1],
+                      "model": model}
         return configdict
 
     def applyConfig(self, configdict, **kwargs):
@@ -2283,17 +2394,21 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         .. seealso:: :meth:`createConfig`, :meth:`TaurusBaseComponent.applyConfig`
         """
-        if not self.checkConfigVersion(configdict): return
-        #attach the curves
-        for rd in configdict["RawData"].values(): self.attachRawData(rd)
-        models = configdict.get("model", configdict["TangoCurves"].values()) #for backwards compatibility, if the ordered list of models is not stored, it uses the unsorted dict values
+        if not self.checkConfigVersion(configdict):
+            return
+        # attach the curves
+        for rd in configdict["RawData"].values():
+            self.attachRawData(rd)
+        # for backwards compatibility, if the ordered list of models is not
+        # stored, it uses the unsorted dict values
+        models = configdict.get("model", configdict["TangoCurves"].values())
         self.addModels(models)
-        #set curve properties
+        # set curve properties
         self.setCurveAppearanceProperties(configdict["CurveProp"])
         self.updateLegend(force=True)
-        #set the axes
+        # set the axes
         self.applyAxesConfig(configdict["Axes"])
-        #set other misc configurations
+        # set other misc configurations
         self.applyMiscConfig(configdict["Misc"])
 
     def applyMiscConfig(self, miscdict):
@@ -2305,12 +2420,13 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         self.setDefaultCurvesTitle(miscdict["defaultCurvesTitle"])
         self.setCanvasBackground(miscdict["canvasBackground"])
         self.sortCurves(ordered=miscdict.get("orderedCurveNames", None))
-        if "plotTitle" in miscdict: self.setTitle(miscdict['plotTitle'])
+        if "plotTitle" in miscdict:
+            self.setTitle(miscdict['plotTitle'])
 
     def applyAxesConfig(self, axes):
         '''sets the axes according to settings stored in the axes dict,
         which can be generated with _createAxesDict()
-        
+
         :param axes: (dict) contains axes properties
         '''
         self.setXIsTime(axes["xIsTime"])
@@ -2335,11 +2451,14 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         """
         import cPickle as pickle
         if ofile is None:
-            ofile = str(Qt.QFileDialog.getSaveFileName( self, 'Save Taurusplot Configuration', 'TaurusplotConfig.pck', 'TaurusPlot Curve Properties File (*.pck)'))
-            if not ofile: return
-        if not isinstance(ofile,file): ofile=open(ofile,'w')
-        configdict=self.createConfig(curvenames=curvenames)
-        self.info("Saving current settings in '%s'"%ofile.name)
+            ofile = str(Qt.QFileDialog.getSaveFileName(self, 'Save Taurusplot Configuration',
+                                                       'TaurusplotConfig.pck', 'TaurusPlot Curve Properties File (*.pck)'))
+            if not ofile:
+                return
+        if not isinstance(ofile, file):
+            ofile = open(ofile, 'w')
+        configdict = self.createConfig(curvenames=curvenames)
+        self.info("Saving current settings in '%s'" % ofile.name)
         pickle.dump(configdict, ofile)
         return ofile.name
 
@@ -2352,10 +2471,13 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         """
         import cPickle as pickle
         if ifile is None:
-            ifile = str(Qt.QFileDialog.getOpenFileName( self, 'Load Taurusplot Configuration', '', 'TaurusPlot Curve Properties File (*.pck)'))
-            if not ifile: return
-        if not isinstance(ifile,file): ifile=open(ifile,'r')
-        configdict=pickle.load(ifile)
+            ifile = str(Qt.QFileDialog.getOpenFileName(
+                self, 'Load Taurusplot Configuration', '', 'TaurusPlot Curve Properties File (*.pck)'))
+            if not ifile:
+                return
+        if not isinstance(ifile, file):
+            ifile = open(ifile, 'r')
+        configdict = pickle.load(ifile)
         self.applyConfig(configdict)
         return ifile.name
 
@@ -2363,15 +2485,15 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''propagates a list of taurus filters to the curves given by curvenames.
         See :meth:`TaurusBaseComponent.setEventFilters`
         '''
-        if curvenames is None: curvenames=self.curves.keys()
+        if curvenames is None:
+            curvenames = self.curves.keys()
         self.curves_lock.acquire()
         try:
-            for name in curvenames: 
+            for name in curvenames:
                 self.curves[name].setEventFilters(filters, preqt=preqt)
         finally:
             self.curves_lock.release()
 
-
     def setAxisAutoScale(self, axis):
         """Sets the axis to autoscale and resets the zoomer for that axis if needed
 
@@ -2380,39 +2502,40 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         .. seealso:: :meth:`autoScaleAllAxes`
         """
         Qwt5.QwtPlot.setAxisAutoScale(self, axis)
-        for z in self.getZoomers(axis): z.setZoomBase()
+        for z in self.getZoomers(axis):
+            z.setZoomBase()
         self.replot()
 
-
     def autoScaleAllAxes(self):
         '''Optimized autoscale of whole plot'''
-        minX=float('inf')
-        maxX=float('-inf')
+        minX = float('inf')
+        maxX = float('-inf')
         if self.getXDynScale():
             originalXRange = self.getXAxisRange()
             self.curves_lock.acquire()
             try:
                 for c in self.curves.values():
-                    if c.minXValue() < minX: 
+                    if c.minXValue() < minX:
                         minX = c.minXValue()
-                    if c.maxXValue() > maxX: 
+                    if c.maxXValue() > maxX:
                         maxX = c.maxXValue()
-                    if minX!=maxX:
+                    if minX != maxX:
                         break
             finally:
                 self.curves_lock.release()
-                         
+
         for axis in range(Qwt5.QwtPlot.axisCnt):
-            if axis == Qwt5.QwtPlot.xBottom and minX==maxX:
-                Qwt5.QwtPlot.setAxisScale(self, axis, minX-0.5*originalXRange, minX+0.5*originalXRange)
+            if axis == Qwt5.QwtPlot.xBottom and minX == maxX:
+                Qwt5.QwtPlot.setAxisScale(
+                    self, axis, minX - 0.5 * originalXRange, minX + 0.5 * originalXRange)
             else:
                 Qwt5.QwtPlot.setAxisAutoScale(self, axis)
         self.replot()
-        #Update the zoom stacks
+        # Update the zoom stacks
         self._zoomer1.setZoomBase()
         self._zoomer2.setZoomBase()
 
-    def setAxisScale(self,axis,min,max):
+    def setAxisScale(self, axis, min, max):
         """Rescales the given axis to the range defined by min and max. If min
         and max are None, autoscales. It also takes care of resetting the
         affected zoomer(s)
@@ -2433,7 +2556,8 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         else:
             Qwt5.QwtPlot.setAxisScale(self, axis, min, max)
             self.replot()
-        for z in self.getZoomers(axis): z.setZoomBase()
+        for z in self.getZoomers(axis):
+            z.setZoomBase()
 
     def getAxisScale(self, axis):
         """returns the lower and higher bounds for the given axis, or None,None
@@ -2443,10 +2567,11 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         :return: (float,float) atuple of floats (or None,None)
         """
-        if self.axisAutoScale(axis): return None,None
+        if self.axisAutoScale(axis):
+            return None, None
         return self.axisScaleDiv(axis).lowerBound(), self.axisScaleDiv(axis).upperBound()
 
-    def getXAxisRange(self,axis=Qwt5.QwtPlot.xBottom):
+    def getXAxisRange(self, axis=Qwt5.QwtPlot.xBottom):
         '''same as self.axisScaleDiv(axis).range()
 
         :param axis: (Qwt5.QwtPlot.Axis) the (X) axis. (default=Qwt5.QwtPlot.xBottom)
@@ -2462,17 +2587,18 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         :param axis: (Qwt5.QwtPlot.Axis) the axis
         :param scale: (Qwt5.QwtScaleTransformation.Type) the scale
                       transformation. For convenience, the strings "Linear"
-                      and "Log" can be used as well'''
-                      
+                      and "Logarithmic" can be used as well'''
+
         if self.getXIsTime() and isinstance(self.axisScaleEngine(axis), DateTimeScaleEngine):
-            raise ValueError('TaurusPlot.setAxisScaleType cannot be called with time scales') 
+            raise ValueError(
+                'TaurusPlot.setAxisScaleType cannot be called with time scales')
         if not Qwt5.QwtPlot.axisValid(axis):
             self.error("TaurusPlot.setScale() invalid axis: " + axis)
         if scale is None:
             currentType = self.getAxisTransformationType(axis)
             if currentType == Qwt5.QwtScaleTransformation.Linear:
                 scale = Qwt5.QwtScaleTransformation.Log10
-            elif  currentType == Qwt5.QwtScaleTransformation.Log10:
+            elif currentType == Qwt5.QwtScaleTransformation.Log10:
                 scale = Qwt5.QwtScaleTransformation.Linear
 
         if scale in ("Linear", Qwt5.QwtScaleTransformation.Linear, int(Qwt5.QwtScaleTransformation.Linear)):
@@ -2480,13 +2606,15 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         elif scale in ("Logarithmic", Qwt5.QwtScaleTransformation.Log10, int(Qwt5.QwtScaleTransformation.Log10)):
             newScale = Qwt5.QwtLog10ScaleEngine()
         else:
-            self.error("TaurusPlot.setAxisScaleType() invalid scale: %s"%str(scale))
+            self.error(
+                "TaurusPlot.setAxisScaleType() invalid scale: %s" % str(scale))
             return
-        self.setAxisScaleEngine(axis,newScale)
-        #update the data in the curves (because of the filtering done for possitive values in log mode)
+        self.setAxisScaleEngine(axis, newScale)
+        # update the data in the curves (because of the filtering done for
+        # possitive values in log mode)
         self.__updateCurvesData()
         return
-    
+
     def axisScaleDiv(self, axis):
         """ Return the scale division of a specified axis.
 
@@ -2495,7 +2623,8 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         :return: (Qwt5.QwtScaleDiv) scale division
         """
         div = Qwt5.QwtPlot.axisScaleDiv(self, axis)
-        if Qwt5.QWT_VERSION < 0x050200: #fix compatibility issue with Qwt < 5.2 (contributed by A. Persson)
+        # fix compatibility issue with Qwt < 5.2 (contributed by A. Persson)
+        if Qwt5.QWT_VERSION < 0x050200:
             div.lowerBound = div.lBound
             div.upperBound = div.hBound
         return div
@@ -2510,7 +2639,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
             self.curves_lock.release()
         self.replot()
 
-    def exportPdf(self,fileName=None):
+    def exportPdf(self, fileName=None):
         """Export the plot to a PDF. slot for the _exportPdfAction.
 
         :param fileName: (str) The name of the file to which the plot will be
@@ -2518,17 +2647,19 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                          a file name.
         """
         if fileName is None:
-            fileName = Qt.QFileDialog.getSaveFileName( self, 'Export File Name', 'plot.pdf', 'PDF Documents (*.pdf)')
+            fileName = Qt.QFileDialog.getSaveFileName(
+                self, 'Export File Name', 'plot.pdf', 'PDF Documents (*.pdf)')
         fileName = str(fileName)
         if fileName:
             try:
-                f = open(fileName,'w') #check if the file is actually writable
+                # check if the file is actually writable
+                f = open(fileName, 'w')
                 f.close()
             except:
-                self.error("Can't write to '%s'"%fileName)
+                self.error("Can't write to '%s'" % fileName)
                 Qt.QMessageBox.warning(self, "File Error",
-                                       "Can't write to\n'%s'"%fileName,
-                                        Qt.QMessageBox.Ok)
+                                       "Can't write to\n'%s'" % fileName,
+                                       Qt.QMessageBox.Ok)
                 return
             printer = Qt.QPrinter()
             printer.setOutputFormat(Qt.QPrinter.PdfFormat)
@@ -2537,7 +2668,6 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
             printer.setCreator('TaurusPlot')
             self.print_(printer)
 
-
     def exportPrint(self):
         '''Launches a QPrintDialog for printing the plot'''
         printer = Qt.QPrinter(Qt.QPrinter.HighResolution)
@@ -2554,11 +2684,11 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
             filter = Qwt5.QwtPlotPrintFilter()
             if (Qt.QPrinter.GrayScale == printer.colorMode()):
                 filter.setOptions(Qwt5.QwtPlotPrintFilter.PrintAll
-                                 & ~Qwt5.QwtPlotPrintFilter.PrintBackground
-                                 | Qwt5.QwtPlotPrintFilter.PrintFrameWithScales)
+                                  & ~Qwt5.QwtPlotPrintFilter.PrintBackground
+                                  | Qwt5.QwtPlotPrintFilter.PrintFrameWithScales)
             self.print_(printer, filter)
 
-    def exportAscii(self,curves=None):
+    def exportAscii(self, curves=None):
         '''Opens a dialog for exporting curves to ASCII files.
 
         :param curves:  (sequence<str>) the curves curves that will be
@@ -2569,16 +2699,16 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         try:
             if curves is None:
                 curves = self.getCurveNamesSorted()
-            frozendata={}
+            frozendata = {}
             for k in curves:
-                frozendata[k]=self.getCurveData(k)
+                frozendata[k] = self.getCurveData(k)
         finally:
             self.curves_lock.release()
-        klass = getattr(self,'exportDlgClass', None)
+        klass = getattr(self, 'exportDlgClass', None)
         if klass is None:
             from taurus.qt.qtgui.panel import QDataExportDialog
             klass = QDataExportDialog
-        dialog = klass(parent=self, datadict=frozendata, 
+        dialog = klass(parent=self, datadict=frozendata,
                        sortedNames=curves)
         dialog.setXIsTime(self.getXIsTime())
         return dialog.exec_()
@@ -2613,29 +2743,33 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         .. seealso:: :meth:`numpy.loadtxt`
         '''
         if filenames is None:
-            filenames = Qt.QFileDialog.getOpenFileNames( self, 'Choose input files', '', 'Ascii file (*)')
-        if not filenames: return False
-        rawdata={}
+            filenames = Qt.QFileDialog.getOpenFileNames(
+                self, 'Choose input files', '', 'Ascii file (*)')
+        if not filenames:
+            return False
+        rawdata = {}
         for fname in filenames:
-            fname=str(fname)
+            fname = str(fname)
             if self.xIsTime and xcol is not None:
-                converters = kwargs.get('converters',{})
+                converters = kwargs.get('converters', {})
                 converters[xcol] = isodatestr2float
-                kwargs['converters']=converters
-            M=numpy.loadtxt(fname, **kwargs)
-            if len(M.shape)==1:M = M.reshape(M.size, 1) #make sure we are dealing with a 2D matrix even if it is just a colum
+                kwargs['converters'] = converters
+            M = numpy.loadtxt(fname, **kwargs)
+            if len(M.shape) == 1:
+                # make sure we are dealing with a 2D matrix even if it is just
+                # a colum
+                M = M.reshape(M.size, 1)
             if xcol is None:
-                rawdata["x"]=None
+                rawdata["x"] = None
             else:
-                rawdata["x"]=M[:,xcol]
+                rawdata["x"] = M[:, xcol]
 
             for col in xrange(M.shape[1]):
-                if col==xcol: continue #ignore the xcol (it has already been set)
-                rawdata["y"]=M[:,col]
-                rawdata["title"]="%s[%i]"%(os.path.basename(fname),col)
+                if col == xcol:
+                    continue  # ignore the xcol (it has already been set)
+                rawdata["y"] = M[:, col]
+                rawdata["title"] = "%s[%i]" % (os.path.basename(fname), col)
                 self.attachRawData(copy.deepcopy(rawdata))
-    
-    
 
     def showDataImportDlg(self):
         '''Launches the data import dialog. This dialog lets the user manage
@@ -2646,30 +2780,33 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         if self.DataImportDlg is None:
             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.taurusbasetypes.TaurusElementType.Attribute])
+            self.DataImportDlg.setWindowTitle(
+                "%s - Import Data" % (str(self.windowTitle())))
+            self.DataImportDlg.modelChooser = TaurusModelChooser(
+                selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute])
             from taurus.qt.qtgui.panel import QRawDataWidget
             self.DataImportDlg.rawDataChooser = QRawDataWidget()
 
-            tabs=Qt.QTabWidget()
+            tabs = Qt.QTabWidget()
             tabs.addTab(self.DataImportDlg.modelChooser, "&Attributes")
             tabs.addTab(self.DataImportDlg.rawDataChooser, "&Raw Data")
-            mainlayout=Qt.QVBoxLayout(self.DataImportDlg)
+            mainlayout = Qt.QVBoxLayout(self.DataImportDlg)
             mainlayout.addWidget(tabs)
 
-            self.connect(self.DataImportDlg.modelChooser, Qt.SIGNAL("updateModels"), self.setModel)
-            self.connect(self.DataImportDlg.rawDataChooser, Qt.SIGNAL("ReadFromFiles"), self.readFromFiles)
-            self.connect(self.DataImportDlg.rawDataChooser, Qt.SIGNAL("AddCurve"), self.attachRawData)
+            self.DataImportDlg.modelChooser.updateModels.connect(self.setModel)
+            self.DataImportDlg.rawDataChooser.ReadFromFiles.connect(self.readFromFiles)
+            self.DataImportDlg.rawDataChooser.AddCurve.connect(self.attachRawData)
+
+        models_and_display = [(m, self.getCurveTitle(
+            m.split('|')[-1])) for m in self._modelNames]
 
-        models_and_display = [(m,self.getCurveTitle(m.split('|')[-1])) for m in self._modelNames]
-        
         self.DataImportDlg.modelChooser.setListedModels(models_and_display)
         self.DataImportDlg.show()
 
     def readFromFiles(self, xcol, skiprows):
         '''helper slot. Calls self.importAscii(xcol=xcol, skiprows=skiprows )
         See meth:`importAscii`'''
-        self.importAscii(xcol=xcol, skiprows=skiprows )
+        self.importAscii(xcol=xcol, skiprows=skiprows)
 
     def isXDynScaleSupported(self):
         '''Whether this widget offers xDynScale-related options. Useful for
@@ -2703,7 +2840,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                         X axis. Otherwise it is disabled. (Default=True)
 
         .. seealso:: :meth:`getXDynScale`, :meth:`setXDynScaleSupported`'''
-        self._xDynScale=enabled
+        self._xDynScale = enabled
 
     def getXDynScale(self):
         '''Whether the current X scale is in Dynamic scaling mode
@@ -2722,7 +2859,8 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         :param axis: (Qwt5.QwtPlot.Axis) the axis
         """
         if not Qwt5.QwtPlot.axisValid(axis):
-            raise ValueError, "TaurusPlot::setCurvesYAxis. Invalid axis ID: " + repr(axis)
+            raise ValueError, "TaurusPlot::setCurvesYAxis. Invalid axis ID: " + \
+                repr(axis)
         self.curves_lock.acquire()
         try:
             for curveName in curvesNamesList:
@@ -2734,13 +2872,13 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         finally:
             self.curves_lock.release()
 
-        #disable the other axis if no curves are assigned to it
+        # disable the other axis if no curves are assigned to it
         self.autoShowYAxes()
-        #change the axis of the picked marker if needed
+        # change the axis of the picked marker if needed
         if self._pickedCurveName in curvesNamesList:
             self._pickedMarker.setYAxis(axis)
 
-        self.emit(Qt.SIGNAL('CurvesYAxisChanged'),curvesNamesList,axis)
+        self.CurvesYAxisChanged.emit(curvesNamesList, axis)
 
         self.replot()
 
@@ -2749,20 +2887,22 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         associated to them. Also takes care of changing the zoomer if needed"""
         self.curves_lock.acquire()
         try:
-            #get a list of *unique* axes with visible curves attached
-            axes=list(set([curve.yAxis() for curve in self.curves.itervalues() if curve.isVisible()]))
-
-            n=len(axes)
-            if n==0:
-                self.enableAxis(Qwt5.QwtPlot.yLeft,False)
-                self.enableAxis(Qwt5.QwtPlot.yRight,False)
-            elif n==1:
+            # get a list of *unique* axes with visible curves attached
+            axes = list(
+                set([curve.yAxis() for curve in self.curves.itervalues() if curve.isVisible()]))
+
+            n = len(axes)
+            if n == 0:
+                self.enableAxis(Qwt5.QwtPlot.yLeft, False)
+                self.enableAxis(Qwt5.QwtPlot.yRight, False)
+            elif n == 1:
                 for axis in [Qwt5.QwtPlot.yLeft, Qwt5.QwtPlot.yRight]:
-                    self.enableAxis(axis,(axis==axes[0]))
-                self.toggleZoomer(axes[0]) #enable the zoom of the axis that has contents
+                    self.enableAxis(axis, (axis == axes[0]))
+                # enable the zoom of the axis that has contents
+                self.toggleZoomer(axes[0])
             else:
-                self.enableAxis(Qwt5.QwtPlot.yLeft,True)
-                self.enableAxis(Qwt5.QwtPlot.yRight,True)
+                self.enableAxis(Qwt5.QwtPlot.yLeft, True)
+                self.enableAxis(Qwt5.QwtPlot.yRight, True)
         finally:
             self.curves_lock.release()
 
@@ -2797,30 +2937,35 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                  the picked point in the curve data. If no point was found
                  within the scope, it returns None,None,None
         '''
-        if isinstance(pos,Qt.QPolygon):pos=pos.first()
-        scopeRect=Qt.QRect(0,0,scope,scope)
+        if isinstance(pos, Qt.QPolygon):
+            pos = pos.first()
+        scopeRect = Qt.QRect(0, 0, scope, scope)
         scopeRect.moveCenter(pos)
-        mindist=scope
-        picked=None
-        pickedCurveName=None
-        pickedIndex=None
+        mindist = scope
+        picked = None
+        pickedCurveName = None
+        pickedIndex = None
         self.curves_lock.acquire()
         try:
-            if targetCurveNames is None: targetCurveNames = self.curves.iterkeys()
+            if targetCurveNames is None:
+                targetCurveNames = self.curves.iterkeys()
             for name in targetCurveNames:
                 curve = self.curves.get(name, None)
-                if curve is None: self.error("Curve '%s' not found"%name)
-                if not curve.isVisible(): continue
-                data=curve.data()
+                if curve is None:
+                    self.error("Curve '%s' not found" % name)
+                if not curve.isVisible():
+                    continue
+                data = curve.data()
                 for i in xrange(data.size()):
-                    point=Qt.QPoint(self.transform(curve.xAxis(),data.x(i)) , self.transform(curve.yAxis(),data.y(i)))
+                    point = Qt.QPoint(self.transform(curve.xAxis(), data.x(
+                        i)), self.transform(curve.yAxis(), data.y(i)))
                     if scopeRect.contains(point):
-                        dist=(pos-point).manhattanLength()
+                        dist = (pos - point).manhattanLength()
                         if dist < mindist:
-                            mindist=dist
-                            picked = Qt.QPointF(data.x(i),data.y(i))
-                            pickedCurveName=name
-                            pickedIndex=i
+                            mindist = dist
+                            picked = Qt.QPointF(data.x(i), data.y(i))
+                            pickedCurveName = name
+                            pickedIndex = i
                             pickedAxes = curve.xAxis(), curve.yAxis()
         finally:
             self.curves_lock.release()
@@ -2830,32 +2975,36 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
             self._pickedMarker.setValue(picked)
             self._pickedMarker.setAxis(*pickedAxes)
             self._pickedMarker.attach(self)
-            self._pickedCurveName=pickedCurveName
-            self._pickedMarker.pickedIndex=pickedIndex
+            self._pickedCurveName = pickedCurveName
+            self._pickedMarker.pickedIndex = pickedIndex
             pickedCurveTitle = self.getCurveTitle(pickedCurveName)
             self.replot()
-            label=self._pickedMarker.label()
+            label = self._pickedMarker.label()
             if self.getXIsTime():
-                infotxt = "'%s'[%i]:\n\t (t=%s, y=%.5g)"%(pickedCurveTitle,pickedIndex,datetime.fromtimestamp(picked.x()).ctime(),picked.y())
+                infotxt = "'%s'[%i]:\n\t (t=%s, y=%.5g)" % (
+                    pickedCurveTitle, pickedIndex, datetime.fromtimestamp(picked.x()).ctime(), picked.y())
             else:
-                infotxt = "'%s'[%i]:\n\t (x=%.5g, y=%.5g)"%(pickedCurveTitle,pickedIndex,picked.x(),picked.y())
+                infotxt = "'%s'[%i]:\n\t (x=%.5g, y=%.5g)" % (
+                    pickedCurveTitle, pickedIndex, picked.x(), picked.y())
             label.setText(infotxt)
-            fits = label.textSize().width()<self.size().width()
+            fits = label.textSize().width() < self.size().width()
             if fits:
-                self._pickedMarker.setLabel(Qwt5.QwtText (label))
+                self._pickedMarker.setLabel(Qwt5.QwtText(label))
                 self._pickedMarker.alignLabel()
                 self.replot()
             else:
                 popup = Qt.QWidget(self, Qt.Qt.Popup)
                 popup.setLayout(Qt.QVBoxLayout())
-                popup.layout().addWidget(Qt.QLabel(infotxt))  #@todo: make the widget background semitransparent green!
+                # @todo: make the widget background semitransparent green!
+                popup.layout().addWidget(Qt.QLabel(infotxt))
                 popup.setWindowOpacity(self._pickedMarker.labelOpacity)
                 popup.show()
-                popup.move(self.pos().x()-popup.size().width(),self.pos().y() )
+                popup.move(self.pos().x() -
+                           popup.size().width(), self.pos().y())
                 popup.move(self.pos())
                 Qt.QTimer.singleShot(5000, popup.hide)
-                
-        return picked,pickedCurveName,pickedIndex
+
+        return picked, pickedCurveName, pickedIndex
 
     def toggleDataInspectorMode(self, enable=None):
         ''' Enables/Disables the Inspector Mode. When "Inspector Mode" is
@@ -2871,45 +3020,47 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                  disabled (False)
         '''
         if enable is None:
-            enable=not(self._inspectorMode)
+            enable = not(self._inspectorMode)
 
-        self._pointPicker.setEnabled(enable)#enables/disables the picker
-        self._zoomer.setEnabled(self._allowZoomers and not(enable)) #disables/enables the zoomers
+        self._pointPicker.setEnabled(enable)  # enables/disables the picker
+        self._zoomer.setEnabled(self._allowZoomers and not(
+            enable))  # disables/enables the zoomers
 
         if enable:
-            cursor=Qt.Qt.WhatsThisCursor
+            cursor = Qt.Qt.WhatsThisCursor
         else:
-            cursor=Qt.Qt.CrossCursor
-            self._pickedMarker.detach()#clears previous marker
+            cursor = Qt.Qt.CrossCursor
+            self._pickedMarker.detach()  # clears previous marker
             self.replot()
 
         self.canvas().setCursor(cursor)
-        self._inspectorMode=enable
+        self._inspectorMode = enable
 
         return self._inspectorMode
-        
+
     def onCurveStatsAction(self):
-        ''' 
-        slot for the curveStatsAction. Allows the user to select a range and 
-        then shows curve statistics on that range. 
         '''
-        if getattr(self, '_curveStatsDialog',None) is None:
+        slot for the curveStatsAction. Allows the user to select a range and
+        then shows curve statistics on that range.
+        '''
+        if getattr(self, '_curveStatsDialog', None) is None:
             from taurus.qt.qtgui.plot import CurveStatsDialog
             self._curveStatsDialog = CurveStatsDialog(self)
-            self.connect(self._curveStatsDialog, Qt.SIGNAL('closed'),self._onCurveStatsDialogClosed)
-            self.connect(self._curveStatsDialog, Qt.SIGNAL('finished(int)'),self._onCurveStatsDialogClosed)
+            self._curveStatsDialog.closed.connect(self._onCurveStatsDialogClosed)
+            self._curveStatsDialog.finished.connect(self._onCurveStatsDialogClosed)
         elif not self._curveStatsDialog.isVisible():
             self._curveStatsDialog.refreshCurves()
-        self._curveStatsAction.setEnabled(False) #it will be reenabed by _onCurveStatsDialogClosed
+        # it will be reenabed by _onCurveStatsDialogClosed
+        self._curveStatsAction.setEnabled(False)
         self._curveStatsDialog.show()
-        
+
     def _onCurveStatsDialogClosed(self, *args):
         '''slot called when the Curve Stats dialog is closed'''
         self._curveStatsAction.setEnabled(True)
-        
+
     def selectXRegion(self, axis=Qwt5.QwtPlot.xBottom, callback=None):
         '''Changes the input mode to allow the user to select a region of the X axis
-        
+
         :param axis: (Qwt5.QwtPlot.xBottom or Qwt5.QwtPlot.xTop) on which the
                      region will be defined (Default=Qwt5.QwtPlot.xBottom)
         :param callback: (method) a function that will be called when the user
@@ -2917,9 +3068,9 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                         nothing is done
         '''
         self.__xRegionCallback = callback
-        self._xRegionPicker.setAxis(axis,Qwt5.QwtPlot.yLeft)
+        self._xRegionPicker.setAxis(axis, Qwt5.QwtPlot.yLeft)
         self._beginXRegionMode()
-        
+
     def _onXRegionEvent(self, pos):
         '''slot called when the _xRegionPicker picks a point'''
         if self.__xRegionEnd is not None:
@@ -2935,15 +3086,16 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
             self.__xRegionEnd = x
             self.__xRegionEndMarker.setXValue(x)
             self.__xRegionEndMarker.attach(self)
-            
-            xmin,xmax = self.__xRegionStart,self.__xRegionEnd
-            if xmin>xmax: xmin,xmax = xmax,xmin
-            
-            self.__xRegionCallback((xmin,xmax))
-            
+
+            xmin, xmax = self.__xRegionStart, self.__xRegionEnd
+            if xmin > xmax:
+                xmin, xmax = xmax, xmin
+
+            self.__xRegionCallback((xmin, xmax))
+
             self.replot()
             self._endXRegionMode()
-            
+
     def _beginXRegionMode(self):
         '''pre-region selection tasks'''
         self.__xRegionStart = None
@@ -2954,11 +3106,11 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         self.__xRegionEndMarker = Qwt5.QwtPlotMarker()
         self.__xRegionEndMarker.setLineStyle(Qwt5.QwtPlotMarker.VLine)
         self.__xRegionEndMarker.setLinePen(Qt.QPen(Qt.Qt.green, 2))
-        
-        self._zoomer.setEnabled(False) #disables the zoomers
-        self.canvas().setCursor(Qt.Qt.SplitHCursor) 
-        self._xRegionPicker.setEnabled(True) 
-        
+
+        self._zoomer.setEnabled(False)  # disables the zoomers
+        self.canvas().setCursor(Qt.Qt.SplitHCursor)
+        self._xRegionPicker.setEnabled(True)
+
     def _endXRegionMode(self):
         '''post-region selection tasks'''
         self._xRegionPicker.setEnabled(False)
@@ -2967,32 +3119,32 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         self.__xRegionStartMarker.detach()
         self.__xRegionEndMarker.detach()
         self.replot()
-        
+
     def getCurveStats(self, limits=None, curveNames=None):
         '''Shows a dialog containing descriptive statistics on curves
-        
-        :param limits: (None or tuple<float,float>) tuple containing (min,max) limits. 
-                       Points of the curve whose abscisa value is outside of 
+
+        :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
         :param curveNames: (seq<str>) sequence of curve names for which
                            statistics are requested. If None passed (default), all curves are
                            considered
-                           
+
         :return: (dict) Returns a dictionary whose keys are the curve names and
                         whose values are the dictionaries returned by
                         :meth:`TaurusCurve.getStats`
         '''
-        if limits is not None and limits[0] is None and limits[1] is None: 
+        if limits is not None and limits[0] is None and limits[1] is None:
             limits = None
         if curveNames is None:
-            curveNames=self.getCurveNamesSorted()
-        
+            curveNames = self.getCurveNamesSorted()
+
         stats = {}
         self.curves_lock.acquire()
         try:
             for name in curveNames:
                 curve = self.curves.get(name, None)
-                stats[name] = curve.getStats(limits=limits)             
+                stats[name] = curve.getStats(limits=limits)
                 stats[name]['title'] = unicode(curve.title().text())
         finally:
             self.curves_lock.release()
@@ -3006,7 +3158,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
     # grid properties
     #-~-~-~-~-~-~-~-~-~-~-~-~
 
-    @Qt.pyqtSignature("setGridColor(QColor)")
+    @Qt.pyqtSlot('QColor')
     def setGridColor(self, color):
         '''Changes the color of the plot grid and refreshes the plot
 
@@ -3027,7 +3179,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''equivalent to self.setGridColor(Qt.Qt.gray)'''
         self.setGridColor(Qt.Qt.gray)
 
-    @Qt.pyqtSignature("setGridWidth(int)")
+    @Qt.pyqtSlot(int)
     def setGridWidth(self, width):
         '''Changes the width of the plot grid lines and refreshes the plot
 
@@ -3053,12 +3205,27 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
     #-~-~-~-~-~-~-~-~-~-~-~-~
     def _splitModel(self, modelNames):
         '''convert str to list if needed (commas and whitespace are considered as separators)'''
-        if isinstance(modelNames,(basestring,Qt.QString)): 
-            modelNames = str(modelNames).replace(',',' ')
+        if isinstance(modelNames, (basestring, Qt.QString)):
+            modelNames = str(modelNames).replace(',', ' ')
             modelNames = modelNames.split()
         return modelNames
-    
-    @Qt.pyqtSignature("setModel(QStringList)")
+
+    def _lowerIfInsensitive(self, modelNames):
+        """filter a model name list converting to lowercase the names belonging
+         to case-insensitive schemes"""
+        models = []
+        for m in modelNames:
+            scheme = getSchemeFromName(m)
+            # scan is not a scheme, but a "legacy" way in which Sardana plots
+            # the scan data comming from the door; as Tango scheme it is
+            # case insensitive
+            if scheme == "scan" or not taurus.Factory(scheme).caseSensitive:
+                models.append(str(m).lower())
+            else:
+                models.append(str(m))
+        return models
+
+    @Qt.pyqtSlot('QStringList')
     def setModel(self, modelNames):
         '''sets the models of the Tango attributes that should be displayed in
         this TaurusPlot.
@@ -3074,10 +3241,10 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         if modelNames is None:
             modelNames = []
         modelNames = self._splitModel(modelNames)
-        self._modelNames = CaselessList([str(n) for n in modelNames])
+        self._modelNames = self._lowerIfInsensitive(modelNames)
         self.updateCurves(self._modelNames)
-        self.emit(Qt.SIGNAL("modelChanged()"))
-        #update the modelchooser list
+        self.modelChanged.emit()
+        # update the modelchooser list
         if self.DataImportDlg is not None:
             self.DataImportDlg.modelChooser.setListedModels(self._modelNames)
 
@@ -3094,7 +3261,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''equivalent to setModel([])'''
         self.setModel([])
 
-    @Qt.pyqtSignature("addModels(QStringList)")
+    @Qt.pyqtSlot('QStringList')
     def addModels(self, modelNames):
         '''Adds models to the existing ones:
 
@@ -3103,11 +3270,11 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         .. seealso:: :meth:`setModels`, :meth:`removeModels`
         '''
-        modelNames = self._splitModel(modelNames)
+        modelNames = self._lowerIfInsensitive(self._splitModel(modelNames))
         modelNames = [str(m) for m in modelNames if m not in self._modelNames]
-        self.setModel(self._modelNames+modelNames)
+        self.setModel(self._modelNames + modelNames)
 
-    @Qt.pyqtSignature("removeModels(QStringList)")
+    @Qt.pyqtSlot('QStringList')
     def removeModels(self, modelNames):
         '''Removes models from those already in the plot.
 
@@ -3116,40 +3283,38 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
 
         .. seealso:: :meth:`setModels`, :meth:`addModels`
         '''
-        modelNames = self._splitModel(modelNames)
+        modelNames = self._lowerIfInsensitive(self._splitModel(modelNames))
         for name in modelNames:
-            try: self._modelNames.remove(name)
-            except: self.warning("'%s' not in model list"%name)
+            try:
+                self._modelNames.remove(name)
+            except:
+                self.warning("'%s' not in model list" % name)
         self.setModel(self._modelNames)
 
-    @Qt.pyqtSignature("setUseParentModel(bool)")
-    def setUseParentModel(self,yesno):
+    @Qt.pyqtSlot(bool)
+    def setUseParentModel(self, yesno):
         '''Sets whether the TaurusCurves of this plot should use the plot's parent model
 
         :param yesno: (bool) if True, the curves in the plot will use the Plot's
                       parent model
 
         .. seealso:: :meth:`TaurusBaseComponent.setParentModel` '''
-        
+
         if yesno and self._designMode:
-                Qt.QMessageBox.information(self, "UseParentModel usage note",
-                                         "Using the UseParentModel feature may require you to call "+\
-                                         "recheckTaurusParent() manually for this widget after calling " +\
-                                         "setupUi in your code."+\
-                                         "See the documentation of TaurusBaseWidget.recheckTaurusParent()")
-        
+            Qt.QMessageBox.information(self, "UseParentModel usage note",
+                                       "Using the UseParentModel feature may require you to call " +
+                                       "recheckTaurusParent() manually for this widget after calling " +
+                                       "setupUi in your code." +
+                                       "See the documentation of TaurusBaseWidget.recheckTaurusParent()")
+
         self._useParentModel = yesno
 
         parent_widget = self.getParentTaurusComponent()
         if parent_widget:
             if yesno:
-                self.connect(parent_widget,
-                             Qt.SIGNAL('modelChanged(const QString &)'),
-                             self.parentModelChanged)
+                parent_widget.modelChanged.connect(self.parentModelChanged)
             else:
-                self.disconnect(parent_widget,
-                                Qt.SIGNAL('modelChanged(const QString &)'),
-                                self.parentModelChanged)
+                parent_widget.modelChanged.disconnect(self.parentModelChanged)
 
         self.curves_lock.acquire()
         try:
@@ -3170,8 +3335,8 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
     # legend properties
     #-~-~-~-~-~-~-~-~-~-~-~-~
 
-    @Qt.pyqtSignature("setLegendPosition(int)")
-    def setLegendPosition(self,pos):
+    @Qt.pyqtSlot(int)
+    def setLegendPosition(self, pos):
         '''Specify the position of the legend relative to the plot
 
         :param pos: (Qwt5.QwtPlot.LegendPosition)
@@ -3251,7 +3416,9 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         self.curves_lock.acquire()
         try:
-            if curveNamesList is None: curveNamesList = [n for n,c in self.curves.iteritems() if not c.isRawData]
+            if curveNamesList is None:
+                curveNamesList = [
+                    n for n, c in self.curves.iteritems() if not c.isRawData]
             newTitlesDict = CaselessDict()
             for curveName in curveNamesList:
                 curve = self.curves.get(curveName)
@@ -3277,21 +3444,25 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         .. seealso:: :meth:`setCurvesTitle`, :meth:`setDefaultCurvesTitle`
         '''
         newTitlesDict = None
-        placeholders = ['<label>', '<model>', '<attr_name>', '<attr_fullname>', 
+        placeholders = ['<label>', '<model>', '<attr_name>', '<attr_fullname>',
                         '<dev_alias>', '<dev_name>', '<dev_fullname>', '<current_title>']
         try:
             current = placeholders.index(self._defaultCurvesTitle)
             items = placeholders
         except:
-            current= len(placeholders)
-            items = placeholders+[self._defaultCurvesTitle]
+            current = len(placeholders)
+            items = placeholders + [self._defaultCurvesTitle]
 
-        msg = 'New text to be used for the curves.\nYou can use any of the following placeholders:\n%s'%", ".join(placeholders)
-        titletext, ok = Qt.QInputDialog.getItem(self, 'New Title for Curves', msg, items, current, True)
+        msg = 'New text to be used for the curves.\nYou can use any of the following placeholders:\n%s' % ", ".join(
+            placeholders)
+        titletext, ok = Qt.QInputDialog.getItem(
+            self, 'New Title for Curves', msg, items, current, True)
         if ok:
             titletext = str(titletext)
-            if curveNamesList is None: self.setDefaultCurvesTitle(titletext)
-            newTitlesDict = self.setCurvesTitle(titletext, curveNamesList=curveNamesList)
+            if curveNamesList is None:
+                self.setDefaultCurvesTitle(titletext)
+            newTitlesDict = self.setCurvesTitle(
+                titletext, curveNamesList=curveNamesList)
         return newTitlesDict
 
     #-~-~-~-~-~-~-~-~-~-~-~-~
@@ -3332,17 +3503,17 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''equivalent to setXIsTime(False)'''
         self.setXIsTime(False)
 
-    @Qt.pyqtSignature("setAllowZoomers(bool)")
+    @Qt.pyqtSlot(bool)
     def setAllowZoomers(self, allow):
         '''enable/disable the zoomers for the plot. (The zoomers provide zooming
         by selecting a region of the plot)
 
         :param allow: (bool) If True, zoomers are enabled, otherwise, they are disabled
         '''
-        self._allowZoomers =  allow
+        self._allowZoomers = allow
         self._zoomer.setEnabled(allow)
 
-    @Qt.pyqtSignature("getAllowZoomers()")
+    @Qt.pyqtSlot(result=bool)
     def getAllowZoomers(self):
         '''Whether the Zoomers are enabled for this plot
 
@@ -3352,12 +3523,12 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         return self._allowZoomers
 
-    @Qt.pyqtSignature("resetAllowZoomers()")
+    @Qt.pyqtSlot()
     def resetAllowZoomers(self):
         '''same as setAllowZoomers(True)'''
         self.setAllowZoomers(True)
 
-    @Qt.pyqtSignature("isPannerEnabled(bool)")
+    @Qt.pyqtSlot(bool)
     def setPannerEnabled(self, enable):
         '''Specify whether the plot can be panned (i.e., dragged around to navigate it)
 
@@ -3365,7 +3536,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         self._panner.setEnabled(enable)
 
-    @Qt.pyqtSignature("isPannerEnabled()")
+    @Qt.pyqtSlot(result=bool)
     def isPannerEnabled(self):
         '''Whether the Panner is enabled for this plot
 
@@ -3375,12 +3546,12 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         return self._panner.isEnabled()
 
-    @Qt.pyqtSignature("resetPannerEnabled()")
+    @Qt.pyqtSlot()
     def resetPannerEnabled(self):
         '''same as setPannerEnabled(True)'''
         self.setPannerEnabled(True)
 
-    @Qt.pyqtSignature("setMagnifierEnabled(bool)")
+    @Qt.pyqtSlot(bool)
     def setMagnifierEnabled(self, enable):
         '''Specify whether the plot can be magnified (i.e. zoomed in and out
         with the mousewheel)
@@ -3389,7 +3560,7 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         self._magnifier.setEnabled(enable)
 
-    @Qt.pyqtSignature("isMagnifierEnabled()")
+    @Qt.pyqtSlot(result=bool)
     def isMagnifierEnabled(self):
         '''Whether the magnifier is enabled for this plot
 
@@ -3399,20 +3570,20 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
         '''
         return self._magnifier.isEnabled()
 
-    @Qt.pyqtSignature("resetMagnifierEnabled()")
+    @Qt.pyqtSlot()
     def resetMagnifierEnabled(self):
         '''same as `setMagnifierEnabled(True)`'''
         self.setMagnifierEnabled(True)
 
-    @Qt.pyqtSignature("setOptimizationEnabled(bool)")
+    @Qt.pyqtSlot(bool)
     def setOptimizationEnabled(self, enable):
         '''Specify whether the plot should use paint optimizations
 
         :param enable: (bool) If True, optimization is enabled, otherwise, it is disabled
         '''
-        #set the optimized flag for use with new curves
+        # set the optimized flag for use with new curves
         self._optimizationEnabled = enable
-        #make sure that already-created curves are also optimized
+        # make sure that already-created curves are also optimized
         try:
             for curveName in self.curves.iterkeys():
                 curve = self.curves.get(str(curveName))
@@ -3420,16 +3591,16 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
                 curve.setPaintAttribute(curve.ClipPolygons, enable)
         finally:
             self.curves_lock.release()
-        
-    @Qt.pyqtSignature("isOptimizationEnabled()")
+
+    @Qt.pyqtSlot(result=bool)
     def isOptimizationEnabled(self):
         '''Whether painting optimization is enabled for this plot
 
         :return: (bool)
         '''
         return self._optimizationEnabled
-    
-    @Qt.pyqtSignature("resetOptimizationEnabled()")
+
+    @Qt.pyqtSlot()
     def resetOptimizationEnabled(self):
         '''Equivalent to `setOptimizationEnabled(True)`
         '''
@@ -3439,49 +3610,57 @@ class TaurusPlot(Qwt5.QwtPlot, TaurusBaseWidget):
     def getQtDesignerPluginInfo(cls):
         """Returns pertinent information in order to be able to build a valid
         QtDesigner widget plugin
-        
+
         :return: (dict) a map with pertinent designer information"""
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.plot'
         ret['group'] = 'Taurus Display'
-        ret['icon'] =':/designer/qwtplot.png'
+        ret['icon'] = 'designer:qwtplot.png'
         return ret
-            
+
     ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
     #                      Qt Properties                        #
     ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
 
-
-    gridColor = Qt.pyqtProperty("QColor", getGridColor, setGridColor, resetGridColor)
-    gridWidth = Qt.pyqtProperty("int", getGridWidth, setGridWidth, resetGridWidth)
-    legendPosition = Qt.pyqtProperty("int", getLegendPosition, setLegendPosition, resetLegendPosition)
+    gridColor = Qt.pyqtProperty(
+        "QColor", getGridColor, setGridColor, resetGridColor)
+    gridWidth = Qt.pyqtProperty(
+        "int", getGridWidth, setGridWidth, resetGridWidth)
+    legendPosition = Qt.pyqtProperty(
+        "int", getLegendPosition, setLegendPosition, resetLegendPosition)
     model = Qt.pyqtProperty("QStringList", getModel, setModel, resetModel)
-    useParentModel = Qt.pyqtProperty("bool", getUseParentModel, setUseParentModel, resetUseParentModel)
+    useParentModel = Qt.pyqtProperty(
+        "bool", getUseParentModel, setUseParentModel, resetUseParentModel)
     xIsTime = Qt.pyqtProperty("bool", getXIsTime, setXIsTime, resetXIsTime)
-    allowZoomers = Qt.pyqtProperty("bool", getAllowZoomers, setAllowZoomers, resetAllowZoomers)
-    enablePanner = Qt.pyqtProperty("bool", isPannerEnabled, setPannerEnabled, resetPannerEnabled)
-    enableMagnifier = Qt.pyqtProperty("bool", isMagnifierEnabled, setMagnifierEnabled, resetMagnifierEnabled)
-    defaultCurvesTitle = Qt.pyqtProperty("QString", getDefaultCurvesTitle, setDefaultCurvesTitle, resetDefaultCurvesTitle)
-    enableOptimization = Qt.pyqtProperty("bool", isOptimizationEnabled, setOptimizationEnabled, resetOptimizationEnabled)
-    
+    allowZoomers = Qt.pyqtProperty(
+        "bool", getAllowZoomers, setAllowZoomers, resetAllowZoomers)
+    enablePanner = Qt.pyqtProperty(
+        "bool", isPannerEnabled, setPannerEnabled, resetPannerEnabled)
+    enableMagnifier = Qt.pyqtProperty(
+        "bool", isMagnifierEnabled, setMagnifierEnabled, resetMagnifierEnabled)
+    defaultCurvesTitle = Qt.pyqtProperty(
+        "QString", getDefaultCurvesTitle, setDefaultCurvesTitle, resetDefaultCurvesTitle)
+    enableOptimization = Qt.pyqtProperty(
+        "bool", isOptimizationEnabled, setOptimizationEnabled, resetOptimizationEnabled)
+
 
 def main():
     import sys
     import taurus.qt.qtgui.application
     import taurus.core.util.argparse
-    
+
     parser = taurus.core.util.argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [<model1> [<model2>] ...]")
     parser.set_description("a taurus application for plotting 1D data sets")
     parser.add_option("-x", "--x-axis-mode", dest="x_axis_mode", default='e', metavar="t|n",
-                  help="interprete X values as either timestamps (t) or numbers (n). Accepted values: t|n (e is also accepted as a synonim of n)")
+                      help="interprete X values as either timestamps (t) or numbers (n). Accepted values: t|n (e is also accepted as a synonim of n)")
     parser.add_option("--config", "--config-file", dest="config_file", default=None,
-                  help="use the given config file for initialization")
+                      help="use the given config file for initialization")
     parser.add_option("--export", "--export-file", dest="export_file", default=None,
-                  help="use the given file to as output instead of showing the plot")
-    parser.add_option("--window-name", dest="window_name", default="TaurusPlot", help="Name of the window")
-    
-    
+                      help="use the given file to as output instead of showing the plot")
+    parser.add_option("--window-name", dest="window_name",
+                      default="TaurusPlot", help="Name of the window")
+
     app = taurus.qt.qtgui.application.TaurusApplication(cmd_line_parser=parser,
                                                         app_name="taurusplot",
                                                         app_version=taurus.Release.version)
@@ -3489,44 +3668,46 @@ def main():
     options = app.get_command_line_options()
     if options.x_axis_mode.lower() not in ['t', 'e', 'n']:
         parser.print_help(sys.stderr)
-        sys.exit(1)    
+        sys.exit(1)
 
     models = args
-    
     w = TaurusPlot()
     w.setWindowTitle(options.window_name)
-    
+
     w.setXIsTime(options.x_axis_mode.lower() == 't')
-    if options.config_file is not None: w.loadConfig(options.config_file)
-    if models: w.setModel(models)
+    if options.config_file is not None:
+        w.loadConfig(options.config_file)
+
+    if models:
+        w.setModel(models)
     if options.export_file is not None:
-        curves = dict.fromkeys(w.trendSets.keys(),0)        
-        def exportIfAllCurves(curve,trend=w,counters=curves):
+        curves = dict.fromkeys(w.trendSets.keys(), 0)
+
+        def exportIfAllCurves(curve, trend=w, counters=curves):
             curve = str(curve)
-            print '*'*10 + ' %s: Event received for %s  '%(datetime.now().isoformat(),curve) +'*'*10        
+            print '*' * 10 + ' %s: Event received for %s  ' % (datetime.now().isoformat(), curve) + '*' * 10
             if curve in counters:
-                counters[curve]+=1
+                counters[curve] += 1
                 if all(counters.values()):
                     trend.exportPdf(options.export_file)
-                    print '*'*10 + ' %s: Exported to : %s  '%(datetime.now().isoformat(),options.export_file) +'*'*10        
+                    print '*' * 10 + ' %s: Exported to : %s  ' % (datetime.now().isoformat(), options.export_file) + '*' * 10
                     trend.close()
             return
-        if not curves: w.close()
+        if not curves:
+            w.close()
         else:
             for ts in w.trendSets.values():
-#                Qt.QObject.connect(ts._signalGen, ts._signalGen.newDataChangedSignal(), exportIfAllCurves)
-                Qt.QObject.connect(ts._signalGen, Qt.SIGNAL("dataChanged(const QString &)"), exportIfAllCurves)
-        sys.exit(app.exec_()) #exit without showing the widget
-    
-    #show the widget
+                ts.dataChanged.connect(exportIfAllCurves)
+        sys.exit(app.exec_())  # exit without showing the widget
+
+    # show the widget
     w.show()
-    #if no models are passed, show the data import dialog
+    # 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_())
 
-    
-if __name__ == "__main__":
-    main()    
 
+if __name__ == "__main__":
+    main()
diff --git a/lib/taurus/qt/qtgui/plot/taurusplotconf.py b/lib/taurus/qt/qtgui/plot/taurusplotconf.py
index f032c57..83334c2 100644
--- a/lib/taurus/qt/qtgui/plot/taurusplotconf.py
+++ b/lib/taurus/qt/qtgui/plot/taurusplotconf.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -41,39 +41,42 @@ try:
 except:
     extra_nexus = None
 
+
 @UILoadable(with_ui='ui')
 class TaurusPlotConfDlg(Qt.QWidget):
     ''' A configuration dialog for TaurusPlot.
-    
-    The dialog uses a Model/View design: 
+
+    The dialog uses a Model/View design:
       - it uses a :class:`CurvesTableModel` for describing the curves
-        configuration 
+        configuration
       - it has two views on that model: a :class:`QTableView` and a
         :class:`CurvePropertiesView`.
       - The selection is managed via a :class:`ExtendedSelectionModel` which is
         shared by both views.
-    
+
     It also has a data sources browser which is used to select the sources of
     the data to be used by the curves. Currently supported sources are: Tango
     attributes, Nexus/HDF5 datasets, and column organized ASCII data. Apart from
     this, the dialog allows to use mathematical expression and the given sources
     to assign values to the curves
-    
-    
+
+
     When the changes are applied (eg, when the Apply button is pressed), the
     model is used to (re)configure the plot.
     '''
-    
+
     def __init__(self, parent=None, curves=None):
-        super(TaurusPlotConfDlg,self).__init__(parent)
+        super(TaurusPlotConfDlg, self).__init__(parent)
         self.loadUi()
-        
+
         ###################################
         #@todo: this block should disappear once we can use taurusuic4 to include taurus widgets
-        self.ui.propView = self.__replaceWidget(curveprops.CurvePropertiesView(), self.ui.propView)
+        self.ui.propView = self.__replaceWidget(
+            curveprops.CurvePropertiesView(), self.ui.propView)
         from taurus.qt.qtgui.panel import TaurusModelSelectorTree
-        tangoTree =  TaurusModelSelectorTree(parent = None,
-                                            selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute], 
+        tangoTree = TaurusModelSelectorTree(parent=None,
+                                            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,135 +85,142 @@ 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.taurusbasetypes.TaurusElementType.Attribute], 
+#                                                     selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute],
 #                                                     buttonsPos=Qt.Qt.RightToolBarArea)
 #        l.insertWidget(0, self.ui.tangoTree)
         ####################################
-        
+
         if extra_nexus is not None:
-            self.ui.nexusBrowser = self.__replaceWidget(extra_nexus.TaurusNeXusBrowser(), self.ui.nexusBrowser)
-               
+            self.ui.nexusBrowser = self.__replaceWidget(
+                extra_nexus.TaurusNeXusBrowser(), self.ui.nexusBrowser)
+
         self.model = curveprops.CurvesTableModel(curves)
-        self.selectionModel = curveprops.ExtendedSelectionModel(self.model) 
+        self.selectionModel = curveprops.ExtendedSelectionModel(self.model)
         self.ui.curvesTable.setModel(self.model)
         self.ui.propView.setModel(self.model)
         self.ui.curvesTable.setSelectionModel(self.selectionModel)
         self.ui.propView.setSelectionModel(self.selectionModel)
-        
-        #host
-        host = taurus.Database().getNormalName()
+
+        # host
+        host = taurus.Authority().getNormalName()
         self.ui.tangoTree.setModel(host)
-        
-        #Connections        
-        self.connect(self.ui.applyBT,Qt.SIGNAL("clicked()"),self.onApply)
-        self.connect(self.ui.reloadBT,Qt.SIGNAL("clicked()"),self.onReload)
-        self.connect(self.ui.cancelBT,Qt.SIGNAL("clicked()"),self.close)
-        self.connect(self.ui.tangoTree,Qt.SIGNAL("addModels"),self.onModelsAdded)
-    
+
+        # Connections
+        self.ui.applyBT.clicked.connect(self.onApply)
+        self.ui.reloadBT.clicked.connect(self.onReload)
+        self.ui.cancelBT.clicked.connect(self.close)
+        self.ui.tangoTree.addModels.connect(self.onModelsAdded)
+
     def __replaceWidget(self, new, old, layout=None):
-        if layout is None: layout = old.parent().layout()
+        if layout is None:
+            layout = old.parent().layout()
         index = layout.indexOf(old)
         layout.removeWidget(old)
         old.setParent(None)
-        layout.insertWidget(index,new)
+        layout.insertWidget(index, new)
         return new
-        
-        
+
     def onModelsAdded(self, models):
         print models
         nmodels = len(models)
         rowcount = self.model.rowCount()
-        self.model.insertRows(rowcount,nmodels)
-        for i,m in enumerate(models):
-            self.model.setData(self.model.index(rowcount+i,curveprops.Y),
+        self.model.insertRows(rowcount, nmodels)
+        for i, m in enumerate(models):
+            self.model.setData(self.model.index(rowcount + i, curveprops.Y),
                                value=Qt.QVariant(m))
-    
+
     def onApply(self):
         print "APPLY!!! (todo)"
         curveConfs = self.model.dumpData()
-    
+
         for c in curveConfs:
             print repr(c)
-        
-        
+
     def onReload(self):
         print "RELOAD!!! (todo)"
-        
-        
+
 
 class demo(Qt.QDialog):
+
     def __init__(self, parent=None, curves=None):
-        super(demo,self).__init__(parent)
-        
+        super(demo, self).__init__(parent)
+
         if curves is None:
-            curves=[curveprops.CurveConf(xsrc='', ysrc='a/b/c/d', properties=None, title="tangocurve", vis=Qwt5.QwtPlot.yLeft ),
-                    curveprops.CurveConf(xsrc='[1,2,3]', ysrc='=#2.x**2', properties=None, title="parab", vis=Qwt5.QwtPlot.yLeft)
-                    ]
-        
-        #create table
+            curves = [curveprops.CurveConf(xsrc='', ysrc='a/b/c/d', properties=None, title="tangocurve", vis=Qwt5.QwtPlot.yLeft),
+                      curveprops.CurveConf(
+                xsrc='[1,2,3]', ysrc='=#2.x**2', properties=None, title="parab", vis=Qwt5.QwtPlot.yLeft)
+            ]
+
+        # create table
         self.model = curveprops.CurvesTableModel(curves)
 #        self.selection = Qt.QItemSelectionModel(self.model)
-        
+
         self.table = Qt.QTableView(self)
         self.table.setModel(self.model)
-        
+
 #        print "!!!!!!!!",self.table.selectionModel()
 #        self.table.setItemDelegate(commandDelegate(self))
-        
-        #create buttons
-        self.posSB=Qt.QSpinBox()
-        self.newSB=Qt.QSpinBox()
-        self.addBT=Qt.QPushButton(u"Add")    
-        self.remBT=Qt.QPushButton(u"Rem")        
-        self.dataBT=Qt.QPushButton(u"Data")
-        
-        #put widgets in the layout
-        mainLayout=Qt.QGridLayout()
-        mainLayout.addWidget(self.table,0,0,1,2)
-        mainLayout.addWidget(self.posSB,1,0)
-        mainLayout.addWidget(self.newSB,1,1)
-        mainLayout.addWidget(self.addBT,2,0)
-        mainLayout.addWidget(self.remBT,2,1)
-        mainLayout.addWidget(self.dataBT,3,0)
+
+        # create buttons
+        self.posSB = Qt.QSpinBox()
+        self.newSB = Qt.QSpinBox()
+        self.addBT = Qt.QPushButton(u"Add")
+        self.remBT = Qt.QPushButton(u"Rem")
+        self.dataBT = Qt.QPushButton(u"Data")
+
+        # put widgets in the layout
+        mainLayout = Qt.QGridLayout()
+        mainLayout.addWidget(self.table, 0, 0, 1, 2)
+        mainLayout.addWidget(self.posSB, 1, 0)
+        mainLayout.addWidget(self.newSB, 1, 1)
+        mainLayout.addWidget(self.addBT, 2, 0)
+        mainLayout.addWidget(self.remBT, 2, 1)
+        mainLayout.addWidget(self.dataBT, 3, 0)
         self.setLayout(mainLayout)
-        
-        #connections
-        Qt.QObject.connect(self.addBT,Qt.SIGNAL("clicked()"),self.onAdd)
-        Qt.QObject.connect(self.remBT,Qt.SIGNAL("clicked()"),self.onRem)
-        Qt.QObject.connect(self.dataBT,Qt.SIGNAL("clicked()"),self.onData)
-        
-        #misc
+
+        # connections
+        self.addBT.clicked.connect(self.onAdd)
+        self.remBT.clicked.connect(self.onRem)
+        self.dataBT.clicked.connect(self.onData)
+
+        # misc
         self.table.resizeColumnsToContents()
 #        self.table.setShowGrid(False)
 #        self.table.setSelectionMode(self.table.ExtendedSelection)
 #        self.table.setSelectionBehavior(Qt.QAbstractItemView.SelectItems)
         self.model.mimeTypes()
-        
+
     def onAdd(self):
-        self.model.insertRows(position=self.posSB.value(),rows=self.newSB.value())
+        self.model.insertRows(position=self.posSB.value(),
+                              rows=self.newSB.value())
+
     def onRem(self):
-        self.model.removeRows(position=self.posSB.value(),rows=self.newSB.value())
+        self.model.removeRows(position=self.posSB.value(),
+                              rows=self.newSB.value())
+
     def onData(self):
-        cmds=self.model.dumpData()
+        cmds = self.model.dumpData()
         print self.model.curves
 
+
 def main1():
     app = Qt.QApplication(sys.argv)
     form = demo()
     form.show()
-    sys.exit(app.exec_())      
+    sys.exit(app.exec_())
+
 
-    
 def main2():
     app = Qt.QApplication(sys.argv)
-    
-    curves=[curveprops.CurveConf(xsrc='', ysrc='tango://host:1000/a/b/c/d', properties=None, title="tangocurve", vis=Qwt5.QwtPlot.yLeft ),
-                curveprops.CurveConf(xsrc='=[1,2,3]', ysrc='=#2.x**2', properties=None, title="parab", vis=Qwt5.QwtPlot.yLeft)
-                ]
+
+    curves = [curveprops.CurveConf(xsrc='', ysrc='tango://host:1000/a/b/c/d', properties=None, title="tangocurve", vis=Qwt5.QwtPlot.yLeft),
+              curveprops.CurveConf(
+                  xsrc='=[1,2,3]', ysrc='=#2.x**2', properties=None, title="parab", vis=Qwt5.QwtPlot.yLeft)
+              ]
     form = TaurusPlotConfDlg(curves=curves)
     form.show()
-    sys.exit(app.exec_())  
+    sys.exit(app.exec_())
 
 if __name__ == "__main__":
     import sys
-    main2()    
+    main2()
diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py
index f88785a..74bf2f7 100644
--- a/lib/taurus/qt/qtgui/plot/taurustrend.py
+++ b/lib/taurus/qt/qtgui/plot/taurustrend.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -40,7 +40,6 @@ 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
 
 def getArchivedTrendValues(*args, **kwargs):
     try:
@@ -56,22 +55,23 @@ def stripShape(s):
     have all dimensions with length 1 removed, and it will be a list regardless
     of the input shape
     '''
-    return [e for e in s if e!=1]
+    return [e for e in s if e != 1]
+
 
 class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
     """A collection of TaurusCurves generated from a Taurus Attribute.
-    
+
     If the attribute is a scalar, The Trend Set consists of only one curve
     representing the evolution of the value of the attribute. If the attribute
     is a SPECTRUM, as many curves as the length of the spectrum are created,
     each representing the evolution of the value of a component of the array.
-       
+
     When an event is received, all curves belonging to a TaurusTrendSet are updated.
-    
+
     TaurusTrendSet objects can be considered as containers of (sorted) curves. As
     such, the curves contained by them can be accessed with item notation, as in
     the following example::
-    
+
         attrname = 'a/b/c/d'       #consider this attribute is a SPECTRUM of 3 elements
         ts=TaurusTrendSet(attrname)
         ...                        # wait for a Taurus Event arriving so that the curves are created
@@ -79,15 +79,20 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
         curve0 = ts[0]             #you can access the curve by index
         curve1 = ts['a/b/c/d[1]']  #and also by name
 
-    
+
     Note that internally each curve is treated as a RawData curve (i.e., it is
     not aware of events by itself, but it relies on the TaurusTrendSet object to
     update its values)
-    
+
     """
-    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, parent = None, curves=None):
+    consecutiveDroppedEventsWarning = 3  # number consecutive of dropped events before issuing a warning (-1 for disabling)
+    # absolute number of dropped events before issuing a warning (-1 for
+    # disabling)
+    droppedEventsWarning = -1
+
+    dataChanged = Qt.pyqtSignal('QString')
+
+    def __init__(self, name, parent=None, curves=None):
         Qt.QObject.__init__(self, parent)
         self.call__init__(TaurusBaseComponent, self.__class__.__name__)
         self._xBuffer = None
@@ -96,8 +101,10 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
         self.droppedEventsCount = 0
         self.consecutiveDroppedEventsCount = 0
         self.compiledTitle = name
-        try: self._maxBufferSize = self.parent().getMaxDataBufferSize()
-        except: self._maxBufferSize = TaurusTrend.DEFAULT_MAX_BUFFER_SIZE
+        try:
+            self._maxBufferSize = self.parent().getMaxDataBufferSize()
+        except:
+            self._maxBufferSize = TaurusTrend.DEFAULT_MAX_BUFFER_SIZE
         if curves is None:
             self._curves = {}
             self._orderedCurveNames = []
@@ -106,54 +113,54 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
             self._orderedCurveNames = curves.keys()
         self._titleText = None
         self.setModel(name)
-        
+
     def __getitem__(self, key):
         if isinstance(key, int):
             key = self._orderedCurveNames[key]
         return self._curves[key]
-        
+
     def __len__(self):
         return len(self._orderedCurveNames)
-        
+
     def __contains__(self, k):
         return self._curves.__contains__(k)
-        
+
     def index(self, curveName):
         '''Returns the index in the trend for the given curve name. It gives an
         exception if the curve is not in the set.
-        
+
         :param curveName: (str) the curvename to find
-        
+
         :return: (int) The index associated to the given curve in the TrendSet
         '''
         return self.getCurveNames().index(curveName)
-    
+
     def setTitleText(self, basetitle):
         '''Sets the title text of the trends this trendset. The name will be
         constructed by appending "[%i]" to the basetitle, where %i is the index
         position of the trend in the trendset. As a particular case, nothing is
         appended if the trendset consists of only one trend.
-        
+
         :param basetitle: (str) The title text to use as a base for constructing
                           the title of each trend belonging to this trendset. It
                           may contain placeholders as those used in
                           :meth:`TaurusCurve.setTitleText`
-        
+
         .. seealso:: :meth:`TaurusCurve.setTitleText`
         '''
         self._titleText = basetitle
         titles = self.compileTitles(basetitle)
-        for t,(n,c) in zip(titles, self.getCurves()):
+        for t, (n, c) in zip(titles, self.getCurves()):
             c.setTitleText(t)
-    
+
     def compileTitles(self, basetitle):
         '''Return a list of titles. Each title corresponds to a trend of the
         trendset (ordered). Substitution of known placeholders is performed.
-        
+
         :param basetitle: (str) A string to be used as base title. It may
                           contain any of the following placeholders (which will
                           be substituted by their corresponding value):
-            
+
             - <label> the attribute label (default)
             - <model> the model name
             - <attr_name> attribute name
@@ -164,27 +171,28 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
             - <current_title> The current title
             - <trend_index> The index of the trend in the trendset
             - <[trend_index]> Same as: `"[<trend_index>]" if Ntrends>1 else ""`
-        
+
         :return: (string_list) a list of title strings that correspond to the
-                 list of trends in the set. 
-        
+                 list of trends in the set.
+
         .. seealso:: :meth:`compileBaseTitle`
         '''
         basetitle = self.compileBaseTitle(basetitle)
         ntrends = len(self._curves)
         if '<trend_index>' in basetitle:
-            ret = [basetitle.replace('<trend_index>', "%i"%i) for i in xrange(ntrends)]
+            ret = [basetitle.replace('<trend_index>', "%i" % i)
+                   for i in xrange(ntrends)]
         else:
-            ret = [basetitle]*ntrends
+            ret = [basetitle] * ntrends
         return ret
-    
+
     def compileBaseTitle(self, basetitle):
         '''Return a base tile for a trend in whichs substitution of known
         placeholders has been performed.
-        
+
         :param basetitle: (str) String on which the substitutions will be
                           performed. The following placeholders are supported:
-            
+
             - <label> the attribute label (default)
             - <model> the model name
             - <attr_name> attribute name
@@ -194,80 +202,89 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
             - <dev_fullname> full device name (for backwards compatibility, <dev_full_name> is also accepted)
             - <current_title> The current title
             - <[trend_index]> Same as: `"[<trend_index>]" if Ntrends>1 else ""`
-        
+
         **Note** that <trend_index> itself is not substituted!
-        
+
         :return: (str) the compiled base title.
-        
+
         .. seealso:: :meth:`compileTitles`
         '''
         attr = self.getModelObj()
-        basetitle = basetitle.replace('<current_title>',self._titleText)
-        basetitle = basetitle.replace('<model>',self.getModel())
+        basetitle = basetitle.replace('<current_title>', self._titleText)
+        basetitle = basetitle.replace('<model>', self.getModel())
         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 '---')
-            basetitle = basetitle.replace('<attr_full_name>',attr.getFullName() or '---')
-            basetitle = basetitle.replace('<dev_alias>',attr.dev_alias or '---')
-            basetitle = basetitle.replace('<dev_name>',attr.dev_name or '---')
-        
+            basetitle = basetitle.replace('<label>', attr.label or '---')
+            basetitle = basetitle.replace(
+                '<attr_name>', attr.getSimpleName() or '---')
+            basetitle = basetitle.replace(
+                '<attr_fullname>', attr.getFullName() or '---')
+            basetitle = basetitle.replace(
+                '<attr_full_name>', attr.getFullName() or '---')
+
         dev = attr.getParentObj()
         if dev is not None:
-            basetitle = basetitle.replace('<dev_fullname>',dev.getFullName() or '---')
-            basetitle = basetitle.replace('<dev_full_name>',dev.getFullName() or '---')
+            basetitle = basetitle.replace(
+                '<dev_alias>', dev.getSimpleName() or '---')
+            basetitle = basetitle.replace(
+                '<dev_name>', dev.getNormalName() or '---')
+            basetitle = basetitle.replace(
+                '<dev_fullname>', dev.getFullName() or '---')
+            basetitle = basetitle.replace(
+                '<dev_full_name>', dev.getFullName() or '---')
+
+        if len(self._curves) == 1:
+            basetitle = basetitle.replace('<[trend_index]>', '')
+        else:
+            basetitle = basetitle.replace('<[trend_index]>', '[<trend_index>]')
 
-        if len(self._curves)==1: basetitle = basetitle.replace('<[trend_index]>','')
-        else: basetitle = basetitle.replace('<[trend_index]>','[<trend_index>]')
-            
-        self.compiledTitle = basetitle    
+        self.compiledTitle = basetitle
         return basetitle
-        
+
     def addCurve(self, name, curve):
         '''add a curve (with the given name) to the internal curves dictionary of this TaurusTrendSet
-        
+
         :param name: (str) the name of the curve
         :param curve: (TaurusCurve) the curve object to be added
-        '''  
+        '''
         self._curves[name] = curve
         self._orderedCurveNames.append(name)
-        
+
     def getCurves(self):
         '''returns an iterator of (curveName,curveObject) tuples associated to
         this TaurusTrendSet. The curves will always be returned in the order they
         were added to the set
-        
+
         :return: (iterator<str,TaurusCurve>)
         '''
-        return iter([(n,self._curves[n]) for n in self._orderedCurveNames])
-    
+        return iter([(n, self._curves[n]) for n in self._orderedCurveNames])
+
     def getCurveNames(self):
         '''returns a list of the names of the curves associated to this
         TaurusTrendSet. The curve names will always be returned in the order they
         were added to the set
-        
+
         :return: (list<str>) the names of the curves
         '''
         return self._orderedCurveNames
-        
+
     def getModelClass(self):
         '''see :meth:`TaurusBaseComponent.getModelClass`'''
         return taurus.core.taurusattribute.TaurusAttribute
 
-    def registerDataChanged(self,listener,meth):
+    def registerDataChanged(self, listener, meth):
         '''see :meth:`TaurusBaseComponent.registerDataChanged`'''
-        listener.connect(self, Qt.SIGNAL("dataChanged(const QString &)"), meth)
-        
-    def unregisterDataChanged(self,listener,meth):
+        self.dataChanged.connect(meth)
+
+    def unregisterDataChanged(self, listener, meth):
         '''see :meth:`TaurusBaseComponent.unregisterDataChanged`'''
-        listener.disconnect(self, Qt.SIGNAL("dataChanged(const QString &)"), meth)
+        self.dataChanged.disconnect(meth)
 
-    def _updateHistory(self,model, value):
+    def _updateHistory(self, model, value):
         '''Update the history data buffers using the latest value from the event
-        
+
         :param model: (str) the source of the event (needed to retrieve data from archiving)
-        :param value: (PyTango.DeviceAttribute) the value from the event
-        
+        :param value: (TaurusAttrValue) the value from the event
+
         :return: (tuple<numpy.ndarray, numpy.ndarray>) Tuple of two arrays
                  containing the X data and Y data, respectively, from the
                  history buffers:
@@ -276,13 +293,13 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
                    XisTime mode, and a sequential event number otherwise.
                  - The Y array may be two-dimensional if the attribute value is
                    a spectrum
-                   
+
         **Example of return values:** Consider history of 10 events for a
         SPECTRUM attribute with dim_x=8. Then the return value will be (X,Y)
         where X.shape=(10,) and Y.shape=(10,8); X.dtype = Y.dtype = <dtype('float64')>
         '''
         if value is not None:
-            v = value.value
+            v = value.rvalue.magnitude  # TODO: check unit consistency
             if numpy.isscalar(v):
                 ntrends = 1
             else:
@@ -291,117 +308,134 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
                     ntrends = 1
                 except:
                     try:
-                        #Trying with spectrums
+                        # Trying with spectrums
                         ntrends = len(v)
                     except:
-                        #Simply unreadable
+                        # Simply unreadable
                         value = None
                         ntrends = len(self._curves)
-        else: 
+        else:
             ntrends = len(self._curves)
-        
+
         if self._xBuffer is None:
-            self._xBuffer = ArrayBuffer(numpy.zeros(min(128,self._maxBufferSize), dtype='d'), maxSize=self._maxBufferSize )
+            self._xBuffer = ArrayBuffer(numpy.zeros(
+                min(128, self._maxBufferSize), dtype='d'), maxSize=self._maxBufferSize)
         if self._yBuffer is None:
-            self._yBuffer = ArrayBuffer(numpy.zeros((min(128,self._maxBufferSize), ntrends),dtype='d'), maxSize=self._maxBufferSize )
-            
-        #self.trace('_updateHistory(%s,%s(...))' % (model,type(value.value)))
-        if value is not None: 
+            self._yBuffer = ArrayBuffer(numpy.zeros(
+                (min(128, self._maxBufferSize), ntrends), dtype='d'), maxSize=self._maxBufferSize)
+        if value is not None:
             try:
-                self._yBuffer.append(value.value)
-            except Exception,e: 
-                self.warning('Problem updating history (%s=%s):%s', 
-                             model, value.value, e)
+                self._yBuffer.append(value.rvalue.magnitude)
+            except Exception, e:
+                self.warning('Problem updating history (%s=%s):%s',
+                             model, value.rvalue.magnitude, e)
                 value = None
-        
+
         if self.parent().getXIsTime():
-            #add the timestamp to the x buffer
-            if value is not None: self._xBuffer.append(value.time.totime())
-            ##Adding archiving values
+            # add the timestamp to the x buffer
+            if value is not None:
+                self._xBuffer.append(value.time.totime())
+            # Adding archiving values
             if self.parent().getUseArchiving():
-                #open a mysql connection for online trends or any not autoscaled plots
+                # open a mysql connection for online trends or any not
+                # autoscaled plots
                 if self.parent().getXDynScale() or not self.parent().axisAutoScale(Qwt5.QwtPlot.xBottom):
                     try:
-                        getArchivedTrendValues(self,model,insert=True)
-                    except Exception,e:
+                        getArchivedTrendValues(self, model, insert=True)
+                    except Exception, e:
                         import traceback
-                        self.warning('%s: reading from archiving failed: %s'%(datetime.now().isoformat('_'),traceback.format_exc()))     
+                        self.warning('%s: reading from archiving failed: %s' % (
+                            datetime.now().isoformat('_'), traceback.format_exc()))
         elif value is not None:
-            #add the event number to the x buffer
+            # add the event number to the x buffer
             try:
-                self._xBuffer.append(1.+self._xBuffer[-1]) 
-            except IndexError: #this will happen when the x buffer is empty
-                self._xBuffer.append(0) 
+                self._xBuffer.append(1. + self._xBuffer[-1])
+            except IndexError:  # this will happen when the x buffer is empty
+                self._xBuffer.append(0)
         return self._xBuffer.contents(), self._yBuffer.contents()
 
     def clearTrends(self, replot=True):
         '''clears all stored data (buffers and copies of the curves data)
-        
+
         :param replot: (bool) do a replot after clearing
         '''
-        #clean previous curves
+        # clean previous curves
         for subname in self.getCurveNames():
             self.parent().detachRawData(subname)
         self._curves = {}
         self._orderedCurveNames = []
-        #clean history Buffers
+        # clean history Buffers
         self._xBuffer = None
         self._yBuffer = None
-        #clean x,ydata
+        # clean x,ydata
         self._xValues = None
         self._yValues = None
-        #replot
+        # replot
         if replot:
             self.parent().replot()
-        #Force immediate garbage collection (otherwise the buffered data remains in memory)
+        # Force immediate garbage collection (otherwise the buffered data
+        # remains in memory)
         gc.collect()
-        
+
     def handleEvent(self, evt_src, evt_type, evt_value):
         ''' processes Change (and Periodic) Taurus Events: updates the data of all
         curves in the set according to the value of the attribute.
-        
+
         For documentation about the parameters of this method, see
         :meth:`TaurusBaseComponent.handleEvent`
         '''
         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!)
+            # 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.taurusbasetypes.TaurusEventType.Error:
                 self._onDroppedEvent(reason='Error event')
-                if not self.parent().getUseArchiving(): return
-                else: value = None
-            elif model is None: 
+                if not self.parent().getUseArchiving():
+                    return
+                else:
+                    value = None
+            elif model is None:
                 self._onDroppedEvent(reason='unknown model')
-                if not self.parent().getUseArchiving(): return
-                else: value = None
+                if not self.parent().getUseArchiving():
+                    return
+                else:
+                    value = None
             else:
-                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: 
+                value = evt_value if isinstance(
+                    evt_value, taurus.core.taurusbasetypes.TaurusAttrValue) else self.getModelValueObj()
+                if value is None or value.rvalue is None:
                     self._onDroppedEvent(reason='invalid value')
-                    if not self.parent().getUseArchiving(): return
+                    if not self.parent().getUseArchiving():
+                        return
+                elif not hasattr(value.rvalue, 'magnitude'):
+                    self._onDroppedEvent(reason='rvalue has no .magnitude')
+                    return
                 else:
-                    self._checkDataDimensions(value.value)
+                    self._checkDataDimensions(value.rvalue.magnitude)
 
-        #get the data from the event
+        # get the data from the event
         try:
-            self._xValues, self._yValues = self._updateHistory(model=model or self.getModel(),value=value)
+            self._xValues, self._yValues = self._updateHistory(
+                model=model or self.getModel(), value=value)
         except Exception, e:
             self._onDroppedEvent(reason=str(e))
             raise
-                    
-        #this was a good event, so we reset the consecutive dropped events count
+
+        # this was a good event, so we reset the consecutive dropped events
+        # count
         self.consecutiveDroppedEventsCount = 0
 
-        #assign xvalues and yvalues to each of the curves in self._curves
-        for i,(n,c) in enumerate(self.getCurves()):
-            c._xValues, c._yValues = self._xValues, self._yValues[:,i]
+        # assign xvalues and yvalues to each of the curves in self._curves
+        for i, (n, c) in enumerate(self.getCurves()):
+            c._xValues, c._yValues = self._xValues, self._yValues[:, i]
             c._updateMarkers()
-            
-        self.emit(Qt.SIGNAL("dataChanged(const QString &)"), Qt.QString(self.getModel()))
-        
-    def _checkDataDimensions(self,value):
+
+        self.dataChanged.emit(Qt.QString(self.getModel()))
+
+    def _checkDataDimensions(self, value):
         '''
         Check that the data dimensions are consistent with what was plotted before
         '''
@@ -409,26 +443,28 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
             return len(self._curves)
         try:
             float(value)
-            ntrends=1
+            ntrends = 1
         except:
-            ntrends=len(value)
+            ntrends = len(value)
         if ntrends != len(self._curves):
-            #clean previous curves
+            # clean previous curves
             self.clearTrends(replot=False)
-            #create as many curves as the dim_x of the given model and add them to the TrendSet
+            # create as many curves as the dim_x of the given model and add
+            # them to the TrendSet
             name = self.getModelName()
-            rawdata = {'x':numpy.zeros(0), 'y':numpy.zeros(0)}
+            rawdata = {'x': numpy.zeros(0), 'y': numpy.zeros(0)}
             for i in xrange(ntrends):
-                subname = "%s[%i]"%(name,i)
-                self.parent().attachRawData(rawdata,id=subname)
+                subname = "%s[%i]" % (name, i)
+                self.parent().attachRawData(rawdata, id=subname)
                 self.addCurve(subname, self.parent().curves[subname])
-            self.setTitleText(self._titleText or self.parent().getDefaultCurvesTitle())
+            self.setTitleText(
+                self._titleText or self.parent().getDefaultCurvesTitle())
             self.parent().autoShowYAxes()
         return ntrends
-    
+
     def _onDroppedEvent(self, reason='Unknown'):
         '''inform the user about a dropped event
-        
+
         :param reason: (str) The reason of the drop
         '''
         self.debug("Droping event. Reason %s", reason)
@@ -437,36 +473,40 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
         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)
+            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)
+            # disable the consecutive Dropped events warning (we do not want it
+            # if we got this one)
+            self.consecutiveDroppedEventsWarning = -1
         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 
+            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)
+            # disable the consecutive Dropped events warning
+            self.consecutiveDroppedEventsWarning = -1
         if mustwarn:
             self.warning(msg)
             p = self.parent()
             if p:
                 c = p.canvas()
-                msg2 = "Errors reading %s (%s)"%(self._titleText, self.modelName)
+                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
-    
+
     def setMaxDataBufferSize(self, maxSize):
         '''sets the maximum number of events that are stored in the internal
         buffers of the trend. Note that this sets the maximum amount of memory
         used by the data in this trend set to:
-        
+
             ~(1+ntrends)*2*8*maxSize bytes
-        
+
         (the data is stored as float64, and two copies of it are kept: one at
         the x and y buffers and another at the QwtPlotCurve.data)
-        
+
         :param maxSize: (int) the maximum limit
         '''
         if self._xBuffer is not None:
@@ -474,7 +514,7 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
         if self._yBuffer is not None:
             self._yBuffer.setMaxSize(maxSize)
         self._maxBufferSize = maxSize
-        
+
     def maxDataBufferSize(self):
         return self._maxBufferSize
 
@@ -486,71 +526,76 @@ class TaurusTrendsSet(Qt.QObject, TaurusBaseComponent):
         unwanted results when the x axis is set to show event numbers
         (xIsTime==False)since there is no way of distinguishing the real from
         the fake events.
-        
+
         :param msec: (int) period in milliseconds. Use msec<0 to stop the
                      forced periodic reading
         '''
         if self.forcedReadingTimer is None:
             self.forcedReadingTimer = Qt.QTimer()
-            self.connect(self.forcedReadingTimer, Qt.SIGNAL('timeout()'),self.forceReading)
-        
-        #stop the timer and remove the __ONLY_OWN_EVENTS filter
+            self.forcedReadingTimer.timeout.connect(self.forceReading)
+
+        # stop the timer and remove the __ONLY_OWN_EVENTS filter
         self.forcedReadingTimer.stop()
         filters = self.getEventFilters()
-        if self.__ONLY_OWN_EVENTS in filters: 
+        if self.__ONLY_OWN_EVENTS in filters:
             filters.remove(self.__ONLY_OWN_EVENTS)
             self.setEventFilters(filters)
-        
-        #if msec is positive, set the filter and start
+
+        # if msec is positive, set the filter and start
         if msec >= 0:
             self.insertEventFilter(self.__ONLY_OWN_EVENTS)
             self.forcedReadingTimer.start(msec)
-            
+
     def getForcedReadingPeriod(self):
         if self.forcedReadingTimer is None or not self.forcedReadingTimer.isActive():
             return -1
         else:
             return self.forcedReadingTimer.interval()
-    
-    def __ONLY_OWN_EVENTS(self, s ,t, v):
+
+    def __ONLY_OWN_EVENTS(self, s, t, v):
         '''An event filter that rejects all events except those that originate from this object'''
-        if s is self:return s,t,v
-        else: return None
-        
+        if s is self:
+            return s, t, v
+        else:
+            return None
+
     def forceReading(self, cache=False):
-        '''Forces a read of the attribute and generates a fake event with it. 
+        '''Forces a read of the attribute and generates a fake event with it.
         By default it ignores the cache
-        
+
         :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.taurusbasetypes.TaurusEventType.Periodic, vobj)
+        vobj = self.getModelValueObj(cache=False)
+        self.fireEvent(
+            self, taurus.core.taurusbasetypes.TaurusEventType.Periodic, vobj)
 
 
 class ScanTrendsSet(TaurusTrendsSet):
     """
     An specialized TaurusTrendSet that instead of being updated via events, it
     receives new data directly via a PyQt slot
-    
+
     receives signal containing record data from a scan.
-       
+
     When an event is received, all curves belonging to a TaurusTrendSet are updated.
-        
+
     Note that internally each curve is treated as a RawData curve (i.e., it is
     not aware of events by itself, but it relies on the ScanTrendSet object to
     update its values)
-    
+
     .. seealso:: :class:`TaurusTrendSet`
     """
     DEFAULT_X_DATA_KEY = 'point_nb'
-    
-    def __init__(self, name, parent = None, autoClear=True, xDataKey=None):
+
+    dataChanged = Qt.pyqtSignal('QString')
+
+    def __init__(self, name, parent=None, autoClear=True, xDataKey=None):
         '''
         Creator
-        
+
         :param autoClear: (bool) If True, (default) :meth:`clearTrends` will be
                           called every time a "data_desc" packet is received
-        :param xDataKey:  (str) a the name of the data to be used for the x value 
+        :param xDataKey:  (str) a the name of the data to be used for the x value
                           in the scan curves (e.g., a motor name, a counter
                           name,...) By default, "point_nb" is used. The special key
                           "__SCAN_TREND_INDEX__" will associate an internal integer index
@@ -563,25 +608,26 @@ class ScanTrendsSet(TaurusTrendsSet):
         self._autoClear = autoClear
         #self._usePointNumber = usePointNumber
         self._currentpoint = -1
-        self._plotablesFilter = lambda x:True
+        self._plotablesFilter = lambda x: True
         self.__datadesc = None
         self._endMarkers = []
         self.setModel(name)
         self._endMacroMarkerEnabled = True
-        
+
     def setAutoClear(self, enable):
         self._autoClear = enable
-        
+
     def setXDataKey(self, key):
-        if key == self._xDataKey: return
+        if key == self._xDataKey:
+            return
         self._xDataKey = key
         self.clearTrends()
-        
+
     def setEndMacroMarkerEnabled(self, enable):
         '''Sets whether a marker should be put at the end of each macro or not
-        
+
         :param enabled: (bool)
-        ''' 
+        '''
         self._endMacroMarkerEnabled = enable
 
     def scanDataReceived(self, packet):
@@ -592,50 +638,50 @@ class ScanTrendsSet(TaurusTrendsSet):
         if packet is None:
             self.debug('Ignoring empty scan data packet')
             return
-        pkgid,packet = packet
-        pcktype = packet.get("type","__UNKNOWN_PCK_TYPE__")
-        if pcktype == "data_desc": 
+        pkgid, packet = packet
+        pcktype = packet.get("type", "__UNKNOWN_PCK_TYPE__")
+        if pcktype == "data_desc":
             self._dataDescReceived(packet["data"])
-        elif pcktype == "record_data": 
+        elif pcktype == "record_data":
             self._scanLineReceived(packet["data"])
         elif pcktype == "record_end":
             self._addEndMarker()
         else:
-            self.debug("Ignoring packet of type %s"%repr(pcktype))
-            
+            self.debug("Ignoring packet of type %s" % repr(pcktype))
+
     def clearTrends(self, replot=True):
         '''
-        Reimplemented from :meth:`TaurusTrendsSet.clearTrends`. 
-        
+        Reimplemented from :meth:`TaurusTrendsSet.clearTrends`.
+
         .. note:: If the autoClear property is True for this trend set, this method is
                   called automatically every time a data_desc package is received.
         '''
-        #clean the datadesc
+        # clean the datadesc
         self.__datadesc = None
-        #clean markers
+        # clean markers
         for m in self._endMarkers:
             m.detach()
         self._endMarkers = []
-        #reset current point counter
+        # reset current point counter
         self._currentpoint = -1
-        #call the superclass
+        # call the superclass
         TaurusTrendsSet.clearTrends(self, replot=replot)
-    
+
     def onPlotablesFilterChanged(self, flt):
         '''
         slot to be called whenever the plotables filter is changed. It will call
         :meth:`clearTrends` if flt is None
-        
+
         :param flt:  (list<method>)
         '''
         if flt is None:
             self.clearTrends()
         else:
-            self.setPlotablesFilter(flt) 
-    
+            self.setPlotablesFilter(flt)
+
     def setPlotablesFilter(self, flt):
         self._plotablesFilter = flt
-    
+
     def _addEndMarker(self):
         if self._endMacroMarkerEnabled:
             m = Qwt5.QwtPlotMarker()
@@ -648,20 +694,20 @@ class ScanTrendsSet(TaurusTrendsSet):
             self._endMarkers.append(m)
             self._currentpoint -= 1
             self.parent().replot()
-    
+
     def getDataDesc(self):
-        return self.__datadesc     
-    
+        return self.__datadesc
+
     def _dataDescReceived(self, datadesc):
         '''prepares the plot according to the info in the datadesc dictionary'''
-        #backwards compatibility (datadesc was a list and now is a dict)
-        if isinstance(datadesc,list):
-            datadesc={'column_desc':datadesc}
-        #clear existing curves if required
+        # backwards compatibility (datadesc was a list and now is a dict)
+        if isinstance(datadesc, list):
+            datadesc = {'column_desc': datadesc}
+        # clear existing curves if required
         if self._autoClear:
             self.clearTrends()
-        #decide which data to use for x
-        if self._xDataKey is None or self._xDataKey == "<mov>": #@todo use a standard key for <mov> and <idx>
+        # decide which data to use for x
+        if self._xDataKey is None or self._xDataKey == "<mov>":  # @todo use a standard key for <mov> and <idx>
             try:
                 self._autoXDataKey = datadesc['ref_moveables'][0]
             except (KeyError, IndexError):
@@ -670,9 +716,9 @@ class ScanTrendsSet(TaurusTrendsSet):
             self._autoXDataKey = 'point_nb'
         else:
             self._autoXDataKey = self._xDataKey
-        #set the x axis
-        columndesc = datadesc.get('column_desc',[])
-        xinfo = {'min_value':None, 'max_value':None}
+        # set the x axis
+        columndesc = datadesc.get('column_desc', [])
+        xinfo = {'min_value': None, 'max_value': None}
         for e in columndesc:
             if e['label'] == self._autoXDataKey:
                 xinfo = e
@@ -681,30 +727,31 @@ class ScanTrendsSet(TaurusTrendsSet):
         xmin, xmax = xinfo.get('min_value'), xinfo.get('max_value')
         self.parent().setXDynScale(False)
         if xmin is None or xmax is None:
-            self.parent().setAxisAutoScale(self.parent().xBottom) #autoscale if any limit is unknown
+            # autoscale if any limit is unknown
+            self.parent().setAxisAutoScale(self.parent().xBottom)
         else:
             self.parent().setAxisScale(self.parent().xBottom, xmin, xmax)
-        #create trends
+        # create trends
         self._createTrends(datadesc["column_desc"])
-       
+
     def _createTrends(self, datadesc):
         '''
         Creates the needed curves using the information from the DataDesc
-        
+
         For now, it only creates trends for those "columns" containing scalar values
-        
+
         :param datadesc: (seq<dict>) each dict is a ColumnDesc.toDict()
         '''
         self.__datadesc = datadesc
-        #create as many curves as columns containing scalars
-        rawdata = {'x':numpy.zeros(0), 'y':numpy.zeros(0)}
+        # create as many curves as columns containing scalars
+        rawdata = {'x': numpy.zeros(0), 'y': numpy.zeros(0)}
         self.parent()._curvePens.setCurrentIndex(0)
         for dd in self.__datadesc:
-            if len(stripShape(dd['shape']))== 0: #an scalar
+            if len(stripShape(dd['shape'])) == 0:  # an scalar
                 name = dd["name"]
                 if name not in self._curves and self._plotablesFilter(name) and name != self._autoXDataKey:
                     rawdata["title"] = dd["label"]
-                    curve = self.parent().attachRawData(rawdata,id=name)
+                    curve = self.parent().attachRawData(rawdata, id=name)
                     prop = curve.getAppearanceProperties()
                     prop.sColor = prop.lColor
                     prop.sStyle = Qwt5.QwtSymbol.Ellipse
@@ -714,84 +761,93 @@ class ScanTrendsSet(TaurusTrendsSet):
                     curve.setAppearanceProperties(prop)
                     self.addCurve(name, curve)
         self.parent().autoShowYAxes()
-        self.emit(Qt.SIGNAL("dataChanged(const QString &)"), Qt.QString(self.getModel()))
-    
+        self.dataChanged.emit(Qt.QString(self.getModel()))
+
     def _scanLineReceived(self, recordData):
         '''Receives a recordData dictionary and updates the curves associated to it
-        
+
         .. seealso:: <Sardana>/MacroServer/scan/scandata.py:Record.data
-        
+
         '''
-        #obtain the x value
+        # obtain the x value
         if self._autoXDataKey == "__SCAN_TREND_INDEX__":
             self._currentpoint += 1
         else:
             try:
                 self._currentpoint = recordData[self._autoXDataKey]
             except KeyError:
-                self.warning('Cannot find data "%s" in the current scan record. Ignoring'%self._autoXDataKey)
+                self.warning(
+                    'Cannot find data "%s" in the current scan record. Ignoring' % self._autoXDataKey)
                 return
             if not numpy.isscalar(self._currentpoint):
-                self.warning('Data for "%s" is of type "%s". Cannot use it for the X values. Ignoring'%(self._autoXDataKey, type(self._currentpoint)))
+                self.warning('Data for "%s" is of type "%s". Cannot use it for the X values. Ignoring' % (
+                    self._autoXDataKey, type(self._currentpoint)))
                 return
-            
-        #If autoclear is True, we use buffers
+
+        # If autoclear is True, we use buffers
         if self._autoClear:
             curvenames = self.getCurveNames()
             if self._xBuffer is None:
-                self._xBuffer = ArrayBuffer(numpy.zeros(128, dtype='d'), maxSize=self.maxDataBufferSize() )
+                self._xBuffer = ArrayBuffer(numpy.zeros(
+                    128, dtype='d'), maxSize=self.maxDataBufferSize())
             if self._yBuffer is None:
-                self._yBuffer = ArrayBuffer(numpy.zeros((128, len(curvenames)),dtype='d'), maxSize=self.maxDataBufferSize() )
-            #x values
+                self._yBuffer = ArrayBuffer(numpy.zeros(
+                    (128, len(curvenames)), dtype='d'), maxSize=self.maxDataBufferSize())
+            # x values
             self._xBuffer.append(self._currentpoint)
-            #y values        
-            y = numpy.array([recordData.get(n,numpy.NaN) for n in curvenames])
+            # y values
+            y = numpy.array([recordData.get(n, numpy.NaN) for n in curvenames])
             self._yBuffer.append(y)
-            
+
             self._xValues, self._yValues = self._xBuffer.contents(), self._yBuffer.contents()
-    
-            #assign xvalues and yvalues to each of the curves in self._curves
-            for i,(n,c) in enumerate(self.getCurves()):
+
+            # assign xvalues and yvalues to each of the curves in self._curves
+            for i, (n, c) in enumerate(self.getCurves()):
                 c._xValues = self._xValues
-                c._yValues = self._yValues[:,i] #this is an assigment by reference
+                # this is an assigment by reference
+                c._yValues = self._yValues[:, i]
                 c._updateMarkers()
-        
-        #if autoclear is False we have to work directly with each curve (and cannot buffer)
+
+        # if autoclear is False we have to work directly with each curve (and
+        # cannot buffer)
         else:
-            for n,v in recordData.items():
+            for n, v in recordData.items():
                 c = self._curves.get(n, None)
-                if c is None: continue
-                c._xValues = numpy.append(c._xValues, self._currentpoint) 
+                if c is None:
+                    continue
+                c._xValues = numpy.append(c._xValues, self._currentpoint)
                 c._yValues = numpy.append(c._yValues, v)
                 c._updateMarkers()
-                
-        self.emit(Qt.SIGNAL("dataChanged(const QString &)"), Qt.QString(self.getModel()))
-        
+
+        self.dataChanged.emit(Qt.QString(self.getModel()))
+
     def connectWithQDoor(self, qdoor):
         '''connects this ScanTrendsSet to a QDoor
-        
+
         :param qdoor: (QDoor or str) either a QDoor instance or the QDoor name
         '''
         from sardana.taurus.qt.qtcore.tango.sardana.macroserver import QDoor
-        if not isinstance(qdoor, QDoor): qdoor = taurus.Device(qdoor)
-        self.connect(qdoor, Qt.SIGNAL("recordDataUpdated"), self.scanDataReceived)
-        
-            
+        if not isinstance(qdoor, QDoor):
+            qdoor = taurus.Device(qdoor)
+        qdoor.recordDataUpdated.connect(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
         '''
         from sardana.taurus.qt.qtcore.tango.sardana.macroserver import QDoor
-        if not isinstance(qdoor, QDoor): qdoor = taurus.Device(qdoor)
-        self.disconnect(qdoor, Qt.SIGNAL("recordDataUpdated"), self.scanDataReceived)
-    
+        if not isinstance(qdoor, QDoor):
+            qdoor = taurus.Device(qdoor)
+        qdoor.recordDataUpdated.disconnect(self.scanDataReceived)
+
     def getModel(self):
-        return self.__model 
+        return self.__model
+
     def setModel(self, model):
         self.__model = model
-    
-           
+
+
 class TaurusTrend(TaurusPlot):
     '''
     A :class:`TaurusPlot` -derived widget specialised in plotting trends (i.e.,
@@ -803,118 +859,123 @@ class TaurusTrend(TaurusPlot):
     TaurusTrend inherits all the features from TaurusPlot (zooming,
     exporting/importing, data inspection,...) and also provides some specific
     features (e.g. fixed-range X scale mode and Archiving support).
-    
+
     For an overview of the features from an user point of view, see the
     :ref:`TaurusTrend User's Interface Guide <trend_ui>`.
-    
+
     You can also see some code that exemplifies the use of TaurusTrend in :ref:`the
     TaurusTrend coding examples <examples_taurustrend>`
-    
-    Note: if you pass a model that is a Tango SPECTRUM attribute (instead of a
+
+    Note: if you pass a model that is a 1D attribute (instead of a
     scalar), TaurusTrend will interpret it as a collection of scalar values and
     will plot a separate trend line for each.
-    
+
     Note 2: As an special case, you can pass a model of the type
-    scan://doorname. This will link the TaurusTrend to the given Taurus door and will 
+    scan://doorname. This will link the TaurusTrend to the given Taurus door and will
     listen to it for scan record events, which will be plotted.
 
 
-    
+
     .. seealso:: :class:`TaurusPlot`,
-                 :ref:`TaurusTrend User's Interface Guide <trend_ui>`, 
+                 :ref:`TaurusTrend User's Interface Guide <trend_ui>`,
                  :ref:`The TaurusTrend coding examples <examples_taurustrend>`
     '''
-    
-    DEFAULT_MAX_BUFFER_SIZE = 65536 #(=2**16, i.e., 64K events))
-    
-    def __init__(self, parent = None, designMode = False):
-        TaurusPlot.__init__(self, parent = parent, designMode = designMode)
+
+    DEFAULT_MAX_BUFFER_SIZE = 65536  # (=2**16, i.e., 64K events))
+
+    dataChanged = Qt.pyqtSignal('QString')
+
+    def __init__(self, parent=None, designMode=False):
+        TaurusPlot.__init__(self, parent=parent, designMode=designMode)
         self.trendSets = CaselessDict()
-        self._supportedConfigVersions = ["ttc-1"]        
+        self._supportedConfigVersions = ["ttc-1"]
         self._xDynScaleSupported = True
         self._useArchiving = False
         self._usePollingBuffer = False
         self.setDefaultCurvesTitle('<label><[trend_index]>')
-        self._maxDataBufferSize = self.DEFAULT_MAX_BUFFER_SIZE 
+        self._maxDataBufferSize = self.DEFAULT_MAX_BUFFER_SIZE
         self.__qdoorname = None
         self._scansXDataKey = None
         self.__initActions()
         self._startingTime = time.time()
         self._archivingWarningLocked = False
         self._forcedReadingPeriod = None
-        self._replotTimer = None 
+        self._replotTimer = None
         self.setXIsTime(True)
-        #Use a rotated labels x timescale by default
+        # Use a rotated labels x timescale by default
         rotation = -45
         alignment = self.getDefaultAxisLabelsAlignment(self.xBottom, rotation)
         self.setAxisLabelRotation(self.xBottom, rotation)
         self.setAxisLabelAlignment(self.xBottom, alignment)
-        #use dynamic scale by default
+        # use dynamic scale by default
         self.setXDynScale(True)
-        self._scrollStep = 0.2        
-    
+        self._scrollStep = 0.2
+
     def __initActions(self):
         '''Create TaurusTrend actions'''
         self._useArchivingAction = Qt.QAction("Use Archiver", None)
         self._useArchivingAction.setCheckable(True)
         self._useArchivingAction.setChecked(self.getUseArchiving())
-        self.connect(self._useArchivingAction, Qt.SIGNAL("toggled(bool)"), self._onUseArchivingAction)
+        self._useArchivingAction.toggled.connect(self._onUseArchivingAction)
         self._usePollingBufferAction = Qt.QAction("Use Polling Buffer", None)
         self._usePollingBufferAction.setCheckable(True)
         self._usePollingBufferAction.setChecked(self.getUsePollingBuffer())
-        self.connect(self._usePollingBufferAction, Qt.SIGNAL("toggled(bool)"), self.setUsePollingBuffer)
-        self._setForcedReadingPeriodAction = Qt.QAction("Set forced reading period...", None)
-        self.connect(self._setForcedReadingPeriodAction, Qt.SIGNAL("triggered()"), self.setForcedReadingPeriod)
+        self._usePollingBufferAction.toggled.connect(self.setUsePollingBuffer)
+        self._setForcedReadingPeriodAction = Qt.QAction(
+            "Set forced reading period...", None)
+        self._setForcedReadingPeriodAction.triggered[()].connect(self.setForcedReadingPeriod)
         self._clearBuffersAction = Qt.QAction("Clear Buffers", None)
-        self.connect(self._clearBuffersAction, Qt.SIGNAL("triggered()"), self.clearBuffers)
-        self._setMaxBufferSizeAction = Qt.QAction("Change buffers size...", None)
-        self.connect(self._setMaxBufferSizeAction, Qt.SIGNAL("triggered()"), self.setMaxDataBufferSize)
-        self._autoClearOnScanAction = Qt.QAction("Auto-clear on new scans", None)
+        self._clearBuffersAction.triggered[()].connect(self.clearBuffers)
+        self._setMaxBufferSizeAction = Qt.QAction(
+            "Change buffers size...", None)
+        self._setMaxBufferSizeAction.triggered[()].connect(self.setMaxDataBufferSize)
+        self._autoClearOnScanAction = Qt.QAction(
+            "Auto-clear on new scans", None)
         self._autoClearOnScanAction.setCheckable(True)
         self._autoClearOnScanAction.setChecked(True)
-        self.connect(self._autoClearOnScanAction, Qt.SIGNAL("toggled(bool)"), self._onAutoClearOnScanAction)
-    
+        self._autoClearOnScanAction.toggled.connect(self._onAutoClearOnScanAction)
+
     def isTimerNeeded(self, checkMinimized=True):
-        '''checks if it makes sense to activate the replot timer. 
+        '''checks if it makes sense to activate the replot timer.
         The following conditions must be met:
-        
+
         - the replot timer must exist
         - the area of the plot must be non-zero
         - at least one trendset must be attached
         - the plot should be visible
         - the plot should not be minimized (unless checkMinimized=False)
-        
+
         :param checkMinimized: (bool) whether to include the check of minimized (True by default)
-        
-        :return: (bool) 
+
+        :return: (bool)
         '''
         return self._replotTimer is not None and \
-               not self.size().isEmpty() and \
-               bool(len(self.trendSets)) and \
-               self.isVisible() and \
-               not (checkMinimized and self.isMinimized())
-               
+            not self.size().isEmpty() and \
+            bool(len(self.trendSets)) and \
+            self.isVisible() and \
+            not (checkMinimized and self.isMinimized())
+
     def showEvent(self, event):
-        '''reimplemented from :meth:`TaurusPlot.showEvent` so that 
+        '''reimplemented from :meth:`TaurusPlot.showEvent` so that
         the replot timer is active only when needed'''
         TaurusPlot.showEvent(self, event)
         if self.isTimerNeeded(checkMinimized=False):
             self.debug('(re)starting the timer (in showEvent)')
             self._replotTimer.start()
-    
+
     def hideEvent(self, event):
-        '''reimplemented from :meth:`TaurusPlot.showEvent` so that 
+        '''reimplemented from :meth:`TaurusPlot.showEvent` so that
         the replot timer is active only when needed'''
         TaurusPlot.hideEvent(self, event)
         if self._replotTimer is not None:
             self.debug('stopping the timer (in hideEvent)')
             self._replotTimer.stop()
-    
-    def resizeEvent(self,event):
-        '''reimplemented from :meth:`TaurusPlot.resizeEvent` so that 
+
+    def resizeEvent(self, event):
+        '''reimplemented from :meth:`TaurusPlot.resizeEvent` so that
         the replot timer is active only when needed'''
         TaurusPlot.resizeEvent(self, event)
-        if event.oldSize().isEmpty(): #do further checks only if previous size was 0
+        if event.oldSize().isEmpty():  # do further checks only if previous size was 0
             if self.isTimerNeeded():
                 self.debug('(re)starting the timer (in resizeEvent)')
                 self._replotTimer.start()
@@ -922,27 +983,29 @@ class TaurusTrend(TaurusPlot):
                 if self._replotTimer is not None:
                     self.debug('stopping the timer (in resizeEvent)')
                     self._replotTimer.stop()
-            
+
     def setXIsTime(self, enable, axis=Qwt5.QwtPlot.xBottom):
         '''Reimplemented from :meth:`TaurusPlot.setXIsTime`'''
-        #set a reasonable scale
+        # set a reasonable scale
         if enable:
-            self.setAxisScale(axis, self._startingTime-60, self._startingTime)#Set a range of 1 min
+            self.setAxisScale(axis, self._startingTime - 60,
+                              self._startingTime)  # Set a range of 1 min
         else:
-            self.setAxisScale(axis, 0, 10) #Set a range of 10 events   
-            self.disconnect(self.axisWidget(axis), Qt.SIGNAL("scaleDivChanged ()"), self.rescheduleReplot) #disconnects the previous axis
-        #enable/disable the archiving action
+            self.setAxisScale(axis, 0, 10)  # Set a range of 10 events
+            self.axisWidget(axis).scaleDivChanged.disconnect(self.rescheduleReplot)  # disconnects the previous axis
+        # enable/disable the archiving action
         self._useArchivingAction.setEnabled(enable)
-        #call the parent class method
-        TaurusPlot.setXIsTime(self, enable, axis=axis) #the axis is changed here
-        #set the replot timer if needed
+        # call the parent class method
+        # the axis is changed here
+        TaurusPlot.setXIsTime(self, enable, axis=axis)
+        # set the replot timer if needed
         if enable and not self._designMode:
             if self._replotTimer is None:
                 self._dirtyPlot = True
                 self._replotTimer = Qt.QTimer()
-                self.connect(self._replotTimer,Qt.SIGNAL('timeout()'),self.doReplot)
+                self._replotTimer.timeout.connect(self.doReplot)
             self.rescheduleReplot(axis)
-            self.connect(self.axisWidget(axis), Qt.SIGNAL("scaleDivChanged ()"), self.rescheduleReplot) #connects the new axis
+            self.axisWidget(axis).scaleDivChanged.connect(self.rescheduleReplot)  # connects the new axis
         else:
             self._replotTimer = None
 
@@ -950,91 +1013,93 @@ class TaurusTrend(TaurusPlot):
         if scanname is None:
             if self.__qdoorname is None:
                 return
-            scanname = "scan://%s"%self.__qdoorname
+            scanname = "scan://%s" % self.__qdoorname
         tset = self.getTrendSet(scanname)
         tset.onPlotablesFilterChanged(flt)
-        
+
     def setScansAutoClear(self, enable):
         '''
         sets whether the trend sets associated to scans should be reset every
         time a data_desc packet is received from the door.
-        
+
         :param enable: (bool)
-        
+
         .. seealso:: :meth:`setScanDoor` and :class:`ScanTrendsSet`
         '''
         self._autoClearOnScanAction.setChecked(enable)
-    
-    def _onAutoClearOnScanAction(self,enable, scanname=None):
-        self.info('Autoclear on Scan set to %s',bool(enable))
+
+    def _onAutoClearOnScanAction(self, enable, scanname=None):
+        self.info('Autoclear on Scan set to %s', bool(enable))
         if scanname is None:
             if self.__qdoorname is None:
                 return
-            scanname = "scan://%s"%self.__qdoorname
+            scanname = "scan://%s" % self.__qdoorname
         tset = self.getTrendSet(scanname)
         tset.setAutoClear(enable)
-        
+
     def getScansAutoClear(self):
         return self._autoClearOnScanAction.isChecked()
-        
+
     def setScansUsePointNumber(self, enable):
         '''
         .. note:: This method is deprecated. Please use :meth:`setScansXDataKey` instead
-        
+
         sets whether the trend sets associated to scans should use the point
         number from the data record for the abscissas (default).
-        
+
         :param enable: (bool)
-        
+
         '''
-        self.info('setScansUsePointNumber is deprecated. Please use setScansXDataKey instead')
+        self.info(
+            'setScansUsePointNumber is deprecated. Please use setScansXDataKey instead')
         if enable:
             key = 'point_nb'
         else:
             key = '__SCAN_TREND_INDEX__'
         self.setScansXDataKey(key)
-        
+
     def setScansXDataKey(self, key, scanname=None):
         '''
         selects the source for the data to be used as abscissas in the scan plot.
-        
+
         :param key: (str) a string corresponding to a data label for data
                     present in the scan. Alternatively, "__SCAN_TREND_INDEX__"
                     can be used for an internal integer count of scan records
-                    
+
         :param scanname: (str or None) name of the model for the scan. If None,
                          the default scan is selected
-        
+
         .. seealso:: the constructor of :class:`ScanTrendsSet`
         '''
         if scanname is None:
             if self.__qdoorname is None:
                 return
-            scanname = "scan://%s"%self.__qdoorname
+            scanname = "scan://%s" % self.__qdoorname
         tset = self.getTrendSet(scanname)
         tset.setXDataKey(key)
-        if key is None: key = ''
+        if key is None:
+            key = ''
         self.setAxisTitle(self.xBottom, key)
         self._scansXDataKey = key
-            
+
     def setScanDoor(self, qdoorname):
         '''
         sets the door to which TaurusTrend will listen for scans.
         This removes any previous scan set using this method, but respects scans set with setModel
         '''
-        if self.__qdoorname is not None: 
-            self.removeModels(["scan://%s"%self.__qdoorname])
-        self.addModels(["scan://%s"%qdoorname])
-        self.__qdoorname=qdoorname
-        
+        if self.__qdoorname is not None:
+            self.removeModels(["scan://%s" % self.__qdoorname])
+        self.addModels(["scan://%s" % qdoorname])
+        self.__qdoorname = qdoorname
+
     def clearScan(self, scanname):
         '''resets the curves associated to the given scan
-        
+
         :param scanname: (str) the scan model name (e.g. "scan://a/b/c")
         '''
         tset = self.getTrendSet(scanname)
         tset.clearTrends()
-        
+
     def clearBuffers(self):
         '''clears the buffers of existing trend sets (note that this does
         not remove the models, it simply removes all stored data)'''
@@ -1045,56 +1110,64 @@ class TaurusTrend(TaurusPlot):
         finally:
             self.curves_lock.release()
         self.replot()
-          
+
     def updateCurves(self, names):
         '''Defines the curves that need to be plotted. For a TaurusTrend, the
         models can refer to:
-        
-        - PyTango.SCALARS: they are to be plotted in a trend
-        - PyTango.SPECTRUM: each element of the spectrum is considered
-          independently 
-        
+
+        - scalar data: they are to be plotted in a trend
+        - on-dimensional data: each element of the spectrum is considered
+          independently
+
         Note that passing an attribute for X values makes no sense in this case
-        
+
         Internally, every curve is grouped in a TaurusTrendSet. For each SPECTRUM
         attribute, a TrendSet is created, containing as many curves as the
         lenght of the spectrum For eacha SCALAR attribute, a TrendSet containing
         just one curve is created.
-        
+
         :param names: (sequence<str>) a sequence of model names
-        
+
         .. note:: Adding/removing a model will add/remove a whole set. No
                   sub-set adding/removing is allowed.
                   Still, each curve will be independent regarding its
                   properties, and can be hidden/shown independently.
-        
+
         .. seealso:: :meth:`TaurusPlot.updateCurves`
         '''
         self.curves_lock.acquire()
         try:
             # For it to work properly, 'names' must be a CaselessList, just as
             # self.trendSets is a CaselessDict
-            del_sets = [ name for name in self.trendSets.keys() if name not in names]
-            
-            #if all trends were removed, reset the color palette
+            del_sets = [name for name in self.trendSets.keys()
+                        if name not in names]
+
+            # if all trends were removed, reset the color palette
             if len(del_sets) == len(self.trendSets):
                 self._curvePens.setCurrentIndex(0)
-            
-            #update new/existing trendsets
+
+            # update new/existing trendsets
             for name in names:
                 name = str(name)
-                if "|" in name: raise ValueError('composed ("X|Y") models are not supported by TaurusTrend')
-                #create a new TrendSet if not already there
+                if "|" in name:
+                    raise ValueError(
+                        'composed ("X|Y") models are not supported by TaurusTrend')
+                # create a new TrendSet if not already there
                 if not self.trendSets.has_key(name):
-                    matchScan = re.search(r"scan:\/\/(.*)", name) #check if the model name is of scan type and provides a door
+                    # check if the model name is of scan type and provides a
+                    # door
+                    matchScan = re.search(r"scan:\/\/(.*)", name)
                     if matchScan:
-                        tset = ScanTrendsSet(name, parent=self, autoClear=self.getScansAutoClear(), xDataKey=self._scansXDataKey)
-                        self.__qdoorname = matchScan.group(1) #the name of the door
-                        tset.connectWithQDoor(self.__qdoorname)                        
+                        tset = ScanTrendsSet(name, parent=self, autoClear=self.getScansAutoClear(
+                        ), xDataKey=self._scansXDataKey)
+                        self.__qdoorname = matchScan.group(
+                            1)  # the name of the door
+                        tset.connectWithQDoor(self.__qdoorname)
                     else:
                         tset = TaurusTrendsSet(name, parent=self)
-                        if self._forcedReadingPeriod is not None: 
-                            tset.setForcedReadingPeriod(self._forcedReadingPeriod)
+                        if self._forcedReadingPeriod is not None:
+                            tset.setForcedReadingPeriod(
+                                self._forcedReadingPeriod)
                     self.trendSets[name] = tset
                     tset.registerDataChanged(self, self.curveDataChanged)
             # Trend Sets to be removed
@@ -1109,14 +1182,15 @@ class TaurusTrend(TaurusPlot):
                 if matchScan:
                     olddoorname = matchScan.group(1)
                     tset.disconnectQDoor(olddoorname)
-            if del_sets:        
+            if del_sets:
                 self.autoShowYAxes()
-                
+
             # legend
             self.showLegend(len(self.curves) > 1, forever=False)
             self.replot()
-            
-            #keep the replotting timer active only if there is something to refresh
+
+            # keep the replotting timer active only if there is something to
+            # refresh
             if self.isTimerNeeded():
                 self.debug('(re)starting the timer (in updateCurves)')
                 self._replotTimer.start()
@@ -1124,26 +1198,26 @@ class TaurusTrend(TaurusPlot):
                 if self._replotTimer is not None:
                     self.debug('stopping the timer (in updateCurves)')
                     self._replotTimer.stop()
-            
+
         finally:
             self.curves_lock.release()
-        
+
     def getTrendSetNames(self):
         '''returns the names of all TrendSets attached to this TaurusTrend.
-        
+
         :return: (list<str>) a copy of self.trendSets.keys()
         '''
         return self.getModel()
-    
+
     def getTrendSet(self, name):
         '''gets a trend set object by name.
-        
+
         **Important**: Note that the TrendSet object is not thread safe.
         Therefore, if you access it you must do it protected by the
         TaurusTrend.curves_lock reentrant lock.
-        
+
         :param name: (str) the trend set name
-        
+
         :return: (TaurusTrendSet) the trend set object corresponding to name
         '''
         self.curves_lock.acquire()
@@ -1152,31 +1226,32 @@ class TaurusTrend(TaurusPlot):
         finally:
             self.curves_lock.release()
         return ret
-    
+
     def getCurveTitle(self, name, index=None):
         '''reimplemented from :class:`TaurusPlot`.
         Returns the title of a curve from a trendset
-        
-        :param name: (str) The name of the trendset. If the name is not a known 
-                     trendset name and index is None, we will try with tsetname and 
-                     index obtained from parsing the given name (assuming the 
+
+        :param name: (str) The name of the trendset. If the name is not a known
+                     trendset name and index is None, we will try with tsetname and
+                     index obtained from parsing the given name (assuming the
                      format '<tsetname>[<index>]').
-        :param index: (int or None) the index of the curve in the trend set. 
+        :param index: (int or None) the index of the curve in the trend set.
                       If None is passed, it returns the base title of the trendset
-                      
-        :return: (str) the title 
+
+        :return: (str) the title
         '''
         self.curves_lock.acquire()
         try:
             tset = self.trendSets.get(name)
-            if tset is None: #name not found...
-                if index is None: # maybe name was actually a curve name including the index? 
-                    match = re.match(r'^(.*)\[([0-9]+)\]$', name) 
+            if tset is None:  # name not found...
+                if index is None:  # maybe name was actually a curve name including the index?
+                    match = re.match(r'^(.*)\[([0-9]+)\]$', name)
                     if match:
-                        name,index = match.groups()
+                        name, index = match.groups()
                         index = int(index)
-                        return self.getCurveTitle(name, index=index) #recursive call with parsed tsetname and index
-                return None 
+                        # recursive call with parsed tsetname and index
+                        return self.getCurveTitle(name, index=index)
+                return None
             if index is None:
                 if len(tset) == 1:
                     index = 0
@@ -1186,38 +1261,40 @@ class TaurusTrend(TaurusPlot):
         finally:
             self.curves_lock.release()
         return title
-    
+
     def changeCurvesTitlesDialog(self, curveNamesList=None):
         '''Shows a dialog to set the curves titles (it will change the current
         curves titles and the default curves titles)
-                
+
         :param curveNamesList: (string_sequence or string_iterator) names of the
                                curves to which the title will be changed (if
                                None given , it will apply to all the TrendsSets
                                and it will also be used as default for newly
                                created ones)
-        
+
         :return: (caselessDict<str,QString> or None) The return value will be
                  `None` if `curveNamesList` is None. Otherwise it will be a
-                 dictionary with key=curvename and value=newtitle. 
-        
+                 dictionary with key=curvename and value=newtitle.
+
         .. seealso:: :meth:`setCurvesTitle`, :meth:`setDefaultCurvesTitle`
         '''
         newTitlesDict = None
-        
-        placeholders = ['<label>', '<model>', '<attr_name>', '<attr_fullname>', 
+
+        placeholders = ['<label>', '<model>', '<attr_name>', '<attr_fullname>',
                         '<dev_alias>', '<dev_name>', '<dev_fullname>', '<current_title>',
                         '<trend_index>', '<[trend_index]>']
         try:
             current = placeholders.index(self._defaultCurvesTitle)
             items = placeholders
         except:
-            current= len(placeholders)
-            items = placeholders+[self._defaultCurvesTitle]
-            
-        msg = 'New text to be used for the curves.\nYou can use any of the following placeholders:\n%s'%", ".join(placeholders)
-        titletext, ok = Qt.QInputDialog.getItem(self, 'New Title for Curves', msg, items, current, True)
-             
+            current = len(placeholders)
+            items = placeholders + [self._defaultCurvesTitle]
+
+        msg = 'New text to be used for the curves.\nYou can use any of the following placeholders:\n%s' % ", ".join(
+            placeholders)
+        titletext, ok = Qt.QInputDialog.getItem(
+            self, 'New Title for Curves', msg, items, current, True)
+
         if ok:
             titletext = str(titletext)
             if curveNamesList is None:
@@ -1226,13 +1303,14 @@ class TaurusTrend(TaurusPlot):
             else:
                 self.curves_lock.acquire()
                 try:
-                    newTitlesDict = CaselessDict() 
+                    newTitlesDict = CaselessDict()
                     for curveName in curveNamesList:
                         curvetitle = titletext
                         for ts in self.trendSets.itervalues():
                             if curveName in ts:
                                 curvetitle = ts.compileBaseTitle(curvetitle)
-                                curvetitle = curvetitle.replace('<trend_index>', "%i"%ts.index(curveName))
+                                curvetitle = curvetitle.replace(
+                                    '<trend_index>', "%i" % ts.index(curveName))
                                 break
                         curve = self.curves.get(curveName)
                         curve.setTitleText(curvetitle)
@@ -1242,18 +1320,19 @@ class TaurusTrend(TaurusPlot):
                 finally:
                     self.curves_lock.release()
         return newTitlesDict
-    
+
     def setTrendSetsTitles(self, basetitle, setNames=None):
         '''Calls setTitleText(basetitle) for each Trend Set set in setNames
-        
+
         :param basetitle: (str) the base title
         :param setNames: (sequence<str> or iterator<str>) names of the sets to be changed
-        
+
         See: TaurusTrendsSet.setTitleText
         '''
         self.curves_lock.acquire()
         try:
-            if setNames is None: setNames = self.getModel()
+            if setNames is None:
+                setNames = self.getModel()
             for tname in setNames:
                 if tname in self.trendSets:
                     self.trendSets[tname].setTitleText(basetitle)
@@ -1261,35 +1340,41 @@ class TaurusTrend(TaurusPlot):
             self.curves_lock.release()
         self.updateLegend(self.legend())
 
-    @Qt.pyqtSignature("dataChanged(const QString &)")
+    @Qt.pyqtSlot('QString', name='dataChanged')
     def curveDataChanged(self, name):
         '''slot that is called whenever a curve emits a dataChanged signal
-        
+
         :emits: "dataChanged(const QString &)"
-        
+
         :param name: (str) curve name
         '''
-        name=str(name)
+        name = str(name)
         self.curves_lock.acquire()
         try:
-            curve = None 
-            for n,curve in self.trendSets[name].getCurves():
-                curve.setData(curve._xValues,curve._yValues)
-            #self._zoomer.setZoomBase()
-            if curve is not None and self.getXDynScale() and len(curve._xValues)>0: #keep the scale width constant, but translate it to get the last value
+            curve = None
+            for n, curve in self.trendSets[name].getCurves():
+                curve.setData(curve._xValues, curve._yValues)
+            # self._zoomer.setZoomBase()
+            # keep the scale width constant, but translate it to get the last
+            # value
+            if curve is not None and self.getXDynScale() and len(curve._xValues) > 0:
                 sdiv = self.axisScaleDiv(self.xBottom)
                 currmin, currmax = sdiv.lowerBound(), sdiv.upperBound()
                 datamax = curve._xValues[-1]
                 if datamax > currmax or datamax < currmin:
-                    minstep = datamax - currmax #the new scale max must be above the latest point
-                    maxstep = datamax - currmin #the new scale min must be below the latest point
-                    step = min(max(self.getXAxisRange()*self._scrollStep, minstep), maxstep)
-                    self.setAxisScale(self.xBottom, currmin+step, currmax+step)
+                    minstep = datamax - currmax  # the new scale max must be above the latest point
+                    maxstep = datamax - currmin  # the new scale min must be below the latest point
+                    step = min(max(self.getXAxisRange() *
+                                   self._scrollStep, minstep), maxstep)
+                    self.setAxisScale(
+                        self.xBottom, currmin + step, currmax + step)
         finally:
             self.curves_lock.release()
-        self.emit(Qt.SIGNAL("dataChanged(const QString &)"), Qt.QString(name))
-        if not self.xIsTime: self.replot()
-        else: self._dirtyPlot = True
+        self.dataChanged.emit(Qt.QString(name))
+        if not self.xIsTime:
+            self.replot()
+        else:
+            self._dirtyPlot = True
 
     def doReplot(self):
         '''calls :meth:`replot` only if there is new data to be plotted'''
@@ -1302,61 +1387,68 @@ class TaurusTrend(TaurusPlot):
         '''calculates the replotting frequency based on the time axis range.
         It assumes that it is unnecessary to replot with a period less than the
         time per pixel.
-        
+
         :param axis: (Qwt5.QwtPlot.Axis) the axis to which it should associate
         :param width: (int) the approx canvas width (in pixels). The exact value
                       could be obtained from the widget, but an order of
                       magnitude approximation is usually ok (and cheaper). The
                       default value is 1080 (HD ready!)
-        
+
         '''
         if self.xIsTime:
             sdiv = self.axisScaleDiv(axis)
             currmin, currmax = sdiv.lowerBound(), sdiv.upperBound()
-            plot_refresh = int(1000*(currmax-currmin)/width)
-            plot_refresh = min((max((plot_refresh,250)),1800000)) #enforce limits
-            if self._replotTimer.interval() != plot_refresh: 
-                #note: calling QTimer.setInterval() very often seems to eventually trigger some bug
+            plot_refresh = int(1000 * (currmax - currmin) / width)
+            # enforce limits
+            plot_refresh = min((max((plot_refresh, 250)), 1800000))
+            if self._replotTimer.interval() != plot_refresh:
+                # note: calling QTimer.setInterval() very often seems to eventually trigger some bug
                 #      that stops the timer from emitting the timeout signal. We avoid this by
-                #      calling setInterval only when really needed. 
-                self._replotTimer.setInterval(plot_refresh) 
-                self.debug('New replot period is %1.2f seconds',(plot_refresh/1000.))
-                
+                #      calling setInterval only when really needed.
+                self._replotTimer.setInterval(plot_refresh)
+                self.debug('New replot period is %1.2f seconds',
+                           (plot_refresh / 1000.))
+
         else:
-            self.warning('rescheduleReplot() called but X axis is not in time mode')
+            self.warning(
+                'rescheduleReplot() called but X axis is not in time mode')
 
-    def setPaused(self, paused = True):
+    def setPaused(self, paused=True):
         '''Pauses itself and other listeners (e.g. the trendsets) depending on it
-        
+
         .. seealso:: :meth:`TaurusBaseComponent.setPaused`
         '''
         for ts in self.trendSets.itervalues():
             ts.setPaused(paused)
         self._isPaused = paused
-    
+
     def createConfig(self, tsnames=None, **kwargs):
         '''Returns a pickable dictionary containing all relevant information
         about the current plot.
-        For Tango attributes it stores the attribute name and the curve properties
+        For Taurus attributes it stores the attribute name and the curve properties
         For raw data curves, it stores the data as well.
-        
+
         Hint: The following code allows you to serialize the configuration
-        dictionary as a string (which you can store as a QSetting, or as a Tango
+        dictionary as a string (which you can store as a QSetting, or as a Taurus
         Attribute)::
-        
+
             import pickle
             c = pickle.dumps(taurusplot.createConfig())  #c is a string that can be stored
-                
+
         :param names:  (sequence<str>) a sequence of TrendSet names for which the
                        configuration will be stored (all by default).
-        
+
         :return: (dict) configurations (which can be loaded with applyConfig)
         '''
-        configdict = TaurusPlot.createConfig(self, curvenames=None) #use the superclass configdict as a starting point
-        if tsnames is None: tsnames = CaselessList(self.getModel())
+        configdict = TaurusPlot.createConfig(
+            self, curvenames=None)  # use the superclass configdict as a starting point
+        if tsnames is None:
+            tsnames = CaselessList(self.getModel())
         model = CaselessList([m for m in self.getModel() if m in tsnames])
-        configdict["model"] = model #overwrite the value created by TaurusPlot.createConfig()
-        configdict.pop("TangoCurves") #delete the TangoCurves key since it is meaningless in a TaurusTrend
+        # overwrite the value created by TaurusPlot.createConfig()
+        configdict["model"] = model
+        # delete the TangoCurves key since it is meaningless in a TaurusTrend
+        configdict.pop("TangoCurves")
         tsetsdict = CaselessDict()
         rawdatadict = CaselessDict(configdict["RawData"])
         miscdict = CaselessDict(configdict["Misc"])
@@ -1364,75 +1456,87 @@ class TaurusTrend(TaurusPlot):
         miscdict["MaxBufferSize"] = self.getMaxDataBufferSize()
         self.curves_lock.acquire()
         try:
-            for tsname,ts in self.trendSets.iteritems():
+            for tsname, ts in self.trendSets.iteritems():
                 if tsname in tsnames:
-                    tsetsdict[tsname] = tsname #store a dict containing just model names (key and value are the same)
+                    # store a dict containing just model names (key and value
+                    # are the same)
+                    tsetsdict[tsname] = tsname
                 for cname in CaselessList(ts.getCurveNames()):
-                    rawdatadict.pop(cname)#clean the rawdatadict of rawdata curves that come from trendsets (but we keep the properties!)                
+                    # clean the rawdatadict of rawdata curves that come from
+                    # trendsets (but we keep the properties!)
+                    rawdatadict.pop(cname)
         finally:
             self.curves_lock.release()
         configdict["TrendSets"] = tsetsdict
         configdict["RawData"] = rawdatadict
         configdict["Misc"] = miscdict
         return configdict
-        
+
     def applyConfig(self, configdict, **kwargs):
         """applies the settings stored in a configdict to the current plot.
-        
+
         :param configdict: (dict)
-        
+
         .. seealso:: :meth:`createConfig`
         """
-        if not self.checkConfigVersion(configdict): return
-        #set the max Buffer data size (we do it before ataching the curves to avoid useless reallocations of buffers)
+        if not self.checkConfigVersion(configdict):
+            return
+        # set the max Buffer data size (we do it before ataching the curves to
+        # avoid useless reallocations of buffers)
         maxBufferSize = configdict["Misc"].get("MaxBufferSize")
         if maxBufferSize is not None:
             self.setMaxDataBufferSize(maxBufferSize)
-        #attach the curves
-        for rd in configdict["RawData"].values(): self.attachRawData(rd)
-        models = configdict.get("model",configdict["TrendSets"].values()) #for backwards compatibility, if the ordered list of models is not stored, it uses the unsorted dict values
+        # attach the curves
+        for rd in configdict["RawData"].values():
+            self.attachRawData(rd)
+        # for backwards compatibility, if the ordered list of models is not
+        # stored, it uses the unsorted dict values
+        models = configdict.get("model", configdict["TrendSets"].values())
         self.addModels(models)
         for m in models:
             tset = self.trendSets[m]
-            tset.fireEvent(None, taurus.core.taurusbasetypes.TaurusEventType.Change, None) #a fake event to force generating the curves
-        #set curve properties
+            # a fake event to force generating the curves
+            tset.fireEvent(
+                None, taurus.core.taurusbasetypes.TaurusEventType.Change, None)
+        # set curve properties
         self.setCurveAppearanceProperties(configdict["CurveProp"])
         self.updateLegend(force=True)
-        #set the axes
+        # set the axes
         self.applyAxesConfig(configdict["Axes"])
-        #set other misc configurations
+        # set other misc configurations
         self.applyMiscConfig(configdict["Misc"])
         forcedreadingperiod = configdict["Misc"].get("ForcedReadingPeriod")
         if forcedreadingperiod is not None:
             self.setForcedReadingPeriod(forcedreadingperiod)
-            
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         """Returns pertinent information in order to be able to build a valid
         QtDesigner widget plugin
-        
+
         :return: (dict) a map with pertinent designer information"""
         return {
-            'module'    : 'taurus.qt.qtgui.plot',
-            'group'     : 'Taurus Display',
-            'icon'      : ':/designer/qwtplot.png',
-            'container' : False }
-                
+            'module': 'taurus.qt.qtgui.plot',
+            'group': 'Taurus Display',
+            'icon': 'designer:qwtplot.png',
+            'container': False}
+
     def setEventFilters(self, filters=None, tsetnames=None, preqt=False):
         '''propagates a list of taurus filters to the trendsets given by tsetnames.
         See :meth:`TaurusBaseComponent.setEventFilters`
         '''
-        if tsetnames is None: tsetnames=self.getModel()
+        if tsetnames is None:
+            tsetnames = self.getModel()
         self.curves_lock.acquire()
         try:
             for name in tsetnames:
                 self.trendSets[name].setEventFilters(filters, preqt=preqt)
         finally:
             self.curves_lock.release()
-             
+
     def setUsePollingBuffer(self, enable):
         '''enables/disables looking up in the PollingBuffer for data
-        
+
         :param enable: (bool) if True, PollingBuffer values will be used if available
         '''
         self._usePollingBuffer = enable
@@ -1440,50 +1544,51 @@ class TaurusTrend(TaurusPlot):
 
     def getUsePollingBuffer(self):
         '''whether TaurusTrend is looking for data in the PollingBuffer
-        
+
         :return: (bool)
-        
+
         .. seealso:: :meth:`setUsePollingBuffer`
         '''
         return self._usePollingBuffer
 
     def resetUsePollingBuffer(self):
         '''Same as setUsePollingBuffer(True)'''
-        self.setUsePollingBuffer(True)   
-    
+        self.setUsePollingBuffer(True)
+
     def setUseArchiving(self, enable):
         '''enables/disables looking up in the archiver for data stored before
         the Trend was started
-        
+
         :param enable: (bool) if True, archiving values will be used if available
         '''
         if not self.getXIsTime():
             self.info('ignoring setUseArchiving. Reason: not in X time scale')
         self._useArchivingAction.setChecked(enable)
-        
+
     def getUseArchiving(self):
         '''whether TaurusTrend is looking for data in the archiver when needed
-        
+
         :return: (bool)
-        
+
         .. seealso:: :meth:`setUseArchiving`
         '''
         return self._useArchiving
 
     def resetUseArchiving(self):
         '''Same as setUseArchiving(True)'''
-        self.setUseArchiving(True)   
-    
+        self.setUseArchiving(True)
+
     def _onUseArchivingAction(self, enable):
         '''slot being called when toggling the useArchiving action
-        
+
         .. seealso:: :meth:`setUseArchiving`
         '''
         if enable:
-            self._archivingWarningThresshold = self._startingTime - 600 #10 min before the widget was created
-            self.connect(self.axisWidget(self.xBottom), Qt.SIGNAL("scaleDivChanged ()"), self._scaleChangeWarning)
+            self._archivingWarningThresshold = self._startingTime - \
+                600  # 10 min before the widget was created
+            self.axisWidget(self.xBottom).scaleDivChanged.connect(self._scaleChangeWarning)
         else:
-            self.disconnect(self.axisWidget(self.xBottom), Qt.SIGNAL("scaleDivChanged ()"), self._scaleChangeWarning)
+            self.axisWidget(self.xBottom).scaleDivChanged.disconnect(self._scaleChangeWarning)
             self._archivingWarningThresshold = None
         self._useArchiving = enable
         self.replot()
@@ -1494,173 +1599,184 @@ class TaurusTrend(TaurusPlot):
         smin = sdiv.lowerBound()
         if smin < self._archivingWarningThresshold:
             self.showArchivingWarning()
-            self._archivingWarningThresshold = smin-2*sdiv.range() #lower the thresshold by twice the current range 
-    
+            # lower the thresshold by twice the current range
+            self._archivingWarningThresshold = smin - 2 * sdiv.range()
+
     def showArchivingWarning(self):
-        '''shows a dialog warning of the potential isuues with 
+        '''shows a dialog warning of the potential isuues with
         archiving performance. It offers the user to disable archiving retrieval'''
-        #stop the scale change notification temporally (to avoid duplicate warnings)
+        # stop the scale change notification temporally (to avoid duplicate
+        # warnings)
         self.setUseArchiving(False)
-        self.disconnect(self.axisWidget(self.xBottom), Qt.SIGNAL("scaleDivChanged ()"), self._scaleChangeWarning)
-        #show a dialog
+        self.axisWidget(self.xBottom).scaleDivChanged.disconnect(self._scaleChangeWarning)
+        # show a dialog
         dlg = Qt.QDialog(self)
         dlg.setModal(True)
         dlg.setLayout(Qt.QVBoxLayout())
         dlg.setWindowTitle('Archiving warning')
-        msg = 'Archiving retrieval is enabled.\n'+\
-              'Rescaling to previous date/times may cause performance loss.\n'+\
-              '\nDisable archiving retrieval?\n'            
+        msg = 'Archiving retrieval is enabled.\n' +\
+              'Rescaling to previous date/times may cause performance loss.\n' +\
+              '\nDisable archiving retrieval?\n'
         dlg.layout().addWidget(Qt.QLabel(msg))
         rememberCB = Qt.QCheckBox('Do not ask again')
         buttonbox = Qt.QDialogButtonBox()
-        buttonbox.addButton(Qt.QPushButton('&Keep enabled'), buttonbox.RejectRole)
+        buttonbox.addButton(Qt.QPushButton(
+            '&Keep enabled'), buttonbox.RejectRole)
         buttonbox.addButton(Qt.QPushButton('&Disable'), buttonbox.AcceptRole)
         dlg.layout().addWidget(buttonbox)
-        dlg.connect(buttonbox, Qt.SIGNAL('accepted()'), dlg.accept)
-        dlg.connect(buttonbox, Qt.SIGNAL('rejected()'), dlg.reject)
+        buttonbox.accepted.connect(dlg.accept)
+        buttonbox.rejected.connect(dlg.reject)
         dlg.layout().addWidget(rememberCB)
         dlg.exec_()
-        #disable archiving if the user said so
+        # disable archiving if the user said so
         if dlg.result() == dlg.Accepted:
             self.setUseArchiving(False)
-        #restore the scale change notification only if the user chose to keep archiving AND did not want to disable warnings
+        # restore the scale change notification only if the user chose to keep
+        # archiving AND did not want to disable warnings
         else:
             self.setUseArchiving(True)
-            if not rememberCB.isChecked(): 
-                self.connect(self.axisWidget(self.xBottom), Qt.SIGNAL("scaleDivChanged ()"), self._scaleChangeWarning) 
-    
+            if not rememberCB.isChecked():
+                self.axisWidget(self.xBottom).scaleDivChanged.connect(self._scaleChangeWarning)
+
     def setMaxDataBufferSize(self, maxSize=None):
         '''sets the maximum number of events that can be plotted in the trends
-        
-        :param maxSize: (int or None) the maximum limit. If None is passed, 
-                        the user is prompted for a value. 
-        
+
+        :param maxSize: (int or None) the maximum limit. If None is passed,
+                        the user is prompted for a value.
+
         .. seealso:: :meth:`TaurusTrendSet.setMaxDataBufferSize`
         '''
         if maxSize is None:
             maxSize = self._maxDataBufferSize
-            try: #API changed in QInputDialog since Qt4.4
+            try:  # API changed in QInputDialog since Qt4.4
                 qgetint = Qt.QInputDialog.getInt
             except AttributeError:
                 qgetint = Qt.QInputDialog.getInteger
-            maxSize,ok = qgetint(self, 'New buffer data size', 
-                                               'Enter the number of points to be kept in memory for each curve', 
-                                               maxSize, 2, 10000000, 1000)
-            if not ok: 
-                return 
-        
+            maxSize, ok = qgetint(self, 'New buffer data size',
+                                  'Enter the number of points to be kept in memory for each curve',
+                                  maxSize, 2, 10000000, 1000)
+            if not ok:
+                return
+
         choiceOnClear = None
-        
+
         self.curves_lock.acquire()
         try:
-            for n,ts in self.trendSets.iteritems():
+            for n, ts in self.trendSets.iteritems():
                 try:
                     ts.setMaxDataBufferSize(maxSize)
                 except ValueError:
                     if choiceOnClear is None:
-                        choiceOnClear = Qt.QMessageBox.question(self, "Clear buffers?", "Clear the curves that contain too many points for the selected buffer size?", Qt.QMessageBox.No|Qt.QMessageBox.Yes) 
+                        choiceOnClear = Qt.QMessageBox.question(
+                            self, "Clear buffers?", "Clear the curves that contain too many points for the selected buffer size?", Qt.QMessageBox.No | Qt.QMessageBox.Yes)
                     if choiceOnClear == Qt.QMessageBox.Yes:
                         ts.clearTrends(replot=False)
                         ts.setMaxDataBufferSize(maxSize)
         finally:
             self.curves_lock.release()
         self._maxDataBufferSize = maxSize
-        
+
     def getMaxDataBufferSize(self):
         '''returns the maximum number of events that can be plotted in the trend
-        
+
         :return: (int)
         '''
         return self._maxDataBufferSize
-            
+
     def resetMaxDataBufferSize(self):
         '''Same as setMaxDataBufferSize(self.DEFAULT_MAX_BUFFER_SIZE)'''
         self.setMaxDataBufferSize(self.DEFAULT_MAX_BUFFER_SIZE)
-    
+
     def _canvasContextMenu(self):
         ''' see :meth:`TaurusPlot._canvasContextMenu` '''
         menu = TaurusPlot._canvasContextMenu(self)
         menu.insertAction(self._setCurvesTitleAction, self._useArchivingAction)
-        menu.insertAction(self._setCurvesTitleAction, self._usePollingBufferAction)
-        menu.insertAction(self._setCurvesTitleAction, self._setForcedReadingPeriodAction)
-        menu.insertAction(self._setCurvesTitleAction, self._setMaxBufferSizeAction)
+        menu.insertAction(self._setCurvesTitleAction,
+                          self._usePollingBufferAction)
+        menu.insertAction(self._setCurvesTitleAction,
+                          self._setForcedReadingPeriodAction)
+        menu.insertAction(self._setCurvesTitleAction,
+                          self._setMaxBufferSizeAction)
         menu.insertAction(self._setCurvesTitleAction, self._clearBuffersAction)
         if self.__qdoorname is not None:
-            menu.insertAction(self._setCurvesTitleAction, self._autoClearOnScanAction)
+            menu.insertAction(self._setCurvesTitleAction,
+                              self._autoClearOnScanAction)
         return menu
-    
-    def _axisContextMenu(self,axis=None):
+
+    def _axisContextMenu(self, axis=None):
         ''' see :meth:`TaurusPlot._axisContextMenu` '''
         menu = TaurusPlot._axisContextMenu(self, axis=axis)
         if axis in (Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.xTop) and self.__qdoorname is not None:
-            menu.addAction('Source of X values...', self.onChangeXDataKeyAction)
+            menu.addAction('Source of X values...',
+                           self.onChangeXDataKeyAction)
         return menu
-    
+
     def onChangeXDataKeyAction(self):
         options = ['[Auto Selection]', '[Internal Scan Index]']
         if self.__qdoorname is not None:
-            scanname = "scan://%s"%self.__qdoorname
+            scanname = "scan://%s" % self.__qdoorname
             tset = self.getTrendSet(scanname)
             datadesc = tset.getDataDesc()
             if datadesc is not None:
                 for dd in datadesc:
-                    if len(stripShape(dd['shape']))== 0: #an scalar
+                    if len(stripShape(dd['shape'])) == 0:  # an scalar
                         options.append(dd["label"])
-    
-        key, ok = Qt.QInputDialog.getItem(self, 'X data source selection', 
+
+        key, ok = Qt.QInputDialog.getItem(self, 'X data source selection',
                                           'Which data is to be used for the abscissas in scans?',
                                           options, 0, True)
         if ok:
-            key=str(key)
-            if key == options[0]: key = None
-            elif key == options[1]: key = '__SCAN_TREND_INDEX__'
+            key = str(key)
+            if key == options[0]:
+                key = None
+            elif key == options[1]:
+                key = '__SCAN_TREND_INDEX__'
             self.setScansXDataKey(key, scanname)
-            
-    
+
     def setForcedReadingPeriod(self, msec=None, tsetnames=None):
         '''Sets the forced reading period for the trend sets given by tsetnames.
-        
-        :param msec: (int or None) period in milliseconds. If None passed, the user will be 
+
+        :param msec: (int or None) period in milliseconds. If None passed, the user will be
                      prompted
-        :param tsetnames: (seq<str> or None) names of the curves for which the forced 
-                          reading is set. If None passed, this will be set for all 
+        :param tsetnames: (seq<str> or None) names of the curves for which the forced
+                          reading is set. If None passed, this will be set for all
                           present *and future* curves added to this trend
-    
+
         .. seealso: :meth:`TaurusTrendSet.setForcedReadingPeriod`
         '''
         if msec is None:
             msec = self._forcedReadingPeriod
-            try: #API changed in QInputDialog since Qt4.4
+            try:  # API changed in QInputDialog since Qt4.4
                 qgetint = Qt.QInputDialog.getInt
             except AttributeError:
                 qgetint = Qt.QInputDialog.getInteger
-            msec,ok = qgetint(self, 'New forced reading period', 
-                                               'Enter the new period for forced reading (in ms).\n Enter "0" for disabling', 
-                                               max(0,msec), 0, 604800000, 100)
-            if not ok: 
+            msec, ok = qgetint(self, 'New forced reading period',
+                               'Enter the new period for forced reading (in ms).\n Enter "0" for disabling',
+                               max(0, msec), 0, 604800000, 100)
+            if not ok:
                 return
-            if msec == 0: 
-                msec=-1
-        
+            if msec == 0:
+                msec = -1
+
         self._forcedReadingPeriod = msec
-        
-        if tsetnames is None: 
-            tsetnames=self.getModel()
+
+        if tsetnames is None:
+            tsetnames = self.getModel()
         self.curves_lock.acquire()
         try:
             for name in tsetnames:
                 self.trendSets[name].setForcedReadingPeriod(msec)
         finally:
             self.curves_lock.release()
-            
+
     def getForcedReadingPeriod(self, tsetname=None):
-        '''returns the forced reading period for the given trend (or the general period 
+        '''returns the forced reading period for the given trend (or the general period
         if None is given)
-        
-        :param tsetname: (str or None) name of the trend set for which the forced 
+
+        :param tsetname: (str or None) name of the trend set for which the forced
                           reading should be returned. If None passed, the
                           default period for all curves is returned
-    
+
         .. seealso: :meth:`setForcedReadingPeriod`
         '''
         if tsetname is None:
@@ -1671,87 +1787,92 @@ class TaurusTrend(TaurusPlot):
                 return self.trendSets[tsetname].getForcedReadingPeriod()
             finally:
                 self.curves_lock.release()
-                
+
     def resetForcedReadingPeriod(self):
         '''Equivalent to setForcedReadingPeriod(msec=-1, tsetnames=None)'''
         self.setForcedReadingPeriod(msec=-1, tsetnames=None)
-            
+
     def setScrollStep(self, scrollStep):
         '''
         Sets the scroll step when in Dynamic X mode. This is used to avoid
         excessive replotting, which may be a problem when plotting a lot of points.
-        
+
         :param scrollStep: (float) portion of the current range that will
                              be added when scrolling.  For example, 0.1 means
                              that 10% of the current range will be added when
                              scrolling. A value of 0 means that no extra
                              space will be added (thus the scroll is not in
-                             "steps"). Large scroll steps mean rough scrolls, 
+                             "steps"). Large scroll steps mean rough scrolls,
                              but also less CPU usage.
-                             
+
         .. seealso:: :meth:`setXDynScale`
         '''
         self._scrollStep = scrollStep
-        
+
     def getScrollStep(self):
         '''returns the value of the scroll step
-        
+
         :return: (float)
         '''
-        return self._scrollStep 
-    
+        return self._scrollStep
+
     def resetScrollStep(self):
         '''equivalent to setScrollStep(0.2)'''
         self.setScrollStep(0.2)
-    
-    useArchiving = Qt.pyqtProperty("bool", getUseArchiving, setUseArchiving, resetUseArchiving)
-    usePollingBuffer = Qt.pyqtProperty("bool", getUsePollingBuffer, setUsePollingBuffer, resetUsePollingBuffer)
-    maxDataBufferSize = Qt.pyqtProperty("int", getMaxDataBufferSize, setMaxDataBufferSize, resetMaxDataBufferSize)
-    scrollstep = Qt.pyqtProperty("double", getScrollStep, setScrollStep, resetScrollStep)
-    forcedReadingPeriod = Qt.pyqtProperty("int", getForcedReadingPeriod, setForcedReadingPeriod, resetForcedReadingPeriod)
-    
-    
+
+    useArchiving = Qt.pyqtProperty(
+        "bool", getUseArchiving, setUseArchiving, resetUseArchiving)
+    usePollingBuffer = Qt.pyqtProperty(
+        "bool", getUsePollingBuffer, setUsePollingBuffer, resetUsePollingBuffer)
+    maxDataBufferSize = Qt.pyqtProperty(
+        "int", getMaxDataBufferSize, setMaxDataBufferSize, resetMaxDataBufferSize)
+    scrollstep = Qt.pyqtProperty(
+        "double", getScrollStep, setScrollStep, resetScrollStep)
+    forcedReadingPeriod = Qt.pyqtProperty(
+        "int", getForcedReadingPeriod, setForcedReadingPeriod, resetForcedReadingPeriod)
+
 
 def test():
     import sys
     import taurus.qt.qtgui.application
     app = taurus.qt.qtgui.application.TaurusApplication()
-    w=Qt.QWidget()
+    w = Qt.QWidget()
     w.setLayout(Qt.QVBoxLayout())
-    s=Qt.QSplitter()
+    s = Qt.QSplitter()
     w.layout().addWidget(s)
-    t=TaurusTrend()
-    l=Qt.QLabel('asdasdasdasdasd')
+    t = TaurusTrend()
+    l = Qt.QLabel('asdasdasdasdasd')
     s.addWidget(l)
     s.addWidget(t)
-    s.setSizes([1,0])
+    s.setSizes([1, 0])
     w.show()
     t.setModel(['bl97/pc/dummy-01/voltage'])
     sys.exit(app.exec_())
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     import taurus.core.util.argparse
-    
+
     parser = taurus.core.util.argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [<model1> [<model2>] ...]")
     parser.set_description("a taurus application for plotting trends")
     parser.add_option("-x", "--x-axis-mode", dest="x_axis_mode", default='t', metavar="t|e",
-                  help="interprete X values as either timestamps (t) or event numbers (e). Accepted values: t|e")
-    parser.add_option("-b", "--buffer", dest="max_buffer_size", default=TaurusTrend.DEFAULT_MAX_BUFFER_SIZE, 
-                  help="maximum number of values per curve to be plotted (default = %i) (when reached, the oldest values will be discarded)"%TaurusTrend.DEFAULT_MAX_BUFFER_SIZE)
+                      help="interprete X values as either timestamps (t) or event numbers (e). Accepted values: t|e")
+    parser.add_option("-b", "--buffer", dest="max_buffer_size", default=TaurusTrend.DEFAULT_MAX_BUFFER_SIZE,
+                      help="maximum number of values per curve to be plotted (default = %i) (when reached, the oldest values will be discarded)" % TaurusTrend.DEFAULT_MAX_BUFFER_SIZE)
     parser.add_option("--config", "--config-file", dest="config_file", default=None,
-                  help="use the given config file for initialization")
+                      help="use the given config file for initialization")
     parser.add_option("--export", "--export-file", dest="export_file", default=None,
-                  help="use the given file to as output instead of showing the plot")
+                      help="use the given file to as output instead of showing the plot")
     parser.add_option("-r", "--forced-read", dest="forced_read_period", type="int", default=-1, metavar="MILLISECONDS",
-                  help="force Taurustrend to re-read the attributes every MILLISECONDS ms")
-    parser.add_option("-a", "--use-archiving", action="store_true", dest="use_archiving", default=False)
-    parser.add_option("--window-name", dest="window_name", default="TaurusTrend", help="Name of the window")
+                      help="force Taurustrend to re-read the attributes every MILLISECONDS ms")
+    parser.add_option("-a", "--use-archiving",
+                      action="store_true", dest="use_archiving", default=False)
+    parser.add_option("--window-name", dest="window_name",
+                      default="TaurusTrend", help="Name of the window")
 
-    
-    
     app = taurus.qt.qtgui.application.TaurusApplication(cmd_line_parser=parser,
                                                         app_name="taurustrend",
                                                         app_version=taurus.Release.version)
@@ -1762,53 +1883,56 @@ def main():
         sys.exit(1)
 
     models = args
-    
+
     w = TaurusTrend()
     w.setWindowTitle(options.window_name)
-    
-    #xistime option
+
+    # xistime option
     w.setXIsTime(options.x_axis_mode.lower() == 't')
-    #max buffer size option
+    # max buffer size option
     w.setMaxDataBufferSize(int(options.max_buffer_size))
-    #configuration file option
-    if options.config_file is not None: w.loadConfig(options.config_file)
-    #set models 
-    if models: w.setModel(models)
-    #export option
+    # configuration file option
+    if options.config_file is not None:
+        w.loadConfig(options.config_file)
+    # set models
+    if models:
+        w.setModel(models)
+    # export option
     if options.export_file is not None:
-        curves = dict.fromkeys(w.trendSets.keys(),0)        
-        def exportIfAllCurves(curve,trend=w,counters=curves):
+        curves = dict.fromkeys(w.trendSets.keys(), 0)
+
+        def exportIfAllCurves(curve, trend=w, counters=curves):
             curve = str(curve)
-            print '*'*10 + ' %s: Event received for %s  '%(datetime.now().isoformat(),curve) +'*'*10        
+            print '*' * 10 + ' %s: Event received for %s  ' % (datetime.now().isoformat(), curve) + '*' * 10
             if curve in counters:
-                counters[curve]+=1
+                counters[curve] += 1
                 if all(counters.values()):
                     trend.exportPdf(options.export_file)
-                    print '*'*10 + ' %s: Exported to : %s  '%(datetime.now().isoformat(),options.export_file) +'*'*10        
+                    print '*' * 10 + ' %s: Exported to : %s  ' % (datetime.now().isoformat(), options.export_file) + '*' * 10
                     trend.close()
             return
-        if not curves: w.close()
+        if not curves:
+            w.close()
         else:
             for ts in w.trendSets.values():
-                Qt.QObject.connect(ts, Qt.SIGNAL("dataChanged(const QString &)"), exportIfAllCurves)
-        sys.exit(app.exec_()) #exit without showing the widget
-    
+                ts.dataChanged.connect(exportIfAllCurves)
+        sys.exit(app.exec_())  # exit without showing the widget
+
     # period option
-    if options.forced_read_period >0:
+    if options.forced_read_period > 0:
         w.setForcedReadingPeriod(options.forced_read_period)
-    
-    #archiving option     
+
+    # archiving option
     w.setUseArchiving(options.use_archiving)
-    
-    #show the widget
+
+    # show the widget
     w.show()
-    
-    #if no models are passed, show the data import dialog
+
+    # 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_())
- 
-if __name__ == "__main__":
-    main()    
 
+if __name__ == "__main__":
+    main()
diff --git a/lib/taurus/qt/qtgui/plot/ui/ArrayEditor.ui b/lib/taurus/qt/qtgui/plot/ui/ArrayEditor.ui
index c527d96..668060e 100644
--- a/lib/taurus/qt/qtgui/plot/ui/ArrayEditor.ui
+++ b/lib/taurus/qt/qtgui/plot/ui/ArrayEditor.ui
@@ -116,7 +116,7 @@
  <customwidgets>
   <customwidget>
    <class>TaurusPlot</class>
-   <extends>QWidget</extends>
+   <extends>QwtPlot</extends>
    <header>taurus.qt.qtgui.plot</header>
   </customwidget>
  </customwidgets>
diff --git a/lib/taurus/qt/qtgui/plot/ui/CurvesAppearanceChooser.ui b/lib/taurus/qt/qtgui/plot/ui/CurvesAppearanceChooser.ui
old mode 100644
new mode 100755
diff --git a/lib/taurus/qt/qtgui/plot/ui/TaurusPlotConfDlg.ui b/lib/taurus/qt/qtgui/plot/ui/TaurusPlotConfDlg.ui
old mode 100644
new mode 100755
diff --git a/lib/taurus/qt/qtgui/resource/__init__.py b/lib/taurus/qt/qtgui/resource/__init__.py
index 707b30d..ef0a65b 100644
--- a/lib/taurus/qt/qtgui/resource/__init__.py
+++ b/lib/taurus/qt/qtgui/resource/__init__.py
@@ -2,29 +2,36 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-    
+Old module supporting resources (now it just contains a reimplementation
+based on taurus.qt.qtgui.icon for bck-compat)
 """
 
+from taurus.core.util.log import deprecated as __deprecated
+
+__deprecated(dep='taurus.qt.qtgui.resource',
+           alt='taurus.qt.qtgui.icon',
+           rel='4.0')
+
 from taurus_resource_utils import *
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-delete.svg b/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-delete.svg
deleted file mode 100644
index 5da694f..0000000
--- a/lib/taurus/qt/qtgui/resource/tango-icons/actions/edit-delete.svg
+++ /dev/null
@@ -1,792 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="48px"
-   height="48px"
-   id="svg57"
-   sodipodi:version="0.32"
-   inkscape:version="0.46+devel"
-   sodipodi:docname="edit-delete.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs3">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 24 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="48 : 24 : 1"
-       inkscape:persp3d-origin="24 : 16 : 1"
-       id="perspective141" />
-    <linearGradient
-       id="linearGradient3241">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop3243" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop3245" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3229">
-      <stop
-         style="stop-color:#598bcb;stop-opacity:1;"
-         offset="0"
-         id="stop3231" />
-      <stop
-         id="stop3249"
-         offset="0.75675678"
-         style="stop-color:#2f5c96;stop-opacity:1;" />
-      <stop
-         style="stop-color:#203e65;stop-opacity:1;"
-         offset="1"
-         id="stop3233" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3175">
-      <stop
-         style="stop-color:black;stop-opacity:1;"
-         offset="0"
-         id="stop3177" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop3179" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3159">
-      <stop
-         style="stop-color:black;stop-opacity:1;"
-         offset="0"
-         id="stop3161" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop3163" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3141">
-      <stop
-         style="stop-color:#a40000;stop-opacity:1;"
-         offset="0"
-         id="stop3143" />
-      <stop
-         style="stop-color:#ffc4c4;stop-opacity:1;"
-         offset="1"
-         id="stop3145" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3008">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop3010" />
-      <stop
-         style="stop-color:#d3d3d3;stop-opacity:1;"
-         offset="1"
-         id="stop3012" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2978">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop2980" />
-      <stop
-         style="stop-color:#d5d5d5;stop-opacity:1;"
-         offset="1"
-         id="stop2982" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2964">
-      <stop
-         style="stop-color:black;stop-opacity:1;"
-         offset="0"
-         id="stop2966" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop2968" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5060"
-       id="radialGradient6719"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
-       cx="605.71429"
-       cy="486.64789"
-       fx="605.71429"
-       fy="486.64789"
-       r="117.14286" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5060">
-      <stop
-         style="stop-color:black;stop-opacity:1;"
-         offset="0"
-         id="stop5062" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop5064" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5060"
-       id="radialGradient6717"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
-       cx="605.71429"
-       cy="486.64789"
-       fx="605.71429"
-       fy="486.64789"
-       r="117.14286" />
-    <linearGradient
-       id="linearGradient5048">
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="0"
-         id="stop5050" />
-      <stop
-         id="stop5056"
-         offset="0.5"
-         style="stop-color:black;stop-opacity:1;" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop5052" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5048"
-       id="linearGradient6715"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
-       x1="302.85715"
-       y1="366.64789"
-       x2="302.85715"
-       y2="609.50507" />
-    <linearGradient
-       id="linearGradient381">
-      <stop
-         id="stop382"
-         offset="0"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         id="stop383"
-         offset="1"
-         style="stop-color:white;stop-opacity:0.84466022;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient368">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0.10309278;"
-         offset="0.0000000"
-         id="stop369" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0.0000000;"
-         offset="1.0000000"
-         id="stop372" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient1065">
-      <stop
-         style="stop-color:#b5c051;stop-opacity:1.0000000;"
-         offset="0.0000000"
-         id="stop1066" />
-      <stop
-         style="stop-color:#858e3f;stop-opacity:1.0000000;"
-         offset="1.0000000"
-         id="stop1067" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient172">
-      <stop
-         id="stop173"
-         offset="0.0000000"
-         style="stop-color:#616c08;stop-opacity:1.0000000;" />
-      <stop
-         id="stop174"
-         offset="1.0000000"
-         style="stop-color:#495106;stop-opacity:1.0000000;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient161">
-      <stop
-         id="stop162"
-         offset="0.0000000"
-         style="stop-color:#575955;stop-opacity:1.0000000;" />
-      <stop
-         id="stop163"
-         offset="1.0000000"
-         style="stop-color:#7c7e79;stop-opacity:1.0000000;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient157">
-      <stop
-         id="stop158"
-         offset="0.0000000"
-         style="stop-color:#babdb6;stop-opacity:1.0000000;" />
-      <stop
-         id="stop159"
-         offset="1.0000000"
-         style="stop-color:#f1f5ec;stop-opacity:1.0000000;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient149"
-       inkscape:collect="always">
-      <stop
-         id="stop150"
-         offset="0"
-         style="stop-color:#000000;stop-opacity:1;" />
-      <stop
-         id="stop151"
-         offset="1"
-         style="stop-color:#000000;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient1869">
-      <stop
-         style="stop-color:#c9c9c9;stop-opacity:1;"
-         offset="0"
-         id="stop1870" />
-      <stop
-         style="stop-color:#787a7b;stop-opacity:1;"
-         offset="1"
-         id="stop1871" />
-    </linearGradient>
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="69.460503"
-       x2="7.5291119"
-       y1="27.376621"
-       x1="7.3738608"
-       gradientTransform="matrix(3.495016,0,0,0.344323,-2.972087,-3.408148e-2)"
-       id="linearGradient152"
-       xlink:href="#linearGradient149"
-       inkscape:collect="always" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient149"
-       id="linearGradient2058"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.520411,0,0,0.348016,-3.037918,1.544257)"
-       x1="7.3738608"
-       y1="27.376621"
-       x2="7.5291119"
-       y2="69.460503" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2964"
-       id="linearGradient2970"
-       x1="27.5"
-       y1="14"
-       x2="27.625"
-       y2="18.750015"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.799991,0,-1.199875)" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient2984"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-17.82887,-61.79699)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient2988"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-16.18243,-61.79699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient2992"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-14.33255,-61.89699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient2996"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-12.67991,-61.03155)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3000"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-10.78506,-60.99081)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3004"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-19.58362,-61.75172)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3008"
-       id="linearGradient3097"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.984533,0,0,1.203586,0.971903,-2.123191)"
-       x1="26.151339"
-       y1="-5.7401156"
-       x2="27.500387"
-       y2="13.351768" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3107"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-8.332562,-61.89699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3111"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-6.332562,-61.89699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3115"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-4.332562,-61.89699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3119"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-2.332562,-61.89699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3123"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,-0.332562,-61.89699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3127"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,1.667438,-61.89699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3131"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,3.667438,-61.89699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2978"
-       id="radialGradient3135"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.146715,6.924886e-2,-6.039991e-2,2.744612,5.667438,-61.89699)"
-       cx="9.5796242"
-       cy="33.588264"
-       fx="9.5796242"
-       fy="33.588264"
-       r="2.5527742" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3141"
-       id="linearGradient3147"
-       x1="40.5"
-       y1="13.822797"
-       x2="40.5"
-       y2="16.877842"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3159"
-       id="linearGradient3165"
-       x1="23.5"
-       y1="12"
-       x2="23.5"
-       y2="6.6875"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3175"
-       id="linearGradient3181"
-       x1="25"
-       y1="21"
-       x2="25"
-       y2="32.25"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3229"
-       id="linearGradient3239"
-       gradientUnits="userSpaceOnUse"
-       x1="24.000006"
-       y1="15.837313"
-       x2="24.000006"
-       y2="21" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3241"
-       id="linearGradient3247"
-       x1="21.67791"
-       y1="19.969507"
-       x2="22.333523"
-       y2="11.643976"
-       gradientUnits="userSpaceOnUse" />
-    <inkscape:perspective
-       id="perspective1771"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <filter
-       color-interpolation-filters="sRGB"
-       inkscape:collect="always"
-       id="filter1402-6"
-       x="-0.1352438"
-       width="1.2704875"
-       y="-0.23404884"
-       height="1.4680977">
-      <feGaussianBlur
-         inkscape:collect="always"
-         stdDeviation="1.1763393"
-         id="feGaussianBlur1404-8" />
-    </filter>
-    <filter
-       color-interpolation-filters="sRGB"
-       inkscape:collect="always"
-       id="filter1392-1">
-      <feGaussianBlur
-         inkscape:collect="always"
-         stdDeviation="0.35290179"
-         id="feGaussianBlur1394-9" />
-    </filter>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient1378-7"
-       id="linearGradient1730"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.0215056,-0.01115,-5.8410512)"
-       x1="322.47101"
-       y1="188.47574"
-       x2="318.93546"
-       y2="178.74567" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient1378-7">
-      <stop
-         style="stop-color:#e08980;stop-opacity:1"
-         offset="0"
-         id="stop1380-2" />
-      <stop
-         style="stop-color:#ecb8b3;stop-opacity:1"
-         offset="1"
-         id="stop1382-7" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient1406-8"
-       id="linearGradient1732"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.0215056,0,-3.8387571)"
-       x1="319.19122"
-       y1="189.01508"
-       x2="316.5"
-       y2="179.51508" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient1406-8">
-      <stop
-         style="stop-color:#ef2929;stop-opacity:1;"
-         offset="0"
-         id="stop1408-4" />
-      <stop
-         style="stop-color:#f68888;stop-opacity:1"
-         offset="1"
-         id="stop1410-7" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient1685"
-       id="radialGradient1734"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.5678358,0,0,1.6135477,-495.24396,-111.34155)"
-       cx="315.87744"
-       cy="185.13527"
-       fx="315.87744"
-       fy="185.13527"
-       r="6.9191298" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient1685">
-      <stop
-         style="stop-color:#eac9c3;stop-opacity:1"
-         offset="0"
-         id="stop1687" />
-      <stop
-         style="stop-color:#dfaea5;stop-opacity:0;"
-         offset="1"
-         id="stop1689" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient1414-9"
-       id="radialGradient1736"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.9049428,0,0,1.7883119,-284.81779,-147.22221)"
-       cx="314.73569"
-       cy="186.7563"
-       fx="314.73569"
-       fy="186.7563"
-       r="8.2883635" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient1414-9">
-      <stop
-         style="stop-color:#edd6d1;stop-opacity:1;"
-         offset="0"
-         id="stop1416-3" />
-      <stop
-         style="stop-color:#edd6d1;stop-opacity:0;"
-         offset="1"
-         id="stop1418-4" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient1708"
-       id="radialGradient1759"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(4.1253276,-0.06809918,0.01466137,0.88816079,-983.12001,42.179334)"
-       cx="313.72925"
-       cy="184.16124"
-       fx="313.72925"
-       fy="184.16124"
-       r="9.4561253" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient1708">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop1710" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop1712" />
-    </linearGradient>
-    <radialGradient
-       r="9.4561253"
-       fy="184.16124"
-       fx="313.72925"
-       cy="184.16124"
-       cx="313.72925"
-       gradientTransform="matrix(4.1253276,-0.06809918,0.01466137,0.88816079,-983.12001,42.179334)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient1806"
-       xlink:href="#linearGradient1708"
-       inkscape:collect="always" />
-  </defs>
-  <sodipodi:namedview
-     showborder="true"
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666"
-     borderopacity="0.13333333"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="28.471441"
-     inkscape:cy="29.499819"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="872"
-     inkscape:window-height="688"
-     inkscape:window-x="562"
-     inkscape:window-y="156"
-     inkscape:showpageshadow="false"
-     inkscape:object-nodes="true"
-     inkscape:object-points="false"
-     inkscape:object-bbox="false"
-     inkscape:guide-bbox="false"
-     inkscape:grid-points="true"
-     inkscape:object-paths="false">
-    <inkscape:grid
-       id="GridFromPre046Settings"
-       type="xygrid"
-       originx="0px"
-       originy="0px"
-       spacingx="1px"
-       spacingy="1px"
-       color="#0000ff"
-       empcolor="#0000ff"
-       opacity="0.2"
-       empopacity="0.4"
-       empspacing="4"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata4">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title>Delete</dc:title>
-        <dc:date />
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>Jakub Steiner</dc:title>
-          </cc:Agent>
-        </dc:creator>
-        <dc:subject>
-          <rdf:Bag>
-            <rdf:li>edit</rdf:li>
-            <rdf:li>delete</rdf:li>
-            <rdf:li>shredder</rdf:li>
-          </rdf:Bag>
-        </dc:subject>
-        <dc:publisher>
-          <cc:Agent>
-            <dc:title>Novell, Inc.</dc:title>
-          </cc:Agent>
-        </dc:publisher>
-        <cc:license
-           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
-        <dc:contributor>
-          <cc:Agent>
-            <dc:title />
-          </cc:Agent>
-        </dc:contributor>
-      </cc:Work>
-      <cc:License
-         rdf:about="http://creativecommons.org/licenses/publicdomain/">
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Reproduction" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Distribution" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
-      </cc:License>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <g
-       transform="matrix(2.0977523,0,0,2.0977523,-633.61745,-371.24275)"
-       style="display:inline;enable-background:new"
-       id="g1716">
-      <path
-         style="opacity:0.55825243;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter1402-6);enable-background:new"
-         d="m 312.5,184.125 -9.375,12 14.4375,-0.0625 6.4375,-12 -11.5,0.0625 z"
-         id="path1718" />
-      <path
-         id="path1720"
-         d="m 313,183.9375 -8.71954,10.92742 c -0.30288,0.53466 -0.48193,1.19206 0.6024,1.08555 l 10.0215,0.10329 c 1.49137,-0.29414 3.02657,-0.48603 4.05734,-1.85493 l 4.46572,-9.9663 L 313,183.9375 z"
-         style="opacity:0.52912622;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter1392-1);enable-background:new"
-         sodipodi:nodetypes="ccccccc" />
-      <path
-         sodipodi:nodetypes="cccccccccccc"
-         id="path1722"
-         d="m 312.32017,178.62672 9.67525,-0.0297 c 0.61872,-0.0903 1.32582,0.63203 1.32582,1.35435 l 0,4.15421 -4.48525,8.91788 c -0.80681,1.95287 -3.46271,2.74008 -5.32342,2.81042 l -7.40669,-0.0268 c -1.1178,0.0288 -2.42684,-0.60328 -1.91897,-2.25139 l 1.94203,-6.77221 5.07528,-7.70321 c 0.22709,-0.26222 0.43111,-0.54212 1.11595,-0.45364 l 0,9e-5 z"
-         style="color:#000000;fill:url(#linearGradient1730);fill-opacity:1;stroke:url(#linearGradient1732);stroke-width:0.47670069;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
-      <path
-         sodipodi:nodetypes="ccccccc"
-         id="path1724"
-         d="m 304.25279,195.46532 9.98597,0.10826 c 1.1349,-0.21139 2.20094,-0.53754 3.09848,-1.14453 l 0.75381,-7.59316 -11.5672,-0.0276 -2.27106,8.65705 0,-2e-5 z"
-         style="color:#000000;fill:url(#radialGradient1734);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
-      <path
-         sodipodi:nodetypes="cccccccccccccccc"
-         id="path1726"
-         d="m 317.41365,194.35621 1.06523,-7.12058 4.46893,-7.86036 c 0.0296,-0.27049 -0.1616,-0.329 -0.41698,-0.38554 l -4.27844,7.50027 -4.13109,-0.0519 c -0.60022,0.52688 -1.35358,0.84162 -2.11909,0.0462 l -5.3197,-0.0139 -0.35323,0.50004 5.65618,-0.005 c 0.4774,0.65669 1.36705,0.49517 2.1411,-0.0423 l 3.60854,0.0278 -1.28109,8.02625 c 0.33128,-0.19564 0.70071,-0.35312 0.95964,-0.62111 l 0,-2e-5 0,1.4e-4 z"
-         style="color:#000000;fill:url(#radialGradient1736);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
-      <path
-         id="path1728"
-         d="m 322.24177,179.04861 -10.05721,0.0315 c -0.0314,0.002 -0.0629,0.002 -0.0943,0 -0.23539,-0.0304 -0.24008,-0.007 -0.2516,0 -0.008,0.005 -0.0907,0.0826 -0.15725,0.15725 -0.0267,0.0299 -0.0231,0.0172 -0.0629,0.0629 l -5.00047,7.6737 -2.10712,7.54788 c 2.3e-4,0.0105 2.3e-4,0.021 0,0.0315 -0.12577,0.41356 -0.0882,0.52811 -0.0943,0.53464 3.7675,0.48486 7.68563,0.5781 11.84984,0.0315 0.4082,-0.006 0.69927,-0.0262 0.84913,-0.0943 0.14988,-0.0682 0.27824,-0.14712 0.40885,-0.66044 0.00 [...]
-         style="opacity:0.33495148;color:#000000;fill:none;stroke:url(#radialGradient1806);stroke-width:0.47670078;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
-         sodipodi:nodetypes="ccssscccsccsscccsscc" />
-    </g>
-  </g>
-</svg>
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-mark-not-junk.svg b/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-mark-not-junk.svg
deleted file mode 100644
index f0b0560..0000000
--- a/lib/taurus/qt/qtgui/resource/tango-icons/actions/mail-mark-not-junk.svg
+++ /dev/null
@@ -1,324 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   inkscape:export-ydpi="90.000000"
-   inkscape:export-xdpi="90.000000"
-   inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
-   width="48px"
-   height="48px"
-   id="svg11300"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
-   sodipodi:docname="mail-mark-not-junk.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs3">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 24 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="48 : 24 : 1"
-       inkscape:persp3d-origin="24 : 16 : 1"
-       id="perspective47" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5166">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop5168" />
-      <stop
-         style="stop-color:white;stop-opacity:0;"
-         offset="1"
-         id="stop5170" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient5196">
-      <stop
-         style="stop-color:#dfe2dc;stop-opacity:1;"
-         offset="0"
-         id="stop5198" />
-      <stop
-         style="stop-color:#86917a;stop-opacity:1;"
-         offset="1"
-         id="stop5200" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient5188">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop5190" />
-      <stop
-         style="stop-color:#aeaea3;stop-opacity:1;"
-         offset="1"
-         id="stop5192" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5176">
-      <stop
-         style="stop-color:black;stop-opacity:1;"
-         offset="0"
-         id="stop5178" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop5180" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient5162">
-      <stop
-         style="stop-color:#babdb6;stop-opacity:1;"
-         offset="0"
-         id="stop5164" />
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="1"
-         id="stop5166" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5150">
-      <stop
-         style="stop-color:black;stop-opacity:1;"
-         offset="0"
-         id="stop5152" />
-      <stop
-         style="stop-color:black;stop-opacity:0;"
-         offset="1"
-         id="stop5154" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5150"
-       id="radialGradient5156"
-       cx="24.837126"
-       cy="40.663769"
-       fx="24.837126"
-       fy="40.663769"
-       r="21.478369"
-       gradientTransform="matrix(1,0,0,0.325103,2.211772e-16,27.44386)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5162"
-       id="linearGradient5168"
-       x1="24.365993"
-       y1="20.246058"
-       x2="32.600704"
-       y2="28.554564"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5162"
-       id="linearGradient5170"
-       gradientUnits="userSpaceOnUse"
-       x1="22.008699"
-       y1="36.509514"
-       x2="23.585091"
-       y2="14.412428" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5176"
-       id="linearGradient5182"
-       x1="25.632622"
-       y1="10.611729"
-       x2="38.714096"
-       y2="18.389904"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5188"
-       id="radialGradient5361"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.135667,1.912751e-16,-1.890308e-16,2.110607,-26.90176,-15.66914)"
-       cx="23.688078"
-       cy="14.210698"
-       fx="23.688078"
-       fy="14.210698"
-       r="22.597087" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5196"
-       id="radialGradient5363"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.790269,1.339577e-16,-1.323859e-16,1.769263,-15.81394,-11.94997)"
-       cx="20.089987"
-       cy="10.853651"
-       fx="20.089987"
-       fy="10.853651"
-       r="22.597087" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5166"
-       id="linearGradient5172"
-       x1="19.450956"
-       y1="14.463861"
-       x2="23.71875"
-       y2="48.404987"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <sodipodi:namedview
-     stroke="#ef2929"
-     fill="#eeeeec"
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="0.25490196"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="-58.650069"
-     inkscape:cy="-15.809595"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:showpageshadow="false"
-     inkscape:window-width="872"
-     inkscape:window-height="652"
-     inkscape:window-x="441"
-     inkscape:window-y="340" />
-  <metadata
-     id="metadata4">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>Jakub Steiner</dc:title>
-          </cc:Agent>
-        </dc:creator>
-        <dc:source>http://jimmac.musichall.cz</dc:source>
-        <cc:license
-           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
-        <dc:title>Mark as non-junk</dc:title>
-        <dc:subject>
-          <rdf:Bag>
-            <rdf:li>mail</rdf:li>
-            <rdf:li>ham</rdf:li>
-            <rdf:li>non-junk</rdf:li>
-          </rdf:Bag>
-        </dc:subject>
-      </cc:Work>
-      <cc:License
-         rdf:about="http://creativecommons.org/licenses/publicdomain/">
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Reproduction" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Distribution" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
-      </cc:License>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       sodipodi:type="arc"
-       style="opacity:0.3258427;color:black;fill:url(#radialGradient5156);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       id="path4275"
-       sodipodi:cx="24.837126"
-       sodipodi:cy="40.663769"
-       sodipodi:rx="21.478369"
-       sodipodi:ry="6.9826794"
-       d="M 46.315495 40.663769 A 21.478369 6.9826794 0 1 1  3.358757,40.663769 A 21.478369 6.9826794 0 1 1  46.315495 40.663769 z"
-       transform="matrix(1.106996,0,0,1.106996,-3.364576,-5.411516)" />
-    <path
-       style="opacity:1;color:black;fill:url(#radialGradient5361);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient5363);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       d="M 9.0156115,37.570175 L 7.2478445,40.398602 L 10.960155,41.989592 L 13.611806,39.868272 L 25.455844,40.752155 L 29.168155,45.701903 L 32.526912,40.221825 L 36.769553,42.519922 L 42.426407,41.812816 L 41.012193,38.807612 L 44.901281,34.918524 L 39.421203,28.73134 L 44.724504,29.438447 L 47.022601,27.317127 L 44.017397,27.847457 L 40.835417,22.367379 L 36.239223,21.306719 L 39.951533,20.069282 L 40.12831,16.887302 L 32.880465,10.523341 L 30.228815,2.0380592 L 18.208,5.5735931 L 1 [...]
-       id="path4273" />
-    <path
-       style="opacity:0.76966292;color:black;fill:url(#linearGradient5170);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       d="M 19.445437,22.720933 L 18.561553,29.26167 L 20.682873,32.620427 L 16.086679,34.034641 L 13.435029,39.337942 L 25.455844,40.221825 L 28.284271,44.287689 L 30.582368,38.100505 L 26.162951,35.272078 L 19.445437,37.216622 L 22.097087,33.681088 L 20.682873,27.493903 L 19.445437,22.720933 z "
-       id="path5158" />
-    <path
-       style="opacity:0.61797753;color:black;fill:url(#linearGradient5168);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       d="M 20.506097,23.781593 L 24.925514,30.675884 L 32.173359,25.726136 L 36.592776,28.20101 L 40.12831,25.195806 L 43.31029,28.024233 L 40.305087,23.074486 L 33.410795,21.483496 L 24.748737,17.240855 C 24.748737,17.240855 12.374369,20.953166 13.081475,20.953166 C 13.788582,20.953166 23.334524,21.129942 23.334524,21.129942 L 24.925514,18.831845 L 29.168155,20.776389 L 20.506097,23.781593 z "
-       id="path5160" />
-    <path
-       style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       d="M 29.521708,3.4522727 L 19.091883,6.9878066 L 17.67767,10.876894 L 23.688077,15.119535 L 29.344931,9.6394571 L 29.521708,3.4522727 z "
-       id="path5172" />
-    <path
-       style="opacity:0.13483146;color:black;fill:url(#linearGradient5182);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       d="M 29.698485,3.8058261 L 31.996582,11.230447 L 36.239223,14.942758 L 27.577165,12.998214 C 27.577165,12.998214 25.102291,15.826641 26.162951,15.826641 C 27.223611,15.826641 38.714096,17.240855 38.714096,17.240855 L 38.53732,19.538952 L 22.273864,16.533748 L 29.344931,9.9930105 L 29.698485,3.8058261 z "
-       id="path5174" />
-    <path
-       style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       d="M 7.4246212,14.235651 L 6.5407377,23.074486 L 8.4852814,17.064078 L 13.611806,18.655069 L 14.849242,16.003418 L 21.036427,16.887302 L 22.45064,15.649865 L 13.435029,15.296311 L 12.551145,17.771185 L 8.6620581,15.826641 L 7.4246212,14.235651 z "
-       id="path5184" />
-    <path
-       style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       d="M 22.45064,27.317127 L 25.455844,30.852661 L 32.350135,26.256466 L 36.592776,28.554563 L 43.487067,35.095301 L 35.885669,29.26167 L 32.173359,28.20101 L 24.925514,33.150758 L 22.45064,27.317127 z "
-       id="path5186" />
-    <path
-       sodipodi:type="inkscape:offset"
-       inkscape:radius="-0.83777463"
-       inkscape:original="M 30.21875 2.03125 L 18.21875 5.5625 L 15.1875 12.65625 L 14.15625 10.34375 L 11.125 10.53125 L 11.125 13.34375 L 7.59375 9.28125 L 2.84375 14.40625 L 2.84375 21.65625 L 11.125 28.90625 L 5.84375 31.90625 L 6 34.90625 L 9 37.5625 L 7.25 40.40625 L 10.96875 42 L 13.625 39.875 L 25.46875 40.75 L 29.15625 45.6875 L 32.53125 40.21875 L 36.78125 42.53125 L 42.4375 41.8125 L 41 38.8125 L 44.90625 34.90625 L 39.40625 28.71875 L 44.71875 29.4375 L 47.03125 27.3125 L 44. [...]
-       xlink:href="#path4273"
-       style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5172);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       id="path5359"
-       inkscape:href="#path4273"
-       d="M 29.65625,3.09375 L 18.84375,6.25 L 15.96875,13 C 15.834262,13.30255 15.53422,13.497528 15.203125,13.497528 C 14.87203,13.497528 14.571988,13.30255 14.4375,13 L 13.65625,11.21875 L 11.96875,11.3125 L 11.96875,13.34375 C 11.973462,13.69495 11.758625,14.011813 11.430625,14.13743 C 11.102625,14.263047 10.731089,14.170753 10.5,13.90625 L 7.5625,10.53125 L 3.6875,14.71875 L 3.6875,21.28125 L 11.6875,28.28125 C 11.883657,28.462891 11.981357,28.727236 11.950479,28.992788 C 11.919601, [...]
-    <g
-       id="g3147"
-       transform="translate(-1,0)">
-      <rect
-         ry="2.2097087"
-         rx="2.2097087"
-         inkscape:r_cy="true"
-         inkscape:r_cx="true"
-         y="27.5"
-         x="28.5"
-         height="19"
-         width="20"
-         id="rect1686"
-         style="opacity:1;color:black;fill:#c00;fill-opacity:1;fill-rule:evenodd;stroke:#a40000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
-      <g
-         inkscape:r_cy="true"
-         inkscape:r_cx="true"
-         transform="matrix(0.779029,0,0,0.779029,28.87262,8.175921)"
-         id="g2254">
-        <path
-           style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:2.56729817;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-           d="M 8,32 L 18,42"
-           id="path1377"
-           inkscape:r_cx="true"
-           inkscape:r_cy="true" />
-        <path
-           inkscape:r_cy="true"
-           inkscape:r_cx="true"
-           id="path2252"
-           d="M 18,32 L 8,42"
-           style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:2.56729817;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
-      </g>
-      <rect
-         style="opacity:0.4;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-         id="rect2258"
-         width="18.09524"
-         height="17.190477"
-         x="29.452381"
-         y="28.404764"
-         inkscape:r_cx="true"
-         inkscape:r_cy="true"
-         rx="1.5847089"
-         ry="1.5847089" />
-    </g>
-  </g>
-</svg>
diff --git a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-cool.svg b/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-cool.svg
deleted file mode 100644
index f47d981..0000000
--- a/lib/taurus/qt/qtgui/resource/tango-icons/emotes/face-cool.svg
+++ /dev/null
@@ -1,282 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="48.000000px"
-   height="48.000000px"
-   id="svg4376"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   sodipodi:docbase="/storage/Development/Art/Tango/Emotes/face-cool/scalable"
-   sodipodi:docname="face-cool.svg"
-   inkscape:export-filename="/storage/Development/Art/Tango/Emotes/face-cool/48x48/face-cool.png"
-   inkscape:export-xdpi="90.000000"
-   inkscape:export-ydpi="90.000000"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs3">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 24 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="48 : 24 : 1"
-       inkscape:persp3d-origin="24 : 16 : 1"
-       id="perspective34" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3229">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop3231" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop3233" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3213">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:0.5"
-         offset="0"
-         id="stop3215" />
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1"
-         offset="1"
-         id="stop3217" />
-    </linearGradient>
-    <radialGradient
-       gradientTransform="matrix(-0.8718058,3.0940915e-2,9.3196149e-3,0.3961597,43.925449,-0.1513036)"
-       id="aigrd2"
-       cx="25.404816"
-       cy="84.907654"
-       r="15.7572"
-       fx="25.404816"
-       fy="84.907654"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         offset="0.0000000"
-         style="stop-color:#777777;stop-opacity:1.0000000;"
-         id="stop8602" />
-      <stop
-         offset="1"
-         style="stop-color:#000000"
-         id="stop8604" />
-    </radialGradient>
-    <linearGradient
-       id="linearGradient3290">
-      <stop
-         style="stop-color:#fffcde;stop-opacity:1.0000000;"
-         offset="0.0000000"
-         id="stop3292" />
-      <stop
-         id="stop3294"
-         offset="0.64485979"
-         style="stop-color:#f6e76a;stop-opacity:1.0000000;" />
-      <stop
-         style="stop-color:#ffb738;stop-opacity:1.0000000;"
-         offset="1.0000000"
-         id="stop3296" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4565">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop4567" />
-      <stop
-         style="stop-color:#000000;stop-opacity:0;"
-         offset="1"
-         id="stop4569" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4565"
-       id="radialGradient1360"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.333333,0,25.71429)"
-       cx="24.714285"
-       cy="38.571430"
-       fx="24.714285"
-       fy="38.571430"
-       r="19.714285" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3290"
-       id="radialGradient1362"
-       gradientUnits="userSpaceOnUse"
-       cx="29.288071"
-       cy="15.720984"
-       fx="29.158466"
-       fy="15.755712"
-       r="8.9020796" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3213"
-       id="radialGradient3219"
-       cx="0.94009703"
-       cy="25.99531"
-       fx="10.000337"
-       fy="28.174583"
-       r="15.557144"
-       gradientTransform="matrix(0,0.8367385,-1.8479303,0,72.530223,13.213385)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3229"
-       id="radialGradient3235"
-       cx="22.446625"
-       cy="12.045134"
-       fx="22.446625"
-       fy="12.045134"
-       r="16.632473"
-       gradientTransform="matrix(1.3355068,-2.0704867e-3,1.1330553e-3,0.7308438,-7.544643,10.905259)"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <sodipodi:namedview
-     fill="#a40000"
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="0.19607843"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="-94.824849"
-     inkscape:cy="13.490773"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:showpageshadow="false"
-     inkscape:window-width="1400"
-     inkscape:window-height="981"
-     inkscape:window-x="0"
-     inkscape:window-y="25"
-     stroke="#8f5902"
-     inkscape:grid-points="true"
-     showguides="true"
-     inkscape:guide-bbox="true">
-    <inkscape:grid
-       id="GridFromPre046Settings"
-       type="xygrid"
-       originx="0px"
-       originy="0px"
-       spacingx="0.5px"
-       spacingy="0.5px"
-       color="#0000ff"
-       empcolor="#0000ff"
-       opacity="0.2"
-       empopacity="0.4"
-       empspacing="2"
-       visible="true"
-       enabled="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata4">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title>Face - Cool</dc:title>
-        <dc:subject>
-          <rdf:Bag>
-            <rdf:li>emoticon</rdf:li>
-            <rdf:li>emote</rdf:li>
-            <rdf:li>smiley</rdf:li>
-            <rdf:li>cool</rdf:li>
-          </rdf:Bag>
-        </dc:subject>
-        <cc:license
-           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>André Wyrwa</dc:title>
-          </cc:Agent>
-        </dc:creator>
-        <dc:source />
-        <dc:contributor>
-          <cc:Agent>
-            <dc:title>Tuomas Kuosmanen,
-Jakub Steiner</dc:title>
-          </cc:Agent>
-        </dc:contributor>
-      </cc:Work>
-      <cc:License
-         rdf:about="http://creativecommons.org/licenses/publicdomain/">
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Reproduction" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Distribution" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
-      </cc:License>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       sodipodi:type="arc"
-       style="opacity:0.53164559;color:#000000;fill:url(#radialGradient1360);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.40487173;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       id="path4563"
-       sodipodi:cx="24.714285"
-       sodipodi:cy="38.57143"
-       sodipodi:rx="19.714285"
-       sodipodi:ry="6.5714288"
-       d="M 44.42857 38.57143 A 19.714285 6.5714288 0 1 1  5,38.57143 A 19.714285 6.5714288 0 1 1  44.42857 38.57143 z"
-       transform="translate(0,2.857141)" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:url(#radialGradient1362);fill-opacity:1;fill-rule:evenodd;stroke:#9c8c0a;stroke-width:0.4812254;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       id="path4320"
-       sodipodi:cx="31.112698"
-       sodipodi:cy="19.008621"
-       sodipodi:rx="8.6620579"
-       sodipodi:ry="8.6620579"
-       d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1  22.45064,19.008621 A 8.6620579 8.6620579 0 1 1  39.774755 19.008621 z"
-       transform="matrix(2.0780281,0,0,2.0780282,-40.15306,-14.00045)" />
-    <path
-       d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1  22.45064,19.008621 A 8.6620579 8.6620579 0 1 1  39.774755 19.008621 z"
-       sodipodi:ry="8.6620579"
-       sodipodi:rx="8.6620579"
-       sodipodi:cy="19.008621"
-       sodipodi:cx="31.112698"
-       id="path4322"
-       style="opacity:0.67721522;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50953299;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-       sodipodi:type="arc"
-       transform="matrix(1.9625821,0,0,1.962582,-36.561223,-11.805978)" />
-    <path
-       style="opacity:0.36;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
-       d="M 34,33.17385 C 30,36.043463 27,37 24.5,37 C 22,37 19,36.043463 15,33.17385 C 20,32.217312 19,33.447148 24.5,33.447148 C 30,33.447148 29,32.217312 34,33.17385 z "
-       id="path3237"
-       sodipodi:nodetypes="czczc" />
-    <path
-       style="fill:url(#aigrd2);fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
-       d="M 34,33.043463 C 30,34.885866 27,35.5 24.5,35.5 C 22,35.5 19,34.885866 15,33.043463 C 20,32.429328 19,33.218931 24.5,33.218931 C 30,33.218931 29,32.429328 34,33.043463 z "
-       id="path8606"
-       sodipodi:nodetypes="czczc" />
-    <path
-       style="fill:url(#radialGradient3219);fill-opacity:1;stroke:#000000;stroke-width:1.01459932;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 42.5,19.5 C 42.5,19.5 41.5,16.5 41.5,16.5 C 40,18.5 29.329999,18.5 24.5,18.5 C 19.670001,18.5 9,18.5 7.5,16.5 C 7.5,16.5 6.5,19.5 6.5,19.5 C 8,23 11,27.5 17.5,27.5 C 23.5,27.5 22.000001,24.5 24.5,24.5 C 27.000001,24.5 25.5,27.5 31.5,27.5 C 38,27.5 41,23 42.5,19.5 z "
-       id="path2237"
-       sodipodi:nodetypes="ccsccsssc" />
-    <path
-       style="opacity:0.5;fill:none;fill-opacity:1;stroke:url(#radialGradient3235);stroke-width:1.01459932;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 8,17.5 C 7.7503886,17.842996 7.125,20.4375 7.5,19.5 C 9.0187889,21.690819 7.9500785,20.852488 10.5,24 C 11.781455,25.615748 13.698426,26.5 17.5,26.5 C 22.5,26.375 21.5,23.5 24.5,23.5 C 27.5,23.5 26.5,26.375 31.5,26.5 C 35.301574,26.5 37.218545,25.615748 38.5,24 C 39.737877,22.439199 40.5,21.5 41.5,19.5 C 41.381673,19.095467 41.196578,17.868585 41,17.5 C 39,18.5 35.932936,19.137704 33.21875,19.25 C 30.171875,19.37606 26.915,19.375 24.5,19.375 C 22.085,19.375 18.828125,19.37606 [...]
-       id="path3217"
-       sodipodi:nodetypes="ccccccsccsssc" />
-  </g>
-</svg>
diff --git a/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py b/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
index 9f7df3a..b2fbee6 100644
--- a/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
+++ b/lib/taurus/qt/qtgui/resource/taurus_resource_utils.py
@@ -2,34 +2,45 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides widgets that display the database in a tree format"""
 
-__all__ = ['getPixmap', 'getThemePixmap', 'getIcon', 'getThemeIcon', 'getStandardIcon',
-           'getElementTypeToolTip', 'getElementTypeIconName', 'getElementTypeIcon',
-           'getElementTypePixmap', 'getElementTypeSize',
-           'getSWDevHealthToolTip', 'getSWDevHealthIcon', 'getSWDevHealthPixmap',
-           'getThemeMembers' ]
+__all__ = [
+    'getPixmap',
+    'getIcon',
+    'getThemePixmap',
+    'getThemeIcon',
+    'getThemeMembers',
+    # the following are actually from taurus.qt.qtgui.icon
+    'getStandardIcon',
+    'getElementTypeToolTip',
+    'getElementTypeSize',
+    'getElementTypeIcon',
+    'getElementTypeIconName',
+    'getElementTypePixmap',
+    'getDevStateToolTip',
+    'getDevStateIcon',
+    'getDevStatePixmap',]
 
 __docformat__ = 'restructuredtext'
 
@@ -37,316 +48,155 @@ import os
 
 from taurus.external.qt import Qt
 
-from taurus.core.taurusbasetypes import TaurusElementType, TaurusSWDevHealth
-from taurus.core.util.log import Logger
-
-__LOGGER = Logger(__name__)
-
-ElemType = TaurusElementType
-DevHealth = TaurusSWDevHealth
-Size = Qt.QSize
-
-__INITIALIZED = False
-# Theme capacity was only added in Qt 4.6
-__THEME_CAPACITY = hasattr(Qt.QIcon, "fromTheme")
-# Uncomment the following line to force NOT to use OS theme.
-#__THEME_CAPACITY = False 
-
-__THEME_MEMBERS = {}
-
-# Default width, height and QSize constants
-__DW = 70
-__DH = 24
-
-__DQS = Size(__DW, __DH)
-__1DQS = __DQS
-__2DQS = Size(2*__DW, __DH)
-__3DQS = Size(3*__DW, __DH)
-
-def __init():
-    global __INITIALIZED
-    global __THEME_MEMBERS
-    
-    if __INITIALIZED: return
-        
-    #register only the tango-icons rcc files (and initialize the THEME_MEMBERS)
-    res_dir = os.path.dirname(os.path.abspath(__file__))
-    Qt.QDir.addSearchPath("resource", res_dir)
-    prefix = 'qrc_tango_icons_'
-    suffix = '.rcc'
-    lp, ls = len(prefix),len(suffix)
-    theme_members = {}
-    other_rcc_files = []
-    for f in os.listdir(res_dir):
-        if f.endswith(suffix):
-            if f.startswith(prefix):
-                if Qt.QResource.registerResource("resource:" + f):
-                    d = f[lp:-ls]
-                    theme_members[d] = [str(e)[:-4] for e in Qt.QDir(":%s"%d).entryList() if str(e).endswith('.svg')] 
-                else:
-                    __LOGGER.info("Failed to load resource %s" % f)
-            else:
-                other_rcc_files.append(f) #we remember these and will register later
-    __THEME_MEMBERS = theme_members
-    
-    #register the rest of the resource files
-    for f in other_rcc_files:
-        if not Qt.QResource.registerResource("resource:" + f):
-            __LOGGER.info("Failed to load resource %s" % f)
-    
-    __INITIALIZED = True
-
-__init()
+from taurus.core.util.log import (deprecated, taurus4_deprecation,
+                                  deprecation_decorator)
+
+from taurus.qt.qtgui.icon import *
+
 
+ at deprecation_decorator(alt='QIcon.hasThemeIcon to test individual names',
+                       rel='4.0')
 def getThemeMembers():
     """Returns the current icon theme elements
-    
+
+    .. note:: Since its depredation, it returns an empty dict (there is no
+    reasonable way of introspecting the list of available icon names).
+    Alternatively Just test a given name using
+
     :return: the current icon theme elements in a dictionary where each key is
              a group name and the value is a sequence of theme icon name.
     :rtype: dict<str,seq<str>>"""
-    global __THEME_MEMBERS
-    return __THEME_MEMBERS
+    return {}
+
 
 def getPixmap(key, size=None):
-    """Returns a PyQt4.QtGui.QPixmap object for the given key and size
-    
-    :param key: (str) a string with the pixmap resource key (ex.: ':/status/folder_open.svg')
-    :param size: (int) the pixmap size in pixels (will get a square pixmap). Default is None
-                 meaning it will return the original size
-    
-    :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given key and size"""
-    
-    name = key
-    if size is not None:
-        key = key + "_%sx%s" % (size, size)
-    pm = Qt.QPixmapCache.find(key)
-    if pm is None:
-        pm = Qt.QPixmap(name)
-        if size is not None:
-            pm = pm.scaled(size, size, Qt.Qt.KeepAspectRatio, Qt.Qt.SmoothTransformation)
-        Qt.QPixmapCache.insert(key, pm)
-    return Qt.QPixmap(pm)
+    # handle resource syntax (deprecated)
+    if key.startswith(':'):
+        head, tail = os.path.split(key[1:])
+        # logos used to be in the resource root. Now they are in 'logos'
+        prefix = sanitizePrefix(head or 'logos')
+        alt = 'getCachedPixmap("%s:%s [, size]")' % (prefix, tail)
+        ret = getCachedPixmap('%s:%s' % (prefix, tail), size)
+    deprecated(dep='getPixmap("%s" [, size])' % key, alt=alt, rel='4.0')
+    return ret
+
 
 def getIcon(key):
-    """Returns a PyQt4.QtGui.QIcon object for the given key
-    
-    :param key: (str) a string with the pixmap resource key (ex.: ':/status/folder_open.svg')
-    
+    """Returns a PyQt4.QtGui.QIcon object for the given key. It supports QDir's
+    searchPath prefixes (see :meth:`QDir.setSearchPaths`).
+    Note that taurus.qt.qtgui.resource already sets several search paths based
+    on .path files
+
+    :param key: (str) the pixmap file name. (optionally with a prefix)
+
     :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given key"""
+
+    # handle resource syntax (deprecated)
     if key.startswith(':'):
-        return Qt.QIcon(key)
-    return getThemeIcon(key)
-
-def getThemePixmap(key, size=None):
-    """Returns a PyQt4.QtGui.QPixmap object for the given key and size. Key should be a valid theme
-    key. See `Icon Naming Specification <http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html>`_
-    for the list of valid theme keys.
-    
-    If theme is not supported by Qt (version < 4.6) or by the OS, the method will return a
-    theme pixmap from the `Tango Icon Library <http://tango.freedesktop.org/Tango_Icon_Library>`_.
-    
+        head, tail = os.path.split(key[1:])
+        # logos used to be in the resource root. Now they are in 'logos'
+        prefix = sanitizePrefix(head or 'logos')
+        alt = 'Qt.QIcon("%s:%s")' % (prefix, tail)
+        ret = Qt.QIcon('%s:%s' % (prefix, tail))
+    elif not Qt.QFile.exists(key) and Qt.QIcon.hasThemeIcon(key):
+        alt = 'QIcon.fromTheme("%s")' % key
+        ret = Qt.QIcon.fromTheme(key)
+    else:
+        alt = 'QIcon("%s")' % key
+        ret = Qt.QIcon(key)
+    deprecated(dep='getIcon("%s")' % key, alt=alt, rel='4.0')
+    return ret
+
+
+ at deprecation_decorator(alt='QIcon.fromTheme(key).pixmap(size, size)', rel='4.0')
+def getThemePixmap(key, size=48):
+    """Returns a PyQt4.QtGui.QPixmap object for the given key and size.
+    Key should be a valid theme icon key. See :meth:`PyQt4.QIcon.fromTheme`.
+
+    Note that if the OS does not define a theme, taurus.qt.qtgui.resource will
+    use the bundled 'Tango' icons theme. See:
+    `Tango Icon Library <http://tango.freedesktop.org/Tango_Icon_Library>`_.
+
     If the key cannot be found, it will return a null content Pixmap.
-    
+
     :param key: (str) a string with the pixmap theme key (ex.: 'folder_open')
-    :param size: (int) the pixmap size in pixels (will get a square pixmap). Default is None
-                 meaning it will return the original size
-    
-    :return: (PyQt4.QtGui.QPixmap) a PyQt4.QtGui.QPixmap for the given key and size"""
-
-    global __THEME_CAPACITY
-    global __LOGGER
-    if __THEME_CAPACITY:
-        if Qt.QIcon.hasThemeIcon(key):
-            size = size or 48
-            return Qt.QIcon.fromTheme(key).pixmap(size, size)
-        else:
-            __LOGGER.debug('Theme pixmap "%s" not supported. Trying to provide a fallback...',key)
-    for member, items in getThemeMembers().items():
-        if not key in items: continue
-        return getPixmap(":/%s/%s.svg" % (member, key), size)
-    __LOGGER.debug('Theme pixmap "%s" not supported.', key)
-    return Qt.QPixmap()
+    :param size: (int) the pixmap size in pixels (will get a square pixmap).
+                 Default size=48
+
+    :return: (PyQt4.QtGui.QPixmap)
+    """
+    return Qt.QIcon.fromTheme(key).pixmap(size, size)
+
 
+ at deprecation_decorator(alt='QIcon.fromTheme', rel='4.0')
 def getThemeIcon(key):
-    """Returns a PyQt4.QtGui.QIcon object for the given key. Key should be a valid theme key. See
-    `Icon Naming Specification <http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html>`_
-    for the list of valid theme keys.
-    
-    If theme is not supported by Qt (version < 4.6) or by the OS, the method will return a
-    theme icon from the `Tango Icon Library <http://tango.freedesktop.org/Tango_Icon_Library>`_.
-    
-    If the key cannot be found, it will return a null content QIcon.
-    
-    :param key: (str) a string with the icon theme key (ex.: 'folder_open')
-    
-    :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given key"""
+    """Returns the theme icon corresponding to the given key.
+    Key should be a valid theme icon key. See :meth:`PyQt4.QIcon.fromTheme`.
 
-    global __THEME_CAPACITY
-    global __LOGGER
-    if __THEME_CAPACITY:
-        if Qt.QIcon.hasThemeIcon(key):
-            return Qt.QIcon.fromTheme(key)
-        else:
-            __LOGGER.debug('Theme icon "%s" not supported. Trying to provide a fallback...',key)
-            __LOGGER.stack()
-    for member, items in getThemeMembers().items():
-        if not key in items: continue
-        return Qt.QIcon(":/%s/%s.svg" % (member, key))
-    __LOGGER.debug('Theme icon "%s" not supported.', key)
-    return Qt.QIcon()
-
-def getStandardIcon(key, widget=None):
-    """Returns a PyQt4.QtGui.QIcon object for the given key. Key should be a 
-    QStyle.StandardPixmap enumeration member. The widget argument is optional 
-    and can also be used to aid the determination of the icon.
-    
-    :param key: (QStyle.StandardPixmap) a standard pixmap which can follow some existing GUI style or guideline
-    :param widget: (Qt.QWidget) the widget argument (optional) can also be used to aid the determination of the icon.
-    
-    :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given key"""
-    styleOption = None
-    if widget is not None:
-        styleOption = Qt.QStyleOption()
-        styleOption.initFrom(widget)
-    style = Qt.QApplication.instance().style()
-    return style.standardIcon(key, styleOption, widget)
-    
-# Indexes for the map below
-__IDX_ELEM_TYPE_ICON, __IDX_ELEM_TYPE_SIZE, __IDX_ELEM_TYPE_TOOLTIP = range(3)
-
-# New default role map
-# Elements are: icon theme, preferred size, description/tooltip
-_ELEM_TYPE_MAP = { ElemType.Name : ("folder", __3DQS, None),
-            ElemType.Device : ("applications-system", Size(210, __DH), "Tango device name"),
-       ElemType.DeviceAlias : ("applications-system", Size(140, __DH), "Tango device alias"),
-            ElemType.Domain : ("folder", Size(80, __DH), "Tango device domain"),
-            ElemType.Family : ("folder", Size(80, __DH), "Tango device family"),
-            ElemType.Member : ("applications-system", Size(80, __DH), "Tango device member"),
-            ElemType.Server : ("application-x-executable", Size(190, __DH), "Tango server"),
-        ElemType.ServerName : ("application-x-executable", Size(80, __DH), "Tango server name"),
-    ElemType.ServerInstance : ("application-x-executable", Size(80, __DH), "Tango server instance"),
-       ElemType.DeviceClass : ("text-x-script", Size(140, __DH), "Tango class name"),
-          ElemType.Exported : ("start-here", Size(60, __DH), "Alive/not alive"),
-              ElemType.Host : ("network-server", Size(100, __DH), "Host machine were last ran"),
-         ElemType.Attribute : ("format-text-bold", Size(100, __DH), "Attribute name"), }
-
-def getElementTypeToolTip(elemType):
-    data = _ELEM_TYPE_MAP.get(elemType)
-    if data is None:
-        return
-    return data[__IDX_ELEM_TYPE_TOOLTIP]
-
-def getElementTypeSize(elemType):
-    data = _ELEM_TYPE_MAP.get(elemType)
-    if data is None:
-        return
-    return data[__IDX_ELEM_TYPE_SIZE]
-
-def getElementTypeIconName(elemType):
-    """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.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.taurusbasetypes.TaurusElementType`"""
-    if elemType is None:
-        return
-    data = _ELEM_TYPE_MAP.get(elemType)
-    if data is None:
-        return
-    return data[__IDX_ELEM_TYPE_ICON]
-
-def getElementTypeIcon(elemType, fallback=None):
-    """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.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.taurusbasetypes.TaurusElementType`"""
-
-    themeIconName = getElementTypeIconName(elemType)
-    icon = getThemeIcon(themeIconName)
-    if icon.isNull() and fallback is not None:
-        icon = fallback
-    return icon
-
-def getElementTypePixmap(elemType, size=None):
-    """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.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.taurusbasetypes.TaurusElementType`"""
-
-    if elemType is None:
-        return
-    data = _ELEM_TYPE_MAP.get(elemType)
-    if data is None:
-        return
-    themeName = data[__IDX_ELEM_TYPE_ICON]
-    return getThemePixmap(themeName, size)
-
-# Indexes for the map below
-__IDX_HEALTH_ICON, __IDX_HEALTH_TOOLTIP = range(2)
-
-_HEALTH_MAP = { DevHealth.Exported   : ("face-smile", "Element reported to be alive") ,
-            DevHealth.ExportedAlive  : ("face-smile-big", "Element confirmed to be alive"),
-          DevHealth.ExportedNotAlive : ("face-surprise", "Element reported to be alive but there is no connection!"),
-             DevHealth.NotExported   : ("face-sad", "Element reported to be shutdown"),
-         DevHealth.NotExportedAlive  : ("face-plain", "Element reported to be shutdown but there is a connection!"),
-       DevHealth.NotExportedNotAlive : ("face-sad", "Element reported to be shutdown") }
-
-def getSWDevHealthToolTip(elemHealth):
-    data = _HEALTH_MAP.get(elemHealth)
-    if data is None:
-        return
-    return data[__IDX_HEALTH_TOOLTIP]
-
-def getSWDevHealthIcon(elemHealth, fallback=None):
-    """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.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.taurusbasetypes.TaurusSWDevHealth`"""
-    if elemHealth is None:
-        return
-    data = _HEALTH_MAP.get(elemHealth)
-    if data is None:
-        return
-    themeIconName = data[__IDX_HEALTH_ICON]
-    
-    icon = getThemeIcon(themeIconName)
-    if icon.isNull() and fallback is not None:
-        icon = fallback
-    return icon
-
-def getSWDevHealthPixmap(elemHealth, size=None):
-    """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.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.taurusbasetypes.TaurusSWDevHealth`"""
-    if elemHealth is None:
-        return
-    data = _HEALTH_MAP.get(elemHealth)
-    if data is None:
-        return
-    themeName = data[__IDX_HEALTH_ICON]
-    return getThemePixmap(themeName, size)
+    Note that if the OS does not define a theme, taurus.qt.qtgui.resource will
+    use the bundled 'Tango' icons theme. See:
+    `Tango Icon Library <http://tango.freedesktop.org/Tango_Icon_Library>`_.
+
+    :param key: (str) a string with the icon theme key (e.g.: 'folder_open')
+
+    :return: (PyQt4.QtGui.QIcon) a PyQt4.QtGui.QIcon for the given theme key
+    """
+    return Qt.QIcon.fromTheme(key)
+
+
+ at taurus4_deprecation(alt='getDevStateToolTip')
+def getSWDevHealthToolTip(state):
+    return getDevStateToolTip(state)
+
+
+ at taurus4_deprecation(alt='getDevStateIcon')
+def getSWDevHealthIcon(state, fallback=None):
+    return getDevStateIcon(state, fallback=fallback)
+
+
+ at taurus4_deprecation(alt='getDevStatePixmap')
+def getSWDevHealthPixmap(state, fallback=None):
+    return getDevStatePixmap(state, fallback=fallback)
+
+
+
+
+if __name__ == '__main__':
+
+    import sys
+    from taurus.qt.qtgui.application import TaurusApplication
+
+    app = TaurusApplication()
+
+
+
+    themekey = 'computer'
+    b = Qt.QIcon.fromTheme(themekey)
+
+    icons = [
+
+        getIcon('actions:edit-cut.svg'),
+        getIcon(':/actions/edit-cut.svg'),
+
+        getIcon(":/apps/preferences-system-session.svg"),
+        getIcon(":/designer/devs_tree.png"),
+
+        getIcon(":/actions/process-stop.svg"), # from tango-icons/actions
+        getIcon(":/actions/add.svg"), # from rrze-icons/actions
+        getIcon(":/actions/stop.svg"), # from extra-icons/actions
+
+        getIcon(":taurus.svg"),
+        getIcon("computer"), # theme Icon via getIcon
+        getThemeIcon("computer"), # theme Icon via getThemeIcon
+        ]
+
+    w = Qt.QWidget()
+    l = Qt.QVBoxLayout()
+    w.setLayout(l)
+    for icon in icons:
+        button = Qt.QPushButton(icon, 'kk')
+        l.addWidget(button)
+
+    w.show()
+
+    sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/style/__init__.py b/lib/taurus/qt/qtgui/style/__init__.py
index 6467301..9dc0b7a 100644
--- a/lib/taurus/qt/qtgui/style/__init__.py
+++ b/lib/taurus/qt/qtgui/style/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -33,20 +33,21 @@ import imp
 
 from taurus.external.qt import Qt
 
+
 def setTaurusStyle(newStyle):
 
     app = Qt.QApplication.instance()
-    
+
     if app is None:
-        raise RuntimeError("Must initialize a QApplication before setting style")
-    
+        raise RuntimeError(
+            "Must initialize a QApplication before setting style")
+
     mod = imp.load_module(newStyle, *imp.find_module(newStyle, __path__))
-    
+
     style = mod.getStyle()
     styleSheet = mod.getStyleSheet()
-    
+
     if style is not None:
         app.setStyle(style)
     if styleSheet is not None:
         app.setStyleSheet(styleSheet)
-
diff --git a/lib/taurus/qt/qtgui/style/nebula.py b/lib/taurus/qt/qtgui/style/nebula.py
index c151675..e67c1dd 100644
--- a/lib/taurus/qt/qtgui/style/nebula.py
+++ b/lib/taurus/qt/qtgui/style/nebula.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -32,17 +32,17 @@ __docformat__ = 'restructuredtext'
 from taurus.external.qt import Qt
 
 _NEBULA_KEYS = {
-    'border_radius' : '4px',
-    'titlebar_background_color' : 'qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgb(200, 200, 200), stop: 1 rgb(150, 150, 150))',
-    'selected_titlebar_background_color' : 'qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgb(60, 150, 255), stop: 1 rgb(0, 65, 200))',
-    'single_titlebar_background_color' : 'qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgb(90, 180, 255), stop: 1 rgb(30, 95, 250))',
-    'titlebar_color' : 'white',
-    'selected_titlebar_color' : 'white',
-    'content_background_color' : 'qlineargradient(x1: 0, y1: 0, x2: 1.0, y2: 1.0, stop: 0 rgb(224, 224, 224), stop: 1 rgb(255, 255, 255))'
+    'border_radius': '4px',
+    'titlebar_background_color': 'qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgb(200, 200, 200), stop: 1 rgb(150, 150, 150))',
+    'selected_titlebar_background_color': 'qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgb(60, 150, 255), stop: 1 rgb(0, 65, 200))',
+    'single_titlebar_background_color': 'qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgb(90, 180, 255), stop: 1 rgb(30, 95, 250))',
+    'titlebar_color': 'white',
+    'selected_titlebar_color': 'white',
+    'content_background_color': 'qlineargradient(x1: 0, y1: 0, x2: 1.0, y2: 1.0, stop: 0 rgb(224, 224, 224), stop: 1 rgb(255, 255, 255))'
 }
 
 _NEBULA_STYLESHEET = \
-"""QToolBox:tab {{
+    """QToolBox:tab {{
     color: {titlebar_color};
     border-width: 0px;
     border-style: solid;
@@ -120,7 +120,7 @@ QGroupBox::title {{
 }}
 
 QTabWidget {{
-    
+
 }}
 
 QTabWidget::tab-bar {{
@@ -170,16 +170,18 @@ QTabBar::tab:selected {{
  QMainWindow::separator:hover {{
     background: red;
  }}
- 
+
  */
- 
+
 
 """
 
 NEBULA_STYLESHEET = _NEBULA_STYLESHEET.format(**_NEBULA_KEYS)
 
+
 def getStyle():
     return None
 
+
 def getStyleSheet():
-    return NEBULA_STYLESHEET
\ No newline at end of file
+    return NEBULA_STYLESHEET
diff --git a/lib/taurus/qt/qtgui/table/__init__.py b/lib/taurus/qt/qtgui/table/__init__.py
index c9ef11e..7ab08f5 100644
--- a/lib/taurus/qt/qtgui/table/__init__.py
+++ b/lib/taurus/qt/qtgui/table/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -34,4 +34,4 @@ from .taurusdbtable import *
 from .taurusvaluestable import *
 from .taurusdevicepropertytable import *
 from .taurusgrid import *
-from .qdictionary import *
\ No newline at end of file
+from .qdictionary import *
diff --git a/lib/taurus/qt/qtgui/table/qdictionary.py b/lib/taurus/qt/qtgui/table/qdictionary.py
index ccf3c86..dd47a80 100644
--- a/lib/taurus/qt/qtgui/table/qdictionary.py
+++ b/lib/taurus/qt/qtgui/table/qdictionary.py
@@ -2,30 +2,30 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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 provides basic python dictionary/list editor widgets"""
 
-__all__ = ["QDictionaryEditor","QListEditor"]
+__all__ = ["QDictionaryEditor", "QListEditor"]
 
 __docformat__ = 'restructuredtext'
 
@@ -34,295 +34,343 @@ import taurus
 import numpy
 from taurus.core.util.containers import SortedDict
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.container import TaurusBaseContainer,TaurusWidget
-from taurus.qt.qtcore.util.properties import join,djoin
+from taurus.qt.qtgui.container import TaurusBaseContainer, TaurusWidget
+from taurus.qt.qtcore.util.properties import join, djoin
 
 ###############################################################################
 # Methods borrowed from fandango modules
 
+
 def isString(seq):
-    if isinstance(seq,basestring): return True # It matches most python str-like classes
-    if any(s in str(type(seq)).lower() for s in ('vector','array','list',)): return False
-    if 'qstring' == str(type(seq)).lower(): return True # It matches QString
+    if isinstance(seq, basestring):
+        return True  # It matches most python str-like classes
+    if any(s in str(type(seq)).lower() for s in ('vector', 'array', 'list',)):
+        return False
+    if 'qstring' == str(type(seq)).lower():
+        return True  # It matches QString
     return False
 
-def isSequence(seq,INCLUDE_GENERATORS = True):
+
+def isSequence(seq, INCLUDE_GENERATORS=True):
     """ It excludes Strings, dictionaries but includes generators"""
-    if any(isinstance(seq,t) for t in (list,set,tuple)): 
+    if any(isinstance(seq, t) for t in (list, set, tuple)):
         return True
-    if isString(seq): 
+    if isString(seq):
         return False
-    if hasattr(seq,'items'): 
+    if hasattr(seq, 'items'):
         return False
     if INCLUDE_GENERATORS:
-        if hasattr(seq,'__iter__'): 
+        if hasattr(seq, '__iter__'):
             return True
-    elif hasattr(seq,'__len__'): 
+    elif hasattr(seq, '__len__'):
         return True
     return False
-    
+
+
 def isDictionary(seq):
     """ It includes dicts and also nested lists """
-    if isinstance(seq,dict): return True
-    if hasattr(seq,'items') or hasattr(seq,'iteritems'): return True
+    if isinstance(seq, dict):
+        return True
+    if hasattr(seq, 'items') or hasattr(seq, 'iteritems'):
+        return True
     if seq and isSequence(seq) and isSequence(seq[0]):
-        if seq[0] and not isSequence(seq[0][0]): return True #First element of tuple must be hashable
+        if seq[0] and not isSequence(seq[0][0]):
+            return True  # First element of tuple must be hashable
     return False
 
+
 def dict2array(dct):
     """ Converts a dictionary in a table of data, lists are unnested columns """
-    data,table = {},[]
-    data['nrows'],data['ncols'] = 0,2 if isDictionary(dct) else 1
-    def expand(d,level):#,nrows=nrows,ncols=ncols):
-        #self.debug('\texpand(%s(%s),%s)'%(type(d),d,level))
-        items = d.items() if isinstance(d,SortedDict) else sorted(d.items() if hasattr(d,'items') else d)
-        for k,v in items:
+    data, table = {}, []
+    data['nrows'], data['ncols'] = 0, 2 if isDictionary(dct) else 1
+
+    def expand(d, level):  # ,nrows=nrows,ncols=ncols):
+        # self.debug('\texpand(%s(%s),%s)'%(type(d),d,level))
+        items = d.items() if isinstance(d, SortedDict) else sorted(
+            d.items() if hasattr(d, 'items') else d)
+        for k, v in items:
             zero = data['nrows']
-            data[(data['nrows'],level)] = k
-            if isDictionary(v): 
-                data['ncols']+=1
-                expand(v,level+1)
+            data[(data['nrows'], level)] = k
+            if isDictionary(v):
+                data['ncols'] += 1
+                expand(v, level + 1)
             else:
-                if not isSequence(v): v = [v]
+                if not isSequence(v):
+                    v = [v]
                 for t in v:
-                    data[(data['nrows'],level+1)] = t
-                    data['nrows']+=1
+                    data[(data['nrows'], level + 1)] = t
+                    data['nrows'] += 1
             #for i in range(zero+1,nrows): data[(i,level)] = None
-    expand(dct,0)
+    expand(dct, 0)
     [table.append([]) for r in range(data.pop('nrows'))]
-    [table[r].append(None) for c in range(data.pop('ncols')) for r in range(len(table))]
-    for coord,value in data.items(): table[coord[0]][coord[1]] = value
+    [table[r].append(None) for c in range(data.pop('ncols'))
+     for r in range(len(table))]
+    for coord, value in data.items():
+        table[coord[0]][coord[1]] = value
     return table
 
+
 def array2dict(table):
     """ Converts a table in a dictionary of left-to-right nested date, unnested columns are lists"""
-    nrows,ncols = len(table),len(table[0])
-    r,c = 0,0
-    def expand(r,c,end):
-        print('expand(%s,%s,%s)'%(r,c,end))
-        i0,t0 = r,table[r][c]
-        if not t0: return t0
-        if c+1<ncols and (table[r][c+1] or not c):
+    nrows, ncols = len(table), len(table[0])
+    r, c = 0, 0
+
+    def expand(r, c, end):
+        print('expand(%s,%s,%s)' % (r, c, end))
+        i0, t0 = r, table[r][c]
+        if not t0:
+            return t0
+        if c + 1 < ncols and (table[r][c + 1] or not c):
             d = {}
             keys = []
-            new_end = r+1
-            for i in range(r+1,end+1):
-                t = table[i][c] if i<end else None
-                if t or i>=end: 
-                    keys.append((i0,t0,new_end)) #start,name,stop for each key
-                    t0,i0 = t,i
-                new_end = i+1
-            for i,key,new_end in keys:
-                nd = expand(i,c+1,new_end)
-                d[key] = nd if key not in d else djoin(d.get(key),nd)
-            print('expand(%s to %s,%s): %s'%(r,end,c,d))
+            new_end = r + 1
+            for i in range(r + 1, end + 1):
+                t = table[i][c] if i < end else None
+                if t or i >= end:
+                    # start,name,stop for each key
+                    keys.append((i0, t0, new_end))
+                    t0, i0 = t, i
+                new_end = i + 1
+            for i, key, new_end in keys:
+                nd = expand(i, c + 1, new_end)
+                d[key] = nd if key not in d else djoin(d.get(key), nd)
+            print('expand(%s to %s,%s): %s' % (r, end, c, d))
             return d
         else:
-            d = [table[i][c] for i in range(r,end)]
-            print('expand(%s to %s,%s): %s'%(r,end,c,d))
+            d = [table[i][c] for i in range(r, end)]
+            print('expand(%s to %s,%s): %s' % (r, end, c, d))
             return d
-    data = expand(0,0,nrows)
+    data = expand(0, 0, nrows)
     return data
-                
+
 ###############################################################################
 
-class QBaseDictionaryEditor(Qt.QDialog,TaurusBaseContainer):
-    def __init__(self, parent = None, designMode = None, title = None):
-        self.data = {} #An {(x,y):value} array
+
+class QBaseDictionaryEditor(Qt.QDialog, TaurusBaseContainer):
+
+    def __init__(self, parent=None, designMode=None, title=None):
+        self.data = {}  # An {(x,y):value} array
         self.title = title
         self.dctmodel = SortedDict()
         self.callback = None
         self.call__init__wo_kw(Qt.QDialog, parent)
-        self.call__init__(TaurusBaseContainer, type(self).__name__, designMode=designMode)#defineStyle called from here
-        
+        self.call__init__(TaurusBaseContainer, type(
+            self).__name__, designMode=designMode)  # defineStyle called from here
+
     @classmethod
-    def main(klass, args=None,title='',modal=False,callback=None):
+    def main(klass, args=None, title='', modal=False, callback=None):
         dialog = klass()
         dialog.setModal(modal)
         dialog.setCallback(callback)
         dialog.setModifiableByUser(True)
-        dialog.setWindowTitle(title or self.title or klass.__name__)
-        if args: dialog.setModel(args) #[0] if isSequence(args) else args)
+        dialog.setWindowTitle(title or klass.title or klass.__name__)
+        if args:
+            dialog.setModel(args)  # [0] if isSequence(args) else args)
         dialog.show()
         return dialog
-        
+
     def defineStyle(self):
         self.info('QBaseDictionaryEditor.defineStyle()')
-        #self.setWindowTitle('DictionaryEditor')
-        self.label = Qt.QLabel('Dictionary as a nested tree: {key1:[val1,val2],key2:[val3]')
+        # self.setWindowTitle('DictionaryEditor')
+        self.label = Qt.QLabel(
+            'Dictionary as a nested tree: {key1:[val1,val2],key2:[val3]')
         #self.value = Qt.QLabel()
-        self.table = Qt.QTableWidget()#TaurusBaseTable()
+        self.table = Qt.QTableWidget()  # TaurusBaseTable()
         self.table.horizontalHeader().setStretchLastSection(True)
-        #self.table.verticalHeader().setStretchLastSection(True)
+        # self.table.verticalHeader().setStretchLastSection(True)
         self.baccept = Qt.QPushButton('Apply')
         self.bcancel = Qt.QPushButton('Cancel')
         self.baddColumn = Qt.QPushButton()
         self.baddRow = Qt.QPushButton()
-        [(b.setFixedSize(Qt.QSize(20,20)),b.setIcon(taurus.qt.qtgui.resource.getIcon(':/designer/plus.png'))) for b in (self.baddColumn,self.baddRow)]
+        [(b.setFixedSize(Qt.QSize(20, 20)), b.setIcon(Qt.Qicon(
+            'designer:plus.png'))) for b in (self.baddColumn, self.baddRow)]
         self.setLayout(Qt.QGridLayout())
-        self.layout().addWidget(self.label,0,0,1,5)
-        #self.layout().addWidget(self.value,1,0,1,3)
-        self.layout().addWidget(self.baddColumn,2,5,1,1)
-        self.layout().addWidget(self.table,2,0,5,5)
-        self.layout().addWidget(self.baddRow,7,0,1,1)
-        self.layout().addWidget(self.baccept,8,3,1,1)
-        self.layout().addWidget(self.bcancel,8,4,1,1)
-        self.connect(self.baccept,Qt.SIGNAL("clicked()"),self.save)
-        self.connect(self.bcancel,Qt.SIGNAL("clicked()"),self.close)
-        self.connect(self.baddRow,Qt.SIGNAL("clicked()"),self.addRow)
-        self.connect(self.baddColumn,Qt.SIGNAL("clicked()"),self.addColumn)
-        self.connect(self,Qt.SIGNAL("reject()"),self.close)        
-        
+        self.layout().addWidget(self.label, 0, 0, 1, 5)
+        # self.layout().addWidget(self.value,1,0,1,3)
+        self.layout().addWidget(self.baddColumn, 2, 5, 1, 1)
+        self.layout().addWidget(self.table, 2, 0, 5, 5)
+        self.layout().addWidget(self.baddRow, 7, 0, 1, 1)
+        self.layout().addWidget(self.baccept, 8, 3, 1, 1)
+        self.layout().addWidget(self.bcancel, 8, 4, 1, 1)
+        self.baccept.clicked.connect(self.save)
+        self.bcancel.clicked.connect(self.close)
+        self.baddRow.clicked.connect(self.addRow)
+        self.baddColumn.clicked.connect(self.addColumn)
+        self.reject.connect(self.close)
+
     def addRow(self):
-        self.table.setRowCount(self.table.rowCount()+1)
+        self.table.setRowCount(self.table.rowCount() + 1)
         self.table.resizeRowsToContents()
         self.table.update()
-        
+
     def addColumn(self):
         self.table.horizontalHeader().setStretchLastSection(False)
-        self.table.setColumnCount(self.table.columnCount()+1)
+        self.table.setColumnCount(self.table.columnCount() + 1)
         self.table.resizeColumnsToContents()
         self.table.horizontalHeader().setStretchLastSection(True)
         self.table.update()
-                
-    def setCallback(self,callback):
+
+    def setCallback(self, callback):
         self.callback = callback
-        
-    def getCellText(self,row,column):
-        if row>=self.table.rowCount() or column>=self.table.columnCount(): 
+
+    def getCellText(self, row, column):
+        if row >= self.table.rowCount() or column >= self.table.columnCount():
             v = None
         else:
-            i = self.table.item(row,column)
-            if i is None: v = i
-            else: v = str(i.text()).strip()
-        self.debug('getCellText(%s,%s): %s'%(row,column,v))
+            i = self.table.item(row, column)
+            if i is None:
+                v = i
+            else:
+                v = str(i.text()).strip()
+        self.debug('getCellText(%s,%s): %s' % (row, column, v))
         return v
-        
-    def setCellText(self,row,column,value,bold=False,italic=False):
-        i = self.table.item(row,column) or Qt.QTableWidgetItem()
+
+    def setCellText(self, row, column, value, bold=False, italic=False):
+        i = self.table.item(row, column) or Qt.QTableWidgetItem()
         i.setText(str(value if value is not None else ''))
         if bold or italic:
             f = i.font()
-            if bold: f.setBold(True)
-            if italic: f.setItalic(True)
+            if bold:
+                f.setBold(True)
+            if italic:
+                f.setItalic(True)
             i.setFont(f)
-        self.table.setItem(row,column,i)
-        
-    def setModel(self,model): raise Exception('setModel(self,model)!')
-    def updateStyle(self): raise Exception('updateStyle(self)!')
-    def getValues(self): raise Exception('getValues(self)!')
-    def save(self): raise Exception('save(self)!')
+        self.table.setItem(row, column, i)
+
+    def setModel(self, model):
+        raise Exception('setModel(self,model)!')
+
+    def updateStyle(self):
+        raise Exception('updateStyle(self)!')
+
+    def getValues(self):
+        raise Exception('getValues(self)!')
+
+    def save(self):
+        raise Exception('save(self)!')
 
 ###############################################################################
 
+
 class QDictionaryEditor(QBaseDictionaryEditor):
-    
-    def setModel(self,model):
-        self.info('DictionaryEditor.setModel(%s(%s))'%(type(model),model))
+
+    def setModel(self, model):
+        self.info('DictionaryEditor.setModel(%s(%s))' % (type(model), model))
         self.dctmodel = eval(model) if isString(model) else model
-        TaurusBaseContainer.setModel(self,model) #self.updateStyle() called from the property setter
-        
+        # self.updateStyle() called from the property setter
+        TaurusBaseContainer.setModel(self, model)
+
     def getModelClass(self):
         return dict
-        
+
     def updateStyle(self):
-        #self.value.setText(str(self.dctmodel))
+        # self.value.setText(str(self.dctmodel))
         data = dict2array(self.dctmodel)
-        self.nrows,self.ncols = len(data),len(data[0])
+        self.nrows, self.ncols = len(data), len(data[0])
         self.info(data)
         self.table.setRowCount(self.nrows)
         self.table.setColumnCount(self.ncols)
         for r in range(self.nrows):
             for c in range(self.ncols):
-                self.setCellText(r,c,data[r][c],bold=(not c),italic=(c==1))
+                self.setCellText(r, c, data[r][c],
+                                 bold=(not c), italic=(c == 1))
         self.table.resizeRowsToContents()
         self.table.resizeColumnsToContents()
         self.update()
-        
+
     def getValues(self):
-        nrows,ncols = self.table.rowCount(),self.table.columnCount()
-        table = [[self.getCellText(r,c) for c in range(ncols)] for r in range(nrows)]
-        self.data = array2dict(table) #It returns a SortedDict
-        self.info('getValues(): %s'%str(self.data))
+        nrows, ncols = self.table.rowCount(), self.table.columnCount()
+        table = [[self.getCellText(r, c) for c in range(ncols)]
+                 for r in range(nrows)]
+        self.data = array2dict(table)  # It returns a SortedDict
+        self.info('getValues(): %s' % str(self.data))
         return self.data
-        
+
     def save(self):
         self.getValues()
-        self.info('DictionaryEditor.save(): %s'%self.data)
-        if self.callback: 
+        self.info('DictionaryEditor.save(): %s' % self.data)
+        if self.callback:
             self.callback(self.data)
         elif self.dctmodel is None:
             self.dctmodel = self.data
-        else: #Overwriting dctmodel
+        else:  # Overwriting dctmodel
             self.dctmodel.clear()
             self.dctmodel.update(self.data)
-        if self.callback: 
-            self.callback(self.data) #A SortedDict is passed here
+        if self.callback:
+            self.callback(self.data)  # A SortedDict is passed here
         self.updateStyle()
-        
+
 ###############################################################################
 
+
 class QListEditor(QBaseDictionaryEditor):
-        
+
     def defineStyle(self):
         QBaseDictionaryEditor.defineStyle(self)
         self.table.setColumnCount(1)
         self.baddColumn.hide()
-        
-    def setModel(self,model):
-        self.info('DictionaryEditor.setModel(%s(%s))'%(type(model),model))
+
+    def setModel(self, model):
+        self.info('DictionaryEditor.setModel(%s(%s))' % (type(model), model))
         if isString(model):
-            try: self.dctmodel = list(eval(model)) if any(c in model for c in ('{','[','(')) else [model]
-            except: self.dctmodel = [model]
-        else: self.dctmodel = model
-        TaurusBaseContainer.setModel(self,model) #self.updateStyle() called from the property setter
-        
+            try:
+                self.dctmodel = list(eval(model)) if any(
+                    c in model for c in ('{', '[', '(')) else [model]
+            except:
+                self.dctmodel = [model]
+        else:
+            self.dctmodel = model
+        # self.updateStyle() called from the property setter
+        TaurusBaseContainer.setModel(self, model)
+
     def getModelClass(self):
         return list
-    
+
     def updateStyle(self):
-        #self.value.setText(str(self.dctmodel))
+        # self.value.setText(str(self.dctmodel))
         data = list(self.dctmodel)
-        self.nrows,self.ncols = len(data),1
+        self.nrows, self.ncols = len(data), 1
         self.table.setRowCount(self.nrows)
         self.table.setColumnCount(self.ncols)
-        for r in range(self.nrows): self.setCellText(r,0,data[r])
+        for r in range(self.nrows):
+            self.setCellText(r, 0, data[r])
         self.table.resizeRowsToContents()
         self.table.horizontalHeader().setStretchLastSection(True)
         self.update()
-        
+
     def getValues(self):
         nrows = self.table.rowCount()
-        self.data = [self.getCellText(r,0)for r in range(nrows)]
+        self.data = [self.getCellText(r, 0)for r in range(nrows)]
         return self.data
-        
+
     def save(self):
         self.getValues()
-        self.info('DictionaryEditor.save(%s(%s)): %s'%(type(self.data),self.data,self.callback))
-        if self.callback: 
+        self.info('DictionaryEditor.save(%s(%s)): %s' %
+                  (type(self.data), self.data, self.callback))
+        if self.callback:
             self.callback(self.data)
         elif self.dctmodel is None:
             self.dctmodel = self.data
-        else: #Overwriting dctmodel
+        else:  # Overwriting dctmodel
             if isSequence(self.dctmodel):
-                while len(self.dctmodel):self.dctmodel.pop(0)
+                while len(self.dctmodel):
+                    self.dctmodel.pop(0)
                 self.dctmodel.extend(self.data)
             elif isDictionary(self.dctmodel):
                 self.dctmodel.clear()
-                self.dctmodel = djoin(self.dctmodel,self.data)
+                self.dctmodel = djoin(self.dctmodel, self.data)
         return self.data
 
-        
+
 ###############################################################################
-        
+
 def prepare():
     from taurus.qt.qtgui.application import TaurusApplication
     app = TaurusApplication(app_name='DictionaryEditor')
     args = app.get_command_line_args()
-    return app,args
+    return app, args
 
 if __name__ == '__main__':
-    app,args = prepare()
+    app, args = prepare()
     dialog = QDictionaryEditor.main(args)
     sys.exit(app.exec_())
-    
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py
index 2e936de..a96fc72 100644
--- a/lib/taurus/qt/qtgui/table/qlogtable.py
+++ b/lib/taurus/qt/qtgui/table/qlogtable.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -46,7 +46,6 @@ from taurus.core.util.decorator.memoize import memoized
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.model import FilterToolBar
 from taurus.qt.qtgui.util import ActionFactory
-from taurus.qt.qtgui.resource import getThemeIcon
 
 from qtable import QBaseTableWidget
 
@@ -54,14 +53,15 @@ LEVEL, TIME, MSG, NAME, ORIGIN = range(5)
 HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin'
 
 __LEVEL_BRUSH = {
-    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),
+    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):
     elevel = taurus.Trace
     if level <= taurus.Trace:
@@ -76,7 +76,7 @@ def getBrushForLevel(level):
         elevel = taurus.Error
     elif level <= taurus.Critical:
         elevel = taurus.Critical
-    f, g  = map(Qt.QBrush, __LEVEL_BRUSH[elevel])
+    f, g = map(Qt.QBrush, __LEVEL_BRUSH[elevel])
     return f, g
 
 
@@ -91,6 +91,7 @@ def _origin_cmp(rec1, rec2):
 
 gethostname = memoized(socket.gethostname)
 
+
 def _get_record_origin(rec):
     host = getattr(rec, 'hostName', "?" + gethostname() + "?")
     procName = getattr(rec, 'processName', "?process?")
@@ -99,6 +100,7 @@ def _get_record_origin(rec):
     threadID = getattr(rec, 'thread', "?threadID?")
     return host, procName, procID, threadName, threadID
 
+
 def _get_record_trace(rec):
     pathname = getattr(rec, 'pathname', '')
     filename = getattr(rec, 'filename', '')
@@ -106,19 +108,23 @@ def _get_record_trace(rec):
     funcname = getattr(rec, 'funcName', '')
     lineno = getattr(rec, 'lineno', '')
     return pathname, filename, modulename, funcname, lineno
-    
+
+
 def _get_record_origin_str(rec):
     return "{0}.{1}.{3}".format(*_get_record_origin(rec))
 
+
 def _get_record_origin_tooltip(rec):
-    
+
     host, procName, procID, threadName, threadID = _get_record_origin(rec)
     pathname, filename, modulename, funcname, lineno = _get_record_trace(rec)
     timestamp = str(datetime.datetime.fromtimestamp(rec.created))
     bgcolor, fgcolor = map(Qt.QBrush.color, getBrushForLevel(rec.levelno))
-    bgcolor = "#%02x%02x%02x" % (bgcolor.red(), bgcolor.green(), bgcolor.blue())
-    fgcolor = "#%02x%02x%02x" % (fgcolor.red(), fgcolor.green(), fgcolor.blue())
-    
+    bgcolor = "#%02x%02x%02x" % (
+        bgcolor.red(), bgcolor.green(), bgcolor.blue())
+    fgcolor = "#%02x%02x%02x" % (
+        fgcolor.red(), fgcolor.green(), fgcolor.blue())
+
     return """<html><font face="monospace" size="1">
 <table border="0" cellpadding="0" cellspacing="0">
 <tr><td>Level:</td><td><font color="{level_bgcolor}">{level}</font></td></tr>
@@ -137,11 +143,12 @@ def _get_record_origin_tooltip(rec):
            pathname=pathname, filename=filename, funcname=funcname,
            lineno=lineno)
 
+
 class QLoggingTableModel(Qt.QAbstractTableModel, logging.Handler):
 
     DftFont = Qt.QFont("Mono", 8)
     DftColSize = Qt.QSize(80, 20), Qt.QSize(200, 20), \
-                 Qt.QSize(300, 20), Qt.QSize(180, 20), Qt.QSize(240, 20),
+        Qt.QSize(300, 20), Qt.QSize(180, 20), Qt.QSize(240, 20),
 
     def __init__(self, capacity=500000, freq=0.25):
         super(Qt.QAbstractTableModel, self).__init__()
@@ -150,34 +157,35 @@ class QLoggingTableModel(Qt.QAbstractTableModel, logging.Handler):
         self._records = []
         self._accumulated_records = []
         Logger.addRootLogHandler(self)
-        self.startTimer(freq*1000)
+        self.startTimer(freq * 1000)
 
     # ---------------------------------
     # Qt.QAbstractTableModel overwrite
     # ---------------------------------
 
-    def sort(self, column, order = Qt.Qt.AscendingOrder):
+    def sort(self, column, order=Qt.Qt.AscendingOrder):
         if column == LEVEL:
-            f = lambda a,b: cmp(a.levelno,b.levelno)
+            f = lambda a, b: cmp(a.levelno, b.levelno)
         elif column == TIME:
-            f = lambda a,b: cmp(a.created,b.created)
+            f = lambda a, b: cmp(a.created, b.created)
         elif column == MSG:
-            f = lambda a,b: cmp(a.msg,b.msg)
+            f = lambda a, b: cmp(a.msg, b.msg)
         elif column == NAME:
-            f = lambda a,b: cmp(a.name,b.name)
+            f = lambda a, b: cmp(a.name, b.name)
         elif column == ORIGIN:
             f = _origin_cmp
-        self._records = sorted(self._records, cmp=f,reverse= order == Qt.Qt.DescendingOrder)
+        self._records = sorted(self._records, cmp=f,
+                               reverse=order == Qt.Qt.DescendingOrder)
 
     def rowCount(self, index=Qt.QModelIndex()):
         return len(self._records)
 
     def columnCount(self, index=Qt.QModelIndex()):
         return len(HORIZ_HEADER)
-    
+
     def getRecord(self, index):
         return self._records[index.row()]
-    
+
     def data(self, index, role=Qt.Qt.DisplayRole):
         if not index.isValid() or not (0 <= index.row() < len(self._records)):
             return Qt.QVariant()
@@ -189,7 +197,7 @@ class QLoggingTableModel(Qt.QAbstractTableModel, logging.Handler):
             elif column == TIME:
                 dt = datetime.datetime.fromtimestamp(record.created)
                 return Qt.QVariant(str(dt))
-                #return Qt.QVariant(dt.strftime("%Y-%m-%d %H:%m:%S.%f"))
+                # return Qt.QVariant(dt.strftime("%Y-%m-%d %H:%m:%S.%f"))
             elif column == MSG:
                 return Qt.QVariant(record.getMessage())
             elif column == NAME:
@@ -198,8 +206,8 @@ class QLoggingTableModel(Qt.QAbstractTableModel, logging.Handler):
                 return Qt.QVariant(_get_record_origin_str(record))
         elif role == Qt.Qt.TextAlignmentRole:
             if column in (LEVEL, MSG):
-                return Qt.QVariant(Qt.Qt.AlignLeft|Qt.Qt.AlignVCenter)
-            return Qt.QVariant(Qt.Qt.AlignRight|Qt.Qt.AlignVCenter)
+                return Qt.QVariant(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter)
+            return Qt.QVariant(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter)
         elif role == Qt.Qt.BackgroundRole:
             if column == LEVEL:
                 return Qt.QVariant(getBrushForLevel(record.levelno)[0])
@@ -210,8 +218,8 @@ class QLoggingTableModel(Qt.QAbstractTableModel, logging.Handler):
             return Qt.QVariant(_get_record_origin_tooltip(record))
         elif role == Qt.Qt.SizeHintRole:
             return self._getSizeHint(column)
-        #elif role == Qt.Qt.StatusTipRole:
-        #elif role == Qt.Qt.CheckStateRole:
+        # elif role == Qt.Qt.StatusTipRole:
+        # elif role == Qt.Qt.CheckStateRole:
         elif role == Qt.Qt.FontRole:
             return Qt.QVariant(self.DftFont)
         return Qt.QVariant()
@@ -247,27 +255,26 @@ class QLoggingTableModel(Qt.QAbstractTableModel, logging.Handler):
             return Qt.QVariant()
         if orientation == Qt.Qt.Horizontal:
             return Qt.QVariant(HORIZ_HEADER[section])
-        return Qt.QVariant(int(section+1))
+        return Qt.QVariant(int(section + 1))
 
     def insertRows(self, position, rows=1, index=Qt.QModelIndex()):
-        self.beginInsertRows(Qt.QModelIndex(), position, position+rows-1)
+        self.beginInsertRows(Qt.QModelIndex(), position, position + rows - 1)
         self.endInsertRows()
 
     def removeRows(self, position, rows=1, index=Qt.QModelIndex()):
-        self.beginRemoveRows(Qt.QModelIndex(), position, position+rows-1)
+        self.beginRemoveRows(Qt.QModelIndex(), position, position + rows - 1)
         self.endRemoveRows()
 
-
-    #def setData(self, index, value, role=Qt.Qt.DisplayRole):
+    # def setData(self, index, value, role=Qt.Qt.DisplayRole):
     #    pass
 
-    #def flags(self, index)
+    # def flags(self, index)
     #    pass
 
-    #def insertColumns(self):
+    # def insertColumns(self):
     #    pass
 
-    #def removeColumns(self):
+    # def removeColumns(self):
     #    pass
 
     # --------------------------
@@ -310,15 +317,17 @@ class _LogRecordStreamHandler(LogRecordStreamHandler):
 
 class QRemoteLoggingTableModel(QLoggingTableModel):
     """A remote Qt table that displays the taurus logging messages"""
+
     def connect_logging(self, host='localhost',
-                port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
-                handler=_LogRecordStreamHandler):
+                        port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
+                        handler=_LogRecordStreamHandler):
         self.log_receiver = LogRecordSocketReceiver(host=host, port=port,
                                                     handler=handler, model=self)
-        self.log_thread = threading.Thread(target=self.log_receiver.serve_until_stopped)
+        self.log_thread = threading.Thread(
+            target=self.log_receiver.serve_until_stopped)
         self.log_thread.daemon = False
         self.log_thread.start()
-    
+
     def disconnect_logging(self):
         if not hasattr(self, 'log_receiver') or self.log_receiver is None:
             return
@@ -336,7 +345,7 @@ class QLoggingTable(Qt.QTableView):
         """Overwrite of slot rows inserted to do proper resize and scroll to
         bottom if desired"""
         Qt.QTableView.rowsInserted(self, index, start, end)
-        for i in xrange(start,end+1):
+        for i in xrange(start, end + 1):
             self.resizeRowToContents(i)
         if start == 0:
             self.resizeColumnsToContents()
@@ -357,41 +366,43 @@ class QLoggingTable(Qt.QTableView):
 
 class LoggingToolBar(FilterToolBar):
 
+    scrollLockToggled = Qt.pyqtSignal(bool)
+
     def __init__(self, view=None, parent=None, designMode=False):
         FilterToolBar.__init__(self, view=view, parent=parent,
                                designMode=designMode)
         self.getFilterLineEdit().setToolTip("Quick filter by log name")
 
         self._logLevelComboBox = logLevelComboBox = Qt.QComboBox()
-        levels =  "Trace", "Debug", "Info", "Warning", "Error", "Critical"
+        levels = "Trace", "Debug", "Info", "Warning", "Error", "Critical"
         for level in levels:
-            logLevelComboBox.addItem(level, Qt.QVariant(getattr(taurus, level)))
+            logLevelComboBox.addItem(
+                level, Qt.QVariant(getattr(taurus, level)))
         logLevelComboBox.setCurrentIndex(0)
-        Qt.QObject.connect(logLevelComboBox,
-                           Qt.SIGNAL("currentIndexChanged(int)"),
-                           self.onLogLevelChanged)
+        logLevelComboBox.currentIndexChanged.connect(self.onLogLevelChanged)
         logLevelComboBox.setToolTip("Filter by log level")
-        
+
         self._filterLevelAction = self.addWidget(logLevelComboBox)
         self.addSeparator()
-                
+
         af = ActionFactory()
         self._scrollLockAction = af.createAction(self, "Refresh",
-            icon=getThemeIcon("system-lock-screen"),
-            tip="Scroll lock",
-            toggled=self.onToggleScrollLock)
+                                                 icon=Qt.QIcon.fromTheme(
+                                                     "system-lock-screen"),
+                                                 tip="Scroll lock",
+                                                 toggled=self.onToggleScrollLock)
 
         self.addAction(self._scrollLockAction)
 
     def onToggleScrollLock(self, yesno):
-        self.emit(Qt.SIGNAL("scrollLockToggled(bool)"), yesno)
+        self.scrollLockToggled.emit(yesno)
 
     def onLogLevelChanged(self, index):
         self.onFilterChanged()
-    
+
     def getLogLevelComboBox(self):
         return self._logLevelComboBox
-        
+
     def getLogLevel(self):
         combo = self.getLogLevelComboBox()
         return Qt.from_qvariant(combo.itemData(combo.currentIndex()))
@@ -417,8 +428,8 @@ class QLoggingFilterProxyModel(Qt.QSortFilterProxyModel):
         self.setFilterRole(Qt.Qt.DisplayRole)
 
         # sort configuration
-        #self.setSortCaseSensitivity(Qt.Qt.CaseInsensitive)
-        #self.setSortRole(Qt.Qt.DisplayRole)
+        # self.setSortCaseSensitivity(Qt.Qt.CaseInsensitive)
+        # self.setSortRole(Qt.Qt.DisplayRole)
 
         # general configuration
 
@@ -444,20 +455,21 @@ class QLoggingFilterProxyModel(Qt.QSortFilterProxyModel):
 _W = "Warning: Switching log perspective will erase previous log messages " \
      "from current perspective!"
 
+
 class QLoggingWidget(QBaseTableWidget):
 
     KnownPerspectives = {
-        'Standard' : {
-            "label"   : "Local",
-            "icon"    : "computer",
-            "tooltip" : "Local logging.\n" + _W,
-            "model"   : [QLoggingFilterProxyModel, QLoggingTableModel,],
+        'Standard': {
+            "label": "Local",
+            "icon": "computer",
+            "tooltip": "Local logging.\n" + _W,
+            "model": [QLoggingFilterProxyModel, QLoggingTableModel, ],
         },
-        'Remote' : {
-            "label"   : "Remote",
-            "icon"    : "network-server",
-            "tooltip" : "Monitor remote logs.\n" + _W,
-            "model"   : [QLoggingFilterProxyModel, QRemoteLoggingTableModel,],
+        'Remote': {
+            "label": "Remote",
+            "icon": "network-server",
+            "tooltip": "Monitor remote logs.\n" + _W,
+            "model": [QLoggingFilterProxyModel, QRemoteLoggingTableModel, ],
         },
     }
 
@@ -468,9 +480,9 @@ class QLoggingWidget(QBaseTableWidget):
                  with_selection_widget=True, with_refresh_widget=True,
                  perspective=None, proxy=None):
         QBaseTableWidget.__init__(self, parent=parent, designMode=designMode,
-                 with_filter_widget=with_filter_widget,
-                 with_selection_widget=False, with_refresh_widget=False,
-                 perspective=perspective, proxy=proxy)
+                                  with_filter_widget=with_filter_widget,
+                                  with_selection_widget=False, with_refresh_widget=False,
+                                  perspective=perspective, proxy=proxy)
 
     def createViewWidget(self, klass=None):
         if klass is None:
@@ -485,8 +497,7 @@ class QLoggingWidget(QBaseTableWidget):
     def createToolArea(self):
         tb = QBaseTableWidget.createToolArea(self)
         filterBar = self.getFilterBar()
-        Qt.QObject.connect(filterBar, Qt.SIGNAL("scrollLockToggled(bool)"),
-                           self.onScrollLockToggled)
+        filterBar.scrollLockToggled.connect(self.onScrollLockToggled)
         return tb
 
     def onScrollLockToggled(self, yesno):
@@ -497,7 +508,7 @@ class QLoggingWidget(QBaseTableWidget):
             return
         proxy_model = self.getQModel()
         level = self.getFilterBar().getLogLevel()
-        proxy_model.setFilterLogLevel(level)        
+        proxy_model.setFilterLogLevel(level)
         return QBaseTableWidget.onFilterChanged(self, filter)
 
     def onSwitchPerspective(self, perspective):
@@ -507,20 +518,21 @@ class QLoggingWidget(QBaseTableWidget):
                 host, port = self.hostName, self.port
             else:
                 isValid = False
-                dft = "%s:%d" % (socket.gethostname(), logging.handlers.DEFAULT_TCP_LOGGING_PORT)
+                dft = "%s:%d" % (socket.gethostname(),
+                                 logging.handlers.DEFAULT_TCP_LOGGING_PORT)
                 while not isValid:
                     txt, res = Qt.QInputDialog.getText(self,
-                        "Please input remote logging host and port",
-                        "Location (<host>:<port>):", Qt.QLineEdit.Normal, dft)
+                                                       "Please input remote logging host and port",
+                                                       "Location (<host>:<port>):", Qt.QLineEdit.Normal, dft)
                     if not res:
                         return
                     try:
-                        host, port = str(txt).split(":",1)
+                        host, port = str(txt).split(":", 1)
                         port = int(port)
                         isValid = True
                     except:
                         Qt.QMessageBox.information(self, "Invalid name",
-                            "Please type a valid <host>:<port>")
+                                                   "Please type a valid <host>:<port>")
             ret = QBaseTableWidget.onSwitchPerspective(self, perspective)
             qmodel = self.getQModel()
             qmodel.connect_logging(host=host, port=port)
@@ -531,22 +543,21 @@ class QLoggingWidget(QBaseTableWidget):
     def destroy(self, destroyWindow=True, destroySubWindows=True):
         self.stop_logging()
         return QBaseTableWidget.destroy(self, destroyWindow, destroySubWindows)
-    
+
     def stop_logging(self):
         model = self.getBaseQModel()
         if hasattr(model, 'disconnect_logging'):
             model.disconnect_logging()
-    
-    
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         return {
-            'module'    : 'taurus.qt.qtgui.table',
-            'group'     : 'Taurus Views',
-            'icon'      : ':/designer/table.png',
-            'container' : False }
+            'module': 'taurus.qt.qtgui.table',
+            'group': 'Taurus Views',
+            'icon': 'designer:table.png',
+            'container': False}
+
 
-   
 def fill_log():
     import time
     import random
@@ -554,14 +565,15 @@ def fill_log():
     for i in xrange(10):
         taurus.info("Hello world %04d" % i)
 
-    loggers = ["Object%02d" % (i+1) for i in range(10)]
+    loggers = ["Object%02d" % (i + 1) for i in range(10)]
     i = 0
     while True:
         time.sleep(random.random())
         logger = logging.getLogger(random.choice(loggers))
         level = random.randint(taurus.Trace, taurus.Critical)
         logger.log(level, "log message %04d" % i)
-        i +=1
+        i += 1
+
 
 def main():
     import taurus.qt.qtgui.application
@@ -577,14 +589,14 @@ def main():
     taurus.setLogLevel(taurus.Trace)
     taurus.disableLogOutput()
     w = QLoggingWidget()
-    
+
     taurus.trace("trace message")
     taurus.debug("debug message")
     taurus.info("Hello world")
     taurus.warning("Warning message")
     taurus.error("error message")
     taurus.critical("critical message")
-    w.setMinimumSize(1200,600)
+    w.setMinimumSize(1200, 600)
     w.show()
     app.exec_()
     w.stop_logging()
diff --git a/lib/taurus/qt/qtgui/table/qtable.py b/lib/taurus/qt/qtgui/table/qtable.py
index 2e7437d..fb4b520 100644
--- a/lib/taurus/qt/qtgui/table/qtable.py
+++ b/lib/taurus/qt/qtgui/table/qtable.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/table/taurusdbtable.py b/lib/taurus/qt/qtgui/table/taurusdbtable.py
index 6bf8e3f..4dc111d 100644
--- a/lib/taurus/qt/qtgui/table/taurusdbtable.py
+++ b/lib/taurus/qt/qtgui/table/taurusdbtable.py
@@ -2,74 +2,76 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides a base widget that can be used to display a taurus 
+"""This module provides a base widget that can be used to display a taurus
 model in a table widget"""
 
+# todo: tango-centric!!!
+
 __all__ = ["TaurusDbTableWidget"]
 
 __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 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 taurus.core.taurusauthority import TaurusAuthority
+from taurus.qt.qtgui.icon import getElementTypeIcon, getElementTypeIconName
 from taurustable import TaurusBaseTableWidget
 
 
 class TaurusDbTableWidget(TaurusBaseTableWidget):
     """A class:`taurus.qt.qtgui.tree.TaurusBaseTableWidget` that connects to a
-    :class:`taurus.core.taurusdatabase.TaurusDatabase` model. It can show the list of database
-    elements in two different perspectives:
-    
+    :class:`taurus.core.taurusauthority.TaurusAuthority` model. It can show
+    the list of database elements in two different perspectives:
+
     - device : a device list based perspective
     - server : a server list based perspective
-    
+
     Filters can be inserted into this widget to restrict the items that are
     seen.
     """
-    
+
     KnownPerspectives = {
-        TaurusElementType.Device : {
-            "label"   : "Devices",
-            "icon"    : getElementTypeIconName(TaurusElementType.Device),
-            "tooltip" : "View by device",
-            "model"   : [TaurusDbDeviceProxyModel, TaurusDbBaseModel,],
+        TaurusElementType.Device: {
+            "label": "Devices",
+            "icon": getElementTypeIconName(TaurusElementType.Device),
+            "tooltip": "View by device",
+            "model": [TaurusDbDeviceProxyModel, TaurusDbBaseModel, ],
         },
-        TaurusElementType.Server : {
-            "label" : "Servers",
-            "icon" : getElementTypeIconName(TaurusElementType.Server),
-            "tooltip" : "View by server",
-            "model" : [TaurusDbServerProxyModel, TaurusDbPlainServerModel,],
+        TaurusElementType.Server: {
+            "label": "Servers",
+            "icon": getElementTypeIconName(TaurusElementType.Server),
+            "tooltip": "View by server",
+            "model": [TaurusDbServerProxyModel, TaurusDbPlainServerModel, ],
         },
     }
 
     DftPerspective = TaurusElementType.Device
 
     def getModelClass(self):
-        return TaurusDatabase
-    
+        return TaurusAuthority
+
     def sizeHint(self):
         return Qt.QSize(1024, 512)
 
@@ -78,7 +80,7 @@ class TaurusDbTableWidget(TaurusBaseTableWidget):
         ret = TaurusBaseTableWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.table'
         ret['group'] = 'Taurus Views'
-        ret['icon'] = ":/designer/table.png"
+        ret['icon'] = "designer:table.png"
         return ret
 
 
@@ -90,34 +92,35 @@ def main_TaurusDbTableWidget(host, perspective=TaurusElementType.Device):
     w.show()
     return w
 
+
 def demo():
     """Table panels"""
     import taurus
-    db = taurus.Database()
+    db = taurus.Authority()
     host = db.getNormalName()
     w = main_TaurusDbTableWidget(host, TaurusElementType.Device)
-    
+
     return w
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         app = Application(app_name="DB model demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
     w = demo()
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
         return w
-    
+
 if __name__ == "__main__":
     main()
-
diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
old mode 100644
new mode 100755
index 9901ec3..51ee926
--- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
+++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py
@@ -2,46 +2,48 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-taurusdevicepropertytable.py: 
+taurusdevicepropertytable.py:
 """
 
+# todo: tango-centric
+
 __all__ = ["TaurusPropTable"]
 
 from taurus.external.qt import Qt, QtCore, QtGui
 from taurus.qt.qtgui.base import TaurusBaseWidget
-import taurus.core
-import PyTango
+from taurus.core.taurusdevice import TaurusDevice
+
 
 class TaurusPropTable(QtGui.QTableWidget, TaurusBaseWidget):
-    ''' 
+    '''
     This widget will show a list of properties of device and the list of values.
     @todo add a frame for Add, Delete and Refresh buttons!
     '''
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
+    # TODO This widget is Tango-centric
 
-    def __init__(self, parent=None, designMode = False):
+    def __init__(self, parent=None, designMode=False):
         try:
             name = "TaurusPropTable"
             self._useParentModel = True
@@ -49,16 +51,33 @@ class TaurusPropTable(QtGui.QTableWidget, TaurusBaseWidget):
             self.call__init__wo_kw(QtGui.QTableWidget, parent)
             self.call__init__(TaurusBaseWidget, name, designMode=designMode)
             self.setObjectName(name)
-            #self.setItemDelegate(Delegate(self))
-            #self.setModelCheck('controls01:10000') 
             self.defineStyle()
-            
-        except Exception,e:
+            self.db = None
+
+        except Exception, e:
             self.traceback()
-            
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget over writing methods 
+    # TaurusBaseWidget over writing methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+    def setModel(self, model):
+        TaurusBaseWidget.setModel(self, model)
+        # Update the table
+        modelObj = self.getModelObj()
+        if modelObj is None:
+            dev_name = None
+            self.db = None
+        else:
+            validator = modelObj.getNameValidator()
+            groups = validator.getUriGroups(modelObj.getFullName())
+            dev_name = groups['devname']
+            # -----------------------------------------------------------------
+            # Workaround for bug-256
+            # (use next line instead of the other one when bug-256 is fixed)
+            # self.db = modelObj.getParentObj() # use this instead
+            self.db = modelObj.factory().getAuthority(groups['authority'])
+            # -----------------------------------------------------------------
+        self.setTable(dev_name)
 
     def sizeHint(self):
         return QtGui.QTableWidget.sizeHint(self)
@@ -67,146 +86,162 @@ class TaurusPropTable(QtGui.QTableWidget, TaurusBaseWidget):
         return QtGui.QTableWidget.minimumSizeHint(self)
 
     def getModelClass(self):
-        return taurus.core.taurusdatabase.TaurusDatabase
+        return TaurusDevice
 
     @classmethod
     def getQtDesignerPluginInfo(cls):
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.table'
         ret['group'] = 'Taurus Views'
-        ret['icon'] = ":/designer/table.png"
+        ret['icon'] = "designer:table.png"
         return ret
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    model = QtCore.pyqtProperty("QString", TaurusBaseWidget.getModel, 
-                                TaurusBaseWidget.setModel, 
+    model = QtCore.pyqtProperty("QString", TaurusBaseWidget.getModel,
+                                setModel,
                                 TaurusBaseWidget.resetModel)
-    
-    useParentModel = QtCore.pyqtProperty("bool", 
-                                         TaurusBaseWidget.getUseParentModel, 
+
+    useParentModel = QtCore.pyqtProperty("bool",
+                                         TaurusBaseWidget.getUseParentModel,
                                          TaurusBaseWidget.setUseParentModel,
-                                         TaurusBaseWidget.resetUseParentModel)                
+                                         TaurusBaseWidget.resetUseParentModel)
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # My methods 
+    # My methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    @QtCore.pyqtSignature("setTable(QString)")  
-    def setTable(self,dev_name):
-        ''' 
-        This method is used to connect TaurusPropTable widget with TaurusClassTable widget
-        This method fill the table with the names of properties and values for the device selected in the TaurusClassTable
-        '''
-        QtCore.QObject.disconnect(self,QtCore.SIGNAL("cellChanged(int,int)"),self.valueChanged)
-        self.db = PyTango.Database()
+
+    @QtCore.pyqtSlot('QString')
+    def setTable(self, dev_name):
+        """
+        Fills the table with the names of properties and their values for the
+        given device.
+        """
+        if dev_name is None:
+            return  # TODO: the table should be cleaned
+
+        elif self.db is None:
+            self.warning('Model must be set before calling setTable')
+            return
+        self.cellChanged.disconnect(self.valueChanged)
         dev_name = str(dev_name)
-        self.list_prop = list(self.db.get_device_property_list(dev_name,'*'))
+        self.list_prop = list(self.db.get_device_property_list(dev_name, '*'))
         self.setRowCount(len(self.list_prop))
-        for i in range(0,len(self.list_prop)):
+        for i in range(0, len(self.list_prop)):
             elem = self.list_prop[i]
-            self.setText(elem,i,0)
-            self.dictionary=self.db.get_device_property(dev_name,self.list_prop)
-            self.debug('Getting %s properties: %s -> %s'%(dev_name,self.list_prop,self.dictionary))
-            value=self.dictionary[elem]
-            self.debug('TaurusPropsTable: property %s is type %s'%(elem,type(value)))
-            USE_TABLES=False
-            if USE_TABLES: self.setPropertyValue(value,i,1)
+            self.setText(elem, i, 0)
+            self.dictionary = self.db.get_device_property(dev_name,
+                                                          self.list_prop)
+            self.debug('Getting %s properties: %s -> %s',
+                       dev_name, self.list_prop, self.dictionary)
+            value = self.dictionary[elem]
+            self.debug('TaurusPropsTable: property %s is type %s',
+                       elem, type(value))
+            USE_TABLES = False
+            if USE_TABLES:
+                self.setPropertyValue(value, i, 1)
             else:
-                if not isinstance(value,str): #not something like an string
-                    #if isinstance(value,list):#type(value) is list: 
-                    heigh1 = len(value)
-                    value = '\n'.join(str(v) for v in value) # adding new lines in between elements in the list
-                self.setText(str(value),i,1)
-        
+                if not isinstance(value, str):  # not something like an string
+                    # adding new lines in between elements in the list
+                    value = '\n'.join(str(v) for v in value)
+                self.setText(str(value), i, 1)
+
         self.updateStyle()
         self.dev_name = dev_name
-        self.setWindowTitle('%s Properties'%dev_name)
+        self.setWindowTitle('%s Properties' % dev_name)
         self.resizeColumnsToContents()
-        self.resizeRowsToContents()        
-        ##Signals @todo
-        ## Commented as it didn't work really well (many pop-ups open!)
-        #QtCore.QObject.connect(self,QtCore.SIGNAL("cellDoubleClicked(int,int)"),self.valueDoubleClicked)
-        #QtCore.QObject.connect(self,QtCore.SIGNAL("cellChanged(int,int)"),self.valueChanged)    
+        self.resizeRowsToContents()
+        # Signals @todo
+        # Commented as it didn't work really well (many pop-ups open!)
+        # QtCore.QObject.connect(self,QtCore.SIGNAL("cellDoubleClicked(int,int)"),self.valueDoubleClicked)
+        # QtCore.QObject.connect(self,QtCore.SIGNAL("cellChanged(int,int)"),self.valueChanged)
 
     def defineStyle(self):
         """ Defines the initial style for the widget """
         self.setWindowTitle('Properties')
         self.setColumnCount(2)
         self.setRowCount(0)
-        self.setGeometry(QtCore.QRect(0,0,400,500))
+        self.setGeometry(QtCore.QRect(0, 0, 400, 500))
 
-        self.setColumnWidth(0,124)
-        self.setColumnWidth(1,254)
+        self.setColumnWidth(0, 124)
+        self.setColumnWidth(1, 254)
 
         headerItem = QtGui.QTableWidgetItem()
-        headerItem.setText(QtGui.QApplication.translate("PLCTabWidget", "Property Name", None, QtGui.QApplication.UnicodeUTF8))
-        self.setHorizontalHeaderItem(0,headerItem)
+        headerItem.setText(QtGui.QApplication.translate(
+            "PLCTabWidget", "Property Name", None, QtGui.QApplication.UnicodeUTF8))
+        self.setHorizontalHeaderItem(0, headerItem)
 
         headerItem1 = QtGui.QTableWidgetItem()
-        headerItem1.setText(QtGui.QApplication.translate("PLCTabWidget", "Value", None, QtGui.QApplication.UnicodeUTF8))
-        self.setHorizontalHeaderItem(1,headerItem1)
-        self.horizontalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents) #.Stretch)
+        headerItem1.setText(QtGui.QApplication.translate(
+            "PLCTabWidget", "Value", None, QtGui.QApplication.UnicodeUTF8))
+        self.setHorizontalHeaderItem(1, headerItem1)
+        self.horizontalHeader().setResizeMode(
+            QtGui.QHeaderView.ResizeToContents)  # .Stretch)
 
     def updateStyle(self):
         self.resizeRowsToContents()
-        self.horizontalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents) #.Stretch)
-        #self.resizeColumnsToContents()
+        self.horizontalHeader().setResizeMode(
+            QtGui.QHeaderView.ResizeToContents)  # .Stretch)
+        # self.resizeColumnsToContents()
         pass
-        
-    def contextMenuEvent(self,event):
+
+    def contextMenuEvent(self, event):
         ''' This function is called when right clicking on qwt plot area. A pop up menu will be
         shown with the available options. '''
         self.info('TaurusPropTable.contextMenuEvent()')
         menu = Qt.QMenu(self)
         configDialogAction = menu.addAction("Add new property")
-        self.connect(configDialogAction, QtCore.SIGNAL("triggered()"), self.addProperty)
+        configDialogAction.triggered[()].connect(self.addProperty)
         configDialogAction = menu.addAction("Delete property")
-        self.connect(configDialogAction, QtCore.SIGNAL("triggered()"), self.deleteProperty) 
+        configDialogAction.triggered[()].connect(self.deleteProperty)
         configDialogAction = menu.addAction("Edit property")
-        self.connect(configDialogAction, QtCore.SIGNAL("triggered()"), self.editProperty)       
+        configDialogAction.triggered[()].connect(self.editProperty)
         menu.addSeparator()
         menu.exec_(event.globalPos())
-        del menu        
+        del menu
 
-    def setText(self,value,i,j):
+    def setText(self, value, i=None, j=None):
         item = QtGui.QTableWidgetItem()
         item.setFlags(Qt.Qt.ItemIsEnabled)
-        item.setText(QtGui.QApplication.translate("PLCTabWidget", value, None, QtGui.QApplication.UnicodeUTF8))
-        self.setItem(i,j,item)
-        return
-    
-    def valueDoubleClicked(self,x,y):
-        self.info('TaurusPropTable.valueDoubleClicked(%s,%s)' % (x,y))
-        ## opens a dialog for multiline edition
-        self.editProperty()    
-        
+        item.setText(QtGui.QApplication.translate("PLCTabWidget",
+                                                  value, None, QtGui.QApplication.UnicodeUTF8))
+        if i is not None and j is not None:
+            self.setItem(i, j, item)
+        # TODO: the info does not change with the events.
+
+    def valueDoubleClicked(self, x, y):
+        self.info('TaurusPropTable.valueDoubleClicked(%s,%s)' % (x, y))
+        # opens a dialog for multiline edition
+        self.editProperty()
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    ## @name Property Edition
+    # @name Property Edition
     # @{
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def addProperty(self):
-        text, ok = QtGui.QInputDialog.getText(self,'New Property','Property name:')
+        text, ok = QtGui.QInputDialog.getText(
+            self, 'New Property', 'Property name:')
         if ok:
             text1 = unicode(text)
             new_prop_name = str(text1)
             new_prop_value = '0'
-            dict1= {new_prop_name: [new_prop_value]}
-            self.db.put_device_property(self.dev_name,dict1)
+            dict1 = {new_prop_name: [new_prop_value]}
+            self.db.put_device_property(self.dev_name, dict1)
             self.setTable(self.dev_name)
 
     def deleteProperty(self):
         row = self.currentRow()
-        prop_name = self.item(row,0).text()
+        prop_name = self.item(row, 0).text()
         list = [str(prop_name)]
         yes = QtGui.QMessageBox.Ok
         no = QtGui.QMessageBox.Cancel
-        result = QtGui.QMessageBox.question(self,"Removing property","Would you like to delete property  '"+ prop_name +"'  ?",yes, no)
+        result = QtGui.QMessageBox.question(
+            self, "Removing property", "Would you like to delete property  '" + prop_name + "'  ?", yes, no)
         if result == yes:
-            self.db.delete_device_property(self.dev_name,list)
+            self.db.delete_device_property(self.dev_name, list)
             self.setTable(self.dev_name)
 
     def editProperty(self):
@@ -214,138 +249,147 @@ class TaurusPropTable(QtGui.QTableWidget, TaurusBaseWidget):
         col = self.currentColumn()
 
         item1 = QtGui.QTableWidgetItem()
-        item1 = self.item(row,0)
+        item1 = self.item(row, 0)
         prop_name = item1.text()
         prop_name = str(prop_name)
         self.prop_name2 = prop_name
-        self.info('TaurusPropsTable.editProperty(%s)'%prop_name)
+        self.info('TaurusPropsTable.editProperty(%s)' % prop_name)
 
         item2 = QtGui.QTableWidgetItem()
-        item2 = self.item(row,1)
+        item2 = self.item(row, 1)
         prop_value = item2.text()
         prop_value = str(prop_value)
 
         if col == 0:
-            new_text, ok = QtGui.QInputDialog.getText(self,'Rename','Write new name of property:')
+            new_text, ok = QtGui.QInputDialog.getText(
+                self, 'Rename', 'Write new name of property:')
             if ok:
                 new_text = unicode(new_text)
                 new_text = str(new_text)
                 list = [prop_name]
-                dict= {new_text: [prop_value]}
-                self.db.delete_device_property(self.dev_name,list)#usuwanie musze umiescic gdzies wczesniej bo inaczej usuwam juz zmieniana nazwe z listy property 
-                self.db.put_device_property(self.dev_name,dict)
+                dict = {new_text: [prop_value]}
+                # usuwanie musze umiescic gdzies wczesniej bo inaczej usuwam
+                # juz zmieniana nazwe z listy property
+                self.db.delete_device_property(self.dev_name, list)
+                self.db.put_device_property(self.dev_name, dict)
                 self.setTable(self.dev_name)
         elif col == 1:
-            #Create the dilog to edit multiply text
-            dialogx = EditTextDialog(self) 
-            dialogx.setText(prop_value) 
-            dialogx.exec_() 
-            ok = dialogx.getResult() #OK or Cancel
+            # Create the dilog to edit multiply text
+            dialogx = EditTextDialog(self)
+            dialogx.setText(prop_value)
+            dialogx.exec_()
+            ok = dialogx.getResult()  # OK or Cancel
             if ok:
-                new_text = dialogx.getNewText() #method of dialog to get the changed text
+                new_text = dialogx.getNewText()  # method of dialog to get the changed text
                 self.setNewPropertyValue(new_text)
 
-    def setNewPropertyValue(self,new_text):
+    def setNewPropertyValue(self, new_text):
         new_text = unicode(new_text)
         new_text = str(new_text)
-        values = {self.prop_name2: new_text.replace('\r','').split('\n')}
-        self.db.put_device_property(self.dev_name,values)
+        values = {self.prop_name2: new_text.replace('\r', '').split('\n')}
+        self.db.put_device_property(self.dev_name, values)
         self.setTable(self.dev_name)
         self.updateStyle()
-    ##@}
-    
+    # @}
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Methods  for database commands
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    def get_device_property_names(self,dev_name,wildcard='*'):
-        return self.db.get_device_property_list(dev_name,wildcard)
+    def get_device_property_names(self, dev_name, wildcard='*'):
+        return self.db.get_device_property_list(dev_name, wildcard)
+
+    def put_device_property(self, dev_name, dict):
+        return self.db.put_device_property(dev_name, dict)
 
-    def put_device_property(self,dev_name,dict):
-        return self.db.put_device_property(dev_name,dict)
-                                         
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    ## @name DEPRECATED METHODS
+    # @name DEPRECATED METHODS
     # @{
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-        
-        
+    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
     def valueChanged(self):
         ''' @deprecated valueChanged THIS DOES NOTHING! '''
         row = self.currentRow()
         #item = QtGui.QTableWidgetItem()
-        item = self.item(row,0)
+        item = self.item(row, 0)
         prop_name = item.text()
         prop_name = str(prop_name)
         #item_2 = QtGui.QTableWidgetItem()
-        item_2 = self.item(row,1)
+        item_2 = self.item(row, 1)
         prop_value = item_2.text()
         prop_value = str(prop_value)
         dict = {prop_name: [prop_value]}
         list = [self.prop_name]
-        self.db.delete_device_property(self.dev_name,list)
-        self.db.put_device_property(self.dev_name,dict)
-        
-    def setPropertyValue(self,value,i,j):
-        ''' This method inserts a new table widget inside the cell 
+        self.db.delete_device_property(self.dev_name, list)
+        self.db.put_device_property(self.dev_name, dict)
+
+    def setPropertyValue(self, value, i, j):
+        ''' This method inserts a new table widget inside the cell
         @deprecated ... use setText() and editProperty() event call instead!!!
         '''
-        if len(value)==1 and isinstance(value[0],str):
+        if len(value) == 1 and isinstance(value[0], str):
             value = value[0]
-        if isinstance(value,str):# and '\n' in value: 
+        if isinstance(value, str):  # and '\n' in value:
             value = value.split('\n')
-        if False:#isinstance(value,str):
+        if False:  # isinstance(value,str):
             item = QtGui.QTableWidgetItem()
-            item.setText(QtGui.QApplication.translate("PLCTabWidget", value, None, QtGui.QApplication.UnicodeUTF8))
-            self.setItem(i,j,item)
+            item.setText(QtGui.QApplication.translate(
+                "PLCTabWidget", value, None, QtGui.QApplication.UnicodeUTF8))
+            self.setItem(i, j, item)
         else:
-            item = QtGui.QTableWidget(len(value),1)
+            item = QtGui.QTableWidget(len(value), 1)
             item.setItemDelegate(Delegate(item))
             item.horizontalHeader().hide()
             item.verticalHeader().hide()
-            #item.setGridStyle(Qt.Qt.DashLine)
-            for k,v in enumerate(value):
+            # item.setGridStyle(Qt.Qt.DashLine)
+            for k, v in enumerate(value):
                 cell = QtGui.QTableWidgetItem()
-                cell.setText(QtGui.QApplication.translate("PLCTabWidget", v, None, QtGui.QApplication.UnicodeUTF8))
-                item.setItem(k,0,cell) 
-            item.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding,QtGui.QSizePolicy.MinimumExpanding)
-            self.setCellWidget(i,j,item)
+                cell.setText(QtGui.QApplication.translate(
+                    "PLCTabWidget", v, None, QtGui.QApplication.UnicodeUTF8))
+                item.setItem(k, 0, cell)
+            item.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding,
+                               QtGui.QSizePolicy.MinimumExpanding)
+            self.setCellWidget(i, j, item)
             self.resizeColumnsToContents()
             self.resizeRowsToContents()
-        return       
-    
-    ##@}                                         
+        return
+
+    # @}
+
 
 class EditTextDialog(QtGui.QDialog):
     """ This class create the dialog using to edit multiply text """
 
-    def __init__(self, parent = None):
+    def __init__(self, parent=None):
         print ('In EditTextDialog.__init__()')
-        QtGui.QDialog.__init__(self,parent)
+        QtGui.QDialog.__init__(self, parent)
         self.setModal(1)
         self.initComponents()
         self.show()
         self.result = 0
-        #Signals
-        QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("accepted()"),self.pressOK)
-        QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("rejected()"),self.close)   
+        # Signals
+
+        self.buttonBox.accepted.connect(self.pressOK)
+        self.buttonBox.rejected.connect(self.close)
 
     def initComponents(self):
         widgetLayout = QtGui.QVBoxLayout(self)
-        widgetLayout.setContentsMargins(10,10,10,10)
+        widgetLayout.setContentsMargins(10, 10, 10, 10)
         self.editText = QtGui.QTextEdit()
         self.buttonBox = QtGui.QDialogButtonBox()
         self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
-        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Ok)
+        self.buttonBox.setStandardButtons(
+            QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.NoButton | QtGui.QDialogButtonBox.Ok)
         widgetLayout.addWidget(self.editText)
         widgetLayout.addWidget(self.buttonBox)
 
     def pressOK(self):
         print ('In EditTextDialog.pressOk()')
-        self.new_text = self.editText.toPlainText()  
+        self.new_text = self.editText.toPlainText()
         self.result = 1
         self.close()
 
-    def setText(self,text):
+    def setText(self, text):
         self.editText.setText(text)
         self.new_text = text
 
@@ -353,31 +397,36 @@ class EditTextDialog(QtGui.QDialog):
         return self.new_text
 
     def getResult(self):
-        return self.result     
-       
+        return self.result
+
+
 class Delegate(QtGui.QItemDelegate):
     ''' Usage:
             table = QtGui.QTableWidget()
         table.setItemDelegate(Delegate(table))
     '''
-    
+
     def __init__(self, parent=None):
-        QtGui.QItemDelegate.__init__(self,parent)
-        
+        QtGui.QItemDelegate.__init__(self, parent)
+
     def sizeHint(self, option, index):
         table = self.parent()
-        widget = table.cellWidget(index.row(),index.column())
-        if not widget: widget = table.itemAt(index.row(),index.column())
+        widget = table.cellWidget(index.row(), index.column())
+        if not widget:
+            widget = table.itemAt(index.row(), index.column())
         size = widget.sizeHint()
-        return size       
-    
+        return size
+
 if __name__ == '__main__':
-    import sys,os
-    app = QtGui.QApplication([])
+    import sys
+    from taurus.qt.qtgui.application import TaurusApplication
+    app = TaurusApplication(app_name="TaurusDevice property table")
     widget = TaurusPropTable()
-    args = sys.argv[1:]
-    if not args: args = ['tango/admin/%s'%(os.environ['TANGO_HOST'].split(':')[0])] 
-    widget.setTable(sys.args)
+    args = sys.argv
+    if len(args) == 1:
+        model = 'sys/tg_test/1'
+    else:
+        model = str(args[1])
+    widget.setModel(model)
     widget.show()
     app.exec_()
-		
diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py
index 5048dfa..da522d6 100644
--- a/lib/taurus/qt/qtgui/table/taurusgrid.py
+++ b/lib/taurus/qt/qtgui/table/taurusgrid.py
@@ -2,34 +2,37 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-taurusgrid.py: module containing the Taurus Widget: TaurusGrid 
+taurusgrid.py: module containing the Taurus Widget: TaurusGrid
 original idea and development by gcuni
 integrated with taurus and regular expressions by srubio
 alba, 2009
 """
 
+# This module needs a total cleanup. Both re. code conventions and algorithms.
+#   --cpascual 20140827
+
 __all__ = ["TaurusGrid"]
 
 __docformat__ = 'restructuredtext'
@@ -43,44 +46,49 @@ from functools import partial
 from taurus.external.qt import Qt, QtGui, QtCore
 
 import taurus
-from taurus.qt.qtcore.util.emitter import modelSetter,TaurusEmitterThread,SingletonWorker,MethodModel
+from taurus.qt.qtcore.util.emitter import modelSetter, TaurusEmitterThread, SingletonWorker, MethodModel
 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
-from taurus.qt.qtgui.input import TaurusValueLineEdit
 
 metachars = re.compile('([.][*])|([.][^*])|([$^+\-?{}\[\]|()])')
 
-def re_search_low(regexp,target): return re.search(regexp.lower(),target.lower())
-def re_match_low(regexp,target): return re.match(regexp.lower(),target.lower())
 
-def get_all_models(expressions,limit=1000):
+def re_search_low(regexp, target):
+    return re.search(regexp.lower(), target.lower())
+
+
+def re_match_low(regexp, target):
+    return re.match(regexp.lower(), target.lower())
+
+
+def get_all_models(expressions, limit=1000):
     '''
     All devices matching expressions must be obtained.
     For each device only the good attributes are read.
-    
+
     It practically equals to fandango.get_matching_attributes; check which is better!
-    Move this method to taurus.core.tango.search 
+    Move this method to taurus.core.tango.search
     '''
     #print( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions))
-    if isinstance(expressions,str):
-        #if any(re.match(s,expressions) for s in ('\{.*\}','\(.*\)','\[.*\]')):
+    if isinstance(expressions, str):
+        # if any(re.match(s,expressions) for s in ('\{.*\}','\(.*\)','\[.*\]')):
             ##self.debug( 'evaluating expressions ....')
             #expressions = list(eval(expressions))
-        #else:
+        # else:
             ##self.debug( 'expressions as string separated by commas ...')
         expressions = expressions.split(',')
-            
-    elif any(isinstance(expressions,klass) for klass in (QtCore.QStringList,list,tuple,dict)):
+
+    elif any(isinstance(expressions, klass) for klass in (QtCore.QStringList, list, tuple, dict)):
         #self.debug( 'expressions converted from list ...')
         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.TaurusManager().getFactory()().getDatabase()
-    #taurus_db = taurus.Database(os.environ['TANGO_HOST'])
-    if 'SimulationDatabase' in str(type(taurus_db)):
+    taurus_db = taurus.Authority()
+    #taurus_db = taurus.Authority(os.environ['TANGO_HOST'])
+    # WHAAAAAAT????? Someone should get beaten for this line
+    if 'SimulationAuthority' in str(type(taurus_db)):
         #self.trace( 'Using a simulated database ...')
         models = expressions
     else:
@@ -91,86 +99,102 @@ def get_all_models(expressions,limit=1000):
             exp = str(exp)
             devs = []
             targets = []
-            if exp.count('/')==3: device,attribute = exp.rsplit('/',1)
-            else: device,attribute = exp,'State'
-            
+            if exp.count('/') == 3:
+                device, attribute = exp.rsplit('/', 1)
+            else:
+                device, attribute = exp, 'State'
+
             if any(c in device for c in '.*[]()+?'):
-                if '*' in device and '.*' not in device: device = device.replace('*','.*')
-                devs = [s for s in all_devs if re_match_low(device,s)]
+                if '*' in device and '.*' not in device:
+                    device = device.replace('*', '.*')
+                devs = [s for s in all_devs if re_match_low(device, s)]
             else:
                 devs = [device]
-                
+
             #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('*','.*')
+                    if '*' in attribute and '.*' not in attribute:
+                        attribute = attribute.replace('*', '.*')
                     try:
                         #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)
-                    except Exception,e: 
+                        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)
+                    except Exception, e:
                         #self.warning( 'ERROR! TaurusGrid.get_all_models(): Unable to get attributes for device %s: %s' % (dev,str(e)))
                         pass
-                else: targets.append(dev+'/'+attribute)
-            #print 'TaurusGrid.get_all_models(): targets added by %s are: %s' % (exp,targets)
+                else:
+                    targets.append(dev + '/' + attribute)
+            # 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(...)')
-    return models   
-                    
-def get_readwrite_models(expressions,limit=1000):
+    return models
+
+
+def get_readwrite_models(expressions, limit=1000):
     '''
     All devices matching expressions must be obtained.
     For each device only the good attributes are read.
     '''
     #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 ('\{.*\}','\(.*\)','\[.*\]')):
+    if isinstance(expressions, str):
+        if any(re.match(s, expressions) for s in ('\{.*\}', '\(.*\)', '\[.*\]')):
             #self.trace( 'evaluating expressions ....')
             expressions = list(eval(expressions))
         else:
             #self.trace( 'expressions as string separated by commas ...')
             expressions = expressions.split(',')
-            
-    elif any(isinstance(expressions,klass) for klass in (QtCore.QStringList,list,tuple,dict)):
+
+    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.TaurusManager().getFactory()().getDatabase()
-    if 'SimulationDatabase' in str(type(taurus_db)):
-      models = expressions
+
+    taurus_db = taurus.Authority()
+    # WHAAAT???? At least check instances...
+    if 'SimulationAuthority' in str(type(taurus_db)):
+        models = expressions
     else:
-      all_devs = taurus_db.get_device_exported('*')
-      models = []
-      for exp in expressions:
-          exp = str(exp)
-          devs = []
-          targets = []
-          if exp.count('/')==3: device,attribute = exp.rsplit('/',1)
-          else: device,attribute = exp,'State'
-          
-          if any(c in device for c in '.*[]()+?'):
-              if '*' in device and '.*' not in device: device = device.replace('*','.*')
-              devs = [s for s in all_devs if re_match_low(device,s)]
-          else:
-              devs = [device]
-              
-          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.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: 
-                    pass
-              else: targets.append(dev+'/'+attribute)
-          models.extend(targets)
+        all_devs = taurus_db.get_device_exported('*')
+        models = []
+        for exp in expressions:
+            exp = str(exp)
+            devs = []
+            targets = []
+            if exp.count('/') == 3:
+                device, attribute = exp.rsplit('/', 1)
+            else:
+                device, attribute = exp, 'State'
+
+            if any(c in device for c in '.*[]()+?'):
+                if '*' in device and '.*' not in device:
+                    device = device.replace('*', '.*')
+                devs = [s for s in all_devs if re_match_low(device, s)]
+            else:
+                devs = [device]
+
+            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.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:
+                        pass
+                else:
+                    targets.append(dev + '/' + attribute)
+            models.extend(targets)
     models = models[:limit]
     return models
 
+
 class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
     """ TaurusGrid is a Taurus widget designed to represent a set of attributes distributed in columns and rows.
     The Model will be a list with attributes or device names (for devices the State attribute will be shown).
@@ -184,21 +208,26 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
     @todo refactoring to have methods that add/remove new widgets one by one, not only the whole dictionary
     @todo _TAGS property should allow to change row/columns meaning and also add new Custom tags based on regexp
     """
-    
-    #---------------------------------------------------------------------------
+
+    #-------------------------------------------------------------------------
     # Write your own code here to define the signals generated by this widget
     #
-    __pyqtSignals__ = ("modelChanged(const QString &)","itemSelected(QString)")
-    
-    _TAGS = ['DOMAIN','FAMILY','HOST','LEVEL','CLASS','ATTRIBUTE','DEVICE']
-    
-    def __init__(self, parent = None, designMode = False):
+
+    itemSelected = Qt.pyqtSignal('QString')
+    itemClicked = Qt.pyqtSignal()
+
+    _TAGS = ['DOMAIN', 'FAMILY', 'HOST',
+             'LEVEL', 'CLASS', 'ATTRIBUTE', 'DEVICE']
+
+    def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
-        
+
         self.call__init__wo_kw(QtGui.QFrame, parent)
         #self.call__init__(TaurusBaseWidget, name, parent, designMode=designMode)
-        if isinstance(parent,TaurusBaseWidget): #It was needed to avoid exceptions in TaurusDesigner!
-            self.call__init__(TaurusBaseWidget, name, parent, designMode=designMode)
+        # It was needed to avoid exceptions in TaurusDesigner!
+        if isinstance(parent, TaurusBaseWidget):
+            self.call__init__(TaurusBaseWidget, name,
+                              parent, designMode=designMode)
         else:
             self.call__init__(TaurusBaseWidget, name, designMode=designMode)
 
@@ -216,8 +245,8 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
         self._show_others = False
         self._show_attr_labels = True
         self._show_attr_units = True
-        self.hideLabels=False
-        
+        self.hideLabels = False
+
         self.defineStyle()
         self.modelsQueue = Queue.Queue()
         self.__modelsThread = None
@@ -234,445 +263,493 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
             self.__modelsThread = modelsThread
         return modelsThread
 
-    def save(self,filename):
+    def save(self, filename):
         import pickle
         d = {
-            'model':self.filter,
-            'row_labels':self.row_labels,'column_labels':self.column_labels,
-            'frames':self._show_row_frame or self._show_column_frame,'labels':self._show_attr_labels,
-            'units':self._show_attr_units,'others':self._show_others
-            }
-        f = open(filename,'w')
-        pickle.dump(d,f)
+            'model': self.filter,
+            'row_labels': self.row_labels, 'column_labels': self.column_labels,
+            'frames': self._show_row_frame or self._show_column_frame, 'labels': self._show_attr_labels,
+            'units': self._show_attr_units, 'others': self._show_others
+        }
+        f = open(filename, 'w')
+        pickle.dump(d, f)
         f.close()
-        
-    def load(self,filename,delayed=False):
-        self.trace('In TauGrid.load(%s,%s)'%(filename,delayed))
-        if not isinstance(filename,dict):
+
+    def load(self, filename, delayed=False):
+        self.trace('In TauGrid.load(%s,%s)' % (filename, delayed))
+        if not isinstance(filename, dict):
             manual = False
             import pickle
             f = open(filename)
             d = pickle.load(f)
             f.close()
-        else: 
+        else:
             manual = True
             d = filename
         self.setRowLabels(d['row_labels'])
-        self.setColumnLabels(d['column_labels'])  
-        self.showAttributeLabels(d.get('labels',True))
-        self.showAttributeUnits(d.get('units',True))
-        self.showOthers(d.get('others',True))
-        self.showRowFrame(d.get('frames',True))
-        if manual: self.showColumnFrame(d.get('frames',True))
-        self.setModel(d['model'],delayed=d.get('delayed',delayed))
-        return self._modelNames 
-    
+        self.setColumnLabels(d['column_labels'])
+        self.showAttributeLabels(d.get('labels', True))
+        self.showAttributeUnits(d.get('units', True))
+        self.showOthers(d.get('others', True))
+        self.showRowFrame(d.get('frames', True))
+        if manual:
+            self.showColumnFrame(d.get('frames', True))
+        self.setModel(d['model'], delayed=d.get('delayed', delayed))
+        return self._modelNames
+
     def defineStyle(self):
         """ Defines the initial style for the widget """
-        #-----------------------------------------------------------------------
+        #----------------------------------------------------------------------
         # Write your own code here to set the initial style of your widget
         #
         self.setLayout(QtGui.QGridLayout())
-        #self.layout().setContentsMargins(0,0,0,0) 
+        # self.layout().setContentsMargins(0,0,0,0)
         self.updateStyle()
-        
+
     def sizeHint(self):
         return QtGui.QFrame.sizeHint(self)
 
     def minimumSizeHint(self):
         return QtGui.QFrame.minimumSizeHint(self)
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget over writing
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getModelClass(self):
-        #-----------------------------------------------------------------------
+        #----------------------------------------------------------------------
         # [MANDATORY]
         # Replace your own code here
         # ex.: return taurus.core.taurusattribute.Attribute
-        raise RuntimeError("Forgot to overwrite %s.getModelClass" % str(self)) 
+        raise RuntimeError("Forgot to overwrite %s.getModelClass" % str(self))
         return list
-    
+
     def attach(self):
         """Attaches the widget to the model"""
-        
+
         if self.isAttached():
             return True
-        
-        #-----------------------------------------------------------------------
-        # Write your own code here before attaching widget to attribute connect 
+
+        #----------------------------------------------------------------------
+        # Write your own code here before attaching widget to attribute connect
         # the proper signal so that the first event is correctly received by the
         # widget
         #
         # Typical code is:
-        #self.connect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'), 
+        # self.connect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'),
         #             self.setTextValue)
-        
-        
+
         ret = TaurusBaseWidget.attach(self)
-        
+
         # by default enable/disable widget according to attach state
         self.setEnabled(ret)
         return ret
 
     def detach(self):
         """Detaches the widget from the model"""
-        
+
         TaurusBaseWidget.detach(self)
 
-        #-----------------------------------------------------------------------
-        # Write your own code here after detaching the widget from the model 
+        #----------------------------------------------------------------------
+        # Write your own code here after detaching the widget from the model
         #
         # Typical code is:
-        #self.emit(QtCore.SIGNAL('valueChangedDueToEvent(QString)'), 
+        # self.emit(QtCore.SIGNAL('valueChangedDueToEvent(QString)'),
         #          QtCore.QString(value_str))
-        #self.disconnect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'),
+        # self.disconnect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'),
         #                self.setTextValue)
-        
+
         # by default disable widget when dettached
         self.setEnabled(False)
-    
-    #---------------------------------------------------------------------------
+
+    #-------------------------------------------------------------------------
     # [MANDATORY]
-    # Uncomment the following method if your superclass does not provide with a 
+    # Uncomment the following method if your superclass does not provide with a
     # isReadOnly() method or if you need to change its behavior
-    
-    #def isReadOnly(self):
+
+    # def isReadOnly(self):
     #    return True
-    
+
     def updateStyle(self):
-        #-----------------------------------------------------------------------
+        #----------------------------------------------------------------------
         # Write your own code here to update your widget style
-        self.trace('@'*80)
-        self.trace('In TaurusGrid.updateStyle() ....... It seems never called!!!!')
-        self.trace('@'*80)
-        
-        #It was showing an annoying "True" in the widget
+        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 ''
-        #if self._setText: self._setText(value) ##It must be included
-        
-        #update tooltip
-        self.setToolTip(self.getFormatedToolTip()) ##It must be included
-                
+        # if self._setText: self._setText(value) ##It must be included
+
+        # update tooltip
+        self.setToolTip(self.getFormatedToolTip())  # It must be included
+
         # send a repaint in the end
-        if hasattr(self,'title_widget'):
-            if self.title: self.title_widget.show()
-            else: self.title_widget.hide()
-                       
+        if hasattr(self, 'title_widget'):
+            if self.title:
+                self.title_widget.show()
+            else:
+                self.title_widget.hide()
+
         self.update()
-        
-    #---------------------------------------------------------------------------
+
+    #-------------------------------------------------------------------------
     # Write your own code here for your own widget properties
-    
-    def setModel(self,model,devsInRows=False,delayed=False,append=False,load=True):
+
+    def setModel(self, model, devsInRows=False, delayed=False, append=False, load=True):
         '''The model can be initialized as a list of devices or hosts or dictionary or ...'''
-        #self.setModelCheck(model) ##It must be included
-        #differenciate if the model is a RegExp
-        if isinstance(model,dict):
+        # self.setModelCheck(model) ##It must be included
+        # differenciate if the model is a RegExp
+        if isinstance(model, dict):
             self.load(model)
         else:
-            model = isinstance(model,(str,QtCore.QString)) and [model] or list(model)
-            self.trace('#'*80)
-            self.trace('In TaurusGrid.setModel(%s)'%str(model)[:100])
-    
+            model = isinstance(model, (str, QtCore.QString)) and [
+                model] or list(model)
+            self.trace('#' * 80)
+            self.trace('In TaurusGrid.setModel(%s)' % str(model)[:100])
+
             self.delayed = delayed
             self.filter = model
             if any('*' in m for m in model):
                 model = get_all_models(model)
-                self.debug('model was a RegExp, done the query and converted to an attr list')
-    
-            if not self._modelNames == []:#clean to start from scratch
+                self.debug(
+                    'model was a RegExp, done the query and converted to an attr list')
+
+            if not self._modelNames == []:  # clean to start from scratch
                 for widget in self._widgets_list:
                     del widget
-    
-            #here we always have the reals model list, even if it comes from a regexp
-            if append: self._modelNames = self._modelNames+model
-            else: self._modelNames = model
-            
-            self.debug(('In TaurusGrid.setModel(...): modelNames are %s'%(self._modelNames))[:100]+'...')
-            
+
+            # here we always have the reals model list, even if it comes from a
+            # regexp
+            if append:
+                self._modelNames = self._modelNames + model
+            else:
+                self._modelNames = model
+
+            self.debug(('In TaurusGrid.setModel(...): modelNames are %s' %
+                        (self._modelNames))[:100] + '...')
+
             if load:
-                self.trace('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.setRowLabels(
+                        ','.join(set(d.rsplit('/', 1)[0] for d in self._modelNames)))
                 self.create_widgets_table(self._modelNames)
-                self.modelsQueue.put((MethodModel(self.showRowFrame),self._show_row_frame))
-                self.modelsQueue.put((MethodModel(self.showColumnFrame),self._show_column_frame))
-                self.modelsQueue.put((MethodModel(self.showOthers),self._show_others))
-                self.modelsQueue.put((MethodModel(self.showAttributeLabels),self._show_attr_labels))
-                self.modelsQueue.put((MethodModel(self.showAttributeUnits),self._show_attr_units))
-                self.updateStyle()        
-                        
+                self.modelsQueue.put(
+                    (MethodModel(self.showRowFrame), self._show_row_frame))
+                self.modelsQueue.put(
+                    (MethodModel(self.showColumnFrame), self._show_column_frame))
+                self.modelsQueue.put(
+                    (MethodModel(self.showOthers), self._show_others))
+                self.modelsQueue.put(
+                    (MethodModel(self.showAttributeLabels), self._show_attr_labels))
+                self.modelsQueue.put(
+                    (MethodModel(self.showAttributeUnits), self._show_attr_units))
+                self.updateStyle()
+
                 if not self.delayed:
                     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.trace('<'*80)
-                        self.modelsThread.start()#self.modelsThread.IdlePriority)        
+                    if not self.modelsThread.isRunning():
+                        # print 'In setModel(): Starting Thread! (%d objs in
+                        # queue)'%(self.modelsThread.queue.qsize())
+                        self.trace('<' * 80)
+                        # self.modelsThread.IdlePriority)
+                        self.modelsThread.start()
                     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: 
+                else:
                     self.trace('In setModel(): models loading delayed!')
                     pass
-                    
-            self.trace('Out of TaurusGrid.setModel(%s)'%str(model)[:100])
+
+            self.trace('Out of TaurusGrid.setModel(%s)' % str(model)[:100])
             self.updateStyle()
         return
-    
+
     def getModel(self):
         return self._modelNames
-    
+
     def resetModel(self):
         self._modelNames = []
         self.updateFromList(self._modelNames)
         return
-    
-   
-    def setTitle(self,title):
+
+    def setTitle(self, title):
         self.title = str(title)
-        if hasattr(self,'title_widget'):
-            if title: 
+        if hasattr(self, 'title_widget'):
+            if title:
                 self.title_widget.setText(self.title)
                 self.title_widget.show()
-            else: self.title_widget.hide()
-    
-    def parse_labels(self,text):
-        if any(text.startswith(c[0]) and text.endswith(c[1]) for c in [('{','}'),('(',')'),('[',']')]):
+            else:
+                self.title_widget.hide()
+
+    def parse_labels(self, text):
+        if any(text.startswith(c[0]) and text.endswith(c[1]) for c in [('{', '}'), ('(', ')'), ('[', ']')]):
             try:
                 labels = eval(text)
                 return labels
-            except Exception,e:
-                self.warning('ERROR! Unable to parse labels property: %s'%str(e))
+            except Exception, e:
+                self.warning(
+                    'ERROR! Unable to parse labels property: %s' % str(e))
                 return []
         else:
             exprs = [t.strip() for t in text.split(',')]
-            labels = [(':' in e and (e.split(':',1)[0].strip(),e.split(':',1)[-1].strip()) or (e,e)) for e in exprs]
+            labels = [(':' in e and (e.split(':', 1)[0].strip(), e.split(
+                ':', 1)[-1].strip()) or (e, e)) for e in exprs]
             return labels
-        
-    def setRowLabels(self,rows):
+
+    def setRowLabels(self, rows):
         '''The model can be initialized as a list of devices or hosts or ...'''
-        #self.setModelCheck(model) ##It must be included
+        # self.setModelCheck(model) ##It must be included
         self.row_labels = self.parse_labels(str(rows))
         try:
             self.rows = [r[0] for r in self.row_labels]
             for i in range(len(self.rows)):
                 section = self.rows[i]
-                self.table.setVerticalHeaderItem(i,QtGui.QTableWidgetItem(section))
-        except Exception,e:
-            self.debug("setRowLabels(): Exception! %s"%e)
-        #self.create_widgets_table(self._columnsNames)
-        
+                self.table.setVerticalHeaderItem(
+                    i, QtGui.QTableWidgetItem(section))
+        except Exception, e:
+            self.debug("setRowLabels(): Exception! %s" % e)
+        # self.create_widgets_table(self._columnsNames)
+
     def getRowLabels(self):
         return ','.join(':'.join(c) for c in self.row_labels)
-    
+
     def resetRowLabels(self):
         self.row_labels = []
-        return       
-    
-    def setColumnLabels(self,columns):
+        return
+
+    def setColumnLabels(self, columns):
         '''The model can be initialized as a list of devices or hosts or ...'''
-        #self.setModelCheck(model) ##It must be included
+        # self.setModelCheck(model) ##It must be included
         self.column_labels = self.parse_labels(str(columns))
         try:
             self.columns = [c[0] for c in self.column_labels]
             for i in range(len(self.columns)):
                 equipment = self.columns[i]
-                self.table.setHorizontalHeaderItem(i,QtGui.QTableWidgetItem(equipment))
-        except Exception,e:
-            self.debug("setColumnLabels(): Exception! %s"%e)
-        #self.create_widgets_table(self._columnsNames)
-        
+                self.table.setHorizontalHeaderItem(
+                    i, QtGui.QTableWidgetItem(equipment))
+        except Exception, e:
+            self.debug("setColumnLabels(): Exception! %s" % e)
+        # self.create_widgets_table(self._columnsNames)
+
     def getColumnLabels(self):
         return ','.join(':'.join(c) for c in self.column_labels)
-    
+
     def resetColumnLabels(self):
         self.column_labels = []
-        return        
-    
-    #FIXME: when they are called before setModel they fails because 
+        return
+
+    # FIXME: when they are called before setModel they fails because
     # frames are not yet created, and it doesn't has memoty about this.
-    def showRowFrame(self,boolean):
+    def showRowFrame(self, boolean):
         self._show_row_frame = boolean
-        if hasattr(self,'rows_frame'):
+        if hasattr(self, 'rows_frame'):
             if boolean:
                 self.rows_frame.show()
             else:
                 self.rows_frame.hide()
-                
-    def showColumnFrame(self,boolean):
+
+    def showColumnFrame(self, boolean):
         self._show_column_frame = boolean
-        if hasattr(self,'columns_frame'):
+        if hasattr(self, 'columns_frame'):
             if boolean:
                 self.columns_frame.show()
             else:
                 self.columns_frame.hide()
-                
-    def showAttributeLabels(self,boolean):
-        self.trace('In showAttributeLabels(%s)'%boolean)
+
+    def showAttributeLabels(self, boolean):
+        self.trace('In showAttributeLabels(%s)' % boolean)
         self._show_attr_labels = boolean
         for tv in self._widgets_list:
             try:
                 if tv and tv.labelWidget:
-                    if boolean: tv.labelWidget().show()
-                    else: tv.labelWidget().hide()
-            except: pass
+                    if boolean:
+                        tv.labelWidget().show()
+                    else:
+                        tv.labelWidget().hide()
+            except:
+                pass
         return self._show_attr_labels
-        
-    def showAttributeUnits(self,boolean):
-        self.trace('In showAttributeUnits(%s)'%boolean)
+
+    def showAttributeUnits(self, boolean):
+        self.trace('In showAttributeUnits(%s)' % boolean)
         self._show_attr_units = boolean
         for tv in self._widgets_list:
             try:
                 if tv and tv.unitsWidget:
-                    if boolean: tv.unitsWidget().show()
-                    else: tv.unitsWidget().hide()
-            except: pass
+                    if boolean:
+                        tv.unitsWidget().show()
+                    else:
+                        tv.unitsWidget().hide()
+            except:
+                pass
         return self._show_attr_units
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    model = QtCore.pyqtProperty("QStringList", getModel, 
-                                setModel, 
+    model = QtCore.pyqtProperty("QStringList", getModel,
+                                setModel,
                                 resetModel)
-                                
-    rowlabels = QtCore.pyqtProperty("QString", getRowLabels, 
-                                setRowLabels, 
-                                resetRowLabels)
-
-    columnlabels = QtCore.pyqtProperty("QString", getColumnLabels, 
-                                setColumnLabels, 
-                                resetColumnLabels)
-                                
+
+    rowlabels = QtCore.pyqtProperty("QString", getRowLabels,
+                                    setRowLabels,
+                                    resetRowLabels)
+
+    columnlabels = QtCore.pyqtProperty("QString", getColumnLabels,
+                                       setColumnLabels,
+                                       resetColumnLabels)
+
     useParentModel = QtCore.pyqtProperty("bool",
-                                         TaurusBaseWidget.getUseParentModel, 
+                                         TaurusBaseWidget.getUseParentModel,
                                          TaurusBaseWidget.setUseParentModel,
                                          TaurusBaseWidget.resetUseParentModel)
 
-    #---------------------------------------------------------------------------
+    #-------------------------------------------------------------------------
     # Write your own code here for your own widget properties
-              
-    def create_widgets_dict(self,models):
+
+    def create_widgets_dict(self, models):
         from collections import defaultdict
-        values = defaultdict(lambda: defaultdict(list)) #recursive dictionary with 2 levels
+        # recursive dictionary with 2 levels
+        values = defaultdict(lambda: defaultdict(list))
         #domains = list(set(m.split('/')[0].upper()))
         #families = list(set(m.split('/')[1].upper()))
-        
-        if not self.row_labels: #Domains used by default
-            self.row_labels = sorted(list(set(m.split('/')[0].upper() for m in models if m.count('/')>=2)))
-            self.row_labels = zip(self.row_labels,self.row_labels)
-        if not self.column_labels: #Families used by default
-            self.column_labels = sorted(list(set(m.split('/')[1].upper() for m in models if m.count('/')>=2)))
-            self.column_labels = zip(self.column_labels,self.column_labels)
-            
-        #for m in models:
-            #if m.count('/')<2:
-                #self.warning('Wrong model cannot be added: %s'%m)
-            #else:
-                #domain,family = m.upper().split('/')[:2]
-                #values[domain][family].append(m)
-                
-        row_not_found, col_not_found = False, False                
-                
+
+        if not self.row_labels:  # Domains used by default
+            self.row_labels = sorted(
+                list(set(m.split('/')[0].upper() for m in models if m.count('/') >= 2)))
+            self.row_labels = zip(self.row_labels, self.row_labels)
+        if not self.column_labels:  # Families used by default
+            self.column_labels = sorted(
+                list(set(m.split('/')[1].upper() for m in models if m.count('/') >= 2)))
+            self.column_labels = zip(self.column_labels, self.column_labels)
+
+        # for m in models:
+            # if m.count('/')<2:
+            #self.warning('Wrong model cannot be added: %s'%m)
+            # else:
+            #domain,family = m.upper().split('/')[:2]
+            # values[domain][family].append(m)
+
+        row_not_found, col_not_found = False, False
+
         for m in models:
-            row,column = 'Others','Others'
-            for label,rexp in self.row_labels:
-                if '*' in rexp and '.*' not in rexp: rexp = rexp.replace('*','.*')
-                if re_search_low(rexp,m):
+            row, column = 'Others', 'Others'
+            for label, rexp in self.row_labels:
+                if '*' in rexp and '.*' not in rexp:
+                    rexp = rexp.replace('*', '.*')
+                if re_search_low(rexp, m):
                     row = label
                     break
-            for label,rexp in self.column_labels:
-                if '*' in rexp and '.*' not in rexp: rexp = rexp.replace('*','.*')
-                if re_search_low(rexp,m):
+            for label, rexp in self.column_labels:
+                if '*' in rexp and '.*' not in rexp:
+                    rexp = rexp.replace('*', '.*')
+                if re_search_low(rexp, m):
                     column = label
                     break
-            if 'Others' == row: row_not_found = True
-            if 'Others' == column: col_not_found = True
-            self.debug('Model %s added to row %s , column %s' % (m,row,column))
+            if 'Others' == row:
+                row_not_found = True
+            if 'Others' == column:
+                col_not_found = True
+            self.debug('Model %s added to row %s , column %s' %
+                       (m, row, column))
             values[row][column].append(m)
-        if row_not_found: self.row_labels.append(('Others','.*'))
-        if col_not_found: self.column_labels.append(('Others','.*'))
-            
+        if row_not_found:
+            self.row_labels.append(('Others', '.*'))
+        if col_not_found:
+            self.column_labels.append(('Others', '.*'))
+
         return values
-            
+
     def create_frame_with_gridlayout(self):
         """ Just a 'macro' to create the layouts that seem to fit better. """
         frame = QtGui.QFrame()
         frame.setLayout(QtGui.QGridLayout())
-        frame.layout().setContentsMargins(2,2,2,2)
+        frame.layout().setContentsMargins(2, 2, 2, 2)
         frame.layout().setSpacing(0)
         frame.layout().setSpacing(0)
         return frame
-            
-    def create_widgets_table(self,models):
-        
-        ##Added a title to the panel
+
+    def create_widgets_table(self, models):
+
+        # Added a title to the panel
         self.title_widget = QtGui.QLabel()
-        self.layout().addWidget(self.title_widget,0,0)
+        self.layout().addWidget(self.title_widget, 0, 0)
         self.setTitle(self.title)
-        
+
         dct = self.create_widgets_dict(models)
-        ##Assignments modified to keep the order of labels as inserted in properties
-        self.rows = [r[0] for r in self.row_labels]#dct.keys()
-        self.columns = [c[0] for c in self.column_labels]#list(set(reduce(operator.add,v.keys()) for v in dct.values()))
-        
+        # Assignments modified to keep the order of labels as inserted in
+        # properties
+        self.rows = [r[0] for r in self.row_labels]  # dct.keys()
+        # list(set(reduce(operator.add,v.keys()) for v in dct.values()))
+        self.columns = [c[0] for c in self.column_labels]
+
         values = []
         for row in self.rows:
             line = []
             for col in self.columns:
                 #line.append(dct[row][col] if col in dct[row] else [])
-                if col in dct[row]: line.append(dct[row][col])
-                else: line.append([])
+                if col in dct[row]:
+                    line.append(dct[row][col])
+                else:
+                    line.append([])
             values.append(line)
-            
-        ## Here is where the table is created!
+
+        # Here is where the table is created!
         self.table = self.build_table(values)
-           
+
         # SET COLUMN HEADERS (self.columns)
         for i in range(len(self.columns)):
             equipment = self.columns[i]
-            self.table.setHorizontalHeaderItem(i,QtGui.QTableWidgetItem(equipment))
+            self.table.setHorizontalHeaderItem(
+                i, QtGui.QTableWidgetItem(equipment))
             # SOMEDAY THIS WILL BE ICONS
-    
+
         # SET ROW HEADERS (self.rows)
         for i in range(len(self.rows)):
             section = self.rows[i]
-            self.table.setVerticalHeaderItem(i,QtGui.QTableWidgetItem(section))
-        
+            self.table.setVerticalHeaderItem(
+                i, QtGui.QTableWidgetItem(section))
+
 #        table.setAutoScroll(True)
 #        resize_mode = QtGui.QHeaderView.Stretch
 #        table.horizontalHeader().setResizeMode(resize_mode)
-        #table.verticalHeader().setResizeMode(resize_mode)
-        
+        # table.verticalHeader().setResizeMode(resize_mode)
+
 #        for row in range(len(self.rows)):
 #            table.setRowHeight(row,5+25*sum(len(dct[self.rows[row]][col]) for col in self.columns))
-        #for col in range(len(self.columns)):
-        #    table.setColumnWidth(col,300)        
-        
-        use_scroll = False # It didn't work ... it doesn't allow the table widget to resize
+        # for col in range(len(self.columns)):
+        #    table.setColumnWidth(col,300)
+
+        use_scroll = False  # It didn't work ... it doesn't allow the table widget to resize
         if use_scroll:
             scrollable = QtGui.QScrollArea(self)
             scrollable.setWidget(self.table)
-            self.layout().addWidget(scrollable,1,0)
-        else: self.layout().addWidget(self.table,1,0)
-        
-        #-------------------------------------------------------------------------------------
+            self.layout().addWidget(scrollable, 1, 0)
+        else:
+            self.layout().addWidget(self.table, 1, 0)
+
+        #----------------------------------------------------------------------
         # SECTION CHECKBOXES
         self.checkboxes_frame = self.create_frame_with_gridlayout()
-        
+
         self.rows_frame = self.create_frame_with_gridlayout()
         self.rows_frame.setFrameStyle(QtGui.QFrame.Box)
-        if not self._show_row_frame: self.rows_frame.hide()
-        self.checkboxes_frame.layout().addWidget(self.rows_frame,0,0)
-        
+        if not self._show_row_frame:
+            self.rows_frame.hide()
+        self.checkboxes_frame.layout().addWidget(self.rows_frame, 0, 0)
+
         self.columns_frame = self.create_frame_with_gridlayout()
         self.columns_frame.setFrameStyle(QtGui.QFrame.Box)
-        if not self._show_column_frame: self.columns_frame.hide()
-        self.checkboxes_frame.layout().addWidget(self.columns_frame,0,1)
-        
+        if not self._show_column_frame:
+            self.columns_frame.hide()
+        self.checkboxes_frame.layout().addWidget(self.columns_frame, 0, 1)
+
         layout_row = 0
         layout_col = 0
         # For all rows, create rows of three checkboxes in order to
@@ -682,17 +759,18 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
             checkbox = QtGui.QCheckBox(section)
             if checkbox.text() == 'Others':
                 checkbox.setChecked(False)
-                if not self._show_others: checkbox.hide()
+                if not self._show_others:
+                    checkbox.hide()
             else:
                 checkbox.setChecked(True)
-            self.rows_frame.layout().addWidget(checkbox,layout_row,layout_col)
+            self.rows_frame.layout().addWidget(checkbox, layout_row, layout_col)
             layout_col += 1
             if layout_col == 3:
                 layout_col = 0
                 layout_row += 1
-            QtCore.QObject.connect(checkbox,QtCore.SIGNAL('toggled(bool)'),self.show_hide_rows)
+            checkbox.toggled.connect(self.show_hide_rows)
         self.show_hide_rows()
-        
+
         layout_row = 0
         layout_col = 0
         # For all self.columns, create rows of three checkboxes in order to
@@ -702,26 +780,27 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
             checkbox = QtGui.QCheckBox(column)
             if checkbox.text() == 'Others':
                 checkbox.setChecked(False)
-                if not self._show_others: checkbox.hide()
+                if not self._show_others:
+                    checkbox.hide()
             else:
                 checkbox.setChecked(True)
-            self.columns_frame.layout().addWidget(checkbox,layout_row,layout_col)
+            self.columns_frame.layout().addWidget(checkbox, layout_row, layout_col)
             layout_col += 1
             if layout_col == 3:
                 layout_col = 0
                 layout_row += 1
-            QtCore.QObject.connect(checkbox,QtCore.SIGNAL('toggled(bool)'),self.show_hide_columns)
+            checkbox.toggled.connect(self.show_hide_columns)
         self.show_hide_columns()
-        
-        self.layout().addWidget(self.checkboxes_frame,2,0)
-        #self.resize(800,600)
+
+        self.layout().addWidget(self.checkboxes_frame, 2, 0)
+        # self.resize(800,600)
 
     def show_hide_rows(self):
         """
         This needs refactoring to be together with the show_hide_columns method
         """
         for checkbox in self.rows_frame.children():
-            if isinstance(checkbox,QtGui.QCheckBox):
+            if isinstance(checkbox, QtGui.QCheckBox):
                 table_row = self.rows.index(checkbox.text())
                 if checkbox.isChecked():
                     self.table.showRow(table_row)
@@ -733,59 +812,64 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
         This needs refactoring to be together with the show_hide_rows method
         """
         for checkbox in self.columns_frame.children():
-            if isinstance(checkbox,QtGui.QCheckBox):
+            if isinstance(checkbox, QtGui.QCheckBox):
                 table_col = self.columns.index(checkbox.text())
                 if checkbox.isChecked():
                     self.table.showColumn(table_col)
                 else:
                     self.table.hideColumn(table_col)
 
-    def showOthers(self,boolean):
+    def showOthers(self, boolean):
         self._show_others = boolean
-        if hasattr(self,'rows_frame'):
+        if hasattr(self, 'rows_frame'):
             for checkbox in self.rows_frame.children():
-                if isinstance(checkbox,QtGui.QCheckBox) and checkbox.text() == 'Others':
-                    if self._show_others: checkbox.show()
-                    else: checkbox.hide()
-        if hasattr(self,'columns_frame'):
+                if isinstance(checkbox, QtGui.QCheckBox) and checkbox.text() == 'Others':
+                    if self._show_others:
+                        checkbox.show()
+                    else:
+                        checkbox.hide()
+        if hasattr(self, 'columns_frame'):
             for checkbox in self.columns_frame.children():
-                if isinstance(checkbox,QtGui.QCheckBox) and checkbox.text() == 'Others':
-                    if self._show_others: checkbox.show()
-                    else: checkbox.hide()
+                if isinstance(checkbox, QtGui.QCheckBox) and checkbox.text() == 'Others':
+                    if self._show_others:
+                        checkbox.show()
+                    else:
+                        checkbox.hide()
 
-    def build_table(self,values):
+    def build_table(self, values):
         """
         This is a builder. For all the elements in widgets matrix,
         just set the corresponding cells of the QTableWidget.
         """
-        self.trace('In TaurusGrid.build_table(%s)'%values)
-        widgets_matrix = self.build_widgets(values,self.showLabels)
+        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
-        
+
         table = QtGui.QTableWidget()
         table.setItemDelegate(Delegate(table))
         # This example replaces the blue background of selected cells in tables
         palette = Qt.QPalette()
-        palette.setBrush(palette.Active,palette.Highlight,Qt.QBrush(Qt.Qt.white))
-        table.setPalette(palette)        
-        
+        palette.setBrush(palette.Active, palette.Highlight,
+                         Qt.QBrush(Qt.Qt.white))
+        table.setPalette(palette)
+
         table.setRowCount(rows)
         table.setColumnCount(cols)
         for row in range(len(widgets_matrix)):
             for col in range(len(widgets_matrix[row])):
-                table.setCellWidget(row,col,widgets_matrix[row][col])
-        
-        #table.resizeColumnsToContents()
-        #table.resizeRowsToContents()
+                table.setCellWidget(row, col, widgets_matrix[row][col])
+
+        # table.resizeColumnsToContents()
+        # table.resizeRowsToContents()
         table.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
-        #table.verticalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
-        #table.horizontalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents)
+        # table.verticalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
+        # table.horizontalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents)
         table.verticalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents)
-        
+
         return table
 
-    def build_widgets(self,values,show_labels=False,width=240,height=20,value_width=120):
+    def build_widgets(self, values, show_labels=False, width=240, height=20, value_width=120):
         widgets_matrix = []
         for row in values:
             widgets_row = []
@@ -793,63 +877,73 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
                 cell_frame = self.create_frame_with_gridlayout()
                 count = 0
                 for synoptic in sorted(cell):
-                    self.debug("processing synoptic %s"%synoptic)
+                    self.debug("processing synoptic %s" % synoptic)
                     name = model = synoptic
 
-                    self.debug('Creating TaurusValue with model =  %s'%model)
-                    synoptic_value = TaurusValue(cell_frame)    
-                    self.modelsQueue.put((synoptic_value,model))
-                    QtCore.QObject.connect(synoptic_value, QtCore.SIGNAL("itemClicked(QString)"), self.itemClicked)
-                            
+                    self.debug('Creating TaurusValue with model =  %s' % model)
+                    synoptic_value = TaurusValue(cell_frame)
+                    self.modelsQueue.put((synoptic_value, model))
+                    synoptic_value.itemClicked.connect(self.itemClicked)
+
                     if self.hideLabels:
                         synoptic_value.setLabelWidgetClass(None)
-                    else: 
-                        synoptic_value.setLabelConfig('label') ## DO NOT DELETE THIS LINE!!!      
-                    cell_frame.layout().addWidget(synoptic_value,count,0)
+                    else:
+                        # DO NOT DELETE THIS LINE!!!
+                        synoptic_value.setLabelConfig('label')
+                    cell_frame.layout().addWidget(synoptic_value, count, 0)
                     self._widgets_list.append(synoptic_value)
                     count += 1
-                    
-                #Done in this way as TauValue.mousePressEvent are never called
-                def mousePressEvent(event,obj):
-                    #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]
-                
-                cell_frame.mousePressEvent = partial(mousePressEvent,obj=cell_frame)
-                QtCore.QObject.connect(cell_frame, QtCore.SIGNAL("itemClicked(QString)"), self.itemClicked)
-                
+
+                # Done in this way as TauValue.mousePressEvent are never called
+                def mousePressEvent(event, obj):
+                    # 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.itemClicked.emit(t)
+                     for t in targets]
+
+                cell_frame.mousePressEvent = partial(
+                    mousePressEvent, obj=cell_frame)
+                cell_frame.itemClicked.connect(self.itemClicked)
+
                 widgets_row.append(cell_frame)
             widgets_matrix.append(widgets_row)
         return widgets_matrix
-        
-    def itemClicked(self,item_name):
-        self.trace('In TaurusGrid.itemClicked(%s)'%item_name)
+
+    def itemClicked(self, 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):
+        self.itemClicked.emit(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.trace('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name.getModel()),selected))
+        if isinstance(item_name, TaurusValue):
+            self.trace('In TaurusGrid.setItemSelected(%s,%s)' %
+                       (str(item_name.getModel()), selected))
             item = item_name
-        else: 
-            self.trace('In TaurusGrid.setItemSelected(%s,%s)'%(str(item_name),selected))
-            if item_name: item = self.getItemByModel(item_name)
-            else: item = self._last_selected
+        else:
+            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:
             if selected:
-                item._labelWidget.setStyleSheet('border-style: solid ; border-width: 1px; border-color: blue; color: blue; border-radius:4px;')
-                if self._last_selected and self._last_selected!=item:
-                    self.setItemSelected(self._last_selected,False)
+                item._labelWidget.setStyleSheet(
+                    'border-style: solid ; border-width: 1px; border-color: blue; color: blue; border-radius:4px;')
+                if self._last_selected and self._last_selected != item:
+                    self.setItemSelected(self._last_selected, False)
                 self._last_selected = item
             else:
-                item._labelWidget.setStyleSheet('border-style: solid; border-width: 1px; border-color: transparent; color: black;  border-radius:4px;')        
+                item._labelWidget.setStyleSheet(
+                    'border-style: solid; border-width: 1px; border-color: transparent; color: black;  border-radius:4px;')
                 self._last_selected = None
-        else: return None        
-    
+        else:
+            return None
+
     def getItemByModel(self, model, index=0):
-        #a particular model can be many times, index means which one of them
+        # a particular model can be many times, index means which one of them
         model = str(model).lower()
         for widget in self._widgets_list:
             if str(widget.getModel()).lower() == model:
@@ -863,62 +957,66 @@ class TaurusGrid(QtGui.QFrame, TaurusBaseWidget):
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.table'
         ret['group'] = 'Taurus Views'
-        ret['icon'] = ":/designer/grid.png"
+        ret['icon'] = "designer:grid.png"
         return ret
 
+
 class Delegate(QtGui.QItemDelegate):
-    
+
     def __init__(self, parent=None):
-        QtGui.QItemDelegate.__init__(self,parent)
-        
+        QtGui.QItemDelegate.__init__(self, parent)
+
     def sizeHint(self, option, index):
         table = self.parent()
-        widget = table.cellWidget(index.row(),index.column())
+        widget = table.cellWidget(index.row(), index.column())
         size = widget.sizeHint()
         return size
 
+
 def sysargs_to_dict(defaults=[]):
     import sys
-    i,result = 0,{}
+    i, result = 0, {}
     for a in sys.argv[1:]:
         if '=' in a:
             bar = a.split('=')
-            if bar[1] in ['True','False']:#convert string to boolean
+            if bar[1] in ['True', 'False']:  # convert string to boolean
                 bar[1] = eval(bar[1])
-            result[bar[0].replace('--','')] = bar[1]
+            result[bar[0].replace('--', '')] = bar[1]
         else:
             result[defaults[i]] = a
-            i+=1
+            i += 1
     return result
-        
-        
+
+
 if __name__ == '__main__':
-    import sys   
-    if len(sys.argv)<2: 
+    import sys
+    if len(sys.argv) < 2:
         print "The format of the call is something like:"
         print '\t/usr/bin/python taurusgrid.py grid.pickle.file'
         print '\t/usr/bin/python taurusgrid.py "model=lt.*/VC.*/.*/((C*)|(P*)|(I*))" cols=IP,CCG,PNV rows=LT01,LT02 others=False rowframe=True colframe=False'
         exit()
-        
+
     app = QtGui.QApplication(sys.argv[0:1])
     gui = TaurusGrid()
 
-    try: #first try if argument is a file to be opened
-      filename = sys.argv[1]
-      open(filename,'r')
-      gui.load(filename)
+    try:  # first try if argument is a file to be opened
+        filename = sys.argv[1]
+        open(filename, 'r')
+        gui.load(filename)
     except:
-      args = sysargs_to_dict(['model','rows','cols','others','rowframe','colframe'])
-      print "args = %s"%args
-      if args.get('rows'): gui.setRowLabels(args['rows'])
-      if args.get('cols'): gui.setColumnLabels(args['cols'])
-      if args.get('model'): gui.setModel(args['model'])
-      gui.showRowFrame('rowframe' in args and args['rowframe'] and True)
-      gui.showColumnFrame('colframe' in args and args['colframe'] and True)
-      gui.showOthers('others' in args and args['others'] or True)
-
-    print "current TaurusGrid model= %s"%(gui.getModel())
+        args = sysargs_to_dict(
+            ['model', 'rows', 'cols', 'others', 'rowframe', 'colframe'])
+        print "args = %s" % args
+        if args.get('rows'):
+            gui.setRowLabels(args['rows'])
+        if args.get('cols'):
+            gui.setColumnLabels(args['cols'])
+        if args.get('model'):
+            gui.setModel(args['model'])
+        gui.showRowFrame('rowframe' in args and args['rowframe'] and True)
+        gui.showColumnFrame('colframe' in args and args['colframe'] and True)
+        gui.showOthers('others' in args and args['others'] or True)
+
+    print "current TaurusGrid model= %s" % (gui.getModel())
     gui.show()
-    sys.exit(app.exec_())        
-        
-
+    sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/table/taurustable.py b/lib/taurus/qt/qtgui/table/taurustable.py
index 185b1db..2d8e00a 100644
--- a/lib/taurus/qt/qtgui/table/taurustable.py
+++ b/lib/taurus/qt/qtgui/table/taurustable.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py
old mode 100644
new mode 100755
index ffcea9b..fb5f180
--- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py
+++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -28,190 +28,224 @@ __all__ = ["TaurusValuesTable"]
 __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
-import numpy
+from taurus.external.pint import Quantity
 
-import sys
+import numpy
 
 import taurus.core
-from taurus.core.taurusbasetypes import DataFormat
-from taurus.qt.qtgui.base import TaurusBaseWidget, TaurusBaseWritableWidget
+from taurus.core.taurusbasetypes import (DataFormat, DataType, TaurusEventType,
+                                         TaurusElementType)
+from taurus.qt.qtgui.util import PintValidator
 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.enumeration import Enumeration
 
-TableRWState = Enumeration("TableRWState", ("Read", "Write"))
+
+def _value2Quantity(value, units):
+    '''
+    Creates a Quantity from value and forces units if the vaule is dimensionless
+
+    :param value: (int, float or str) a number or a string from which a quantity
+                  can be created
+    :param units: (str or Pint units) Units to use if the value is dimensionless
+    :return: (Quantity)
+    '''
+    q = Quantity(value)
+    if q.dimensionless:
+        q = Quantity(q, units)
+    return q
+
 
 class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
-    typeCastingMap = {'f':float, 'b':bool, 'u':int, 'i':int, 'S':str, 'U':unicode}
+    typeCastingMap = {'f': float, 'b': bool,
+                      'u': int, 'i': int, 'S': str, 'U': unicode}
     # Need to have an array
+
+    dataChanged = Qt.pyqtSignal('QModelIndex', 'QModelIndex')
+
     def __init__(self, size, parent=None):
         Qt.QAbstractTableModel.__init__(self, parent)
+        self._parent = parent
         self._rtabledata = []
         self._wtabledata = []
-        self._rowCount = size [0]
+        self._rowCount = size[0]
         self._columnCount = size[1]
         self._modifiedDict = {}
         self._attr = None
-        self._attrConfig = None
         self.editedIndex = None
         self._editable = False
         self._writeMode = False
-        
+
     def isDirty(self):
         '''returns True if there are user changes. False Otherwise'''
         return bool(self._modifiedDict)
-        
-    #To be implemented ----- 
-    def rowCount(self, index = Qt.QModelIndex()):
+
+    # To be implemented -----
+    def rowCount(self, index=Qt.QModelIndex()):
         '''see :meth:`Qt.QAbstractTableModel.rowCount`'''
         if self._rowCount == 0:
             self._rowCount = 1
         return self._rowCount
-    
-    def columnCount(self, index = Qt.QModelIndex()):
+
+    def columnCount(self, index=Qt.QModelIndex()):
         '''see :meth:`Qt.QAbstractTableModel.columnCount`'''
         if self._columnCount == 0:
             self._columnCount = 1
         return self._columnCount
-    
-    def data(self, index, role = Qt.Qt.DisplayRole):
+
+    def data(self, index, role=Qt.Qt.DisplayRole):
         '''see :meth:`Qt.QAbstractTableModel.data`'''
         if self._writeMode == False:
             tabledata = self._rtabledata
         else:
             tabledata = self._wtabledata
-        if not index.isValid() or not (0 <=index.row() < len(tabledata)):
+        if not index.isValid() or not (0 <= index.row() < len(tabledata)):
             return Qt.QVariant()
         elif role == Qt.Qt.DisplayRole:
             value = None
             rc = (index.row(), index.column())
             if self._writeMode and rc in self._modifiedDict:
-                return self._modifiedDict[rc]
+                if self.getAttr().type in [DataType.Integer, DataType.Float]:
+                    return str(self._modifiedDict[rc])
+                else:
+                    return self._modifiedDict[rc]
             else:
                 value = tabledata[rc]
-            #cast the value to a standard python type
+                if isinstance(value, Quantity):
+                    value = value.magnitude
+            # cast the value to a standard python type
             value = self.typeCastingMap[tabledata.dtype.kind](value)
             return Qt.QVariant(value)
         elif role == Qt.Qt.DecorationRole:
-            status = self.getStatus(index)
-            if (self._modifiedDict.has_key((index.row(), index.column()))) and (self._writeMode):
-                float_data = Qt.from_qvariant(self._modifiedDict[(index.row(), index.column())], float)
-                if self.inAlarmRange(float_data):
-                    icon = getThemeIcon('document-save')
-                    #return Qt.QVariant(Qt.QColor('blue'))
+            if (self._modifiedDict.has_key((index.row(), index.column()))) and\
+                    (self._writeMode):
+                if self.getAttr().type in [DataType.Integer, DataType.Float]:
+                    value = self._modifiedDict[(index.row(), index.column())]
+                    if not self.inAlarmRange(value):
+                        icon = Qt.QIcon.fromTheme('document-save')
+                    else:
+                        icon = Qt.QIcon.fromTheme('emblem-important')
                 else:
-                    icon = getThemeIcon('emblem-important')
-                    #return Qt.QVariant(Qt.QColor('orange'))
+                    icon = Qt.QIcon.fromTheme('document-save')
                 return Qt.QVariant(icon)
         elif role == Qt.Qt.EditRole:
             value = None
-            if self._modifiedDict.has_key((index.row(), index.column())) and (self._writeMode):
+            if self._modifiedDict.has_key((index.row(), index.column())) and\
+                    (self._writeMode):
                 value = self._modifiedDict[(index.row(), index.column())]
             else:
-                value = tabledata[index.row(),index.column()]
+                value = tabledata[index.row(), index.column()]
                 if tabledata.dtype == bool:
                     value = bool(value)
             return Qt.QVariant(value)
         elif role == Qt.Qt.BackgroundRole:
             if self._writeMode:
-                return Qt.QVariant(Qt.QColor(22,223,21,50))
+                return Qt.QVariant(Qt.QColor(22, 223, 21, 50))
             else:
                 return Qt.QVariant(Qt.QColor('white'))
         elif role == Qt.Qt.ForegroundRole:
-            if self._modifiedDict.has_key((index.row(), index.column())) and (self._writeMode):
-                float_data = Qt.from_qvariant(self._modifiedDict[(index.row(), index.column())], float)
-                if self.inAlarmRange(float_data):
-                    return Qt.QVariant(Qt.QColor('blue'))
+            if self._modifiedDict.has_key((index.row(), index.column())) and\
+                    (self._writeMode):
+                if self.getAttr().type in [DataType.Integer, DataType.Float]:
+                    value = self._modifiedDict[(index.row(), index.column())]
+                    if not self.inAlarmRange(value):
+                        return Qt.QVariant(Qt.QColor('blue'))
+                    else:
+                        return Qt.QVariant(Qt.QColor('orange'))
                 else:
-                    return Qt.QVariant(Qt.QColor('orange'))
+                    return Qt.QVariant(Qt.QColor('blue'))
             return Qt.QVariant(Qt.QColor('black'))
         elif role == Qt.Qt.FontRole:
-            if self._modifiedDict.has_key((index.row(), index.column())) and (self._writeMode):
+            if self._modifiedDict.has_key((index.row(), index.column())) and\
+                    (self._writeMode):
                 return Qt.QVariant(Qt.QFont("Arial", 10, Qt.QFont.Bold))
         elif role == Qt.Qt.ToolTipRole:
-            if self._modifiedDict.has_key((index.row(), index.column())) and (self._writeMode):
-                float_data = Qt.from_qvariant(self._modifiedDict[index.row(), index.column()], float)
-                return Qt.QVariant('Original value: %d.\nNew value that will be saved: %d' 
-                                   %(tabledata[index.row(), index.column()], float_data))
+            if self._modifiedDict.has_key((index.row(), index.column())) and\
+                    (self._writeMode):
+                value = str(self._modifiedDict[(index.row(), index.column())])
+                msg = 'Original value: %s.\nNew value that will be saved: %s' %\
+                      (str(tabledata[index.row(), index.column()]), value)
+                return Qt.QVariant(msg)
         return Qt.QVariant()
-    
+
+    def getAttr(self):
+        return self._attr
+
     def setAttr(self, attr):
         '''
         Updated the internal table data from an attribute value
-        
+
         :param attr: (DeviceAttribute)
         '''
         self._attr = attr
-        values = numpy.array(attr.value)
-        wvalues = numpy.array(attr.w_value)
-        #reshape the table
+        rvalue = attr.rvalue
+        if attr.type not in [DataType.Float, DataType.Integer]:
+            rvalue = numpy.array(attr.rvalue)
+        # reshape the table
         if attr.data_format == DataFormat._1D:
-            rows, columns = values.size, 1
+            rows, columns = len(rvalue), 1
         elif attr.data_format == DataFormat._2D:
-            rows, columns = values.shape
+            rows, columns = numpy.shape(rvalue)
         else:
-            raise TypeError('Unsupported data format "%s"'%repr(attr.data_format))
-        
+            raise TypeError('Unsupported data format "%s"' %
+                            repr(attr.data_format))
+
         if (self._rowCount != rows) or (self._columnCount != columns):
             self.reset()
-        
+
         self._rowCount = rows
         self._columnCount = columns
-        values = values.reshape(rows,columns) #make sure it is in matrix form (not a vector)
-        self._rtabledata = values            
-        self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),self.createIndex(0,0), self.createIndex(rows-1,columns-1))
-    
-    def setConfig(self, config):
-        '''
-        Handles configuration events
-        
-        :param attr: (TaurusConfiguration)
-        '''
-        self._attrConfig = config
-        self._editable = config.isWritable()
-        
-    def getConfig(self):
-        '''
-        Returns the configuration object for the data
-        
-        :returns:  (taurus.core.taurusconfiguration.TaurusConfiguration)
-        '''
-        return self._attrConfig
-    
+        rvalue = rvalue.reshape(rows, columns)
+        if attr.type in [DataType.Integer, DataType.Float]:
+            units = self._parent.getCurrentUnits()
+            rvalue = rvalue.to(units)
+        self._rtabledata = rvalue
+        self._editable = False
+        self.dataChanged.emit(self.createIndex(0, 0), self.createIndex(rows - 1, columns - 1))
+
     def getStatus(self, index):
         '''
         Returns Status of the variable
-        
-        :returns:  (taurus.core.taurusbasetypes.AttrQuality) 
+
+        :returns:  (taurus.core.taurusbasetypes.AttrQuality)
         '''
         return self._attr.quality
-    
+
     def getType(self):
         '''
         Returns the table data type.
-        
+
         :returns:  (numpy.dtype)
         '''
         return self._rtabledata.dtype
-    
+
     def addValue(self, index, value):
         '''adds a value to the dictionary of modified cell values
-        
+
         :param index: (QModelIndex) table index
         :param value: (object)
         '''
-        self._modifiedDict[(index.row(), index.column())] = value
-        
+        rtable_value = self._rtabledata[index.row()][index.column()]
+        if self._attr.getType() in [DataType.Float, DataType.Integer]:
+            units = self._parent.getCurrentUnits()
+            value = _value2Quantity(value, units)
+            equals = numpy.allclose(rtable_value, value.to(units))
+        else:
+            equals = bool(rtable_value == value)
+        if not equals:
+            self._modifiedDict[(index.row(), index.column())] = value
+        else:
+            self.removeValue(index)
+
     def removeValue(self, index):
         '''
         Removes index from dictionary
-           
+
         :param index:  (QModelIndex) table index
         '''
         if self._modifiedDict.has_key((index.row(), index.column())):
             self._modifiedDict.pop((index.row(), index.column()))
-    
+
     def flags(self, index):
         '''see :meth:`Qt.QAbstractTableModel`'''
         if not index.isValid():
@@ -220,93 +254,118 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
             return Qt.Qt.ItemFlags(Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsSelectable)
         else:
             return Qt.Qt.ItemFlags(Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsSelectable)
-    
-    def getModifiedWriteData(self):        
+
+    def getModifiedWriteData(self):
         '''
         returns an array for the write data that includes the user modifications
-        
+
         :return: (numpy.array) The write values including user modifications.
         '''
         table = self._wtabledata
         kind = table.dtype.kind
         if kind in 'SU':
-            table = table.tolist() #we want to allow the strings to be larger than the original ones
-            for (r,c),v in self._modifiedDict.items():
+            table = table.tolist()  # we want to allow the strings to be larger than the original ones
+            for (r, c), v in self._modifiedDict.items():
                 table[r][c] = Qt.from_qvariant(v, str)
-            table = numpy.array(table)
-        else:        
-            for k,v in self._modifiedDict.items():
-                if kind == 'f':
-                    table[k] = Qt.from_qvariant(v, float)
-                elif kind in 'iu':
-                    table[k] = Qt.from_qvariant(v, int)
+            table = numpy.array(table, dtype=str)
+        else:
+            for k, v in self._modifiedDict.items():
+                if kind in ['f', 'i', 'u']:
+                    units = self._parent.getCurrentUnits()
+                    q = _value2Quantity(v, units)
+                    table[k] = q
                 elif kind == 'b':
-                    table[k] = Qt.from_qvariant(v, bool)
+                    # TODO: This does not work Qt.from_qvariant(v, bool)
+                    if str(v) == "true":
+                        table[k] = True
+                    else:
+                        table[k] = False
                 else:
-                    raise TypeError('Unknown data type "%s"'%kind)
-        #reshape if needed
+                    raise TypeError('Unknown data type "%s"' % kind)
+        # reshape if needed
         if self._attr.data_format == DataFormat._1D:
             table = table.flatten()
-        return table    
-     
+        return table
+
     def clearChanges(self):
         '''clears the dictionary of changed values'''
         self._modifiedDict.clear()
-        self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),self.createIndex(0,0), self.createIndex(self.rowCount()-1,self.columnCount()-1))
+        self.dataChanged.emit(self.createIndex(
+            0, 0), self.createIndex(self.rowCount() - 1, self.columnCount() - 1))
 
     def inAlarmRange(self, value):
         '''
         Checkes if value is in alarm range.
-           
-        :param value:  (float/int) user entered value
+
+        :param value:  Quantity value
         :returns:  (bool) True if value in alarm range, False if valid
-            
+
         '''
         try:
-            if float(self._attrConfig.getMinAlarm()) <= value <= float(self._attrConfig.getMaxAlarm()):
+            min_alarm, max_alarm = self._attr.alarms
+            if min_alarm >= value or value >= max_alarm:
                 return True
             else:
                 return False
         except:
             return True
-    
+
     def inRange(self, value):
         '''
         Checks if value is in range.
-           
-        :param value:  (float/int) user entered value
+
+        :param value:  Quantity value
         :returns:  (bool) True if value in range, False if valid
-            
+
         '''
         try:
-            if float(self._attrConfig.getMinValue()) <= value <= float(self._attrConfig.getMaxValue()):
+            min_range, max_range = self._attr.range
+            if min_range <= value <= max_range:
                 return True
             else:
                 return False
         except:
             return True
-        
+
     def setWriteMode(self, isWrite):
         '''Changes the write state
-        
+
         :param isWrite: (bool)
         '''
         self._writeMode = isWrite
-        if isWrite and not self.isDirty():
-            #refresh the write data (unless it is dirty)
-            wvalues=numpy.array(self._attr.w_value)
-            #reshape the table
+        if isWrite and not self.isDirty() and self._attr is not None:
+            # refresh the write data (unless it is dirty)
+            wvalue = self._attr.wvalue
+
+            # reshape the table
+            if self._attr.type == DataType.String:
+                wvalue = numpy.array(wvalue)
+            elif self._attr.type in [DataType.Integer, DataType.Float]:
+                units = self._parent.getCurrentUnits()
+                wvalue = wvalue.to(units)
             if self._attr.data_format == DataFormat._1D:
-                rows, columns = wvalues.size, 1
+                rows, columns = numpy.shape(wvalue)[0], 1
+                if rows == 0:
+                    # TODO: Ask to the user for a default shape
+                    rows = 3
             elif self._attr.data_format == DataFormat._2D:
-                rows, columns = wvalues.shape
+                try:
+                    rows, columns = numpy.shape(wvalue)
+                except ValueError:
+                    # TODO: Ask to the user for a default shape
+                    rows = 3
+                    columns = 3
+                    wvalue = numpy.array((rows, columns))
             else:
-                self.warning('unsupported data format %s'%str(val.data_format))
-            wvalues = wvalues.reshape(rows,columns)
-            #In version 4.6 of Qt when whole table is updated it is recommended to use beginReset()
-            self._wtabledata = wvalues
-        self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),self.createIndex(0,0), self.createIndex(self.rowCount()-1,self.columnCount()-1))
-    
+                self.warning('unsupported data format %s' %
+                             str(wvalue.data_format))
+            wvalue = wvalue.reshape(rows, columns)
+            # In version 4.6 of Qt when whole table is updated it is
+            # recommended to use beginReset()
+            self._wtabledata = wvalue
+        self.dataChanged.emit(self.createIndex(0, 0), self.createIndex(self.rowCount() - 1,
+                                                           self.columnCount() - 1))
+
     def getModifiedDict(self):
         '''
         Returns dictionary.
@@ -314,11 +373,11 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
         :returns:  (dictionary) dictionary containing modified indexes and values
         '''
         return self._modifiedDict
-    
+
     def getReadValue(self, index):
         '''
         Returns read value for a given index.
-           
+
         :param index:  (QModelIndex) table model index
         :returns:  (string/int/float/bool) read table value for a given cell
         '''
@@ -326,14 +385,15 @@ class TaurusValuesIOTableModel(Qt.QAbstractTableModel):
 
 
 class TaurusValuesIOTable(Qt.QTableView):
-    def __init__(self, parent = None):
+
+    def __init__(self, parent=None):
+        self._parent = parent
         name = self.__class__.__name__
         Qt.QTableView.__init__(self, parent)
         self._showQuality = True
         self._attr = None
         self._value = None
         self.setSelectionMode(Qt.QAbstractItemView.SingleSelection)
-        self.horizontalHeader().setResizeMode(Qt.QHeaderView.Stretch)
         itemDelegate = TaurusValuesIOTableDelegate(self)
         self.setItemDelegate(itemDelegate)
         #self.setStyleSheet('TaurusValuesIOTable { selection-background-color: violet;} ')
@@ -341,58 +401,69 @@ class TaurusValuesIOTable(Qt.QTableView):
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-        
-    def setModel(self,shape):
+
+    def setModel(self, shape):
         '''
         Creates an instance of QTableModel and sets a QT model.
-           
+
         :param shape:  (tuple<int>) shape of the model table to be set
-            
+
         '''
         qmodel = TaurusValuesIOTableModel(shape, parent=self)
         Qt.QTableView.setModel(self, qmodel)
-        
-    def cancelChanges(self):        
+
+    def cancelChanges(self):
         '''
         Cancels all table modifications.
         '''
         self.model().clearChanges()
-        
-    def removeChange(self):        
+
+    def removeChange(self):
         '''
         If the cell was modified it restores the original write value.
         '''
         self.model().removeValue(self.selectedIndexes()[0])
-    
+
     def showHelp(self):
         '''
         Shows QMessageBox help window. It contains explanations of used icons.
         '''
         buttonBox = Qt.QMessageBox(self)
         buttonBox.setLayout(Qt.QGridLayout(self))
-        icon = getThemePixmap('document-save')
+        icon = Qt.QIcon.fromTheme('document-save').pixmap(48, 48)
         l = Qt.QLabel()
         l.setPixmap(icon)
-        buttonBox.layout().addWidget(l,0,0)
-        buttonBox.layout().addWidget(Qt.QLabel('- value is valid and will be saved if changes will be accepted'),0,1)
-        icon = getThemePixmap('dialog-warning')
+        buttonBox.layout().addWidget(l, 0, 0)
+        buttonBox.layout().addWidget(Qt.QLabel(
+            '- value is valid and will be saved if changes will be accepted'), 0, 1)
+        icon = Qt.QIcon.fromTheme('ddialog-warning').pixmap(48, 48)
         l = Qt.QLabel()
         l.setPixmap(icon)
-        buttonBox.layout().addWidget(l,1,0)
-        buttonBox.layout().addWidget(Qt.QLabel('- value is in alarm range and will be saved if changes will be accepted'),1,1)
+        buttonBox.layout().addWidget(l, 1, 0)
+        buttonBox.layout().addWidget(Qt.QLabel(
+            '- value is in alarm range and will be saved if changes will be accepted'), 1, 1)
         buttonBox.exec_()
-    
+
+    def getCurrentUnits(self):
+        try:
+            return str(self._parent._units.currentText())
+        except:
+            return ''
+
 
 class TaurusValuesIOTableDelegate(Qt.QStyledItemDelegate):
 
-    def __init__(self, parent = None):
+    editorCreated = Qt.pyqtSignal()
+
+    def __init__(self, parent=None):
         Qt.QStyledItemDelegate.__init__(self, parent)
+        self._parent = parent
         self._initialText = ""
-    
-    def createEditor(self,parent,option,index):
+
+    def createEditor(self, parent, option, index):
         '''
         Creates a custom editor for a table delagate.
-        
+
         see :meth:`Qt.QStyledItemDelegate.createEditor`
         '''
         if index.model().getType() == bool:
@@ -400,10 +471,10 @@ class TaurusValuesIOTableDelegate(Qt.QStyledItemDelegate):
             editor = Qt.QComboBox(parent)
         else:
             editor = TableInlineEdit(parent)
-            editor._updateValidator(index.model().getConfig(), index.model().getType())
-        self.emit(Qt.SIGNAL('editorCreated'))
+            editor._updateValidator(index.model().getAttr())
+        self.editorCreated.emit()
         return editor
-    
+
     def setEditorData(self, editor, index):
         '''
         see :meth:`Qt.QStyledItemDelegate.setEditorData`
@@ -416,181 +487,226 @@ class TaurusValuesIOTableDelegate(Qt.QStyledItemDelegate):
             editor.addItems(['true', 'false'])
             a = str(Qt.from_qvariant(index.data(), bool)).lower()
             self._initialText = a
+
             editor.setCurrentIndex(editor.findText(a))
         else:
             data = index.model().data(index, Qt.Qt.EditRole)
             self._initialText = Qt.from_qvariant(data, str)
             editor.setText(str(self._initialText))
-    
-    def setModelData(self, editor, model,index):
+
+    def setModelData(self, editor, model, index):
         '''
         see :meth:`Qt.QStyledItemDelegate.setModelData`
         '''
-        #if editor text changed, then don't mark as updated.
-        try:
-            if not model.inRange(float(editor.text())):
+        # if editor text changed, then don't mark as updated.
+        isNumeric = False
+        if self._parent._attr.type in [DataType.Integer, DataType.Float]:
+            units = self._parent.getCurrentUnits()
+            q = _value2Quantity(editor.text(), units)
+            isNumeric = True
+            if not model.inRange(q):
                 return
-        except:
-            pass
         if index.model().getType() == bool:
             text = editor.currentText()
         else:
-            text = editor.text()
-            
+            if isNumeric:
+                text = q
+            else:
+                text = editor.text()
+            text = str(text)
         if(text != self._initialText) & (text != ""):
             model.addValue(index, Qt.QVariant(text))
-            self.parent().resizeColumnsToContents()
+            hh = self.parent().horizontalHeader()
+            hh.setResizeMode(Qt.QHeaderView.Fixed)
+            vh = self.parent().verticalHeader()
+            vh.setResizeMode(Qt.QHeaderView.Fixed)
+
         index.model().editedIndex = None
-                    
-                    
+
+
 class TableInlineEdit(Qt.QLineEdit):
     '''
     TableInLineEdit is used to validate the content of the new value, also to paint the text: blue - valid, orange - in alarm, grey - invalid.
     '''
-    def __init__(self, parent = None):
+
+    def __init__(self, parent=None):
         super(Qt.QLineEdit, self).__init__(parent)
-        self.connect(self, Qt.SIGNAL('textEdited(const QString &)'), self.textEdited)
-        self.connect(self, Qt.SIGNAL('focusLost(const QString &)'), self.textEdited)
-        self._attrConfig = None
-        self.__minAlarm = -float("inf")
-        self.__maxAlarm = float("inf")
-        self.__minLimit = -float("inf")
-        self.__maxLimit = float("inf")
+        self.textEdited.connect(self.onTextEdited)
         self.setValidator(None)
+        self._min_range = None
+        self._max_range = None
+        self._min_alarm = None
+        self._max_alarm = None
+        self._default_unit = None
 
-    def textEdited (self):
-        '''
+    def onTextEdited(self):
+        """
         Paints the text while typing.
-        
-        see :meth:`Qt.QLineEdit.textEdited`
-        '''
-        color, weight = 'gray', 'normal' #default case: the value is in normal range with no pending changes
+
+        Slot for the `Qt.QLineEdit.textEdited` signal
+        """
+        # default case: the value is in normal range with no pending changes
+        color, weight = 'gray', 'normal'
         try:
-            v = float(self.displayText())
+            value = self.displayText()
+            q = _value2Quantity(value, self._default_unit)
         except:
-            v = 0.0
+            q = 0.0
         try:
-            if float(self._attrConfig.getMinAlarm()) <= v <= float(self._attrConfig.getMaxAlarm()): #the value is invalid and can't be applied
+            if self._min_alarm < q < self._max_alarm:
                 color = 'blue'
-            elif float(self._attrConfig.getMinValue()) <= v <= float(self._attrConfig.getMaxValue()): #the value is valid but in alarm range...
+            elif self._min_range <= q <= self._max_range:
+                # the value is valid but in alarm range...
                 color = 'orange'
+            else:
+                # the value is invalid and can't be applied
+                color = 'gray'
         except:
-            color = 'orange'
+            color = 'gray'
 
         weight = 'bold'
-        self.setStyleSheet('TableInlineEdit {color: %s; font-weight: %s}'%(color,weight))
+        self.setStyleSheet('TableInlineEdit {color: %s; font-weight: %s}' %
+                           (color, weight))
 
-    
-    def _updateValidator(self, attrinfo, datatype):
+    def _updateValidator(self, attr):
         '''This method sets a validator depending on the data type
-        
-        :param attrinfo: (AttributeInfoEx)
-        :datatype: (numpy.dtype) type of the data being edited
-        '''
-        self._attrConfig = attrinfo
-        if numpy.issubdtype(datatype, int):
-            validator = Qt.QIntValidator(self) #initial range is -2147483648 to 2147483647 (and cannot be set larger)
-            if validator.bottom() < self.__minLimit < validator.top(): 
-                validator.setBottom(int(self.__minLimit))
-            if validator.bottom() < self.__maxLimit < validator.top():
-                validator.setTop(int(self.__maxLimit))
-            self.setValidator(validator)
-        elif numpy.issubdtype(datatype, float):
-            validator= Qt.QDoubleValidator(self)
-            validator.setBottom(self.__minLimit)
-            validator.setTop(self.__maxLimit)
+
+        :param attr: TaurusAttribute
+        '''
+        data_type = attr.getType()
+        if data_type in [DataType.Integer, DataType.Float]:
+            self._min_range, self._max_range = attr.range
+            self._min_alarm, self._max_alarm = attr.alarms
+            self._default_unit = attr.wvalue.units
+            validator = PintValidator()
+            validator.setBottom(self._min_range)
+            validator.setTop(self._max_range)
+            validator.setUnits(self._default_unit)
             self.setValidator(validator)
-        else: 
+        else:
             self.setValidator(None)
-    
+
     def __decimalDigits(self, fmt):
         '''returns the number of decimal digits from a format string
-        (or None if they are not defined)''' 
+        (or None if they are not defined)'''
         try:
-            if fmt[-1].lower() in ['f','g'] and '.' in fmt:
+            if fmt[-1].lower() in ['f', 'g'] and '.' in fmt:
                 return int(fmt[:-1].split('.')[-1])
             else:
                 return None
         except:
             return None
-    
-    
+
+
 class TaurusValuesTable(TaurusWidget):
     '''
-    A table for displaying and/or editing 1D/2D Taurus attributes 
+    A table for displaying and/or editing 1D/2D Taurus attributes
     '''
     _showQuality = False
     _writeMode = False
-    
-    def __init__(self, parent = None, designMode = False, defaultWriteMode=None):
-        TaurusWidget.__init__(self, parent = parent, designMode = designMode)
-        self._tableView = TaurusValuesIOTable()
+
+    def __init__(self, parent=None, designMode=False,
+                 defaultWriteMode=None):
+        TaurusWidget.__init__(self, parent=parent, designMode=designMode)
+        self._tableView = TaurusValuesIOTable(self)
         l = Qt.QGridLayout()
-        l.addWidget(self._tableView,1,0)
-        self.connect(self._tableView.itemDelegate(), Qt.SIGNAL("editorCreated"), self._onEditorCreated)
-        
+        l.addWidget(self._tableView, 1, 0)
+        self._tableView.itemDelegate().editorCreated.connect(self._onEditorCreated)
+
         if defaultWriteMode is None:
-            self.defaultWriteMode = self._writeMode
+            self.defaultWriteMode = "rw"
         else:
             self.defaultWriteMode = defaultWriteMode
-        
+
         self._label = TaurusLabel()
         self._label.setBgRole('quality')
         self._label.setFgRole('quality')
-        
+
+        self._units = Qt.QComboBox()
+
         self._applyBT = Qt.QPushButton('Apply')
         self._cancelBT = Qt.QPushButton('Cancel')
-        self.connect(self._applyBT,Qt.SIGNAL("clicked()"),self.okClicked)
-        self.connect(self._cancelBT,Qt.SIGNAL("clicked()"),self.cancelClicked)
-        
+        self._applyBT.clicked.connect(self.okClicked)
+        self._cancelBT.clicked.connect(self.cancelClicked)
+
         self._rwModeCB = Qt.QCheckBox()
         self._rwModeCB.setText('Write mode')
-        self.connect(self._rwModeCB, Qt.SIGNAL("toggled(bool)"),self.setWriteMode)
-        
-        l.addWidget(self._label,2,0)
-        l.addWidget(self._rwModeCB,0,0)
+        self._rwModeCB.toggled.connect(self.setWriteMode)
+
+        lv = Qt.QHBoxLayout()
+        lv.addWidget(self._label)
+        lv.addWidget(self._units)
+        l.addLayout(lv, 2, 0)
+        l.addWidget(self._rwModeCB, 0, 0)
         lv = Qt.QHBoxLayout()
         lv.addWidget(self._applyBT)
         lv.addWidget(self._cancelBT)
-        l.addLayout(lv,3,0)
+        l.addLayout(lv, 3, 0)
+        self._writeMode = False
         self.setLayout(l)
         self._initActions()
-        
+
     def _initActions(self):
         """Initializes the actions for this widget (currently, the pause action.)
         """
         self._pauseAction = Qt.QAction("&Pause", self)
-        self._pauseAction.setShortcuts([Qt.Qt.Key_P,Qt.Qt.Key_Pause])
+        self._pauseAction.setShortcuts([Qt.Qt.Key_P, Qt.Qt.Key_Pause])
         self._pauseAction.setCheckable(True)
         self._pauseAction.setChecked(False)
         self.addAction(self._pauseAction)
-        self.connect(self._pauseAction, Qt.SIGNAL("toggled(bool)"), self.setPaused)
+        self._pauseAction.toggled.connect(self.setPaused)
         self.chooseModelAction = Qt.QAction("Choose &Model", self)
         self.chooseModelAction.setEnabled(self.isModifiableByUser())
         self.addAction(self.chooseModelAction)
-        self.connect(self.chooseModelAction, Qt.SIGNAL("triggered()"), self.chooseModel)
-    
+        self.chooseModelAction.triggered[()].connect(self.chooseModel)
+
     def getModelClass(self):
         '''see :meth:`TaurusWidget.getModelClass`'''
-        return taurus.core.taurusattribute.TaurusAttribute    
-    
+        return taurus.core.taurusattribute.TaurusAttribute
+
     def setModel(self, model):
         '''Reimplemented from :meth:`TaurusWidget.setModel`'''
         TaurusWidget.setModel(self, model)
-        value = self.getModelValueObj()
-        if value is not None:
-            try: 
-                dim_x,dim_y = value.dim_x, value.dim_y #@this is tango-centric. dim_x and dim_y attribute is not present in TaurusConfiguration
-            except:
-                v = numpy.array(value.value)
-                if v.ndim == 1:
-                    dim_x, dim_y = v.shape[0], 1
-                elif v.ndim == 2:
-                    dim_x,dim_y = v.shape
+        model_obj = self.getModelObj()
+
+        if model_obj.isWritable() and self.defaultWriteMode != "r":
+            self._writeMode = True
+        else:
+            self.defaultWriteMode = "r"
+
+        if model_obj is not None:
+            self._tableView._attr = model_obj
+            if model_obj.type in [DataType.Integer, DataType.Float]:
+                if self._writeMode:
+                    try:
+                        default_unit = str(model_obj.wvalue.units)
+                    except AttributeError:
+                        default_unit = ''
                 else:
-                    self.error('Cannot display %i-dimensional data', v.ndim)
-                    return
-            self._tableView.setModel([dim_x, dim_y]) 
+                    default_unit = str(model_obj.rvalue.units)
+                # TODO: fill the combobox with the compatible units
+                self._units.addItem("%s" % default_unit)
+                self._units.setCurrentIndex(self._units.findText(default_unit))
+                self._units.setEnabled(False)
+            else:
+                self._units.setVisible(False)
+            raiseException = False
+            if model_obj.data_format == DataFormat._2D:
+                try:
+                    dim_x, dim_y = numpy.shape(model_obj.rvalue)
+                except ValueError:
+                    raiseException = True
+            elif model_obj.data_format == DataFormat._1D:
+                try:
+                    dim_x, dim_y = len(model_obj.rvalue), 1
+                except ValueError:
+                    raiseException = True
+            else:
+                raiseException = True
+            if raiseException:
+                raise Exception('rvalue is invalid')
+            self._tableView.setModel([dim_x, dim_y])
+        self.setWriteMode(self._writeMode)
         self._label.setModel(model)
 
     def handleEvent(self, evt_src, evt_type, evt_value):
@@ -599,51 +715,67 @@ class TaurusValuesTable(TaurusWidget):
         model = self._tableView.model()
         if model is None:
             return
-        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.taurusbasetypes.TaurusEventType.Config:
-            #force a read to set an attr
-            model.setAttr(self.getModelValueObj())
-            model.setConfig(evt_src)
-            writable = bool(evt_value.writable)
-            self.resetWriteMode()
-            self._rwModeCB.setVisible(writable)
-    
+        if evt_type in (TaurusEventType.Change,
+                        TaurusEventType.Periodic)\
+                and evt_value is not None:
+            attr = self.getModelObj()
+            model.setAttr(attr)
+            model.setWriteMode(self._writeMode)
+
+            hh = self._tableView.horizontalHeader()
+            hh.setResizeMode(Qt.QHeaderView.Fixed)
+            vh = self._tableView.verticalHeader()
+            vh.setResizeMode(Qt.QHeaderView.Fixed)
+            if self.defaultWriteMode == "r":
+                isWritable = False
+            else:
+                isWritable = True
+            writable = isWritable and self._writeMode and\
+                attr.isWritable()
+            self.setWriteMode(writable)
+        elif evt_type == TaurusEventType.Config:
+            # force a read to set an attr
+            attr = self.getModelObj()
+            model.setAttr(attr)
+
     def contextMenuEvent(self, event):
         '''Reimplemented from :meth:`QWidget.contextMenuEvent`'''
         menu = Qt.QMenu()
         globalPos = event.globalPos()
-        menu.addAction(self.chooseModelAction)        
+        menu.addAction(self.chooseModelAction)
         menu.addAction(self._pauseAction)
         if self._writeMode:
             index = self._tableView.selectedIndexes()[0]
             if index.isValid():
                 val = self._tableView.model().getReadValue(index)
                 if self._tableView.model().getModifiedDict().has_key((index.row(), index.column())):
-                    menu.addAction(getThemeIcon('edit-undo'),"Reset to original value (%s) "%repr(val), self._tableView.removeChange)
+                    menu.addAction(Qt.QIcon.fromTheme(
+                        'edit-undo'), "Reset to original value (%s) " % repr(val), self._tableView.removeChange)
                     menu.addSeparator()
-                menu.addAction(getThemeIcon('process-stop'), "Reset all table", self.askCancel)
+                menu.addAction(Qt.QIcon.fromTheme('process-stop'),
+                               "Reset all table", self.askCancel)
                 menu.addSeparator()
-                menu.addAction(getThemeIcon('help-browser') ,"Help", self._tableView.showHelp)
+                menu.addAction(Qt.QIcon.fromTheme('help-browser'),
+                               "Help", self._tableView.showHelp)
         menu.exec_(globalPos)
-        event.accept()       
-    
-    def applyChanges(self):        
+        event.accept()
+
+    def applyChanges(self):
         '''
         Writes table modifications to the device server.
         '''
         tab = self._tableView.model().getModifiedWriteData()
         attr = self.getModelObj()
-        #attr.write(tab)
-        attr.write(tab.tolist()) #@fixme If I don't convert this to a list it segfaults when writing arrays of strings 
+        if attr.type == DataType.String:
+            # String arrays has to be converted to a list
+            tab = tab.tolist()
+        attr.write(tab)
         self._tableView.model().clearChanges()
-    
-        
+
     def okClicked(self):
         """This is a SLOT that is being triggered when ACCEPT button is clicked.
-        
-        .. note:: This SLOT is called, when user wants to apply table modifications. 
+
+        .. note:: This SLOT is called, when user wants to apply table modifications.
                   When no cell was modified it will not be called. When
                   modifications have been done, they will be writen to w_value
                   of an attribute.
@@ -651,111 +783,126 @@ class TaurusValuesTable(TaurusWidget):
         if self._tableView.model().isDirty():
             self.applyChanges()
             self.resetWriteMode()
-        
+
     def cancelClicked(self):
         """This is a SLOT that is being triggered when CANCEL button is clicked.
-        
-        .. note:: This SLOT is called, when user does not want to apply table 
+
+        .. note:: This SLOT is called, when user does not want to apply table
                   modifications. When no cell was modified it will not be called.
         """
         if self._tableView.model().isDirty():
             self.askCancel()
-    
-    def askCancel(self):        
+
+    def askCancel(self):
         '''
         Shows a QMessageBox, asking if user wants to cancel all changes. Triggered when user clicks Cancel button.
         '''
-        result = Qt.QMessageBox.warning(self,'Your changes will be lost!', 
+        result = Qt.QMessageBox.warning(self, 'Your changes will be lost!',
                                         'Do you want to cancel changes done to the whole table?',
-                                         Qt.QMessageBox.Ok | Qt.QMessageBox.Cancel)
+                                        Qt.QMessageBox.Ok | Qt.QMessageBox.Cancel)
         if result == Qt.QMessageBox.Ok:
             self._tableView.cancelChanges()
             self.resetWriteMode()
-    
+
     def _onEditorCreated(self):
         '''slot called when an editor has been created'''
-        self.setWriteMode(True)
-    
+        self.setWriteMode(self._writeMode)
+
     def getWriteMode(self):
         '''whether the widget is showing the read or write values
-        
+
         :return: (bool)'''
         return self._writeMode
-        
+
     def setWriteMode(self, isWrite):
         '''
-        Triggered when the read mode is changed to write mode. 
-        
+        Triggered when the read mode is changed to write mode.
+
         :param isWrite: (bool)
         '''
-        if isWrite == self._writeMode: return
+        self._applyBT.setVisible(isWrite)
+        self._cancelBT.setVisible(isWrite)
+        self._rwModeCB.setChecked(isWrite)
+        if self.defaultWriteMode in ("rw", "wr"):
+            self._rwModeCB.setVisible(True)
+        else:
+            self._rwModeCB.setVisible(False)
+
+        table_view_model = self._tableView.model()
+        if table_view_model is not None:
+            table_view_model.setWriteMode(isWrite)
+            table_view_model._editable = isWrite
+        if isWrite == self._writeMode:
+            return
         self._writeMode = isWrite
-        
-        if isWrite:
-            valueObj = self.getModelValueObj()
-            w_value = valueObj.w_value
-            value = valueObj.value
+        valueObj = self.getModelValueObj()
+        if isWrite and valueObj is not None:
+            w_value = valueObj.wvalue
+            value = valueObj.rvalue
             if numpy.array(w_value).shape != numpy.array(value).shape:
                 ta = self.getModelObj()
                 v = ta.read()
-                ta.write(v.value) #@fixme: this is ugly! we should not be writing into the attribute without asking first...
-                
-        self._tableView.model().setWriteMode(isWrite)
-        self._label.setVisible(isWrite)
-        self._applyBT.setVisible(isWrite)
-        self._cancelBT.setVisible(isWrite)
-        self._rwModeCB.setChecked(isWrite)
-    
+                # @fixme: this is ugly! we should not be writing into the attribute without asking first...
+                ta.write(v.rvalue)
+
     def resetWriteMode(self):
-        '''equivalent to self.setWriteMode(self.defaultWriteMode)'''       
-        self.setWriteMode(self.defaultWriteMode)
-        
+        '''equivalent to self.setWriteMode(self.defaultWriteMode)'''
+        if self.defaultWriteMode == "r":
+            isWritable = False
+        else:
+            isWritable = True
+        self.setWriteMode(isWritable)
+
     @classmethod
     def getQtDesignerPluginInfo(cls):
         '''Reimplemented from :meth:`TaurusWidget.getQtDesignerPluginInfo`'''
         ret = TaurusWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.table'
         ret['group'] = 'Taurus Views'
-        ret['icon'] = ":/designer/table.png"
+        ret['icon'] = "designer:table.png"
         return ret
-    
+
     def chooseModel(self):
         '''shows a model chooser'''
-        from taurus.qt.qtgui.panel import  TaurusModelChooser
-        selectables=[taurus.core.taurusbasetypes.TaurusElementType.Attribute]
-        models, ok = TaurusModelChooser.modelChooserDlg(selectables=selectables, singleModel=True)
-        if ok and len(models)==1:
+        from taurus.qt.qtgui.panel import TaurusModelChooser
+        selectables = [TaurusElementType.Attribute]
+        models, ok = TaurusModelChooser.modelChooserDlg(
+            selectables=selectables, singleModel=True)
+        if ok and len(models) == 1:
             self.setModel(models[0])
-            
+
     def setModifiableByUser(self, modifiable):
         '''Reimplemented from :meth:`TaurusWidget.setModifiableByUser`'''
         self.chooseModelAction.setEnabled(modifiable)
         TaurusWidget.setModifiableByUser(self, modifiable)
-        
+
     def isReadOnly(self):
         '''Reimplemented from :meth:`TaurusWidget.isReadOnly`'''
         return False
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # QT property definition
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    model = Qt.pyqtProperty("QString", TaurusWidget.getModel, 
-                                    setModel, 
-                                    TaurusWidget.resetModel)
-    writeMode = Qt.pyqtProperty("bool", getWriteMode, setWriteMode, resetWriteMode)
-    
+    model = Qt.pyqtProperty("QString", TaurusWidget.getModel,
+                            setModel,
+                            TaurusWidget.resetModel)
+    writeMode = Qt.pyqtProperty(
+        "bool", getWriteMode, setWriteMode, resetWriteMode)
+
 
 def taurusTableMain():
     '''A launcher for TaurusValuesTable.'''
 
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.core.util import argparse
-    import sys, os
-    
+    import sys
+    import os
+
     parser = argparse.get_taurus_parser()
     parser.set_usage("%prog [options] [model]]")
-    parser.set_description("A table for viewing and editing 1D and 2D attribute values")
+    parser.set_description(
+        "A table for viewing and editing 1D and 2D attribute values")
     app = TaurusApplication(cmd_line_parser=parser,
                             app_name="TaurusValuesTable",
                             app_version=taurus.Release.version)
@@ -764,22 +911,24 @@ def taurusTableMain():
     dialog = TaurusValuesTable()
     dialog.setModifiableByUser(True)
     dialog.setWindowTitle(app.applicationName())
-    
-    #set a model list from the command line or launch the chooser  
-    if len(args)==1:
-        model=args[0]
+
+    # set a model list from the command line or launch the chooser
+    if len(args) == 1:
+        model = args[0]
         dialog.setModel(model)
     else:
         dialog.chooseModel()
-        #model = 'sys/tg_test/1/string_spectrum'
-        #model = 'sys/tg_test/1/wave'
-        #dialog.setModel(model)
+        #model = 'sys/tg_test/1/boolean_spectrum'
+        # model = 'sys/tg_test/1/boolean_image'
+        # model = 'sys/tg_test/1/string_spectrum'
+        # model = 'sys/tg_test/1/float_image'
+        # model = 'sys/tg_test/1/double_image'
+        # model = 'sys/tg_test/1/double_image_ro'
+        # model = 'sys/tg_test/1/wave'
+        # dialog.setModel(model)
 
     dialog.show()
     sys.exit(app.exec_())
 
 if __name__ == '__main__':
     taurusTableMain()
-    
-    
-    
diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py b/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py
deleted file mode 100644
index 82a9d64..0000000
--- a/lib/taurus/qt/qtgui/table/taurusvaluestable_ro.py
+++ /dev/null
@@ -1,159 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-taurusvaluestable.py: 
-"""
-
-__all__ = ["TaurusValuesTable_OLD"]
-
-__docformat__ = 'restructuredtext'
-
-import numpy
-
-from taurus.external.qt import Qt
-
-import PyTango
-
-import taurus.core
-from taurus.core.util.colors import ATTRIBUTE_QUALITY_PALETTE
-from taurus.qt.qtgui.base import TaurusBaseWidget
-
-class TaurusValuesTable_OLD(Qt.QTableWidget, TaurusBaseWidget):
-    '''This widget gets spectra or images as model and shows a table containing
-    the values in the model
-    
-    .. warning:: this is an old Read-only implementation of `TaurusValuesTable`. 
-                 Use the newer implentation (which allows editing).
-                 This one is here only for compatibility and will be eventually 
-                 removed.
-    '''
-    
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-    
-    def __init__(self, parent = None, designMode = False):
-        name = self.__class__.__name__
-        self.call__init__wo_kw(Qt.QTableWidget, parent)
-        self.call__init__(TaurusBaseWidget, name, designMode=designMode)
-        #@TODO add event filter once the backwards compatibility is not needed
-        self.setEditTriggers(self.NoEditTriggers) #the table is non-editable by default
-        self.setShowQuality(False) #by default it does not show the quality on background
-        
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget overwriting
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def getModelClass(self):
-        return taurus.core.taurusattribute.TaurusAttribute
-
-    def isReadOnly(self):
-        return True
-        
-    def handleEvent(self, src, evt_type, val):
-        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:
-                rows, columns = values.size, 1
-            elif val.data_format == PyTango.AttrDataFormat.IMAGE:
-                rows, columns = values.shape
-            else:
-                self.warning('unsupported data format %s'%str(val.data_format))
-                return
-            self.setRowCount(rows)
-            self.setColumnCount(columns)
-            
-            #fill the table
-            values = values.reshape(rows,columns) #make sure it is in matrix form (not a vector)
-            for j in xrange(columns):
-                for i in xrange(rows):
-                    self.setItem(i,j,Qt.QTableWidgetItem(str(values[i,j])) ) #extremely inefficient!! #@TODO
-            self.updateStyle()
-            
-    def eventHandle(self, *args):
-        '''Only here for backwards compatibility. It will disapear soon. Not supported'''
-        self.info('using deprecated event handling methods.')
-        model = self.getModelObj()
-        val = model.getValueObj()
-        self.handleEvent(model, taurus.core.taurusbasetypes.TaurusEventType.Change, val)
-        
-    def updateStyle(self):
-        if self.getShowQuality():
-            val = self.getModelValueObj()
-            quality = getattr(val, 'quality', None)
-            stylesheet = "TaurusValuesTable {%s}"%ATTRIBUTE_QUALITY_PALETTE.qtStyleSheet(quality)
-        else:
-            stylesheet = "TaurusValuesTable {}"
-        self.setStyleSheet(stylesheet)
-        self.resizeColumnsToContents()
-        self.horizontalHeader().setStretchLastSection(True)
-
-    def setModel(self, model):
-        if isinstance(model, Qt.QAbstractItemModel):
-            return Qt.QTableWidget.setModel(self, model)
-        return TaurusBaseWidget.setModel(self, model)
-
-#    @classmethod
-#    def getQtDesignerPluginInfo(cls):
-#        ret = TaurusBaseWidget.getQtDesignerPluginInfo()
-#        ret['module'] = 'taurus.qt.qtgui.table'
-#        ret['group'] = 'Taurus Views'
-#        ret['icon'] = ":/designer/table.png"
-#        return ret
-                
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT property definition
-    #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, 
-                                TaurusBaseWidget.setModel, 
-                                TaurusBaseWidget.resetModel)
-    
-    useParentModel = Qt.pyqtProperty("bool", 
-                                         TaurusBaseWidget.getUseParentModel, 
-                                         TaurusBaseWidget.setUseParentModel,
-                                         TaurusBaseWidget.resetUseParentModel)
-    
-    showQuality = Qt.pyqtProperty("bool", 
-                                      TaurusBaseWidget.getShowQuality,
-                                      TaurusBaseWidget.setShowQuality,
-                                      TaurusBaseWidget.resetShowQuality)
-
-
-if __name__ == '__main__':
-    import sys
-    app = Qt.QApplication([])
-    
-    if len(sys.argv) == 2:
-        model = sys.argv[1]
-    else:
-        model = 'bl97/pysignalsimulator/1/value1'
-     
-    w = TaurusValuesTable()
-        
-    w.setModel(model)
-    w.setShowQuality(True)
-    w.show()
-    sys.exit(app.exec_())
\ No newline at end of file
diff --git a/lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py b/lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py
index 9eb692d..59210b0 100644
--- a/lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py
+++ b/lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py
@@ -2,40 +2,40 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
 
 """
-PermanentCustomPanelDlg.py: 
+PermanentCustomPanelDlg.py:
 """
 
 from taurus.external.qt import Qt
 
+
 class PermanentCustomPanelsDlg(object):
     '''
     .. warning:: This class is deprecated. Use class:`taurus.qt.qtgui.panel.QDoubleList` instead
     '''
+
     def __init__(self, *args, **kwargs):
-        raise DeprecationWarning('PermanentCustomPanelsDlg is deprecated. Use taurus.qt.qtgui.panel.QDoubleList instead')
-        
-        
-        
\ No newline at end of file
+        raise DeprecationWarning(
+            'PermanentCustomPanelsDlg is deprecated. Use taurus.qt.qtgui.panel.QDoubleList instead')
diff --git a/lib/taurus/qt/qtgui/taurusgui/__init__.py b/lib/taurus/qt/qtgui/taurusgui/__init__.py
index bf1f5fb..3bb7e6a 100644
--- a/lib/taurus/qt/qtgui/taurusgui/__init__.py
+++ b/lib/taurus/qt/qtgui/taurusgui/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
@@ -27,14 +27,14 @@
 This package provides TaurusGui, a generic framework for creating GUIs without
 actual coding (just configuration files).
 
-See the examples provided in the conf subdirectory directory as well as the 
+See the examples provided in the conf subdirectory directory as well as the
 documentation of the :class:`TaurusGui` class.
 
-    
+
 The "new GUI wizard" and XML configuration files
 ------------------------------------------------
-    
-Note that the configuration files can either be written by hand or by 
+
+Note that the configuration files can either be written by hand or by
 launching the "new GUI" wizard with `taurusgui --new-gui`, which will create
 a new directory containing configuration, resource and launcher files.
 
@@ -43,20 +43,20 @@ The new GUI wizard stores all the options in xml format in a file called
 line::
 
     XML_CONFIG = 'config.xml'
-    
-This line indicates that `config.xml` should also be used as a source of 
-configuration options (in case of conflict, the options set in `config.py` 
-prevail). 
+
+This line indicates that `config.xml` should also be used as a source of
+configuration options (in case of conflict, the options set in `config.py`
+prevail).
 
 """
 
 __docformat__ = 'restructuredtext'
 
-import utils 
+import utils
 from paneldescriptionwizard import *
 from taurusgui import *
 from appsettingswizard import *
 try:
     from macrolistener import *
 except ImportError:
-    pass #allow for sardana not being installed
\ No newline at end of file
+    pass  # allow for sardana not being installed
diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
index d97f36a..25364e2 100644
--- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
+++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 ###########################################################################
 
@@ -43,21 +43,15 @@ import copy
 import datetime
 from lxml import etree
 
+from taurus import tauruscustomsettings
 from taurus.external.qt import Qt
-import taurus.qt.qtgui.resource
 import taurus.qt.qtgui.panel
 import taurus.qt.qtgui.taurusgui.paneldescriptionwizard
 import taurus.qt.qtgui.input
 from taurus.core.util.enumeration import Enumeration
 from taurus.qt.qtgui.util import ExternalAppAction
 
-try:
-    from sardana.taurus.qt.qtgui.extra_macroexecutor.common import \
-        TaurusMacroConfigurationDialog
-    SARDANA_INSTALLED = True
-except:
-    SARDANA_INSTALLED = False
-    
+
 class BooleanWidget(Qt.QWidget):
     """
     This class represents the simple boolean widget with two RadioButtons
@@ -65,6 +59,8 @@ class BooleanWidget(Qt.QWidget):
     It change the value by using getValue and setValue methods
     """
 
+    valueChanged = Qt.pyqtSignal(bool, bool)
+
     def __init__(self, parent=None):
         Qt.QWidget.__init__(self, parent)
         self._formLayout = Qt.QHBoxLayout(self)
@@ -74,13 +70,13 @@ class BooleanWidget(Qt.QWidget):
         self._formLayout.addWidget(self.falseButton)
         self.trueButton.setText("Yes")
         self.falseButton.setText("No")
-        Qt.QObject.connect(self.trueButton, Qt.SIGNAL("clicked()"), self.valueChanged)
-        Qt.QObject.connect(self.falseButton, Qt.SIGNAL("clicked()"), self.valueChanged)
+        self.trueButton.clicked.connect(self.valueChanged)
+        self.falseButton.clicked.connect(self.valueChanged)
         self.setValue(self.getDefaultValue())
 
     def valueChanged(self):
         if not (self.trueButton.isChecked() == self._actualValue):
-            self.emit(Qt.SIGNAL("valueChanged"), self._actualValue, not self._actualValue)
+            self.valueChanged.emit(self._actualValue, not self._actualValue)
         self._actualValue = self.trueButton.isChecked()
 
     def setValue(self, value):
@@ -103,6 +99,8 @@ class BasePage(Qt.QWizardPage):
         This class represents the base page for all of the pages in the wizard
     """
 
+    completeChanged = Qt.pyqtSignal()
+
     def __init__(self, parent=None):
         Qt.QWizardPage.__init__(self, parent)
         self._item_funcs = {}
@@ -125,7 +123,7 @@ class BasePage(Qt.QWizardPage):
 
     def checkData(self):
         self._valid = True
-        self.emit(Qt.SIGNAL('completeChanged()'))
+        self.completeChanged.emit()
 
     def isComplete(self):
         return self._valid
@@ -183,11 +181,13 @@ class IntroPage(BasePage):
 
     def _setupUI(self):
         self.setTitle('Introduction')
-        self.setPixmap(Qt.QWizard.WatermarkPixmap, taurus.qt.qtgui.resource.getThemeIcon("document-properties").pixmap(120, 120))
+        self.setPixmap(Qt.QWizard.WatermarkPixmap, Qt.QIcon.fromTheme(
+            "document-properties").pixmap(120, 120))
         label = Qt.QLabel(self.getIntroText())
         label.setWordWrap(True)
         self._layout.addWidget(label, 0, 0)
-        self._spacerItem1 = Qt.QSpacerItem(10, 200, Qt.QSizePolicy.Minimum, Qt.QSizePolicy.Fixed)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 200, Qt.QSizePolicy.Minimum, Qt.QSizePolicy.Fixed)
         self._layout.addItem(self._spacerItem1, 1, 0)
         self.setLayout(self._layout)
 
@@ -202,31 +202,36 @@ class IntroPage(BasePage):
     def setNextPageId(self, id):
         self._nextPageId = id
 
+
 class ProjectPage(BasePage):
 
     def __init__(self, parent=None):
         BasePage.__init__(self, parent)
         self.setTitle('Project')
-        self.setSubTitle('Choose a location for the application files (i.e., the "project directory")')
+        self.setSubTitle(
+            'Choose a location for the application files (i.e., the "project directory")')
         self.__setitem__('projectDir', self._getProjectDir)
 
-
     def _setupUI(self):
         BasePage._setupUI(self)
         self._projectDirLabel = Qt.QLabel("Project Directory:")
         self._projectDirLE = Qt.QLineEdit(Qt.QDir.homePath())
         self._projectDirLE.setMinimumSize(150, 30)
-        self._projectDirLE.setToolTip('This directory will be used to store all files needed by the application.')
-        self._projectDirBT = Qt.QPushButton(taurus.qt.qtgui.resource.getThemeIcon("document-properties"), '...')
+        self._projectDirLE.setToolTip(
+            'This directory will be used to store all files needed by the application.')
+        self._projectDirBT = Qt.QPushButton(Qt.QIcon.fromTheme(
+            "document-properties"), '...')
         self._layout.addWidget(self._projectDirLabel, 1, 0)
         self._layout.addWidget(self._projectDirLE, 1, 1)
         self._layout.addWidget(self._projectDirBT, 1, 2)
 
-        Qt.QObject.connect(self._projectDirBT, Qt.SIGNAL("clicked()"), self.onSelectDir)
+        self._projectDirBT.clicked.connect(self.onSelectDir)
 
     def onSelectDir(self):
-        dirname = unicode(Qt.QFileDialog.getExistingDirectory(self, 'Choose the project directory', self._projectDirLE.text()))
-        if not dirname: 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):
@@ -237,31 +242,35 @@ class ProjectPage(BasePage):
                 os.makedirs(dirname)
             except Exception, e:
                 Qt.QMessageBox.warning(self, 'Error creating project directory',
-                                    'Could not create the project directory.\nReason:%s' % repr(e),
-                                     Qt.QMessageBox.Cancel)
+                                       'Could not create the project directory.\nReason:%s' % repr(
+                                           e),
+                                       Qt.QMessageBox.Cancel)
                 return False
         fname = os.path.join(dirname, self.wizard().getXmlConfigFileName())
         if os.path.exists(fname):
             option = Qt.QMessageBox.question(self, 'Overwrite project?',
-                                    'The "%s" file already exists in the project directory.\n Do you want to edit the existing project?' % (os.path.basename(fname)),
-                                     Qt.QMessageBox.Yes | Qt.QMessageBox.Cancel)
+                                             'The "%s" file already exists in the project directory.\n Do you want to edit the existing project?' % (
+                                                 os.path.basename(fname)),
+                                             Qt.QMessageBox.Yes | Qt.QMessageBox.Cancel)
             if option == Qt.QMessageBox.Yes:
                 try:
                     self.wizard().loadXml(fname)
                 except Exception, e:
                     Qt.QMessageBox.warning(self, 'Error loading project configuration',
-                                    'Could not load the existing configuration.\nReason:%s' % repr(e),
-                                     Qt.QMessageBox.Cancel)
+                                           'Could not load the existing configuration.\nReason:%s' % repr(
+                                               e),
+                                           Qt.QMessageBox.Cancel)
                     return False
             else:
                 return False
         elif len(os.listdir(dirname)):
             option = Qt.QMessageBox.question(self, 'Non empty project dir',
-                                    'The project directory ("%s") is not empty.\nAre you sure you want to use it?' % (os.path.basename(dirname)),
-                                     Qt.QMessageBox.Yes | Qt.QMessageBox.No)
+                                             'The project directory ("%s") is not empty.\nAre you sure you want to use it?' % (
+                                                 os.path.basename(dirname)),
+                                             Qt.QMessageBox.Yes | Qt.QMessageBox.No)
             if option != Qt.QMessageBox.Yes:
                 return False
-        #if all went ok...
+        # if all went ok...
         return True
 
     def _getProjectDir(self):
@@ -280,8 +289,10 @@ class GeneralSettings(BasePage):
         self.wizard().__setitem__("organizationName", self._getOrganizationName)
 
     def fromXml(self, xml):
-        self._guiNameLineEdit.setText(AppSettingsWizard.getValueFromNode(xml, "GUI_NAME", ''))
-        self._organizationCombo.setEditText(AppSettingsWizard.getValueFromNode(xml, "ORGANIZATION", default='Taurus'))
+        self._guiNameLineEdit.setText(
+            AppSettingsWizard.getValueFromNode(xml, "GUI_NAME", ''))
+        self._organizationCombo.setEditText(
+            AppSettingsWizard.getValueFromNode(xml, "ORGANIZATION", default='Taurus'))
 
     def _getGUIName(self):
         return str(self._guiNameLineEdit.text())
@@ -295,7 +306,7 @@ class GeneralSettings(BasePage):
     def _setupUI(self):
         BasePage._setupUI(self)
         self._guiNameLabel = Qt.QLabel("GUI name:")
-        font = Qt.QFont()  #set bigger font
+        font = Qt.QFont()  # set bigger font
         font.setPointSize(14)
 
         self._label = Qt.QLabel()
@@ -303,26 +314,30 @@ class GeneralSettings(BasePage):
         self._guiNameLineEdit = Qt.QLineEdit()
         self._guiNameLineEdit.setFont(font)
         self._guiNameLineEdit.setMinimumSize(150, 30)
-        self._layout.addWidget(self._guiNameLabel, 1, 0, 1, 1, Qt.Qt.AlignRight)
-        self._layout.addWidget(self._guiNameLineEdit, 1, 1, 1, 1, Qt.Qt.AlignRight)
+        self._layout.addWidget(self._guiNameLabel, 1, 0,
+                               1, 1, Qt.Qt.AlignRight)
+        self._layout.addWidget(self._guiNameLineEdit, 1,
+                               1, 1, 1, Qt.Qt.AlignRight)
         self._organizationNameLabel = Qt.QLabel("Organization name:")
         self._organizationCombo = Qt.QComboBox()
         self._organizationCombo.addItems(self._getOrganizationNames())
         self._organizationCombo.setMinimumSize(150, 25)
         self._organizationCombo.setEditable(True)
-        self._layout.addWidget(self._organizationNameLabel, 2, 0, 1, 1, Qt.Qt.AlignRight)
-        self._layout.addWidget(self._organizationCombo, 2, 1, 1, 1, Qt.Qt.AlignRight)
+        self._layout.addWidget(self._organizationNameLabel,
+                               2, 0, 1, 1, Qt.Qt.AlignRight)
+        self._layout.addWidget(self._organizationCombo,
+                               2, 1, 1, 1, Qt.Qt.AlignRight)
 
-
-        self._spacerItem1 = Qt.QSpacerItem(10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
         self._layout.addItem(self._spacerItem1, 8, 0, 1, 1, Qt.Qt.AlignCenter)
         self._status_label = Qt.QLabel()
         self.setStatusLabelPalette(self._status_label)
         self._layout.addWidget(self._status_label, 9, 0, 1, 3)
 
-        Qt.QObject.connect(self._guiNameLineEdit, Qt.SIGNAL("textChanged(const QString&)"), self.checkData)
-        Qt.QObject.connect(self._organizationCombo, Qt.SIGNAL("editTextChanged(const QString&)"), self.checkData)
-        Qt.QObject.connect(self._organizationCombo, Qt.SIGNAL("currentIndexChanged(const QString&)"), self.checkData)
+        self._guiNameLineEdit.textChanged.connect(self.checkData)
+        self._organizationCombo.editTextChanged.connect(self.checkData)
+        self._organizationCombo.currentIndexChanged.connect(self.checkData)
 
     def _getOrganizationNames(self):
         return ["TAURUS", "ALBA", "DESY", "Elettra", "ESRF", "MAX-lab", "SOLEIL", "XFEL"]
@@ -335,7 +350,7 @@ class GeneralSettings(BasePage):
         else:
             self._markBlack(self._guiNameLabel)
 
-        self.emit(Qt.SIGNAL('completeChanged()'))
+        self.completeChanged.emit()
 
         if not self._valid:
             self._setStatus("Please type the name of the GUI")
@@ -347,9 +362,12 @@ class GeneralSettings(BasePage):
 
 
 class CustomLogoPage(BasePage):
+
     def __init__(self, parent=None):
         BasePage.__init__(self, parent)
-        self._customLogoDefaultPath = ":/logo.png"
+        self._customLogoDefaultPath = getattr(tauruscustomsettings,
+                                              "ORGANIZATION_LOGO",
+                                              "logos:taurus.png")
         self._customLogoPath = self._customLogoDefaultPath
 
     def initializePage(self):
@@ -360,7 +378,8 @@ class CustomLogoPage(BasePage):
     def _setupUI(self):
         BasePage._setupUI(self)
         self.setTitle('Custom logo')
-        self._label = Qt.QLabel("\nIf you want to have a custom logo inside your application panel, please select the image file. \n")
+        self._label = Qt.QLabel(
+            "\nIf you want to have a custom logo inside your application panel, please select the image file. \n")
         self._label.setWordWrap(True)
         self._layout.addWidget(self._label, 0, 0, 1, 4)
         self._customLogoLabel = Qt.QLabel("Custom logo:")
@@ -369,37 +388,45 @@ class CustomLogoPage(BasePage):
         self._customLogoLineEdit.setReadOnly(False)
         self._customLogoButton = Qt.QPushButton()
         self._customLogoButton.setToolTip("Browse...")
-        self._customLogoButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("folder-open"))
+        self._customLogoButton.setIcon(Qt.QIcon.fromTheme("folder-open"))
         self._customLogoButton.setMaximumSize(80, 25)
-        self._spacerItem1 = Qt.QSpacerItem(30, 30, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Fixed)
+        self._spacerItem1 = Qt.QSpacerItem(
+            30, 30, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Fixed)
         self._customLogo = Qt.QLabel(self)
         self._customLogo.setAlignment(Qt.Qt.AlignCenter)
         self._customLogo.setMinimumSize(120, 120)
         self._customLogoDefaultButton = Qt.QPushButton()
         self._customLogoDefaultButton.setToolTip("Default")
         self._customLogoDefaultButton.setMaximumSize(80, 25)
-        self._customLogoDefaultButton.setIcon(taurus.qt.qtgui.resource.getIcon(":/actions/edit-undo.svg"))
+        self._customLogoDefaultButton.setIcon(Qt.QIcon("actions:edit-undo.svg"))
         self._customLogoRemoveButton = Qt.QPushButton()
         self._customLogoRemoveButton.setToolTip("Remove")
         self._customLogoRemoveButton.setMaximumSize(80, 25)
-        self._customLogoRemoveButton.setIcon(taurus.qt.qtgui.resource.getIcon(":/emblems/emblem-unreadable.svg"))
-        self._spacerItem2 = Qt.QSpacerItem(30, 30, Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Fixed)
+        self._customLogoRemoveButton.setIcon(
+            Qt.QIcon("emblems:emblem-unreadable.svg"))
+        self._spacerItem2 = Qt.QSpacerItem(
+            30, 30, Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Fixed)
 
         self._layout.addWidget(self._customLogoLabel, 2, 0, Qt.Qt.AlignRight)
-        self._layout.addWidget(self._customLogoLineEdit, 2, 1, Qt.Qt.AlignRight)
+        self._layout.addWidget(self._customLogoLineEdit,
+                               2, 1, Qt.Qt.AlignRight)
         self._layout.addWidget(self._customLogoButton, 2, 2, Qt.Qt.AlignLeft)
-        self._layout.addWidget(self._customLogoDefaultButton, 2, 3, Qt.Qt.AlignLeft)
-        self._layout.addWidget(self._customLogoRemoveButton, 2, 4, Qt.Qt.AlignLeft)
+        self._layout.addWidget(
+            self._customLogoDefaultButton, 2, 3, Qt.Qt.AlignLeft)
+        self._layout.addWidget(
+            self._customLogoRemoveButton, 2, 4, Qt.Qt.AlignLeft)
         self._layout.addItem(self._spacerItem2, 2, 5)
         self._layout.addItem(self._spacerItem1, 3, 2)
-        self._layout.addWidget(self._customLogo, 4, 1, 1, 1, Qt.Qt.AlignHCenter)
+        self._layout.addWidget(self._customLogo, 4, 1,
+                               1, 1, Qt.Qt.AlignHCenter)
 
-        Qt.QObject.connect(self._customLogoButton, Qt.SIGNAL("clicked()"), self._selectImage)
-        Qt.QObject.connect(self._customLogoDefaultButton, Qt.SIGNAL("clicked()"), self._setDefaultImage)
-        Qt.QObject.connect(self._customLogoRemoveButton, Qt.SIGNAL("clicked()"), self._removeImage)
-        Qt.QObject.connect(self._customLogoLineEdit, Qt.SIGNAL("textChanged(const QString&)"), self._changeImage)
+        self._customLogoButton.clicked.connect(self._selectImage)
+        self._customLogoDefaultButton.clicked.connect(self._setDefaultImage)
+        self._customLogoRemoveButton.clicked.connect(self._removeImage)
+        self._customLogoLineEdit.textChanged.connect(self._changeImage)
 
-        self._spacerItem1 = Qt.QSpacerItem(10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
         self._layout.addItem(self._spacerItem1, 8, 0, 1, 1, Qt.Qt.AlignCenter)
         self._status_label = Qt.QLabel("Press next button to continue")
         self.setStatusLabelPalette(self._status_label)
@@ -407,7 +434,8 @@ class CustomLogoPage(BasePage):
         self._setNoImage()
 
     def fromXml(self, xml):
-        customLogo = AppSettingsWizard.getValueFromNode(xml, "CUSTOM_LOGO", None)
+        customLogo = AppSettingsWizard.getValueFromNode(
+            xml, "CUSTOM_LOGO", None)
         if customLogo is None:
             self._setDefaultImage()
         else:
@@ -417,7 +445,8 @@ class CustomLogoPage(BasePage):
         self._customLogoLineEdit.setText(self._customLogoDefaultPath)
 
     def _setNoImage(self):
-        self._customLogo.setPixmap(taurus.qt.qtgui.resource.getThemePixmap("image-missing").scaled(50, 50))
+        self._customLogo.setPixmap(
+            Qt.QIcon.fromTheme("image-missing").pixmap(50, 50))
         self._customLogoPath = None
         self._customLogoRemoveButton.hide()
 
@@ -432,50 +461,41 @@ class CustomLogoPage(BasePage):
             return None
 
     def _selectImage(self):
-            fileName = Qt.QFileDialog.getOpenFileName(self, self.tr("Open File"), Qt.QDir.homePath() , self.tr("Images (*.png *.xpm *.jpg *.jpeg *.svg)"))
-            self._customLogoLineEdit.setText(fileName)
-            self._changeImage()
+        fileName = Qt.QFileDialog.getOpenFileName(self, self.tr(
+            "Open File"), Qt.QDir.homePath(), self.tr("Images (*.png *.xpm *.jpg *.jpeg *.svg)"))
+        self._customLogoLineEdit.setText(fileName)
+        self._changeImage()
 
     def _changeImage(self):
         fileName = str(self._customLogoLineEdit.text())
-        if (len(fileName)):
-            if  fileName[0] == ":":
-                pixmap = taurus.qt.qtgui.resource.getPixmap(fileName)
-                if (pixmap.height()):
-                    image = pixmap.toImage()
+        if len(fileName):
+            if (os.path.exists(fileName)):
+                image = Qt.QImage()
+                if image.load(fileName):
                     self._setImage(image)
                     self._customLogoPath = fileName
                     self._setStatus("Press next button to continue")
                     self._customLogoRemoveButton.show()
                 else:
                     self._setNoImage()
-                    self._setStatus("The resource is invalid")
+                    self._setStatus("The file is invalid")
             else:
-                if (os.path.exists(fileName)):
-                    image = Qt.QImage()
-                    if image.load(fileName):
-                        self._setImage(image)
-                        self._customLogoPath = fileName
-                        self._setStatus("Press next button to continue")
-                        self._customLogoRemoveButton.show()
-                    else:
-                        self._setNoImage()
-                        self._setStatus("The file is invalid")
-                else:
-                    self._setNoImage()
-                    self._setStatus("The file does not exist")
+                self._setNoImage()
+                self._setStatus("The file does not exist")
         else:
             self._setNoImage()
             self._setStatus("No image")
 
-
     def _setImage(self, image):
         if type(image) == Qt.QPixmap:
-            self._customLogo.setPixmap(image.scaled(60, 200, Qt.Qt.KeepAspectRatio))
+            self._customLogo.setPixmap(
+                image.scaled(60, 200, Qt.Qt.KeepAspectRatio))
         elif type(image) == Qt.QImage:
-            self._customLogo.setPixmap(Qt.QPixmap().fromImage(image).scaled(60, 200, Qt.Qt.KeepAspectRatio))
+            self._customLogo.setPixmap(Qt.QPixmap().fromImage(
+                image).scaled(60, 200, Qt.Qt.KeepAspectRatio))
         else:
-            self._customLogo.setPixmap(taurus.qt.qtgui.resource.getThemePixmap("image-missing").scaled(50, 50))
+            self._customLogo.setPixmap(
+                Qt.QPixmap("image-missing").scaled(50, 50))
             self._customLogoPath = None
 
     def _setStatus(self, text):
@@ -483,16 +503,18 @@ class CustomLogoPage(BasePage):
 
 
 class SynopticPage(BasePage):
+
     def __init__(self, parent=None):
         BasePage.__init__(self, parent)
         self._synoptics = []
 
     def fromXml(self, xml):
         self._synoptics = []
-        synopticNodes = AppSettingsWizard.getArrayFromNode(xml, "SYNOPTIC", default=[])
+        synopticNodes = AppSettingsWizard.getArrayFromNode(
+            xml, "SYNOPTIC", default=[])
         for child in synopticNodes:
             if child.get("str") is not None and len(child.get("str")):
-                    self._synoptics.append(child.get("str"))
+                self._synoptics.append(child.get("str"))
 
     def initializePage(self):
         BasePage.initializePage(self)
@@ -502,14 +524,16 @@ class SynopticPage(BasePage):
     def _setupUI(self):
         BasePage._setupUI(self)
         self.setTitle('Synoptics')
-        self._label = Qt.QLabel("If you want to add one or more synoptic panels (graphical views of instruments) select the corresponding JDRAW files here\n")
+        self._label = Qt.QLabel(
+            "If you want to add one or more synoptic panels (graphical views of instruments) select the corresponding JDRAW files here\n")
         self._label.setWordWrap(True)
         self._layout.addWidget(self._label, 0, 0)
         self.setLayout(self._layout)
         self._synopticGroupBox = Qt.QGroupBox()
         self._synopticGroupBox.setCheckable(False)
         self._synopticGroupBox.setAlignment(Qt.Qt.AlignLeft)
-        self._synopticGroupBox.setStyleSheet(" QGroupBox::title {  subcontrol-position: top left; padding: 5 5px; }")
+        self._synopticGroupBox.setStyleSheet(
+            " QGroupBox::title {  subcontrol-position: top left; padding: 5 5px; }")
         self._layout.addWidget(self._synopticGroupBox, 2, 0, 1, 1)
         self._horizontalLayout = Qt.QHBoxLayout(self._synopticGroupBox)
         self._synopticList = Qt.QListWidget(self._synopticGroupBox)
@@ -528,32 +552,33 @@ class SynopticPage(BasePage):
         self._downButton.setStyleSheet("text-align: left;")
         self._verticalLayout.addWidget(self._downButton)
         self._horizontalLayout.addLayout(self._verticalLayout)
-        self._addButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("list-add"))
-        self._removeButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("list-remove"))
-        self._upButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("go-up"))
-        self._downButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("go-down"))
-        Qt.QObject.connect(self._addButton, Qt.SIGNAL("clicked()"), self._addSynoptic)
-        Qt.QObject.connect(self._removeButton, Qt.SIGNAL("clicked()"), self._removeSynoptic)
-        Qt.QObject.connect(self._upButton, Qt.SIGNAL("clicked()"), self._moveUp)
-        Qt.QObject.connect(self._downButton, Qt.SIGNAL("clicked()"), self._moveDown)
-        #Qt.QObject.connect(self._synopticList, Qt.SIGNAL("itemDoubleClicked(QListWidgetItem*)"), self._editSynoptic)
-        self._spacerItem1 = Qt.QSpacerItem(10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
+        self._addButton.setIcon(Qt.QIcon.fromTheme("list-add"))
+        self._removeButton.setIcon(Qt.QIcon.fromTheme("list-remove"))
+        self._upButton.setIcon(Qt.QIcon.fromTheme("go-up"))
+        self._downButton.setIcon(Qt.QIcon.fromTheme("go-down"))
+        self._addButton.clicked.connect(self._addSynoptic)
+        self._removeButton.clicked.connect(self._removeSynoptic)
+        self._upButton.clicked.connect(self._moveUp)
+        self._downButton.clicked.connect(self._moveDown)
+        #self._synopticList.itemDoubleClicked.connect(self._editSynoptic)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
         self._layout.addItem(self._spacerItem1, 8, 0, 1, 1, Qt.Qt.AlignCenter)
         self._status_label = Qt.QLabel("Press next button to continue")
         self.setStatusLabelPalette(self._status_label)
         self._layout.addWidget(self._status_label, 9, 0, 1, 1)
 
-
-    def _addSynoptic (self):
+    def _addSynoptic(self):
         pdir = self.wizard().__getitem__('projectDir')
-        fileNames = Qt.QFileDialog.getOpenFileNames(self, self.tr("Open File"), pdir, self.tr("JDW (*.jdw );; All files (*)"))
+        fileNames = Qt.QFileDialog.getOpenFileNames(self, self.tr(
+            "Open File"), pdir, self.tr("JDW (*.jdw );; All files (*)"))
         for fileName in fileNames:
             fileName = unicode(fileName)
-            if not fileName in self._synoptics:
+            if fileName not in self._synoptics:
                 self._synoptics.append(fileName)
         self._refreshSynopticList()
 
-    def _editSynoptic (self):
+    def _editSynoptic(self):
         # edit
         self._refreshSynopticList()
 
@@ -568,20 +593,24 @@ class SynopticPage(BasePage):
             self._synoptic_id = self._synopticList.selectedIndexes()[0].row()
             if self._synoptic_id > 0:
                 tmp = self._synoptics[self._synoptic_id]
-                self._synoptics[self._synoptic_id] = self._synoptics[self._synoptic_id - 1]
+                self._synoptics[self._synoptic_id] = self._synoptics[
+                    self._synoptic_id - 1]
                 self._synoptics[self._synoptic_id - 1] = tmp
                 self._refreshSynopticList()
-                self._synopticList.setCurrentIndex(self._synopticList.indexFromItem(self._synopticList.item(self._synoptic_id - 1)))
+                self._synopticList.setCurrentIndex(self._synopticList.indexFromItem(
+                    self._synopticList.item(self._synoptic_id - 1)))
 
     def _moveDown(self):
         if len(self._synopticList.selectedIndexes()) > 0:
             self._synoptic_id = self._synopticList.selectedIndexes()[0].row()
             if self._synoptic_id < self._synopticList.count() - 1:
                 tmp = self._synoptics[self._synoptic_id]
-                self._synoptics[self._synoptic_id] = self._synoptics[self._synoptic_id + 1]
+                self._synoptics[self._synoptic_id] = self._synoptics[
+                    self._synoptic_id + 1]
                 self._synoptics[self._synoptic_id + 1] = tmp
                 self._refreshSynopticList()
-                self._synopticList.setCurrentIndex(self._synopticList.indexFromItem(self._synopticList.item(self._synoptic_id + 1)))
+                self._synopticList.setCurrentIndex(self._synopticList.indexFromItem(
+                    self._synopticList.item(self._synoptic_id + 1)))
 
     def _refreshSynopticList(self):
         self._synopticList.clear()
@@ -609,7 +638,8 @@ class MacroServerInfoPage(BasePage):
 
     def initializePage(self):
         BasePage.initializePage(self)
-        self._label.setText("\n <b>%s</b> can communicate with a Sardana's Macro Server and Pool.\nYou can enable and configure them here:\n" % self.wizard().__getitem__("guiName"))
+        self._label.setText("\n <b>%s</b> can communicate with a Sardana's Macro Server and Pool.\nYou can enable and configure them here:\n" %
+                            self.wizard().__getitem__("guiName"))
         self.wizard().__setitem__("macroServerName", self._getMacroServerName)
         self.wizard().__setitem__("doorName", self._getDoorName)
 
@@ -623,8 +653,11 @@ class MacroServerInfoPage(BasePage):
         self._macroGroupBox.setCheckable(True)
         self._macroGroupBox.setChecked(False)
         self._macroGroupBox.setAlignment(Qt.Qt.AlignLeft)
-        self._macroGroupBox.setStyleSheet(" QGroupBox::title {  subcontrol-position: top left; padding: 5 5px; }")
+        self._macroGroupBox.setStyleSheet(
+            " QGroupBox::title {  subcontrol-position: top left; padding: 5 5px; }")
         self._horizontalLayout = Qt.QHBoxLayout(self._macroGroupBox)
+        from sardana.taurus.qt.qtgui.extra_macroexecutor.common import \
+                TaurusMacroConfigurationDialog
         self._confWidget = TaurusMacroConfigurationDialog(self)
         self._confWidget.setWindowFlags(Qt.Qt.Widget)
         self._confWidget.setModal(False)
@@ -635,22 +668,29 @@ class MacroServerInfoPage(BasePage):
         self._layout.addWidget(self._label, 0, 0, 1, 1)
         self._layout.addWidget(self._macroGroupBox, 1, 0, 1, 1)
 
-        self._spacerItem1 = Qt.QSpacerItem(10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
         self._layout.addItem(self._spacerItem1, 8, 0, 1, 1, Qt.Qt.AlignCenter)
         self._status_label = Qt.QLabel("Press next button to continue")
         self.setStatusLabelPalette(self._status_label)
         self._layout.addWidget(self._status_label, 9, 0, 1, 1)
 
-        Qt.QObject.connect(self._confWidget.macroServerComboBox, Qt.SIGNAL("currentIndexChanged(const QString&)"), self.checkData)
-        Qt.QObject.connect(self._confWidget.doorComboBox, Qt.SIGNAL("currentIndexChanged(const QString&)"), self.checkData)
-        Qt.QObject.connect(self._macroGroupBox, Qt.SIGNAL("toggled(bool)"), self.checkData)
+        self._confWidget.macroServerComboBox.currentIndexChanged.connect(
+            self.checkData)
+        self._confWidget.doorComboBox.currentIndexChanged.connect(
+            self.checkData)
+        self._macroGroupBox.toggled.connect(self.checkData)
 
     def fromXml(self, xml):
-        macroserverName = AppSettingsWizard.getValueFromNode(xml, "MACROSERVER_NAME", default="")
-        doorName = AppSettingsWizard.getValueFromNode(xml, "DOOR_NAME", default="")
-        macroEditorsPath = AppSettingsWizard.getValueFromNode(xml, "MACROEDITORS_PATH", default="")
-
-        id = self._confWidget.macroServerComboBox.findText(macroserverName, Qt.Qt.MatchExactly)
+        macroserverName = AppSettingsWizard.getValueFromNode(
+            xml, "MACROSERVER_NAME", default="")
+        doorName = AppSettingsWizard.getValueFromNode(
+            xml, "DOOR_NAME", default="")
+        macroEditorsPath = AppSettingsWizard.getValueFromNode(
+            xml, "MACROEDITORS_PATH", default="")
+
+        id = self._confWidget.macroServerComboBox.findText(
+            macroserverName, Qt.Qt.MatchExactly)
         if id >= 0:
             self._confWidget.macroServerComboBox.setCurrentIndex(id)
             self._macroGroupBox.setChecked(True)
@@ -658,7 +698,8 @@ class MacroServerInfoPage(BasePage):
             self._macroGroupBox.setChecked(False)
             return
 
-        id = self._confWidget.doorComboBox.findText(doorName, Qt.Qt.MatchExactly)
+        id = self._confWidget.doorComboBox.findText(
+            doorName, Qt.Qt.MatchExactly)
         if id >= 0:
             self._confWidget.doorComboBox.setCurrentIndex(id)
 
@@ -686,13 +727,15 @@ class MacroServerInfoPage(BasePage):
 
 
 class InstrumentsPage(BasePage):
+
     def __init__(self, parent=None):
         BasePage.__init__(self, parent)
 
     def initializePage(self):
         BasePage.initializePage(self)
         self.wizard().__setitem__("instruments", self._getInstruments)
-        self._label.setText("<b>%s</b> can use instrument information stored in the Sardana's Pool to create instrument panels." % self.wizard().__getitem__("guiName"))
+        self._label.setText("<b>%s</b> can use instrument information stored in the Sardana's Pool to create instrument panels." %
+                            self.wizard().__getitem__("guiName"))
 
     def _setupUI(self):
         BasePage._setupUI(self)
@@ -704,17 +747,21 @@ class InstrumentsPage(BasePage):
         self._instrumentsLabel = Qt.QLabel("Generate panels from Pool Info?")
         self._intstrumentsBoolean = BooleanWidget()
         self._intstrumentsBoolean.setMinimumSize(150, 25)
-        self._layout.addWidget(self._instrumentsLabel, 5, 0, 1, 1, Qt.Qt.AlignRight)
-        self._layout.addWidget(self._intstrumentsBoolean, 5, 1, 1, 1, Qt.Qt.AlignRight)
+        self._layout.addWidget(self._instrumentsLabel, 5,
+                               0, 1, 1, Qt.Qt.AlignRight)
+        self._layout.addWidget(self._intstrumentsBoolean,
+                               5, 1, 1, 1, Qt.Qt.AlignRight)
 
-        self._spacerItem1 = Qt.QSpacerItem(10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
         self._layout.addItem(self._spacerItem1, 8, 0, 1, 1, Qt.Qt.AlignCenter)
         self._status_label = Qt.QLabel("Press next button to continue")
         self.setStatusLabelPalette(self._status_label)
         self._layout.addWidget(self._status_label, 9, 0, 1, 3)
 
     def fromXml(self, xml):
-        instruments = AppSettingsWizard.getValueFromNode(xml, "INSTRUMENTS_FROM_POOL", default="False")
+        instruments = AppSettingsWizard.getValueFromNode(
+            xml, "INSTRUMENTS_FROM_POOL", default="False")
         if str(instruments).lower() == "true":
             self._intstrumentsBoolean.setValue(True)
         else:
@@ -744,13 +791,15 @@ class PanelsPage(BasePage):
     def _setupUI(self):
         BasePage._setupUI(self)
         self.setTitle('Panels editor')
-        self._label = Qt.QLabel("If you want extra panels add them to this list\n")
+        self._label = Qt.QLabel(
+            "If you want extra panels add them to this list\n")
         self._layout.addWidget(self._label, 0, 0)
         self.setLayout(self._layout)
         self._panelGroupBox = Qt.QGroupBox()
         self._panelGroupBox.setCheckable(False)
         self._panelGroupBox.setAlignment(Qt.Qt.AlignLeft)
-        self._panelGroupBox.setStyleSheet(" QGroupBox::title {  subcontrol-position: top left; padding: 5 5px; }")
+        self._panelGroupBox.setStyleSheet(
+            " QGroupBox::title {  subcontrol-position: top left; padding: 5 5px; }")
         self._layout.addWidget(self._panelGroupBox, 2, 0, 1, 1)
         self._horizontalLayout = Qt.QHBoxLayout(self._panelGroupBox)
         self._panelList = Qt.QListWidget(self._panelGroupBox)
@@ -769,16 +818,17 @@ class PanelsPage(BasePage):
         self._downButton.setStyleSheet("text-align: left;")
         self._verticalLayout.addWidget(self._downButton)
         self._horizontalLayout.addLayout(self._verticalLayout)
-        self._addButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("list-add"))
-        self._removeButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("list-remove"))
-        self._upButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("go-up"))
-        self._downButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("go-down"))
-        Qt.QObject.connect(self._addButton, Qt.SIGNAL("clicked()"), self._addPanel)
-        Qt.QObject.connect(self._removeButton, Qt.SIGNAL("clicked()"), self._removePanel)
-        Qt.QObject.connect(self._upButton, Qt.SIGNAL("clicked()"), self._moveUp)
-        Qt.QObject.connect(self._downButton, Qt.SIGNAL("clicked()"), self._moveDown)
-        Qt.QObject.connect(self._panelList, Qt.SIGNAL("itemDoubleClicked(QListWidgetItem*)"), self._editPanel)
-        self._spacerItem1 = Qt.QSpacerItem(10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
+        self._addButton.setIcon(Qt.QIcon.fromTheme("list-add"))
+        self._removeButton.setIcon(Qt.QIcon.fromTheme("list-remove"))
+        self._upButton.setIcon(Qt.QIcon.fromTheme("go-up"))
+        self._downButton.setIcon(Qt.QIcon.fromTheme("go-down"))
+        self._addButton.clicked.connect(self._addPanel)
+        self._removeButton.clicked.connect(self._removePanel)
+        self._upButton.clicked.connect(self._moveUp)
+        self._downButton.clicked.connect(self._moveDown)
+        self._panelList.itemDoubleClicked.connect(self._editPanel)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
         self._layout.addItem(self._spacerItem1, 8, 0, 1, 1, Qt.Qt.AlignCenter)
         self._status_label = Qt.QLabel("Press next button to continue")
         self.setStatusLabelPalette(self._status_label)
@@ -786,21 +836,24 @@ class PanelsPage(BasePage):
 
     def fromXml(self, xml):
         self._panels = []
-        panelNodes = AppSettingsWizard.getArrayFromNode(xml, "PanelDescriptions", default=[])
+        panelNodes = AppSettingsWizard.getArrayFromNode(
+            xml, "PanelDescriptions", default=[])
         for child in panelNodes:
-            name = AppSettingsWizard.getValueFromNode(child, "name", default=None)
+            name = AppSettingsWizard.getValueFromNode(
+                child, "name", default=None)
             if name:
                 self._panels.append((name, etree.tostring(child)))
 
-    def _addPanel (self):
-        paneldesc, ok = taurus.qt.qtgui.taurusgui.paneldescriptionwizard.PanelDescriptionWizard.getDialog(self)
+    def _addPanel(self):
+        paneldesc, ok = taurus.qt.qtgui.taurusgui.paneldescriptionwizard.PanelDescriptionWizard.getDialog(
+            self)
         if ok:
             w = paneldesc.getWidget()
             self._panels.append((paneldesc.name, paneldesc.toXml()))
 
         self._refreshPanelList()
 
-    def _editPanel (self):
+    def _editPanel(self):
         # edit
         self._refreshPanelList()
 
@@ -818,7 +871,8 @@ class PanelsPage(BasePage):
                 self._panels[self._panel_id] = self._panels[self._panel_id - 1]
                 self._panels[self._panel_id - 1] = tmp
                 self._refreshPanelList()
-                self._panelList.setCurrentIndex(self._panelList.indexFromItem(self._panelList.item(self._panel_id - 1)))
+                self._panelList.setCurrentIndex(self._panelList.indexFromItem(
+                    self._panelList.item(self._panel_id - 1)))
 
     def _moveDown(self):
         if len(self._panelList.selectedIndexes()) > 0:
@@ -828,7 +882,8 @@ class PanelsPage(BasePage):
                 self._panels[self._panel_id] = self._panels[self._panel_id + 1]
                 self._panels[self._panel_id + 1] = tmp
                 self._refreshPanelList()
-                self._panelList.setCurrentIndex(self._panelList.indexFromItem(self._panelList.item(self._panel_id + 1)))
+                self._panelList.setCurrentIndex(self._panelList.indexFromItem(
+                    self._panelList.item(self._panel_id + 1)))
 
     def _refreshPanelList(self):
         self._panelList.clear()
@@ -855,12 +910,14 @@ class ExternalAppEditor(Qt.QDialog):
     A dialog for configuring an external appaction for a TaurusMainWindow.
     '''
     #@todo: this class should be made more generic (e.g. provide a getter for an ExternalAppAction) and then moved elsewhere
+
     def __init__(self, parent=None):
         Qt.QDialog.__init__(self, parent)
         self.setModal(True)
         self.setWindowTitle('External Application Editor')
 
-        self._dlgBox = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel)
+        self._dlgBox = Qt.QDialogButtonBox(
+            Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel)
 
         self._layout = Qt.QVBoxLayout()
         self._layout1 = Qt.QGridLayout()
@@ -871,15 +928,16 @@ class ExternalAppEditor(Qt.QDialog):
         self.setLayout(self._layout)
 
         self._icon = None
-        self._label = Qt.QLabel("\n On this page you can define an external application. \n")
+        self._label = Qt.QLabel(
+            "\n On this page you can define an external application. \n")
         self._label.setWordWrap(True)
         self._layout1.addWidget(self._label, 0, 0, 1, 4)
         self._execFileLabel = Qt.QLabel("Command:")
         self._execFileLineEdit = Qt.QLineEdit()
         self._execFileLineEdit.setMinimumSize(150, 25)
-        #self._execFileLineEdit.setReadOnly(True)
+        # self._execFileLineEdit.setReadOnly(True)
         self._execFileButton = Qt.QPushButton()
-        self._execFileButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("folder-open"))
+        self._execFileButton.setIcon(Qt.QIcon.fromTheme("folder-open"))
         self._execFileButton.setToolTip("Browse...")
         self._execFileButton.setMaximumSize(80, 25)
         self._layout1.addWidget(self._execFileLabel, 2, 0, Qt.Qt.AlignRight)
@@ -898,25 +956,23 @@ class ExternalAppEditor(Qt.QDialog):
 
         self._iconLabel = Qt.QLabel("Icon:")
         self._iconLogo = Qt.QPushButton()
-        self._iconLogo.setIcon(Qt.QIcon(taurus.qt.qtgui.resource.getThemePixmap("image-missing")))
+        self._iconLogo.setIcon(Qt.QIcon("status:image-missing.svg"))
         self._iconLogo.setIconSize(Qt.QSize(60, 60))
-        self._iconLogo.setStyleSheet(" QPushButton:flat { border: none; /* no border for a flat push button */} ")
-        self._iconLogo.setFlat(True)
         self._layout1.addWidget(self._iconLabel, 5, 0, Qt.Qt.AlignRight)
         self._layout1.addWidget(self._iconLogo, 5, 1, Qt.Qt.AlignCenter)
-        self._spacerItem1 = Qt.QSpacerItem(10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
         self._layout1.addItem(self._spacerItem1, 8, 0, 1, 1, Qt.Qt.AlignCenter)
 
-        #connections
-        Qt.QObject.connect(self._execFileButton, Qt.SIGNAL("clicked()"), self._selectExecFile)
-        Qt.QObject.connect(self._execFileLineEdit, Qt.SIGNAL("textChanged(const QString&)"), self._setDefaultText)
-        Qt.QObject.connect(self._iconLogo, Qt.SIGNAL("clicked()"), self._selectIcon)
-        self.connect(self._dlgBox, Qt.SIGNAL('accepted()'), self.accept)
-        self.connect(self._dlgBox, Qt.SIGNAL('rejected()'), self.reject)
+        # connections
+        self._execFileButton.clicked.connect(self._selectExecFile)
+        self._execFileLineEdit.textChanged.connect(self._setDefaultText)
+        self._iconLogo.clicked.connect(self._selectIcon)
+        self._dlgBox.accepted.connect(self.accept)
+        self._dlgBox.rejected.connect(self.reject)
         self.checkData()
         self._setIcon(ExternalAppAction.DEFAULT_ICON_NAME)
 
-
     def checkData(self):
         if len(self._execFileLineEdit.text()) > 0:
             self._dlgBox.button(Qt.QDialogButtonBox.Ok).setEnabled(True)
@@ -927,73 +983,41 @@ class ExternalAppEditor(Qt.QDialog):
         fileName = self._execFileLineEdit.text().split('/')[-1]
         index = str(fileName).rfind(".")
         if (index > 0):
-            self._textLineEdit.setText (str(fileName)[0:index])
+            self._textLineEdit.setText(str(fileName)[0:index])
         else:
             self._textLineEdit.setText(fileName)
         self.checkData()
 
     def _selectExecFile(self):
-        filePath = Qt.QFileDialog.getOpenFileName(self, self.tr("Open File"), Qt.QDir.homePath(), self.tr("All files (*)"))
+        filePath = Qt.QFileDialog.getOpenFileName(self, self.tr(
+            "Open File"), Qt.QDir.homePath(), self.tr("All files (*)"))
         if len(filePath):
             self._execFileLineEdit.setText(filePath)
             self._setDefaultText()
-            
+
     def _getExecFile(self):
         return str(self._execFileLineEdit.text())
 
     def _selectIcon(self):
-        iconNameList = []
-        pixmapList = {}
-        rowIconName = []
-        #rowPixmap=[]
-        rowSize = 7
-        r = 0
-        i = 0
-
-        progressBar = Qt.QProgressDialog  ("Loading icons...", "Abort", 0, len(taurus.qt.qtgui.resource.getThemeMembers().items()), self)
-        progressBar.setModal(True)
-        progressBar.setMinimumDuration(0)
-
-        for k, v in taurus.qt.qtgui.resource.getThemeMembers().items():
-            progressBar.setValue(progressBar.value() + 1)
-            progressBar.setLabelText(k)
-            for iconName in v:
-                if (not progressBar.wasCanceled()):
-                    p = taurus.qt.qtgui.resource.getThemePixmap(iconName)
-                    rowIconName.append(iconName)
-                    pixmapList[iconName] = p
-                    i = i + 1
-                    if r == rowSize - 1:
-                        r = 0
-                        iconNameList.append(rowIconName)
-                        rowIconName = []
-                    else:
-                        r = r + 1
-
-        if (len (rowIconName) > 0) and not (progressBar.wasCanceled()):
-            iconNameList.append(rowIconName)
-
-        if not progressBar.wasCanceled():
-            progressBar.close()
-            name, ok = taurus.qt.qtgui.input.GraphicalChoiceDlg.getChoice(parent=None, title='Panel chooser', msg='Choose the type of Panel:', choices=iconNameList, pixmaps=pixmapList, iconSize=60)
-            if ok:
-                self._setIcon(name)
-        else:
-            progressBar.close()
-
-    def _setIcon(self , name):
-        if taurus.qt.qtgui.resource.getThemePixmap(name).width() != 0:
-            self._iconLogo.setIcon(Qt.QIcon(taurus.qt.qtgui.resource.getThemePixmap(name)))
-            self._iconLogo.setIconSize(Qt.QSize(60, 60))
-            self._iconLogo.setText("")
-            self._icon = name
-        else:
-            self._iconLogo.setText(name)
-            self._icon = name
+        from taurus.qt.qtgui.icon import QIconCatalog
+        catalog = QIconCatalog()
+        dlg = Qt.QDialog(self)
+        dlg.setLayout(Qt.QVBoxLayout())
+        dlg.layout().addWidget(catalog)
+        dlg.setWindowTitle('Icon Catalog')
+        catalog.iconSelected.connect(self._setIcon)
+        catalog.iconSelected.connect(dlg.accept)
+        dlg.exec_()
+
+    def _setIcon(self, name):
+        self._iconLogo.setIcon(Qt.QIcon(name))
+        self._iconLogo.setIconSize(Qt.QSize(60, 60))
+        self._iconLogo.setText("")
+        self._icon = name
 
     def _getParams(self):
         return str(self._paramsLineEdit.text())
-        #return str(self._paramsLineEdit.text()).split()
+        # return str(self._paramsLineEdit.text()).split()
 
     def _getText(self):
         return str(self._textLineEdit.text())
@@ -1018,10 +1042,11 @@ class ExternalAppEditor(Qt.QDialog):
     def getDialog():
         dlg = ExternalAppEditor()
         dlg.exec_()
-        return dlg._getExecFile(), dlg._toXml() , (dlg.result() == dlg.Accepted)
+        return dlg._getExecFile(), dlg._toXml(), (dlg.result() == dlg.Accepted)
 
 
 class ExternalAppPage(BasePage):
+
     def __init__(self, parent=None):
         BasePage.__init__(self, parent)
         self._externalApps = []
@@ -1034,13 +1059,15 @@ class ExternalAppPage(BasePage):
     def _setupUI(self):
         BasePage._setupUI(self)
         self.setTitle('External Applications')
-        self._label = Qt.QLabel("The GUI may include shortcuts to external applications. You can add them now.\n")
+        self._label = Qt.QLabel(
+            "The GUI may include shortcuts to external applications. You can add them now.\n")
         self._layout.addWidget(self._label, 0, 0)
         self.setLayout(self._layout)
         self._externalAppGroupBox = Qt.QGroupBox()
         self._externalAppGroupBox.setCheckable(False)
         self._externalAppGroupBox.setAlignment(Qt.Qt.AlignLeft)
-        self._externalAppGroupBox.setStyleSheet(" QGroupBox::title {  subcontrol-position: top left; padding: 5 5px; }")
+        self._externalAppGroupBox.setStyleSheet(
+            " QGroupBox::title {  subcontrol-position: top left; padding: 5 5px; }")
         self._layout.addWidget(self._externalAppGroupBox, 2, 0, 1, 1)
         self._horizontalLayout = Qt.QHBoxLayout(self._externalAppGroupBox)
         self._externalAppList = Qt.QListWidget(self._externalAppGroupBox)
@@ -1059,16 +1086,17 @@ class ExternalAppPage(BasePage):
         self._downButton.setStyleSheet("text-align: left;")
         self._verticalLayout.addWidget(self._downButton)
         self._horizontalLayout.addLayout(self._verticalLayout)
-        self._addButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("list-add"))
-        self._removeButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("list-remove"))
-        self._upButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("go-up"))
-        self._downButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("go-down"))
-        Qt.QObject.connect(self._addButton, Qt.SIGNAL("clicked()"), self._addApplication)
-        Qt.QObject.connect(self._removeButton, Qt.SIGNAL("clicked()"), self._removeApplication)
-        Qt.QObject.connect(self._upButton, Qt.SIGNAL("clicked()"), self._moveUp)
-        Qt.QObject.connect(self._downButton, Qt.SIGNAL("clicked()"), self._moveDown)
-        Qt.QObject.connect(self._externalAppList, Qt.SIGNAL("itemDoubleClicked(QListWidgetItem*)"), self._editApplication)
-        self._spacerItem1 = Qt.QSpacerItem(10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
+        self._addButton.setIcon(Qt.QIcon.fromTheme("list-add"))
+        self._removeButton.setIcon(Qt.QIcon.fromTheme("list-remove"))
+        self._upButton.setIcon(Qt.QIcon.fromTheme("go-up"))
+        self._downButton.setIcon(Qt.QIcon.fromTheme("go-down"))
+        self._addButton.clicked.connect(self._addApplication)
+        self._removeButton.clicked.connect(self._removeApplication)
+        self._upButton.clicked.connect(self._moveUp)
+        self._downButton.clicked.connect(self._moveDown)
+        self._externalAppList.itemDoubleClicked.connect(self._editApplication)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
         self._layout.addItem(self._spacerItem1, 8, 0, 1, 1, Qt.Qt.AlignCenter)
         self._status_label = Qt.QLabel("Press next button to continue")
         self.setStatusLabelPalette(self._status_label)
@@ -1076,20 +1104,22 @@ class ExternalAppPage(BasePage):
 
     def fromXml(self, xml):
         self._externalApps = []
-        panelNodes = AppSettingsWizard.getArrayFromNode(xml, "ExternalApps", default=[])
+        panelNodes = AppSettingsWizard.getArrayFromNode(
+            xml, "ExternalApps", default=[])
         for child in panelNodes:
-            name = AppSettingsWizard.getValueFromNode(child, "command", default=None)
+            name = AppSettingsWizard.getValueFromNode(
+                child, "command", default=None)
             if name:
                 self._externalApps.append((name, etree.tostring(child)))
 
-    def _addApplication (self):
+    def _addApplication(self):
         name, xml, ok = ExternalAppEditor.getDialog()
         if ok:
             self._externalApps.append((name, xml))
 
         self._refreshApplicationList()
 
-    def _editApplication (self):
+    def _editApplication(self):
         # edit
         self._refreshApplicationList()
 
@@ -1104,20 +1134,24 @@ class ExternalAppPage(BasePage):
             self._app_id = self._externalAppList.selectedIndexes()[0].row()
             if self._app_id > 0:
                 tmp = self._externalApps[self._app_id]
-                self._externalApps[self._app_id] = self._externalApps[self._app_id - 1]
+                self._externalApps[self._app_id] = self._externalApps[
+                    self._app_id - 1]
                 self._externalApps[self._app_id - 1] = tmp
                 self._refreshApplicationList()
-                self._externalAppList.setCurrentIndex(self._externalAppList.indexFromItem(self._externalAppList.item(self._app_id - 1)))
+                self._externalAppList.setCurrentIndex(self._externalAppList.indexFromItem(
+                    self._externalAppList.item(self._app_id - 1)))
 
     def _moveDown(self):
         if len(self._externalAppList.selectedIndexes()) > 0:
             self._app_id = self._externalAppList.selectedIndexes()[0].row()
             if self._app_id < self._externalAppList.count() - 1:
                 tmp = self._externalApps[self._app_id]
-                self._externalApps[self._app_id] = self._externalApps[self._app_id + 1]
+                self._externalApps[self._app_id] = self._externalApps[
+                    self._app_id + 1]
                 self._externalApps[self._app_id + 1] = tmp
                 self._refreshApplicationList()
-                self._externalAppList.setCurrentIndex(self._externalAppList.indexFromItem(self._externalAppList.item(self._app_id + 1)))
+                self._externalAppList.setCurrentIndex(self._externalAppList.indexFromItem(
+                    self._externalAppList.item(self._app_id + 1)))
 
     def _refreshApplicationList(self):
         self._externalAppList.clear()
@@ -1138,7 +1172,9 @@ class ExternalAppPage(BasePage):
     def _setStatus(self, text):
         self._status_label.setText(text)
 
+
 class MonitorPage(BasePage):
+
     def __init__(self, parent=None):
         BasePage.__init__(self, parent)
 
@@ -1149,52 +1185,57 @@ class MonitorPage(BasePage):
     def _setupUI(self):
         BasePage._setupUI(self)
         self.setTitle('Monitor List')
-        self._label = Qt.QLabel("\nIf you want to monitor some attributes, add them to the monitor list. \n")
+        self._label = Qt.QLabel(
+            "\nIf you want to monitor some attributes, add them to the monitor list. \n")
         self._label.setWordWrap(True)
         self._layout.addWidget(self._label, 0, 0, 1, 4)
         self._monitorLabel = Qt.QLabel("Monitor List:")
         self._monitorLineEdit = Qt.QLineEdit()
-        self._monitorLineEdit.setToolTip("Comma-separated list of attribute names")
+        self._monitorLineEdit.setToolTip(
+            "Comma-separated list of attribute names")
         self._monitorLineEdit.setMinimumSize(400, 25)
         self._monitorLineEdit.setReadOnly(False)
         self._monitorButton = Qt.QPushButton()
         self._monitorButton.setToolTip("Browse...")
-        #self._monitorButton.setIcon(taurus.qt.qtgui.resource.getThemeIcon("system-search"))
-        self._monitorButton.setIcon(taurus.qt.qtgui.resource.getIcon(":/designer/devs_tree.png"))
+        # self._monitorButton.setIcon(Qt.QIcon.fromTheme("system-search"))
+        self._monitorButton.setIcon(Qt.QIcon("designer:devs_tree.png"))
         self._monitorButton.setMaximumSize(80, 25)
         self._monitorClearButton = Qt.QPushButton()
         self._monitorClearButton.setToolTip("Clear")
         self._monitorClearButton.setMaximumSize(80, 25)
-        self._monitorClearButton.setIcon(taurus.qt.qtgui.resource.getIcon(":/actions/edit-clear.svg"))
+        self._monitorClearButton.setIcon(Qt.QIcon("actions:edit-clear.svg"))
         self._layout.addWidget(self._monitorLabel, 2, 0, Qt.Qt.AlignRight)
         self._layout.addWidget(self._monitorLineEdit, 2, 1, Qt.Qt.AlignRight)
         self._layout.addWidget(self._monitorButton, 2, 2, Qt.Qt.AlignLeft)
         self._layout.addWidget(self._monitorClearButton, 2, 3, Qt.Qt.AlignLeft)
-        Qt.QObject.connect(self._monitorButton, Qt.SIGNAL("clicked()"), self._selectMonitor)
-        Qt.QObject.connect(self._monitorClearButton, Qt.SIGNAL("clicked()"), self._clearMonitor)
-        #self._synopticClear.hide()
+        self._monitorButton.clicked.connect(self._selectMonitor)
+        self._monitorClearButton.clicked.connect(self._clearMonitor)
+        # self._synopticClear.hide()
 
-        self._spacerItem1 = Qt.QSpacerItem(10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
+        self._spacerItem1 = Qt.QSpacerItem(
+            10, 0, Qt.QSizePolicy.Fixed, Qt.QSizePolicy.Expanding)
         self._layout.addItem(self._spacerItem1, 8, 0, 1, 1, Qt.Qt.AlignCenter)
         self._status_label = Qt.QLabel("Press next button to continue")
         self.setStatusLabelPalette(self._status_label)
         self._layout.addWidget(self._status_label, 9, 0, 1, 4)
 
     def fromXml(self, xml):
-        self._monitorLineEdit.setText(AppSettingsWizard.getValueFromNode(xml, "MONITOR", default=""))
+        self._monitorLineEdit.setText(
+            AppSettingsWizard.getValueFromNode(xml, "MONITOR", default=""))
 
     def _clearMonitor(self):
         self._monitorLineEdit.clear()
-        #self._monitorClearButton.hide()
+        # self._monitorClearButton.hide()
 
     def _getMonitor(self):
         return str(self._monitorLineEdit.text())
 
     def _selectMonitor(self):
-            models, ok = taurus.qt.qtgui.panel.TaurusModelChooser.modelChooserDlg(host=None)
-            if ok:
-                self._monitorLineEdit.setText(",".join(models))
-            self.checkData()
+        models, ok = taurus.qt.qtgui.panel.TaurusModelChooser.modelChooserDlg(
+            host=None)
+        if ok:
+            self._monitorLineEdit.setText(",".join(models))
+        self.checkData()
 
     def _setStatus(self, text):
         self._status_label.setText(text)
@@ -1209,30 +1250,31 @@ class OutroPage(BasePage):
         self._label1 = Qt.QLabel("XML configuration file:")
         self._layout.addWidget(self._label1, 0, 0)
         self._xml = Qt.QTextEdit()
-        self._xml.setSizePolicy(Qt.QSizePolicy(Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Expanding))
+        self._xml.setSizePolicy(Qt.QSizePolicy(
+            Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Expanding))
         self._layout.addWidget(self._xml, 1, 0)
         self._label2 = Qt.QLabel("Files copied")
         self._layout.addWidget(self._label2, 2, 0)
         self._substTable = Qt.QTableWidget()
         self._substTable.setColumnCount(2)
         self._substTable.setEditTriggers(self._substTable.NoEditTriggers)
-        self._substTable.setHorizontalHeaderLabels (('Original file', 'File in Project dir'))
-        self._substTable.setSizePolicy(Qt.QSizePolicy(Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Expanding))
+        self._substTable.setHorizontalHeaderLabels(
+            ('Original file', 'File in Project dir'))
+        self._substTable.setSizePolicy(Qt.QSizePolicy(
+            Qt.QSizePolicy.Expanding, Qt.QSizePolicy.Expanding))
         self._layout.addWidget(self._substTable, 3, 0)
 
-
     def _getXml(self):
         return str(self._xml.toPlainText())
 
-
     def saveFile(self, fileName):
         file = Qt.QFile(fileName)
 
         if not file.open(Qt.QFile.WriteOnly | Qt.QFile.Text):
             Qt.QMessageBox.warning(self, self.tr("Saving XML..."),
-                    self.tr("Cannot write file %1:\n%2.")
-                    .arg(fileName)
-                    .arg(file.errorString()))
+                                   self.tr("Cannot write file %1:\n%2.")
+                                   .arg(fileName)
+                                   .arg(file.errorString()))
             return False
 
         file.write(str(self._xml.toPlainText()))
@@ -1259,47 +1301,53 @@ class OutroPage(BasePage):
             self.createProject()
         except Exception, e:
             Qt.QMessageBox.warning(self, 'Error creating project',
-                                    'Could not create project files. \nReason:%s' % repr(e),
-                                     Qt.QMessageBox.Cancel)
+                                   'Could not create project files. \nReason:%s' % repr(
+                                       e),
+                                   Qt.QMessageBox.Cancel)
             import traceback
             traceback.print_exc()
             return False
         return True
 
     def createProject(self):
-        #prepare a log file
+        # prepare a log file
         pdir = self.wizard().__getitem__('projectDir')
         logfilename = os.path.join(pdir, 'wizard.log')
         logfile = open(logfilename, 'w')
-        logfile.write('Project created by AppSettingsWizard on %s\n' % datetime.datetime.now().isoformat())
-        #copy files
+        logfile.write('Project created by AppSettingsWizard on %s\n' %
+                      datetime.datetime.now().isoformat())
+        # copy files
         for i in range(self._substTable.rowCount()):
             src = unicode(self._substTable.item(i, 0).text())
-            dst = os.path.join(pdir, unicode(self._substTable.item(i, 1).text()))
+            dst = os.path.join(pdir, unicode(
+                self._substTable.item(i, 1).text()))
             if os.path.normpath(src) != os.path.normpath(dst):
                 shutil.copy(src, dst)
                 logfile.write('File copied: %s --> %s\n' % (src, dst))
-        #write xml config file
-        xmlcfgfilename = os.path.join(pdir, self.wizard().getXmlConfigFileName())
+        # write xml config file
+        xmlcfgfilename = os.path.join(
+            pdir, self.wizard().getXmlConfigFileName())
         f = open(xmlcfgfilename, 'w')
         f.write(unicode(self._xml.toPlainText()))
         f.close()
         logfile.write('XML Config file created: "%s"\n' % xmlcfgfilename)
-        #write python config file
-        pycfgfilename = os.path.join(pdir, '%s.py' % self.wizard().getConfigFilePrefix())
+        # write python config file
+        pycfgfilename = os.path.join(
+            pdir, '%s.py' % self.wizard().getConfigFilePrefix())
         f = open(pycfgfilename, 'w')
         f.write("XML_CONFIG = '%s'" % self.wizard().getXmlConfigFileName())
         f.close()
         logfile.write('Python config file created: "%s"\n' % pycfgfilename)
-        #write __init__.py config file
+        # write __init__.py config file
         initfilename = os.path.join(pdir, '__init__.py')
         f = open(initfilename, 'w')
         f.write('from config import *')
         f.close()
         logfile.write('python init file created: "%s"\n' % initfilename)
-        #write launcher script
+        # write launcher script
         try:
-            launcherfilename = os.path.join(pdir, self.wizard().__getitem__("guiName"))
+            launcherfilename = os.path.join(
+                pdir, self.wizard().__getitem__("guiName"))
             f = open(launcherfilename, 'w')
             f.write(('#!/bin/sh\n'
                      '#Make sure to give this file execution permisions\n'
@@ -1308,8 +1356,9 @@ class OutroPage(BasePage):
             os.chmod(launcherfilename, 0755)
             logfile.write('Unix launcher created: "%s"\n' % launcherfilename)
         except:
-            logfile.write('Error creating Unix launcher: "%s"\n' % launcherfilename)
-        #if all went ok...
+            logfile.write('Error creating Unix launcher: "%s"\n' %
+                          launcherfilename)
+        # if all went ok...
         msg = 'Application project was successfully created. You can find the files in: "%s"' % pdir
         msg += '\nTip: copy this directory into a directory that is in your Python path.'
         details = ''
@@ -1320,7 +1369,8 @@ class OutroPage(BasePage):
                 details += '- %s: %s\n\n' % (short, long)
         logfile.write(msg + details)
         logfile.close()
-        dlg = Qt.QMessageBox(Qt.QMessageBox.Information, 'Application project created', msg, Qt.QMessageBox.Ok, self)
+        dlg = Qt.QMessageBox(Qt.QMessageBox.Information,
+                             'Application project created', msg, Qt.QMessageBox.Ok, self)
         dlg.setDetailedText(details)
         dlg.exec_()
 
@@ -1329,13 +1379,15 @@ class AppSettingsWizard(Qt.QWizard):
     """
     This Wizard provide functionality for creating from scratch a configuration
     directory for a TaurusGUI based application.
-    
+
     The files in the configuration dir determine the default, permanent, pre-defined
     contents of the GUI. While the user may add/remove more elements at run
     time and those customizations will also be stored, this file defines what a
     user will find when launching the GUI for the first time.
     """
-    Pages = Enumeration('Pages', ('IntroPage', 'ProjectPage', 'GeneralSettings', 'CustomLogoPage', 'SynopticPage', 'MacroServerInfo', 'InstrumentsPage', 'PanelsPage', 'ExternalAppPage', 'MonitorPage', 'OutroPage'))
+    Pages = Enumeration('Pages', ('IntroPage', 'ProjectPage', 'GeneralSettings', 'CustomLogoPage', 'SynopticPage',
+                                  'MacroServerInfo', 'InstrumentsPage', 'PanelsPage', 'ExternalAppPage', 'MonitorPage', 'OutroPage'))
+
     def __init__(self, parent=None, jdrawCommand='jdraw', configFilePrefix='config'):
         Qt.QWizard.__init__(self, parent)
         self.installEventFilter(self)
@@ -1391,7 +1443,7 @@ class AppSettingsWizard(Qt.QWizard):
         '''
         parses xml code and sets all pages according to its contents. It
         raises an exception if something could not be processed
-        
+
         :param fname: (unicode) path to file containing xml code
         '''
         projectDir, cfgfile = os.path.split(fname)
@@ -1399,7 +1451,7 @@ class AppSettingsWizard(Qt.QWizard):
         xml = f.read()
         root = etree.fromstring(xml)
 
-        #print self.Pages
+        # print self.Pages
         for pageNumber in range(len(self.Pages.keys())):
             self.page(pageNumber).fromXml(root)
 
@@ -1452,18 +1504,24 @@ class AppSettingsWizard(Qt.QWizard):
 
         synoptic_page = SynopticPage()
         self.setPage(self.Pages.SynopticPage, synoptic_page)
-        
+
+        try:
+            from sardana.taurus.qt.qtgui.extra_macroexecutor.common import \
+                TaurusMacroConfigurationDialog
+            SARDANA_INSTALLED = True
+        except:
+            SARDANA_INSTALLED = False
         if SARDANA_INSTALLED:
             synoptic_page.setNextPageId(self.Pages.MacroServerInfo)
-            
+
             macroserver_page = MacroServerInfoPage()
             self.setPage(self.Pages.MacroServerInfo, macroserver_page)
             macroserver_page.setNextPageId(self.Pages.InstrumentsPage)
-            
+
             instruments_page = InstrumentsPage()
             self.setPage(self.Pages.InstrumentsPage, instruments_page)
-            instruments_page.setNextPageId(self.Pages.PanelsPage) 
-            
+            instruments_page.setNextPageId(self.Pages.PanelsPage)
+
         else:
             synoptic_page.setNextPageId(self.Pages.PanelsPage)
 
@@ -1483,56 +1541,59 @@ class AppSettingsWizard(Qt.QWizard):
         self.setPage(self.Pages.OutroPage, outro_page)
         outro_page.setNextPageId(-1)
 
-        self.setOption (Qt.QWizard.CancelButtonOnLeft , True)
+        self.setOption(Qt.QWizard.CancelButtonOnLeft, True)
 
     def generateXml(self):
         '''returns the xml code corresponding to the options selected in the wizard
         and a dictionary representing the paths that have been substituted.
-        
-        :return: (str, dict<str,str>) The return value is a tuple whose first element 
+
+        :return: (str, dict<str,str>) The return value is a tuple whose first element
                  is the xml code and the second element is a dict where the keys are the
                  destination files and the values are the original paths.
         '''
         pdir = self.__getitem__('projectDir')
         root = etree.Element("taurusgui_config")
-        #general settings page
+        # general settings page
         guiName = etree.SubElement(root, "GUI_NAME")
         guiName.text = self.__getitem__("guiName")
         organizationName = etree.SubElement(root, "ORGANIZATION")
         organizationName.text = self.__getitem__("organizationName")
-        #custom logo page
+        # custom logo page
         customLogo = etree.SubElement(root, "CUSTOM_LOGO")
         src = self.__getitem__("customLogo")
         if src is None or src.startswith(":"):
             dst = src
         else:
-            src = os.path.join(pdir, src)  #if src is absolute, it stays so, and if it is relative, we assume pdir as the root dir
+            # if src is absolute, it stays so, and if it is relative, we assume
+            # pdir as the root dir
+            src = os.path.join(pdir, src)
             dst = self.substitutionName(src)
         customLogo.text = dst
-        #synoptic page
+        # synoptic page
         synopticList = self.__getitem__("synoptics")
         if synopticList:
             synoptics = etree.SubElement(root, "SYNOPTIC")
             for src in synopticList:
                 src = os.path.join(pdir, src)
-                #substitute the jdw files
+                # substitute the jdw files
                 dst = self.substitutionName(src)
                 child = etree.SubElement(synoptics, "synoptic", str=dst)
-                #substitute any referenced files within the jdrawfiles
+                # substitute any referenced files within the jdrawfiles
                 f = open(src, 'r')
                 contents = f.read()
                 f.close()
                 for ref in re.findall(r'file_name:\"(.+?)\"', contents):
-                    refsrc = os.path.join(os.path.dirname(src), ref)  #this is ok for both relative and absolute references
+                    # this is ok for both relative and absolute references
+                    refsrc = os.path.join(os.path.dirname(src), ref)
                     refdst = self.substitutionName(refsrc)
                     if ref != refdst:
                         short = 'Manual editing needed in "%s"' % dst
                         long = ('The synoptic file "%s" references a file that '
-                               'has been copied to the project dir in order to make the project portable. '
-                               'Please edit "%s" and replace "%s" by "%s"') % (dst, dst, ref, refdst)
+                                'has been copied to the project dir in order to make the project portable. '
+                                'Please edit "%s" and replace "%s" by "%s"') % (dst, dst, ref, refdst)
                         self._projectWarnings.append((short, long))
 
-        #macroserver page
+        # macroserver page
         if SARDANA_INSTALLED and self.__getitem__("macroServerName"):
             macroServerName = etree.SubElement(root, "MACROSERVER_NAME")
             macroServerName.text = self.__getitem__("macroServerName")
@@ -1540,7 +1601,7 @@ class AppSettingsWizard(Qt.QWizard):
             doorName.text = self.__getitem__("doorName")
             instruments = etree.SubElement(root, "INSTRUMENTS_FROM_POOL")
             instruments.text = str(self.__getitem__("instruments"))
-        #panels page
+        # panels page
         panelList = self.__getitem__("panels")
         if panelList:
             panels = etree.SubElement(root, "PanelDescriptions")
@@ -1548,7 +1609,7 @@ class AppSettingsWizard(Qt.QWizard):
                 name, xml = panel
                 item = etree.fromstring(xml)
                 panels.append(item)
-        #external apps page
+        # external apps page
         externalAppList = self.__getitem__("externalApps")
         if externalAppList:
             externalApps = etree.SubElement(root, "ExternalApps")
@@ -1556,11 +1617,11 @@ class AppSettingsWizard(Qt.QWizard):
                 name, xml = externalApp
                 item = etree.fromstring(xml)
                 externalApps.append(item)
-       #monitor page
+        # monitor page
         monitor = etree.SubElement(root, "MONITOR")
         monitor.text = self.__getitem__("monitor")
 
-        return  etree.tostring(root, pretty_print=True), copy.copy(self._substitutions)
+        return etree.tostring(root, pretty_print=True), copy.copy(self._substitutions)
 
     def substitutionName(self, src):
         name = os.path.basename(src)
@@ -1581,6 +1642,3 @@ def main():
 
 if __name__ == "__main__":
     main()
-
-
-
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/__init__.py b/lib/taurus/qt/qtgui/taurusgui/conf/__init__.py
index d833fbc..bce13bf 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/__init__.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/gui_noconf.py b/lib/taurus/qt/qtgui/taurusgui/conf/gui_noconf.py
index 65af63b..21bca2a 100755
--- a/lib/taurus/qt/qtgui/taurusgui/conf/gui_noconf.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/gui_noconf.py
@@ -2,38 +2,39 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
 '''An example of usage of TaurusGui in which no configuration file is used
-(everything is done programmatically) 
+(everything is done programmatically)
 This can be launched directly as a stand-alone python script'''
 
 if __name__ == '__main__':
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.qt.qtgui.taurusgui import TaurusGui
     from taurus.external.qt import Qt
-    app = TaurusApplication(app_name='MyGui') #if app_name name not given, it uses the file name
+    # if app_name name not given, it uses the file name
+    app = TaurusApplication(app_name='MyGui')
     gui = TaurusGui()
     panel = Qt.QWidget()
     gui.createPanel(panel, 'Foo')
     gui.show()
-    app.exec_()
\ No newline at end of file
+    app.exec_()
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/gui_pureconf.py b/lib/taurus/qt/qtgui/taurusgui/conf/gui_pureconf.py
index 7d0e2c3..d011e02 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/gui_pureconf.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/gui_pureconf.py
@@ -2,31 +2,31 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
-'''An example of usage of TaurusGui in which the current file is a pure 
-declarative configuration file that should be interpreted by the tarusgui 
-script by running `taurusgui gui_pureconf` (if gui_pureconf.py is in the 
-PYTHONPATH) or `taurusgui <full_path_to_gui_pureconf.py>` (if it is not 
+'''An example of usage of TaurusGui in which the current file is a pure
+declarative configuration file that should be interpreted by the tarusgui
+script by running `taurusgui gui_pureconf` (if gui_pureconf.py is in the
+PYTHONPATH) or `taurusgui <full_path_to_gui_pureconf.py>` (if it is not
 in the PYTHONPATH)'''
 
 
@@ -34,6 +34,3 @@ from taurus.qt.qtgui.taurusgui.utils import PanelDescription
 
 GUI_NAME = 'MyGui'
 panel = PanelDescription('Foo', classname='taurus.external.qt.Qt.QWidget')
-
-
-
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/gui_selfconf.py b/lib/taurus/qt/qtgui/taurusgui/conf/gui_selfconf.py
index 8e32451..d1b705f 100755
--- a/lib/taurus/qt/qtgui/taurusgui/conf/gui_selfconf.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/gui_selfconf.py
@@ -2,33 +2,33 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
-'''An example of usage of TaurusGui in which the specific GUI is set up both 
+'''An example of usage of TaurusGui in which the specific GUI is set up both
 programmatically and using the same file as the configuration file.
 This can be launched directly as a stand-alone python script'''
 
 
-GUI_NAME = 'MyGui' 
+GUI_NAME = 'MyGui'
 
 if __name__ == '__main__':
     from taurus.qt.qtgui.application import TaurusApplication
@@ -39,4 +39,4 @@ if __name__ == '__main__':
     panel = Qt.QWidget()
     gui.createPanel(panel, 'Foo')
     gui.show()
-    app.exec_()
\ No newline at end of file
+    app.exec_()
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py
index 729d964..1c3cba2 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
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 2340157..95b224b 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
 """
-configuration file for an example of how to construct a GUI based on TaurusGUI  
+configuration file for an example of how to construct a GUI based on TaurusGUI
 
 This configuration file determines the default, permanent, pre-defined
 contents of the GUI. While the user may add/remove more elements at run
@@ -33,144 +33,146 @@ user will find when launching the GUI for the first time.
 """
 
 #==============================================================================
-# Import section. You probably want to keep this line. Don't edit this block 
+# Import section. You probably want to keep this line. Don't edit this block
 # unless you know what you are doing
 from taurus.qt.qtgui.taurusgui.utils import PanelDescription, ExternalApp, ToolBarDescription, AppletDescription
 # (end of import section)
 #==============================================================================
 
 
-#===============================================================================
+#=========================================================================
 # General info.
-#===============================================================================
+#=========================================================================
 GUI_NAME = 'EXAMPLE 01'
 ORGANIZATION = 'Taurus'
 
-#===============================================================================
-# Specific logo. It can be an absolute path,or relative to the app dir or a 
+#=========================================================================
+# Specific logo. It can be an absolute path,or relative to the app dir or a
 # resource path. If commented out, ":/taurus.png" will be used
-#===============================================================================
-#CUSTOM_LOGO = <path GUI-specific logo 
+#=========================================================================
+# CUSTOM_LOGO = <path GUI-specific logo
 
-#===============================================================================
+#=========================================================================
 # You can provide an URI for a manual in html format
-# (comment out or make MANUAL_URI=None to skip creating a Manual panel) 
-#===============================================================================
+# (comment out or make MANUAL_URI=None to skip creating a Manual panel)
+#=========================================================================
 MANUAL_URI = 'http://www.taurus-scada.org'
 
-#===============================================================================
+#=========================================================================
 # If you want to have a main synoptic panel, set the SYNOPTIC variable
 # to the file name of a jdraw file. If a relative path is given, the directory
 # containing this configuration file will be used as root
 # (comment out or make SYNOPTIC=None to skip creating a synoptic panel)
-#===============================================================================
-SYNOPTIC = ['images/example01.jdw','images/syn2.jdw']
+#=========================================================================
+SYNOPTIC = ['images/example01.jdw', 'images/syn2.jdw']
 
-#===============================================================================
+#=========================================================================
 # Set INSTRUMENTS_FROM_POOL to True for enabling auto-creation of
 # instrument panels based on the Pool Instrument info
-#===============================================================================
+#=========================================================================
 INSTRUMENTS_FROM_POOL = False
 
-#===============================================================================
-# Define panels to be shown.  
+#=========================================================================
+# Define panels to be shown.
 # To define a panel, instantiate a PanelDescription object (see documentation
 # for the gblgui_utils module)
-#===============================================================================
+#=========================================================================
 
 nxbrowser = PanelDescription('NeXus Browser',
-                       classname = 'TaurusNeXusBrowser',
-                       area = None)
+                             classname='TaurusNeXusBrowser',
+                             area=None)
 
 i0 = PanelDescription('BigInstrument',
-                       classname = 'TaurusAttrForm',
-                       model = 'sys/tg_test/1')
+                      classname='TaurusAttrForm',
+                      model='sys/tg_test/1')
 
 i1 = PanelDescription('instrument1',
-                       classname = 'TaurusForm',
-                       model = ['sys/tg_test/1/double_scalar',
-                                'sys/tg_test/1/short_scalar_ro',
-                                'sys/tg_test/1/float_spectrum_ro',
+                      classname='TaurusForm',
+                      model=['sys/tg_test/1/double_scalar',
+                             'sys/tg_test/1/short_scalar_ro',
+                             'sys/tg_test/1/float_spectrum_ro',
                                 'sys/tg_test/1/double_spectrum'])
 
 i2 = PanelDescription('instrument2',
-                       classname = 'TaurusForm',
-                       model = ['sys/tg_test/1/wave',
-                                'sys/tg_test/1/boolean_scalar'])
+                      classname='TaurusForm',
+                      model=['sys/tg_test/1/wave',
+                             'sys/tg_test/1/boolean_scalar'])
 
 trend = PanelDescription('Trend',
-                        classname = 'TaurusTrend',
-                        model = ['sys/tg_test/1/double_scalar'])
+                         classname='TaurusTrend',
+                         model=['sys/tg_test/1/double_scalar'])
 
 connectionDemo = PanelDescription('Selected Instrument',
-                        classname = 'PyQt4.Qt.QLineEdit',
-                        sharedDataRead={'SelectedInstrument':'setText'},
-                        sharedDataWrite={'SelectedInstrument':'textEdited(QString)'})
+                                  classname='PyQt4.Qt.QLineEdit',
+                                  sharedDataRead={
+                                      'SelectedInstrument': 'setText'},
+                                  sharedDataWrite={'SelectedInstrument': 'textEdited'})
 
-#===============================================================================
+#=========================================================================
 # Define custom toolbars to be shown. To define a toolbar, instantiate a
 # ToolbarDescription object (see documentation for the gblgui_utils module)
-#===============================================================================
+#=========================================================================
 
 dummytoolbar = ToolBarDescription('Empty Toolbar',
-                        classname = 'QToolBar',
-                        modulename = 'PyQt4.Qt')
+                                  classname='QToolBar',
+                                  modulename='PyQt4.Qt')
 
-#panictoolbar = ToolBarDescription('Panic Toolbar',
+# panictoolbar = ToolBarDescription('Panic Toolbar',
 #                        classname = 'PanicToolbar',
 #                        modulename = 'tangopanic')
 
-#===============================================================================
+#=========================================================================
 # Define custom applets to be shown in the applets bar (the wide bar that
 # contains the logos). To define an applet, instantiate an AppletDescription
 # object (see documentation for the gblgui_utils module)
-#===============================================================================
+#=========================================================================
 
 mon2 = AppletDescription('Dummy Monitor',
-                        classname = 'TaurusMonitorTiny',
-                        model='eval://1000*rand(2)')
+                         classname='TaurusMonitorTiny',
+                         model='eval:1000*rand(2)')
 
 
-#===============================================================================
+#=========================================================================
 # Define which External Applications are to be inserted.
 # To define an external application, instantiate an ExternalApp object
 # See TaurusMainWindow.addExternalAppLauncher for valid values of ExternalApp
-#===============================================================================
-xterm = ExternalApp(cmdargs=['xterm','spock'], text="Spock", icon='utilities-terminal')
+#=========================================================================
+xterm = ExternalApp(cmdargs=['xterm', 'spock'],
+                    text="Spock", icon='utilities-terminal')
 hdfview = ExternalApp(["hdfview"])
 pymca = ExternalApp(['pymca'])
 
-#===============================================================================
+#=========================================================================
 # Macro execution configuration
-# Comment out or make MACRO_SERVER=None or set MACRO_PANELS=False to skip 
+# 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 = 
+#=========================================================================
+# MACROSERVER_NAME =
+# DOOR_NAME =
+# MACROEDITORS_PATH =
 
-#===============================================================================
+#=========================================================================
 # 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']
 
-#===============================================================================
+#=========================================================================
 # Adding other widgets to the catalog of the "new panel" dialog.
 # pass a tuple of (classname,screenshot)
 # -classname may contain the module name.
-# -screenshot can either be a resource URL, a file name (either relative to 
+# -screenshot can either be a resource URL, a file name (either relative to
 # the application dir or with an absolute path) or None
-#===============================================================================
-EXTRA_CATALOG_WIDGETS = [('PyQt4.Qt.QLineEdit',':/taurus.png'),  # a resource
-                        ('PyQt4.Qt.QSpinBox','images/syn2.jpg'), # relative
-                        #('PyQt4.Qt.QTextEdit','/tmp/foo.png'),  # absolute
-                        ('PyQt4.Qt.QLabel',None)]                # none
+#=========================================================================
+EXTRA_CATALOG_WIDGETS = [('PyQt4.Qt.QLineEdit', 'logos:taurus.png'),  # a resource
+                         ('PyQt4.Qt.QSpinBox', 'images/syn2.jpg'),  # relative
+                         #('PyQt4.Qt.QTextEdit','/tmp/foo.png'),  # absolute
+                         ('PyQt4.Qt.QLabel', None)]                # 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']
diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py
index 729d964..1c3cba2 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
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 e7dee2b..cf7d39d 100644
--- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py
+++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/config.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 ###########################################################################
 
 """
-configuration file for an example of how to construct a GUI based on TaurusGUI  
+configuration file for an example of how to construct a GUI based on TaurusGUI
 
 This configuration file determines the default, permanent, pre-defined
 contents of the GUI. While the user may add/remove more elements at run
@@ -33,68 +33,68 @@ user will find when launching the GUI for the first time.
 """
 
 #==============================================================================
-# Import section. You probably want to keep this line. Don't edit this block 
+# Import section. You probably want to keep this line. Don't edit this block
 # unless you know what you are doing
 from taurus.qt.qtgui.taurusgui.utils import PanelDescription, ExternalApp, Qt_Qt
 # (end of import section)
 #==============================================================================
 
 
-#===============================================================================
+#=========================================================================
 # General info.
-#===============================================================================
+#=========================================================================
 GUI_NAME = 'MacroGUI'
 ORGANIZATION = 'Taurus'
-#CUSTOM_LOGO = <full path to GUI-specific logo>
+# CUSTOM_LOGO = <full path to GUI-specific logo>
 
-#===============================================================================
+#=========================================================================
 # If you want to have a main synoptic panel, set the SYNOPTIC variable
 # to the file name of a jdraw file. If a relative path is given, the directory
 # containing this configuration file will be used as root
 # (comment out or make SYNOPTIC=None to skip creating a synoptic panel)
-#===============================================================================
-#SYNOPTIC = 
+#=========================================================================
+# SYNOPTIC =
 
-#===============================================================================
+#=========================================================================
 # Set INSTRUMENTS_FROM_POOL to True for enabling auto-creation of
 # instrument panels based on the Pool Instrument info
-#===============================================================================
+#=========================================================================
 #INSTRUMENTS_FROM_POOL = False
 
-#===============================================================================
-# Define panels to be shown.  
+#=========================================================================
+# Define panels to be shown.
 # To define a panel, instantiate a PanelDescription object (see documentation
 # for the gblgui_utils module)
-#===============================================================================
+#=========================================================================
 
-#None defined
+# None defined
 
-#===============================================================================
+#=========================================================================
 # Define which External Applications are to be inserted.
 # To define an external application, instantiate an ExternalApp object
 # See TaurusMainWindow.addExternalAppLauncher for valid values of ExternalApp
-#===============================================================================
+#=========================================================================
 #xterm = ExternalApp(cmdargs=['xterm','spock'], text="Spock", icon='utilities-terminal')
 #hdfview = ExternalApp(["hdfview"])
 pymca = ExternalApp(['pymca'])
 
-#===============================================================================
+#=========================================================================
 # Macro execution configuration
-# Comment out or make MACRO_SERVER=None or set MACRO_PANELS=False to skip 
+# 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 = ''
 
-#===============================================================================
+#=========================================================================
 # Define one or more embedded consoles in the GUI.
 # Possible items for console are 'ipython', 'tango', 'spock'
-#===============================================================================
+#=========================================================================
 CONSOLE = ['tango']
-    
-#===============================================================================
+
+#=========================================================================
 # Monitor widget
-#===============================================================================
-#MONITOR = 
+#=========================================================================
+# MONITOR =
diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py
index 359eedb..53ca2cd 100644
--- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py
+++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py
@@ -2,69 +2,75 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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 provides objects to manage macro-related tasks. Its primary use is 
-to be used within a TaurusGui for managing panels for: 
-- setting preferences in the sardana control system for data I/O 
+This module provides objects to manage macro-related tasks. Its primary use is
+to be used within a TaurusGui for managing panels for:
+- setting preferences in the sardana control system for data I/O
 - displaying results of macro executions, including creating/removing panels for
   plotting results of scans
 - editing macros
+
+.. note:: This module will be moved to sardana.taurus at some point.
 """
 
+ # TODO: move to sardana.taurus
+
 __all__ = ['MacroBroker', 'DynamicPlotManager']
 __docformat__ = 'restructuredtext'
 
-#import os, sys
 import datetime
 
 from taurus.core.util.containers import CaselessList
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.base import TaurusBaseComponent
-from taurus.qt.qtgui.resource import getThemeIcon, getIcon
-#from taurus.qt.qtgui.taurusgui.utils import PanelDescription
 from sardana.taurus.core.tango.sardana import PlotType
 from sardana.taurus.core.tango.sardana.pool import getChannelConfigs
 
 
 class ChannelFilter(object):
+
     def __init__(self, chlist):
         self.chlist = tuple(chlist)
+
     def __call__(self, x):
         return x in self.chlist
 
 
 class DynamicPlotManager(Qt.QObject, TaurusBaseComponent):
     '''This is a manager of plots related to the execution of macros.
-    It dynamically creates/removes plots according to the configuration made by 
+    It dynamically creates/removes plots according to the configuration made by
     an ExperimentConfiguration widget.
-     
+
     Currently it supports only 1D scan trends (2D scans are only half-baked)
-    
-    To use it simply instantiate it and pass it a door name as a model. You may 
-    want to call :meth:`onExpConfChanged` to update the configuration being 
+
+    To use it simply instantiate it and pass it a door name as a model. You may
+    want to call :meth:`onExpConfChanged` to update the configuration being
     used.
     '''
+
+    newShortMessage = Qt.pyqtSignal(str)
+
     def __init__(self, parent=None):
         Qt.QObject.__init__(self, parent)
         TaurusBaseComponent.__init__(self, self.__class__.__name__)
@@ -76,48 +82,49 @@ class DynamicPlotManager(Qt.QObject, TaurusBaseComponent):
 
     def setModel(self, doorname):
         '''reimplemented from :meth:`TaurusBaseComponent`
-        
+
         :param doorname: (str) device name corresponding to a Door device.
         '''
         TaurusBaseComponent.setModel(self, doorname)
-        #self._onDoorChanged(doorname)
+        # self._onDoorChanged(doorname)
         if not doorname:
             return
         door = self.getModelObj()
         if not isinstance(door, Qt.QObject):
             msg = "Unexpected type (%s) for %s" % (repr(type(door)), doorname)
-            Qt.QMessageBox.critical(self.parent(), 'Door connection error', msg)
+            Qt.QMessageBox.critical(
+                self.parent(), 'Door connection error', msg)
             return
-        
+
         self._checkJsonRecorder()
-        
-        #read the expconf
+
+        # read the expconf
         expconf = door.getExperimentConfiguration()
         self.onExpConfChanged(expconf)
-    
-    def _checkJsonRecorder(self): 
+
+    def _checkJsonRecorder(self):
         '''Checks if JsonRecorder env var is set and offers to set it'''
         door = self.getModelObj()
         if 'JsonRecorder' not in door.getEnvironment():
-            msg = ('JsonRecorder environment variable is not set, but it ' + \
-                   'is needed for displaying trend plots.\n' + \
-                   'Enable it globally for %s?') % door.name()
-            result = Qt.QMessageBox.question(self.parent(), 
-                        'JsonRecorder not set', msg, 
-                        Qt.QMessageBox.Yes | Qt.QMessageBox.No)
+            msg = ('JsonRecorder environment variable is not set, but it ' +
+                   'is needed for displaying trend plots.\n' +
+                   'Enable it globally for %s?') % door.fullname
+            result = Qt.QMessageBox.question(self.parent(),
+                                             'JsonRecorder not set', msg,
+                                             Qt.QMessageBox.Yes | Qt.QMessageBox.No)
             if result == Qt.QMessageBox.Yes:
                 door.putEnvironment('JsonRecorder', True)
-                self.info('JsonRecorder Enabled for %s' % door.name())       
-        
+                self.info('JsonRecorder Enabled for %s' % door.fullname)
+
     def onExpConfChanged(self, expconf):
         '''
         Slot to be called when experimental configuration changes. It should
         remove the temporary panels and create the new ones needed.
-        
-        :param expconf: (dict) An Experiment Description dictionary. See 
+
+        :param expconf: (dict) An Experiment Description dictionary. See
                         :meth:`sardana.taurus.qt.qtcore.tango.sardana.
-                        QDoor.getExperimentDescription` 
-                        for more details 
+                        QDoor.getExperimentDescription`
+                        for more details
         '''
         if expconf['ActiveMntGrp'] is None:
             return
@@ -128,8 +135,8 @@ class DynamicPlotManager(Qt.QObject, TaurusBaseComponent):
             return
         mgconfig = expconf['MntGrpConfigs'][expconf['ActiveMntGrp']]
         channels = dict(getChannelConfigs(mgconfig, sort=False))
-        
-        #classify by type of plot:
+
+        # classify by type of plot:
         trends1d = {}
         trends2d = {}
         plots1d = {}
@@ -141,48 +148,48 @@ class DynamicPlotManager(Qt.QObject, TaurusBaseComponent):
                 continue
             elif ptype == PlotType.Spectrum:
                 axes = tuple(chdata['plot_axes'])
-                ndim = chdata.get('ndim', 0)  #TODO: get default value from the channel.
-                if ndim == 0:  #this is a trend
+                # TODO: get default value from the channel.
+                ndim = chdata.get('ndim', 0)
+                if ndim == 0:  # this is a trend
                     if axes in trends1d:
                         trends1d[axes].append(chname)
                     else:
                         trends1d[axes] = CaselessList([chname])
-                elif ndim == 1: #a 1D plot (e.g. a spectrum)
-                    pass # TODO: implement
+                elif ndim == 1:  # a 1D plot (e.g. a spectrum)
+                    pass  # TODO: implement
                 else:
                     self.warning('Cannot create plot for %s', chname)
 
             elif ptype == PlotType.Image:
                 axes = tuple(chdata['plot_axes'])
-                ndim = chdata.get('ndim', 1)  #TODO: get default value from the channel.
-                if ndim == 0: #a mesh-like plot?
-                    pass # TODO implement
-                elif ndim == 1:  #a 2D trend
+                # TODO: get default value from the channel.
+                ndim = chdata.get('ndim', 1)
+                if ndim == 0:  # a mesh-like plot?
+                    pass  # TODO implement
+                elif ndim == 1:  # a 2D trend
                     if axes in trends2d:
                         trends2d[axes].append(chname)
                     else:
                         trends2d[axes] = CaselessList([chname])
-                elif ndim == 2: #a 2D plot (e.g. an image)
-                    pass #TODO: implement
+                elif ndim == 2:  # a 2D plot (e.g. an image)
+                    pass  # TODO: implement
                 else:
                     self.warning('Cannot create plot for %s', chname)
 
         new1d, removed1d = self._updateTemporaryTrends1D(trends1d)
-        self.emit(Qt.SIGNAL("newShortMessage"), 
-                  "Changed panels (%i new, %i removed)" % (len(new1d), 
-                                                           len(removed1d))
-                  )
+        self.newShortMessage.emit("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 
+
+        :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  
-        '''        
+                  panels and rm contains the names of the removed panels
+        '''
         from taurus.qt.qtgui.plot import TaurusTrend
         newpanels = []
         for axes, plotables in trends1d.items():
@@ -191,55 +198,55 @@ class DynamicPlotManager(Qt.QObject, TaurusBaseComponent):
             if axes not in self._trends1d:
                 w = TaurusTrend()
                 w.setXIsTime(False)
-                w.setScanDoor(self.getModelObj().name())
-                #TODO: use a standard key for <idx> and <mov>
-                w.setScansXDataKey(axes[0])  
+                w.setScanDoor(self.getModelObj().fullname)
+                # TODO: use a standard key for <idx> and <mov>
+                w.setScansXDataKey(axes[0])
                 pname = u'Trend1D - %s' % ":".join(axes)
-                panel = self.createPanel(w, pname, registerconfig=False, 
-                                 permanent=False)
-                try: #if the panel is a dockwidget, raise it
+                panel = self.createPanel(w, pname, registerconfig=False,
+                                         permanent=False)
+                try:  # if the panel is a dockwidget, raise it
                     panel.raise_()
                 except:
                     pass
                 self._trends1d[axes] = pname
                 newpanels.append(pname)
-            
+
             widget = self.getPanelWidget(self._trends1d[axes])
             flt = ChannelFilter(plotables)
             widget.onScanPlotablesFilterChanged(flt)
 
-        #remove trends that are no longer configured
-        removedpanels = []   
+        # remove trends that are no longer configured
+        removedpanels = []
         olditems = list(self._trends1d.items())
-        for axes,name in olditems:
+        for axes, name in olditems:
             if axes not in trends1d:
                 removedpanels.append(name)
                 self.removePanel(name)
-                self._trends1d.pop(axes)  
-        
+                self._trends1d.pop(axes)
+
         return newpanels, removedpanels
 
-    def _updateTemporaryTrends2D(self, trends2d):        
+    def _updateTemporaryTrends2D(self, trends2d):
         '''adds necessary trend2D panels and removes no longer needed ones
-        
-        :param trends2d: (dict) A dict whose keys are tuples of axes and 
+
+        :param trends2d: (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
-        
-        ..note:: Not fully implemented yet 
+
+        ..note:: Not fully implemented yet
         '''
         try:
             from taurus.qt.qtgui.extra_guiqwt.taurustrend2d import \
-                 TaurusTrend2DDialog
+                TaurusTrend2DDialog
             from taurus.qt.qtgui.extra_guiqwt.image import TaurusTrend2DScanItem
         except:
-            self.info('guiqwt extension cannot be loaded. ' + \
+            self.info('guiqwt extension cannot be loaded. ' +
                       '2D Trends will not be created')
             raise
             return
-        
+
         for axes, plotables in trends2d.items():
             for chname in plotables:
                 pname = u'Trend2D - %s' % chname
@@ -249,64 +256,64 @@ class DynamicPlotManager(Qt.QObject, TaurusBaseComponent):
                     axis = axes[0]
                     w = TaurusTrend2DDialog(stackMode='event')
                     plot = w.get_plot()
-                    t2d = TaurusTrend2DScanItem(chname, axis, 
-                                                self.getModelObj().name())
+                    t2d = TaurusTrend2DScanItem(chname, axis,
+                                                self.getModelObj().fullname)
                     plot.add_item(t2d)
-                    self.createPanel(w, pname, registerconfig=False, 
-                                           permanent=False)
+                    self.createPanel(w, pname, registerconfig=False,
+                                     permanent=False)
                     self._trends2d[(axes, chname)] = pname
-    
+
     def createPanel(self, widget, name, **kwargs):
-        '''Creates a "panel" from a widget. In this basic implementation this 
+        '''Creates a "panel" from a widget. In this basic implementation this
         means that the widgets is shown as a non-modal top window
-        
+
         :param widget: (QWidget) widget to be used for the panel
         :param name: (str) name of the panel. Must be unique.
-        
-        Note: for backawards compatibility, this implementation accepts 
+
+        Note: for backawards compatibility, this implementation accepts
         arbitrary keyword arguments which are just ignored
-        ''' 
+        '''
         widget.setWindowTitle(name)
         widget.show()
         self.__panels[name] = widget
-    
-    def getPanelWidget(self,name):        
+
+    def getPanelWidget(self, name):
         '''Returns the widget associated to a panel name
-        
+
         :param name: (str) name of the panel. KeyError is raised if not found
-        
+
         :return: (QWidget)
-        ''' 
+        '''
         return self.__panels[name]
-    
+
     def removePanel(self, name):
         '''stop managing the given panel
-        
+
         :param name: (str) name of the panel'''
         widget = self.__panels.pop(name)
         if hasattr(widget, 'setModel'):
             widget.setModel(None)
         widget.setParent(None)
         widget.close()
-    
+
     def removePanels(self, names=None):
         '''removes panels.
-        
-        :param names: (seq<str>) names of the panels to be removed. If None is 
+
+        :param names: (seq<str>) names of the panels to be removed. If None is
                       given (default), all the panels are removed.
-        ''' 
+        '''
         if names is None:
-            names = self._trends1d.values() + self._trends2d.values()  
-            #TODO: do the same for other temporary panels
+            names = self._trends1d.values() + self._trends2d.values()
+            # TODO: do the same for other temporary panels
         for pname in names:
             self.removePanel(pname)
 
 
 class MacroBroker(DynamicPlotManager):
     '''A manager of all macro-related panels of a TaurusGui.
-    
+
     It creates, destroys and manages connections for the following objects:
-    
+
         - Macro Configuration dialog
         - Experiment Configuration panel
         - Macro Executor panel
@@ -315,24 +322,25 @@ class MacroBroker(DynamicPlotManager):
         - Door output, result and debug panels
         - Macro editor
         - Macro "panic" button (to abort macros)
-        - Dynamic plots (see :class:`DynamicPlotManager`) 
+        - Dynamic plots (see :class:`DynamicPlotManager`)
     '''
+
     def __init__(self, parent):
         '''Passing the parent object (the main window) is mandatory'''
         DynamicPlotManager.__init__(self, parent)
 
         self._createPermanentPanels()
-        
-        #connect the broker to shared data
+
+        # connect the broker to shared data
         Qt.qApp.SDM.connectReader("doorName", self.setModel)
         Qt.qApp.SDM.connectReader("expConfChanged", self.onExpConfChanged)
         Qt.qApp.SDM.connectWriter("shortMessage", self, 'newShortMessage')
-   
+
     def setModel(self, doorname):
         ''' Reimplemented from :class:`DynamicPlotManager`.'''
-        #disconnect the previous door
+        # disconnect the previous door
         door = self.getModelObj()
-        if door is not None:  #disconnect it from *all* shared data providing
+        if door is not None:  # disconnect it from *all* shared data providing
             SDM = Qt.qApp.SDM
             SDM.disconnectWriter("macroStatus", door, "macroStatusUpdated")
             SDM.disconnectWriter("doorOutputChanged", door, "outputUpdated")
@@ -341,13 +349,13 @@ class MacroBroker(DynamicPlotManager):
             SDM.disconnectWriter("doorErrorChanged", door, "errorUpdated")
             SDM.disconnectWriter("doorDebugChanged", door, "debugUpdated")
             SDM.disconnectWriter("doorResultChanged", door, "resultUpdated")
-            SDM.disconnectWriter("expConfChanged", door, 
+            SDM.disconnectWriter("expConfChanged", door,
                                  "experimentConfigurationChanged")
-        
-        #set the model     
+
+        # set the model
         DynamicPlotManager.setModel(self, doorname)
-        
-        #connect the new door
+
+        # connect the new door
         door = self.getModelObj()
         if door is not None:
             SDM = Qt.qApp.SDM
@@ -358,7 +366,7 @@ class MacroBroker(DynamicPlotManager):
             SDM.connectWriter("doorErrorChanged", door, "errorUpdated")
             SDM.connectWriter("doorDebugChanged", door, "debugUpdated")
             SDM.connectWriter("doorResultChanged", door, "resultUpdated")
-            SDM.connectWriter("expConfChanged", door, 
+            SDM.connectWriter("expConfChanged", door,
                               "experimentConfigurationChanged")
 
     def _createPermanentPanels(self):
@@ -373,194 +381,194 @@ class MacroBroker(DynamicPlotManager):
 
         mainwindow = self.parent()
 
-        #Create macroconfiguration dialog & action
+        # Create macroconfiguration dialog & action
         self.__macroConfigurationDialog = \
             TaurusMacroConfigurationDialog(mainwindow)
-        self.macroConfigurationAction = mainwindow.taurusMenu.addAction( \
-                getThemeIcon("preferences-system-session"), 
-                "Macro execution configuration...", 
-                self.__macroConfigurationDialog.show)
-        
+        self.macroConfigurationAction = mainwindow.taurusMenu.addAction(
+            Qt.QIcon.fromTheme("preferences-system-session"),
+            "Macro execution configuration...",
+            self.__macroConfigurationDialog.show)
+
         SDM = Qt.qApp.SDM
-        SDM.connectReader("macroserverName", 
+        SDM.connectReader("macroserverName",
                           self.__macroConfigurationDialog.selectMacroServer)
-        SDM.connectReader("doorName", 
+        SDM.connectReader("doorName",
                           self.__macroConfigurationDialog.selectDoor)
-        SDM.connectWriter("macroserverName", self.__macroConfigurationDialog, 
+        SDM.connectWriter("macroserverName", self.__macroConfigurationDialog,
                           'macroserverNameChanged')
-        SDM.connectWriter("doorName", self.__macroConfigurationDialog, 
+        SDM.connectWriter("doorName", self.__macroConfigurationDialog,
                           'doorNameChanged')
 
-        #Create ExpDescriptionEditor dialog
+        # Create ExpDescriptionEditor dialog
         self.__expDescriptionEditor = ExpDescriptionEditor(plotsButton=False)
         SDM.connectReader("doorName", self.__expDescriptionEditor.setModel)
-        mainwindow.createPanel(self.__expDescriptionEditor, 
+        mainwindow.createPanel(self.__expDescriptionEditor,
                                'Experiment Config',
-                               registerconfig=True, 
-                               icon=getThemeIcon('preferences-system'), 
+                               registerconfig=True,
+                               icon=Qt.QIcon.fromTheme('preferences-system'),
                                permanent=True)
         ###############################
-        #TODO: These lines can be removed once the door does emit 
+        # TODO: These lines can be removed once the door does emit
         # "experimentConfigurationChanged" signals
-        SDM.connectWriter("expConfChanged", self.__expDescriptionEditor, 
+        SDM.connectWriter("expConfChanged", self.__expDescriptionEditor,
                           "experimentConfigurationChanged")
         ################################
 
-        #put a Macro Executor
+        # put a Macro Executor
         self.__macroExecutor = TaurusMacroExecutorWidget()
         SDM.connectReader("macroserverName", self.__macroExecutor.setModel)
         SDM.connectReader("doorName", self.__macroExecutor.onDoorChanged)
-        SDM.connectReader("macroStatus", 
+        SDM.connectReader("macroStatus",
                           self.__macroExecutor.onMacroStatusUpdated)
-        SDM.connectWriter("macroName", self.__macroExecutor, "macroNameChanged")
-        SDM.connectWriter("executionStarted", self.__macroExecutor, 
+        SDM.connectWriter("macroName", self.__macroExecutor,
+                          "macroNameChanged")
+        SDM.connectWriter("executionStarted", self.__macroExecutor,
                           "macroStarted")
-        SDM.connectWriter("plotablesFilter", self.__macroExecutor, 
+        SDM.connectWriter("plotablesFilter", self.__macroExecutor,
                           "plotablesFilterChanged")
-        SDM.connectWriter("shortMessage", self.__macroExecutor, 
+        SDM.connectWriter("shortMessage", self.__macroExecutor,
                           "shortMessageEmitted")
-        mainwindow.createPanel(self.__macroExecutor, 'Macros', 
+        mainwindow.createPanel(self.__macroExecutor, 'Macros',
                                registerconfig=True, permanent=True)
 
-        #put a Sequencer
+        # put a Sequencer
         self.__sequencer = TaurusSequencerWidget()
         SDM.connectReader("macroserverName", self.__sequencer.setModel)
         SDM.connectReader("doorName", self.__sequencer.onDoorChanged)
         SDM.connectReader("macroStatus", self.__sequencer.onMacroStatusUpdated)
-        SDM.connectWriter("macroName", self.__sequencer.tree, 
+        SDM.connectWriter("macroName", self.__sequencer.tree,
                           "macroNameChanged")
-        SDM.connectWriter("macroName", self.__sequencer, 
+        SDM.connectWriter("macroName", self.__sequencer,
                           "macroNameChanged")
-        SDM.connectWriter("executionStarted", self.__sequencer, 
+        SDM.connectWriter("executionStarted", self.__sequencer,
                           "macroStarted")
-        SDM.connectWriter("plotablesFilter", self.__sequencer, 
+        SDM.connectWriter("plotablesFilter", self.__sequencer,
                           "plotablesFilterChanged")
-        SDM.connectWriter("shortMessage", self.__sequencer, 
+        SDM.connectWriter("shortMessage", self.__sequencer,
                           "shortMessageEmitted")
-        mainwindow.createPanel(self.__sequencer, 'Sequences', 
+        mainwindow.createPanel(self.__sequencer, 'Sequences',
                                registerconfig=True, permanent=True)
 
-        #puts a macrodescriptionviewer
+        # puts a macrodescriptionviewer
         self.__macroDescriptionViewer = TaurusMacroDescriptionViewer()
-        SDM.connectReader("macroserverName", 
+        SDM.connectReader("macroserverName",
                           self.__macroDescriptionViewer.setModel)
-        SDM.connectReader("macroName", 
+        SDM.connectReader("macroName",
                           self.__macroDescriptionViewer.onMacroNameChanged)
-        mainwindow.createPanel(self.__macroDescriptionViewer, 
-                               'MacroDescription', registerconfig=True, 
+        mainwindow.createPanel(self.__macroDescriptionViewer,
+                               'MacroDescription', registerconfig=True,
                                permanent=True)
 
-        #puts a doorOutput
+        # puts a doorOutput
         self.__doorOutput = DoorOutput()
-        SDM.connectReader("doorOutputChanged", 
+        SDM.connectReader("doorOutputChanged",
                           self.__doorOutput.onDoorOutputChanged)
-        SDM.connectReader("doorInfoChanged", 
+        SDM.connectReader("doorInfoChanged",
                           self.__doorOutput.onDoorInfoChanged)
-        SDM.connectReader("doorWarningChanged", 
+        SDM.connectReader("doorWarningChanged",
                           self.__doorOutput.onDoorWarningChanged)
-        SDM.connectReader("doorErrorChanged", 
+        SDM.connectReader("doorErrorChanged",
                           self.__doorOutput.onDoorErrorChanged)
-        mainwindow.createPanel(self.__doorOutput, 'DoorOutput', 
+        mainwindow.createPanel(self.__doorOutput, 'DoorOutput',
                                registerconfig=False, permanent=True)
 
-        #puts doorDebug
+        # puts doorDebug
         self.__doorDebug = DoorDebug()
-        SDM.connectReader("doorDebugChanged", 
+        SDM.connectReader("doorDebugChanged",
                           self.__doorDebug.onDoorDebugChanged)
-        mainwindow.createPanel(self.__doorDebug, 'DoorDebug', 
+        mainwindow.createPanel(self.__doorDebug, 'DoorDebug',
                                registerconfig=False, permanent=True)
 
-        #puts doorResult
+        # puts doorResult
         self.__doorResult = DoorResult(mainwindow)
-        SDM.connectReader("doorResultChanged", 
+        SDM.connectReader("doorResultChanged",
                           self.__doorResult.onDoorResultChanged)
-        mainwindow.createPanel(self.__doorResult, 'DoorResult', 
+        mainwindow.createPanel(self.__doorResult, 'DoorResult',
                                registerconfig=False, permanent=True)
 
-        #puts sardanaEditor
-        self.__sardanaEditor = SardanaEditor()
-        SDM.connectReader("macroserverName", self.__sardanaEditor.setModel)
-        mainwindow.createPanel(self.__sardanaEditor, 'SardanaEditor', 
-                               registerconfig=False, permanent=True)
+        # puts sardanaEditor
+        # self.__sardanaEditor = SardanaEditor()
+        # SDM.connectReader("macroserverName", self.__sardanaEditor.setModel)
+        # mainwindow.createPanel(self.__sardanaEditor, 'SardanaEditor',
+        #                        registerconfig=False, permanent=True)
 
-        #add panic button for aborting the door
+        # add panic button for aborting the door
         text = "Panic Button: stops the pool (double-click for abort)"
         self.doorAbortAction = mainwindow.jorgsBar.addAction(
-                                getIcon(":/actions/process-stop.svg"), 
-                                text, self.__onDoorAbort)
-        
-        #store beginning of times as a datetime
-        self.__lastAbortTime = datetime.datetime(1, 1, 1)  
-        
-        #store doubleclick interval as a timedelta
+            Qt.QIcon("actions:process-stop.svg"),
+            text, self.__onDoorAbort)
+
+        # store beginning of times as a datetime
+        self.__lastAbortTime = datetime.datetime(1, 1, 1)
+
+        # store doubleclick interval as a timedelta
         td = datetime.timedelta(0, 0, 1000 * Qt.qApp.doubleClickInterval())
         self.__doubleclickInterval = td
 
     def __onDoorAbort(self):
-        '''slot to be called when the abort action is triggered. 
+        '''slot to be called when the abort action is triggered.
         It sends stop command to the pools (or abort if the action
         has been triggered twice in less than self.__doubleclickInterval
-        
-        .. note:: An abort command is always preceded by an stop command 
+
+        .. note:: An abort command is always preceded by an stop command
         '''
-        #decide whether to send stop or abort
+        # decide whether to send stop or abort
         now = datetime.datetime.now()
         if now - self.__lastAbortTime < self.__doubleclickInterval:
             cmd = 'abort'
         else:
             cmd = 'stop'
-            
-        door =self.getModelObj()
-        
-        #abort the door
+
+        door = self.getModelObj()
+
+        # abort the door
         door.command_inout('abort')
-        #send stop/abort to all pools
+        # send stop/abort to all pools
         pools = door.macro_server.getElementsOfType('Pool')
         for pool in pools.values():
             self.info('Sending %s command to %s' % (cmd, pool.getFullName()))
             try:
                 pool.getObj().command_inout(cmd)
             except:
-                self.info('%s command failed on %s', cmd, pool.getFullName(), 
+                self.info('%s command failed on %s', cmd, pool.getFullName(),
                           exc_info=1)
-        self.emit(Qt.SIGNAL("newShortMessage"), "%s command sent to all pools" %
-                   cmd)
+        self.newShortMessage.emit("%s command sent to all pools" %
+                  cmd)
         self.__lastAbortTime = now
 
     def createPanel(self, widget, name, **kwargs):
-        ''' Reimplemented from :class:`DynamicPlotManager` to delegate panel 
+        ''' Reimplemented from :class:`DynamicPlotManager` to delegate panel
         management to the parent widget (a TaurusGui)'''
         mainwindow = self.parent()
         return mainwindow.createPanel(widget, name, **kwargs)
-    
-    def getPanelWidget(self,name):
-        ''' Reimplemented from :class:`DynamicPlotManager` to delegate panel 
+
+    def getPanelWidget(self, name):
+        ''' Reimplemented from :class:`DynamicPlotManager` to delegate panel
         management to the parent widget (a TaurusGui)'''
         mainwindow = self.parent()
-        return mainwindow.getPanel(name).widget() 
-    
+        return mainwindow.getPanel(name).widget()
+
     def removePanel(self, name):
-        ''' Reimplemented from :class:`DynamicPlotManager` to delegate panel 
+        ''' Reimplemented from :class:`DynamicPlotManager` to delegate panel
         management to the parent widget (a TaurusGui)'''
         mainwindow = self.parent()
         mainwindow.removePanel(name)
-        
+
     def removeTemporaryPanels(self, names=None):
         '''Remove temporary panels managed by this widget'''
-        #for now, the only temporary panels are the plots
+        # for now, the only temporary panels are the plots
         DynamicPlotManager.removePanels(self, names=names)
 
 
 if __name__ == "__main__":
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
-        
+
     app = TaurusApplication()
-    
+
     b = DynamicPlotManager(None)
-    
+
     b.setModel('door/cp1/1')
-    
-    print '...'    
+
+    print '...'
     sys.exit(app.exec_())
-    
diff --git a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py
index 607b5c1..4a5c228 100644
--- a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py
+++ b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py
@@ -2,37 +2,37 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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__=["PanelDescriptionWizard"]
+__all__ = ["PanelDescriptionWizard"]
 """
-paneldescriptionwizard.py: 
+paneldescriptionwizard.py:
 """
 
 from taurus.external.qt import Qt
 import sys
 import weakref
 from taurus.qt.qtgui.taurusgui.utils import PanelDescription
-from taurus.qt.qtgui.resource import getPixmap, getThemeIcon, getIcon
+from taurus.qt.qtgui.icon import getCachedPixmap
 from taurus.qt.qtgui.input import GraphicalChoiceWidget
 from taurus.qt.qtgui.panel import TaurusModelChooser
 from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget
@@ -40,28 +40,36 @@ from taurus.qt.qtcore.communication import SharedDataManager
 from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE
 from taurus.qt.qtgui.util import TaurusWidgetFactory
 from taurus.core.util.log import Logger
-import inspect, copy
+import inspect
+import copy
+
 
 class ExpertWidgetChooserDlg(Qt.QDialog):
     CHOOSE_TYPE_TXT = '(choose type)'
-    def __init__(self, parent = None):
+
+    memberSelected = Qt.pyqtSignal(dict)
+
+    def __init__(self, parent=None):
         Qt.QDialog.__init__(self, parent)
-        
+
         self.setWindowTitle('Advanced panel type selection')
-        
+
         layout1 = Qt.QHBoxLayout()
         layout2 = Qt.QHBoxLayout()
         layout = Qt.QVBoxLayout()
-        
-        #subwidgets
+
+        # subwidgets
         self.moduleNameLE = Qt.QLineEdit()
-        self.moduleNameLE.setValidator(Qt.QRegExpValidator(Qt.QRegExp('[a-zA-Z0-9\.\_]*'),self.moduleNameLE))
+        self.moduleNameLE.setValidator(Qt.QRegExpValidator(
+            Qt.QRegExp('[a-zA-Z0-9\.\_]*'), self.moduleNameLE))
         self.membersCB = Qt.QComboBox()
-        self.dlgBox = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok| Qt.QDialogButtonBox.Cancel)
+        self.dlgBox = Qt.QDialogButtonBox(
+            Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel)
         self.dlgBox.button(Qt.QDialogButtonBox.Ok).setEnabled(False)
-        
-        #layout
-        layout.addWidget(Qt.QLabel('Select the module and widget to use in the panel:'))
+
+        # layout
+        layout.addWidget(
+            Qt.QLabel('Select the module and widget to use in the panel:'))
         layout1.addWidget(Qt.QLabel('Module'))
         layout1.addWidget(self.moduleNameLE)
         layout2.addWidget(Qt.QLabel('Class (or widget)'))
@@ -70,52 +78,58 @@ class ExpertWidgetChooserDlg(Qt.QDialog):
         layout.addLayout(layout2)
         layout.addWidget(self.dlgBox)
         self.setLayout(layout)
-        
-        #connections
-        self.connect(self.moduleNameLE, Qt.SIGNAL('editingFinished()'), self.onModuleSelected)
-        self.connect(self.moduleNameLE, Qt.SIGNAL('textEdited(QString)'), self.onModuleEdited)
-        self.connect(self.membersCB, Qt.SIGNAL('activated(QString)'), self.onMemberSelected)
-        self.connect(self.dlgBox,Qt.SIGNAL('accepted()'), self.accept)
-        self.connect(self.dlgBox,Qt.SIGNAL('rejected()'), self.reject)
-        
+
+        # connections
+        self.moduleNameLE.editingFinished.connect(self.onModuleSelected)
+        self.moduleNameLE.textEdited.connect(self.onModuleEdited)
+        self.membersCB.activated.connect(self.onMemberSelected)
+        self.dlgBox.accepted.connect(self.accept)
+        self.dlgBox.rejected.connect(self.reject)
+
     def onModuleEdited(self):
         self.dlgBox.button(Qt.QDialogButtonBox.Ok).setEnabled(False)
         self.module = None
         self.moduleNameLE.setStyleSheet('')
         self.membersCB.clear()
-    
+
     def onModuleSelected(self):
         modulename = str(self.moduleNameLE.text())
         try:
             __import__(modulename)
-            self.module = sys.modules[modulename] #We use this because __import__('x.y') returns x instead of y !! 
+            # We use this because __import__('x.y') returns x instead of y !!
+            self.module = sys.modules[modulename]
             self.moduleNameLE.setStyleSheet('QLineEdit {color: green}')
         except Exception, e:
             Logger().debug(repr(e))
             self.moduleNameLE.setStyleSheet('QLineEdit {color: red}')
             return
-        #inspect the module to find the members we want (classes or widgets inheriting from QWidget)
+        # inspect the module to find the members we want (classes or widgets
+        # inheriting from QWidget)
         members = inspect.getmembers(self.module)
-        classnames = sorted([ n for n,m in members if inspect.isclass(m) and issubclass(m, Qt.QWidget)])
-        widgetnames = sorted([ n for n,m in members if isinstance(m, Qt.QWidget)])
+        classnames = sorted(
+            [n for n, m in members if inspect.isclass(m) and issubclass(m, Qt.QWidget)])
+        widgetnames = sorted(
+            [n for n, m in members if isinstance(m, Qt.QWidget)])
         self.membersCB.clear()
         self.membersCB.addItem(self.CHOOSE_TYPE_TXT)
         self.membersCB.addItems(classnames)
-        if classnames and widgetnames: self.membersCB.InsertSeparator(self.membersCB.count())
+        if classnames and widgetnames:
+            self.membersCB.InsertSeparator(self.membersCB.count())
         self.membersCB.addItems(classnames)
-        
+
     def onMemberSelected(self, text):
-        if str(text) == self.CHOOSE_TYPE_TXT: return
+        if str(text) == self.CHOOSE_TYPE_TXT:
+            return
         self.dlgBox.button(Qt.QDialogButtonBox.Ok).setEnabled(True)
-        #emit a signal with a dictionary that can be used to initialize 
-        self.emit(Qt.SIGNAL('memberSelected'), self.getMemberDescription())
-    
+        # emit a signal with a dictionary that can be used to initialize
+        self.memberSelected.emit(self.getMemberDescription())
+
     def getMemberDescription(self):
         try:
             membername = str(self.membersCB.currentText())
             member = getattr(self.module, membername, None)
-            result = {'modulename':self.module.__name__}
-        except Exception,e:
+            result = {'modulename': self.module.__name__}
+        except Exception, e:
             Logger().debug('Cannot get member description: %s', repr(e))
             return None
         if inspect.isclass(member):
@@ -123,58 +137,62 @@ class ExpertWidgetChooserDlg(Qt.QDialog):
         else:
             result['widgetname'] = membername
         return result
-    
-    @staticmethod    
+
+    @staticmethod
     def getDialog():
         dlg = ExpertWidgetChooserDlg()
         dlg.exec_()
-        return dlg.getMemberDescription(), (dlg.result() == dlg.Accepted)   
-        
-    
+        return dlg.getMemberDescription(), (dlg.result() == dlg.Accepted)
+
 
 class BlackListValidator(Qt.QValidator):
-    def __init__(self, blackList=None, parent = None):
+
+    stateChanged = Qt.pyqtSignal(int, int)
+
+    def __init__(self, blackList=None, parent=None):
         Qt.QValidator.__init__(self, parent)
-        if blackList is None: blackList = []
+        if blackList is None:
+            blackList = []
         self.blackList = blackList
         self._previousState = None
-        #check the signature of the validate method (it changed from old to new versions)
-        #see :http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/python_v3.html#qvalidator
-        dummyValidator = Qt.QDoubleValidator(None) 
-        self._oldMode = len(dummyValidator.validate('',0)) < 3
-        
+        # check the signature of the validate method (it changed from old to new versions)
+        # see
+        # :http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/python_v3.html#qvalidator
+        dummyValidator = Qt.QDoubleValidator(None)
+        self._oldMode = len(dummyValidator.validate('', 0)) < 3
+
     def validate(self, input, pos):
         if str(input) in self.blackList:
             state = self.Intermediate
         else:
             state = self.Acceptable
         if state != self._previousState:
-            self.emit(Qt.SIGNAL('stateChanged'), state, self._previousState)
+            self.stateChanged.emit(state, self._previousState)
             self._previousState = state
-        if self._oldMode: #for backwards compatibility with older versions of PyQt
+        if self._oldMode:  # for backwards compatibility with older versions of PyQt
             return state, pos
         else:
             return state, input, pos
-        
-#class NamePage(Qt.QWizardPage):
-#    
+
+# class NamePage(Qt.QWizardPage):
+#
 #    def __init__(self, parent = None):
 #        Qt.QWizardPage.__init__(self, parent)
-#        
+#
 #        self.setTitle('Name')
 #        self.setSubTitle('Choose a name for the new panel (it must not exist already)')
-#        
-#        #contents    
+#
+#        #contents
 #        self.nameLE = Qt.QLineEdit()
 #        self.registerField("panelname*",self.nameLE)
 #        self.diagnosticLabel = Qt.QLabel('')
-#        
+#
 #        layout = Qt.QHBoxLayout()
 #        layout.addWidget(Qt.QLabel("Panel Name"))
 #        layout.addWidget(self.nameLE)
 #        layout.addWidget(self.diagnosticLabel)
 #        self.setLayout(layout)
-#    
+#
 #    def initializePage(self):
 #        gui = self.wizard().getGui()
 #        if hasattr(gui, 'getPanelNames'):
@@ -182,118 +200,124 @@ class BlackListValidator(Qt.QValidator):
 #            v = BlackListValidator(blackList=pnames, parent=self.nameLE)
 #            self.nameLE.setValidator(v)
 #            self.connect(v, Qt.SIGNAL('stateChanged'),self._onValidatorStateChanged)
-#    
+#
 #    def _onValidatorStateChanged(self, state, previous):
 #        if state == Qt.QValidator.Acceptable:
 #            self.diagnosticLabel.setText('')
 #        else:
 #            self.diagnosticLabel.setText('<b>(Name already exists)</b>')
-#        
-    
-        
+#
+
+
 class WidgetPage(Qt.QWizardPage, TaurusBaseWidget):
-    OTHER_TXT ='Other...'
-    defaultCandidates = ['TaurusForm','TaurusTrend', 'TaurusPlot',
-                    'TaurusImageDialog', 'TaurusTrend2DDialog', 'TaurusNeXusBrowser',
-                    'TaurusDbTreeWidget', 'TaurusArrayEditor',
-                    'TaurusShell', 'SardanaEditor','TaurusJDrawSynopticsView',
-                    'TaurusDevicePanel']
-    def __init__(self, parent = None, designMode=False, extraWidgets=None):
+    OTHER_TXT = 'Other...'
+    defaultCandidates = ['TaurusForm', 'TaurusTrend', 'TaurusPlot',
+                         'TaurusImageDialog', 'TaurusTrend2DDialog', 'TaurusNeXusBrowser',
+                         'TaurusDbTreeWidget', 'TaurusArrayEditor',
+                         'TaurusShell', 'SardanaEditor', 'TaurusJDrawSynopticsView',
+                         'TaurusDevicePanel']
+
+    def __init__(self, parent=None, designMode=False, extraWidgets=None):
         Qt.QWizardPage.__init__(self, parent)
         TaurusBaseWidget.__init__(self, 'WidgetPage')
         if extraWidgets:
-            customWidgets,customWidgetScreenshots = zip(*extraWidgets)
+            customWidgets, customWidgetScreenshots = zip(*extraWidgets)
             pixmaps = {}
-            for k,s in extraWidgets:
+            for k, s in extraWidgets:
                 if s is None:
                     pixmaps[k] = None
                 else:
                     try:
-                        pixmaps[k] = getPixmap(s)
+                        pixmaps[k] = getCachedPixmap(s)
                         if pixmaps[k].isNull():
                             raise Exception('Invalid Pixmap')
                     except:
-                        self.warning('Could not create pixmap from %s'%s)
+                        self.warning('Could not create pixmap from %s' % s)
                         pixmaps[k] = None
-                    
+
         else:
-            customWidgets,customWidgetScreenshots = [],[]
+            customWidgets, customWidgetScreenshots = [], []
             pixmaps = {}
         self.setFinalPage(True)
         self.setTitle('Panel type')
         self.setSubTitle('Choose a name and type for the new panel')
         self.setButtonText(Qt.QWizard.NextButton, 'Advanced settings...')
-        
-        self.widgetDescription = {'widgetname':None, 'modulename':None, 'classname':None}
-        
-        #name part
+
+        self.widgetDescription = {'widgetname': None,
+                                  'modulename': None, 'classname': None}
+
+        # name part
         self.nameLE = Qt.QLineEdit()
-        self.registerField("panelname*",self.nameLE)
+        self.registerField("panelname*", self.nameLE)
         self.diagnosticLabel = Qt.QLabel('')
         nameLayout = Qt.QHBoxLayout()
         nameLayout.addWidget(Qt.QLabel("Panel Name"))
         nameLayout.addWidget(self.nameLE)
         nameLayout.addWidget(self.diagnosticLabel)
-        
-        #contents    
+
+        # contents
         available = TaurusWidgetFactory().getWidgetClassNames()
         choices = []
-        row=[]
-        for cname in self.defaultCandidates+list(customWidgets):
-            if cname in available or '.' in cname: 
+        row = []
+        for cname in self.defaultCandidates + list(customWidgets):
+            if cname in available or '.' in cname:
                 row.append(cname)
                 if cname not in pixmaps:
-                    pixmaps[cname] = getPixmap(':/snapshot/%s.png'%cname)
+                    pixmaps[cname] = getCachedPixmap('snapshot:%s.png' % cname)
                 if len(row) == 3:
                     choices.append(row)
-                    row=[]            
+                    row = []
         row.append(self.OTHER_TXT)
         choices.append(row)
 
-        #defaultPixmap=getPixmap(':/taurus.png')
-        self.choiceWidget = GraphicalChoiceWidget(choices=choices, pixmaps=pixmaps)
-        
+        # defaultPixmap=getPixmap('logos:taurus.png')
+        self.choiceWidget = GraphicalChoiceWidget(
+            choices=choices, pixmaps=pixmaps)
+
         self.widgetTypeLB = Qt.QLabel("<b>Widget Type:</b>")
-        
-        self.connect(self.choiceWidget, Qt.SIGNAL('choiceMade'),self.onChoiceMade)
-        
+
+        self.choiceWidget.choiceMade.connect(self.onChoiceMade)
+
         layout = Qt.QVBoxLayout()
         layout.addLayout(nameLayout)
         layout.addWidget(self.choiceWidget)
         layout.addWidget(self.widgetTypeLB)
         self.setLayout(layout)
-    
+
     def initializePage(self):
         gui = self.wizard().getGui()
         if hasattr(gui, 'getPanelNames'):
             pnames = gui.getPanelNames()
             v = BlackListValidator(blackList=pnames, parent=self.nameLE)
             self.nameLE.setValidator(v)
-            self.connect(v, Qt.SIGNAL('stateChanged'),self._onValidatorStateChanged)
-    
+            v.stateChanged.connect(self._onValidatorStateChanged)
+
     def validatePage(self):
         paneldesc = self.wizard().getPanelDescription()
         if paneldesc is None:
-            Qt.QMessageBox.information(self, 'You must choose a panel type', 'Choose a panel type by clicking on one of the proposed types')
+            Qt.QMessageBox.information(self, 'You must choose a panel type',
+                                       'Choose a panel type by clicking on one of the proposed types')
             return False
         try:
             w = paneldesc.getWidget()
-            if not isinstance(w, Qt.QWidget): 
+            if not isinstance(w, Qt.QWidget):
                 raise ValueError
-            #set the name now because it might have changed since the PanelDescription was created
+            # set the name now because it might have changed since the
+            # PanelDescription was created
             paneldesc.name = Qt.from_qvariant(self.field('panelname'), str)
-            #allow the wizard to proceed
+            # allow the wizard to proceed
             return True
-        except Exception,e:
-            Qt.QMessageBox.warning(self, 'Invalid panel', 'The requested panel cannot be created. \nReason:\n%s'%repr(e))
+        except Exception, e:
+            Qt.QMessageBox.warning(
+                self, 'Invalid panel', 'The requested panel cannot be created. \nReason:\n%s' % repr(e))
             return False
-    
+
     def _onValidatorStateChanged(self, state, previous):
         if state == Qt.QValidator.Acceptable:
             self.diagnosticLabel.setText('')
         else:
             self.diagnosticLabel.setText('<b>(Name already exists)</b>')
-    
+
     def onChoiceMade(self, choice):
         if choice == self.OTHER_TXT:
             wdesc, ok = ExpertWidgetChooserDlg.getDialog()
@@ -303,60 +327,65 @@ class WidgetPage(Qt.QWizardPage, TaurusBaseWidget):
                 return
         else:
             self.widgetDescription['classname'] = choice
-        
-        self.wizard().setPanelDescription( PanelDescription('', **self.widgetDescription))   #the name will be set in self.validatePage   
-        paneltype = str(self.widgetDescription['widgetname'] or self.widgetDescription['classname'])
-        self.widgetTypeLB.setText("<b>Widget Type:</b> %s"%paneltype)
 
-        
+        # the name will be set in self.validatePage
+        self.wizard().setPanelDescription(PanelDescription('', **self.widgetDescription))
+        paneltype = str(self.widgetDescription[
+                        'widgetname'] or self.widgetDescription['classname'])
+        self.widgetTypeLB.setText("<b>Widget Type:</b> %s" % paneltype)
+
+
 class AdvSettingsPage(Qt.QWizardPage):
-    
-    def __init__(self, parent = None):
+
+    def __init__(self, parent=None):
         Qt.QWizardPage.__init__(self, parent)
-        
+
         self.setTitle('Advanced settings')
-        self.setSubTitle('Fine-tune the behavior of the panel by assigning a Taurus model '+ \
+        self.setSubTitle('Fine-tune the behavior of the panel by assigning a Taurus model ' +
                          'and/or defining the panel interactions with other parts of the GUI')
         self.setFinalPage(True)
         self.models = []
-                
-        layout =  Qt.QVBoxLayout()
-        
+
+        layout = Qt.QVBoxLayout()
+
         #----model---------------
-        #subwidgets
+        # subwidgets
         self.modelGB = Qt.QGroupBox('Model')
-        self.modelGB.setToolTip('Choose a Taurus model to be assigned to the panel')
-        self.modelLE = Qt.QLineEdit()    #@todo: add a regexp validator (it should return valid on TAURUS_MODEL_LIST_MIME_TYPE)
+        self.modelGB.setToolTip(
+            'Choose a Taurus model to be assigned to the panel')
+        # @todo: add a regexp validator (it should return valid on TAURUS_MODEL_LIST_MIME_TYPE)
+        self.modelLE = Qt.QLineEdit()
         self.modelChooserBT = Qt.QToolButton()
-        self.modelChooserBT.setIcon(getIcon(':/designer/devs_tree.png'))
+        self.modelChooserBT.setIcon(Qt.QIcon('designer:devs_tree.png'))
 #        self.modelChooser = TaurusModelChooser()
-        
-        #connections
-        self.connect(self.modelChooserBT, Qt.SIGNAL('clicked()'), self.showModelChooser)
-        self.connect(self.modelLE, Qt.SIGNAL('editingFinished()'), self.onModelEdited)
-        
-        #layout
+
+        # connections
+        self.modelChooserBT.clicked.connect(self.showModelChooser)
+        self.modelLE.editingFinished.connect(self.onModelEdited)
+
+        # layout
         layout1 = Qt.QHBoxLayout()
         layout1.addWidget(self.modelLE)
         layout1.addWidget(self.modelChooserBT)
         self.modelGB.setLayout(layout1)
-        
+
         #----communications------
-        #subwidgets
+        # subwidgets
         self.commGB = Qt.QGroupBox('Communication')
-        self.commGB.setToolTip('Define how the panel communicates with other panels and the GUI')
+        self.commGB.setToolTip(
+            'Define how the panel communicates with other panels and the GUI')
         self.commLV = Qt.QTableView()
         self.commModel = CommTableModel()
         self.commLV.setModel(self.commModel)
         self.commLV.setEditTriggers(self.commLV.AllEditTriggers)
-        self.selectedComm =  self.commLV.selectionModel().currentIndex()
+        self.selectedComm = self.commLV.selectionModel().currentIndex()
         self.addBT = Qt.QToolButton()
-        self.addBT.setIcon(getThemeIcon('list-add'))
+        self.addBT.setIcon(Qt.QIcon.fromTheme('list-add'))
         self.removeBT = Qt.QToolButton()
-        self.removeBT.setIcon(getThemeIcon('list-remove'))
+        self.removeBT.setIcon(Qt.QIcon.fromTheme('list-remove'))
         self.removeBT.setEnabled(False)
-        
-        #layout
+
+        # layout
         layout2 = Qt.QVBoxLayout()
         layout3 = Qt.QHBoxLayout()
         layout2.addWidget(self.commLV)
@@ -364,27 +393,27 @@ class AdvSettingsPage(Qt.QWizardPage):
         layout3.addWidget(self.removeBT)
         layout2.addLayout(layout3)
         self.commGB.setLayout(layout2)
-        
-        #connections
-        self.connect(self.addBT, Qt.SIGNAL('clicked()'), self.commModel.insertRows)
-        self.connect(self.removeBT, Qt.SIGNAL('clicked()'), self.onRemoveRows)
-        self.connect(self.commLV.selectionModel(), Qt.SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'), self.onCommRowSelectionChanged)
-        
+
+        # connections
+        self.addBT.clicked.connect(self.commModel.insertRows)
+        self.removeBT.clicked.connect(self.onRemoveRows)
+        self.commLV.selectionModel().currentRowChanged.connect(self.onCommRowSelectionChanged)
+
         layout.addWidget(self.modelGB)
         layout.addWidget(self.commGB)
         self.setLayout(layout)
-        
+
     def initializePage(self):
         try:
             widget = self.wizard().getPanelDescription().getWidget()
         except Exception, e:
             Logger().debug(repr(e))
             widget = None
-        #prevent the user from changing the model if it was already set
+        # prevent the user from changing the model if it was already set
         if isinstance(widget, TaurusBaseComponent) and widget.getModelName() != '':
             self.modelLE.setText("(already set by the chosen widget)")
             self.modelGB.setEnabled(False)
-        #try to get the SDM as if we were in a TaurusGui app
+        # try to get the SDM as if we were in a TaurusGui app
         try:
             if isinstance(Qt.qApp.SDM, SharedDataManager):
                 sdm = Qt.qApp.SDM
@@ -394,31 +423,34 @@ class AdvSettingsPage(Qt.QWizardPage):
         #@todo set selection filter in modelChooser based on the widget's modelclass
         self.itemDelegate = CommItemDelegate(widget=widget, sdm=sdm)
         self.commLV.setItemDelegate(self.itemDelegate)
-    
+
     def showModelChooser(self):
-        models,ok = TaurusModelChooser.modelChooserDlg(parent=self, asMimeData=True)
-        if not ok: return
+        models, ok = TaurusModelChooser.modelChooserDlg(
+            parent=self, asMimeData=True)
+        if not ok:
+            return
         self.models = str(models.data(TAURUS_MODEL_LIST_MIME_TYPE))
         self.modelLE.setText(models.text())
-        
+
     def onModelEdited(self):
         self.models = str(self.modelLE.text())
-        
+
     def onRemoveRows(self):
         if self.selectedComm.isValid():
             self.commModel.removeRows(self.selectedComm.row())
-        
+
     def onCommRowSelectionChanged(self, current, previous):
         self.selectedComm = current
-        enable = (current.isValid() and 0<=current.row()<self.commModel.rowCount())
+        enable = (current.isValid() and 0 <= current.row()
+                  < self.commModel.rowCount())
         self.removeBT.setEnabled(enable)
-        
+
     def validatePage(self):
         desc = self.wizard().getPanelDescription()
-        #model
+        # model
         desc.model = self.models
-        #communications
-        for uid, slotname,signalname in self.commModel.dumpData():
+        # communications
+        for uid, slotname, signalname in self.commModel.dumpData():
             if slotname:
                 desc.sharedDataRead[uid] = slotname
             if signalname:
@@ -427,195 +459,213 @@ class AdvSettingsPage(Qt.QWizardPage):
         return True
 
 
-
 class CommTableModel(Qt.QAbstractTableModel):
     NUMCOLS = 3
     UID, R, W = range(NUMCOLS)
-    def __init__(self, parent = None):
+
+    dataChanged = Qt.pyqtSignal(int, int)
+
+    def __init__(self, parent=None):
         Qt.QAbstractTableModel.__init__(self, parent)
-        self.__table=[]
-    
+        self.__table = []
+
     def dumpData(self):
         return copy.deepcopy(self.__table)
-    
-    def rowCount(self,index=Qt.QModelIndex()):
+
+    def rowCount(self, index=Qt.QModelIndex()):
         return len(self.__table)
-    
-    def columnCount(self,index=Qt.QModelIndex()):
+
+    def columnCount(self, index=Qt.QModelIndex()):
         return self.NUMCOLS
-    
+
     def headerData(self, section, orientation, role=Qt.Qt.DisplayRole):
         if role == Qt.Qt.TextAlignmentRole:
             if orientation == Qt.Qt.Horizontal:
-                return Qt.QVariant(int(Qt.Qt.AlignLeft|Qt.Qt.AlignVCenter))
-            return Qt.QVariant(int(Qt.Qt.AlignRight|Qt.Qt.AlignVCenter))
+                return Qt.QVariant(int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter))
+            return Qt.QVariant(int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter))
         if role != Qt.Qt.DisplayRole:
             return Qt.QVariant()
-        #So this is DisplayRole...
+        # So this is DisplayRole...
         if orientation == Qt.Qt.Horizontal:
-            if section == self.UID: return Qt.QVariant("Data UID")
-            elif section == self.R: return Qt.QVariant("Reader (slot)")
-            elif section == self.W: return Qt.QVariant("Writer (signal)")
+            if section == self.UID:
+                return Qt.QVariant("Data UID")
+            elif section == self.R:
+                return Qt.QVariant("Reader (slot)")
+            elif section == self.W:
+                return Qt.QVariant("Writer (signal)")
             return Qt.QVariant()
         else:
-            return Qt.QVariant(Qt.QString('%i'%(section+1)))
-        
+            return Qt.QVariant(Qt.QString('%i' % (section + 1)))
+
     def data(self, index, role=Qt.Qt.DisplayRole):
         if not index.isValid() or not (0 <= index.row() < self.rowCount()):
             return Qt.QVariant()
-        row=index.row()
+        row = index.row()
         column = index.column()
-        #Display Role
+        # Display Role
         if role == Qt.Qt.DisplayRole:
             text = self.__table[row][column]
             if text == '':
-                if column == self.UID: text = '(enter UID)'
-                else:  text = '(not registered)'
+                if column == self.UID:
+                    text = '(enter UID)'
+                else:
+                    text = '(not registered)'
             return Qt.QVariant(Qt.QString(text))
         return Qt.QVariant()
-        
+
     def flags(self, index):
-        return (Qt.Qt.ItemIsEnabled |Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsDropEnabled | Qt.Qt.ItemIsSelectable)
-                     
+        return (Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsDropEnabled | Qt.Qt.ItemIsSelectable)
+
     def setData(self, index, value=None, role=Qt.Qt.EditRole):
         if index.isValid() and (0 <= index.row() < self.rowCount()):
             row = index.row()
             column = index.column()
             value = Qt.from_qvariant(value, str)
             self.__table[row][column] = value
-            self.emit(Qt.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),index, index)
+            self.dataChanged.emit(index, index)
             return True
         return False
-    
-    def insertRows(self, position=None,rows=1,parentindex=None):
-        if position is None: position = self.rowCount()
-        if parentindex is None: parentindex = Qt.QModelIndex()
-        self.beginInsertRows(parentindex, position, position + rows -1)
+
+    def insertRows(self, position=None, rows=1, parentindex=None):
+        if position is None:
+            position = self.rowCount()
+        if parentindex is None:
+            parentindex = Qt.QModelIndex()
+        self.beginInsertRows(parentindex, position, position + rows - 1)
         slice = [self.rowModel() for i in range(rows)]
-        self.__table = self.__table[:position]+slice+self.__table[position:]
+        self.__table = self.__table[:position] + \
+            slice + self.__table[position:]
         self.endInsertRows()
         return True
-        
+
     def removeRows(self, position, rows=1, parentindex=None):
-        if parentindex is None: parentindex = Qt.QModelIndex()
+        if parentindex is None:
+            parentindex = Qt.QModelIndex()
         self.beginRemoveRows(parentindex, position, position + rows - 1)
-        self.__table = self.__table[:position]+self.__table[position+rows:]
+        self.__table = self.__table[:position] + self.__table[position + rows:]
         self.endRemoveRows()
         self.reset()
         return True
-    
+
     @staticmethod
-    def rowModel(uid='',slot='', signal=''):
-        return [uid, slot, signal] 
+    def rowModel(uid='', slot='', signal=''):
+        return [uid, slot, signal]
+
 
 class CommItemDelegate(Qt.QStyledItemDelegate):
     NUMCOLS = 3
     UID, R, W = range(NUMCOLS)
+
     def __init__(self, parent=None, widget=None, sdm=None):
-        super(CommItemDelegate,self).__init__(parent)
-        if widget is not None: widget = weakref.proxy(widget)
+        super(CommItemDelegate, self).__init__(parent)
+        if widget is not None:
+            widget = weakref.proxy(widget)
         self._widget = widget
-        if sdm is not None: sdm = weakref.proxy(sdm)
+        if sdm is not None:
+            sdm = weakref.proxy(sdm)
         self._sdm = sdm
-        
+
     def createEditor(self, parent, option, index):
         column = index.column()
         combobox = Qt.QComboBox(parent)
         combobox.setEditable(True)
-        if column==self.UID and self._sdm is not None:
+        if column == self.UID and self._sdm is not None:
             combobox.addItems(self._sdm.activeDataUIDs())
-        elif column==self.R and self._widget is not None:
-            slotnames = [n for n,o in inspect.getmembers(self._widget, inspect.ismethod) if not n.startswith('_')]
+        elif column == self.R and self._widget is not None:
+            slotnames = [n for n, o in inspect.getmembers(
+                self._widget, inspect.ismethod) if not n.startswith('_')]
             combobox.addItems(slotnames)
 #        elif column==self.W:
 #            if self._widget is not None:
-#                #@todo: if/when support for old signals style (Qt<4.6) is dropped, we can inspect the methods in search of (new style) signals 
+#                #@todo: if/when support for old signals style (Qt<4.6) is dropped, we can inspect the methods in search of (new style) signals
 #                combobox.addItems(['(Not registered)'])
         return combobox
-        
+
     def setEditorData(self, editor, index):
         editor.setEditText('')
-        
+
     def setModelData(self, editor, model, index):
-        model.setData(index, Qt.QVariant(editor.currentText()))        
+        model.setData(index, Qt.QVariant(editor.currentText()))
+
 
 class PanelDescriptionWizard(Qt.QWizard, TaurusBaseWidget):
-    '''A wizard-style dialog for configuring a new TaurusGui panel. 
+    '''A wizard-style dialog for configuring a new TaurusGui panel.
     Use :meth:`getDialog` for launching it
     '''
+
     def __init__(self, parent=None, designMode=False, gui=None, extraWidgets=None):
         Qt.QWizard.__init__(self, parent)
         name = "PanelDescriptionWizard"
         TaurusBaseWidget.__init__(self, name)
         self._panelDescription = None
-        if gui is None: gui = parent
+        if gui is None:
+            gui = parent
         if gui is not None:
             self._gui = weakref.proxy(gui)
         ###self.setOption(self.HaveFinishButtonOnEarlyPages, True)
         #self.namePG = NamePage()
         self.widgetPG = WidgetPage(extraWidgets=extraWidgets)
         self.advSettingsPG = AdvSettingsPage()
-        
-        ###self.addPage(self.namePG)
+
+        # self.addPage(self.namePG)
         self.addPage(self.widgetPG)
         self.addPage(self.advSettingsPG)
-        
+
     def getGui(self):
         '''returns a reference to the GUI to which the dialog is associated'''
         return self._gui
-        
+
     def getPanelDescription(self):
         '''Returns the panel description with the choices made so far
-        
+
         :return: (PanelDescription) the panel description
         '''
         return self._panelDescription
-    
+
     def setPanelDescription(self, desc):
         '''Sets the Panel description
-        
+
         :param desc: (PanelDescription)
         '''
         self._panelDescription = desc
-        
-    @staticmethod    
+
+    @staticmethod
     def getDialog(parent, extraWidgets=None):
         """Static method for launching a new Dialog.
-        
+
         :param parent: parent widget for the new dialog
-        
-        :return: (tuple<PanelDescription,bool>) tuple of a description object 
+
+        :return: (tuple<PanelDescription,bool>) tuple of a description object
                  and a state flag. The state is True if the dialog was accepted
                  and False otherwise
         """
-        dlg = PanelDescriptionWizard(parent,extraWidgets=extraWidgets)
+        dlg = PanelDescriptionWizard(parent, extraWidgets=extraWidgets)
         dlg.exec_()
-        return dlg.getPanelDescription(), (dlg.result() == dlg.Accepted)   
-        
-        
-        
-        
-#------------------------------------------------------------------------------ 
+        return dlg.getPanelDescription(), (dlg.result() == dlg.Accepted)
+
+
+#------------------------------------------------------------------------------
 
 def test():
     from taurus.qt.qtgui.application import TaurusApplication
     app = TaurusApplication(sys.argv)
     form = PanelDescriptionWizard()
-    
-    def kk(d):print d
+
+    def kk(d):
+        print d
     Qt.qApp.SDM = SharedDataManager(form)
     Qt.qApp.SDM.connectReader('111111', kk)
     Qt.qApp.SDM.connectWriter('222222', form, 'thisisasignalname')
-    
+
     form.show()
     sys.exit(app.exec_())
-    
+
+
 def test2():
     from taurus.qt.qtgui.application import TaurusApplication
     app = TaurusApplication(sys.argv)
-    print  ExpertWidgetChooserDlg.getDialog()
+    print ExpertWidgetChooserDlg.getDialog()
     sys.exit()
-    
 
 
 def main():
@@ -623,30 +673,27 @@ def main():
     app = TaurusApplication(sys.argv)
     from taurus.qt.qtgui.container import TaurusMainWindow
     form = Qt.QMainWindow()
-        
-    def kk(d):print d
+
+    def kk(d):
+        print d
     Qt.qApp.SDM = SharedDataManager(form)
     Qt.qApp.SDM.connectReader('someUID', kk)
     Qt.qApp.SDM.connectWriter('anotherUID', form, 'thisisasignalname')
-    
+
     form.show()
-    
-    paneldesc,ok = PanelDescriptionWizard.getDialog(form, extraWidgets=[('PyQt4.Qt.QLineEdit',':/taurus.png'),
-                                                                        ('PyQt4.Qt.QTextEdit',None)])
+
+    paneldesc, ok = PanelDescriptionWizard.getDialog(form, extraWidgets=[('PyQt4.Qt.QLineEdit', 'logos:taurus.png'),
+                                                                         ('PyQt4.Qt.QTextEdit', None)])
     if ok:
         w = paneldesc.getWidget(sdm=Qt.qApp.SDM)
         form.setCentralWidget(w)
         form.setWindowTitle(paneldesc.name)
     print Qt.qApp.SDM.info()
-    
-    sys.exit(app.exec_())
-    
 
+    sys.exit(app.exec_())
 
 
 if __name__ == "__main__":
     import sys
-    #test2()
-    main()    
-        
-        
+    # test2()
+    main()
diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py
index c2b8d64..7680107 100644
--- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py
+++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 ###########################################################################
 
@@ -39,8 +39,8 @@ import inspect
 from lxml import etree
 
 import taurus
+from taurus import tauruscustomsettings
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.resource import getIcon, getThemeIcon
 from taurus.qt.qtcore.configuration import BaseConfigurableClass
 from taurus.qt.qtcore.communication import SharedDataManager
 from taurus.qt.qtgui.util import TaurusWidgetFactory
@@ -67,9 +67,9 @@ class AssociationDialog(Qt.QDialog):
         self.loadUi()
 
         self.refresh()
-        self.connect(self.ui.instrumentCB, Qt.SIGNAL('activated (QString)'), self.onInstrumentChanged)
-        self.connect(self.ui.buttonBox, Qt.SIGNAL("clicked(QAbstractButton *)"), self.onDialogButtonClicked)
-        self.connect(self.ui.refreshBT, Qt.SIGNAL("clicked()"), self.refresh)
+        self.ui.instrumentCB.activated.connect(self.onInstrumentChanged)
+        self.ui.buttonBox.clicked.connect(self.onDialogButtonClicked)
+        self.ui.refreshBT.clicked.connect(self.refresh)
 
     def refresh(self):
         currentinstrument = self.ui.instrumentCB.currentText()
@@ -77,13 +77,13 @@ class AssociationDialog(Qt.QDialog):
 
         self.associations = mainwindow.getAllInstrumentAssociations()
 
-        #fill the comboboxes
+        # fill the comboboxes
         self.ui.instrumentCB.clear()
         self.ui.panelCB.clear()
         self.ui.instrumentCB.addItems(sorted(self.associations.keys()))
         self.ui.panelCB.addItems(['__[None]__'] + mainwindow.getPanelNames())
 
-        #restore the index
+        # restore the index
         idx = self.ui.instrumentCB.findText(currentinstrument)
         if idx == -1 and self.ui.instrumentCB.count() > 0:
             idx = 0
@@ -102,7 +102,7 @@ class AssociationDialog(Qt.QDialog):
 
     def onDialogButtonClicked(self, button):
         role = self.ui.buttonBox.buttonRole(button)
-        if role in (Qt.QDialogButtonBox.AcceptRole, Qt.QDialogButtonBox.ApplyRole) :
+        if role in (Qt.QDialogButtonBox.AcceptRole, Qt.QDialogButtonBox.ApplyRole):
             if self.ui.panelCB.currentIndex() > 0:
                 panelname = unicode(self.ui.panelCB.currentText())
             else:
@@ -118,6 +118,7 @@ class DockWidgetPanel(Qt.QDockWidget, TaurusBaseWidget):
     as a "panel" of a TaurusGui application. Widgets of TaurusGui are inserted
     in the application by adding them to a DockWidgetPanel.
     '''
+
     def __init__(self, parent, widget, name, mainwindow):
         Qt.QDockWidget.__init__(self, None)
         TaurusBaseWidget.__init__(self, name, parent=parent)
@@ -125,13 +126,14 @@ class DockWidgetPanel(Qt.QDockWidget, TaurusBaseWidget):
         self.setAllowedAreas(Qt.Qt.TopDockWidgetArea)
 
         self.setWidget(widget)
-        #self._widget = self.widget()  #keep a pointer that may change if the widget changes
+        # self._widget = self.widget()  #keep a pointer that may change if the
+        # widget changes
         name = unicode(name)
         self.setWindowTitle(name)
         self.setObjectName(name)
         self._custom = False
 
-        #store a weakref of the main window
+        # store a weakref of the main window
         self._mainwindow = weakref.proxy(mainwindow)
 
     def isCustom(self):
@@ -155,13 +157,15 @@ class DockWidgetPanel(Qt.QDockWidget, TaurusBaseWidget):
                 try:
                     if classname is not None and '.' in classname:
                         mn, classname = classname.rsplit('.', 1)
-                        modulename = ("%s.%s" % (modulename or '', mn)).strip('. ')
+                        modulename = ("%s.%s" %
+                                      (modulename or '', mn)).strip('. ')
                     module = __import__(modulename, fromlist=[''])
                     klass = getattr(module, classname)
                     w = klass()
                 except Exception, e:
-                    raise RuntimeError('Cannot create widget from classname "%s". Reason: %s' % (classname, repr(e)))
-            #set customwidgetmap if necessary
+                    raise RuntimeError(
+                        'Cannot create widget from classname "%s". Reason: %s' % (classname, repr(e)))
+            # set customwidgetmap if necessary
             if hasattr(w, 'setCustomWidgetMap'):
                 w.setCustomWidgetMap(self._mainwindow.getCustomWidgetMap())
             self.setWidget(w)
@@ -181,13 +185,15 @@ class DockWidgetPanel(Qt.QDockWidget, TaurusBaseWidget):
         return w.__class__.__name__
 
     def applyConfig(self, configdict, depth=-1):
-        #create the widget
+        # create the widget
         try:
-            self.setWidgetFromClassName(configdict.get('widgetClassName'), modulename=configdict.get('widgetModuleName', None))
+            self.setWidgetFromClassName(configdict.get(
+                'widgetClassName'), modulename=configdict.get('widgetModuleName', None))
             if isinstance(self.widget(), BaseConfigurableClass):
                 self.widget().applyConfig(configdict['widget'])
         except Exception, e:
-            self.info('Failed to set the widget for this panel. Reason: %s' % repr(e))
+            self.info(
+                'Failed to set the widget for this panel. Reason: %s' % repr(e))
             self.traceback(self.Debug)
             return
         TaurusBaseWidget.applyConfig(self, configdict, depth)
@@ -201,58 +207,58 @@ class DockWidgetPanel(Qt.QDockWidget, TaurusBaseWidget):
         return configdict
 
     def closeEvent(self, event):
-        Qt.QDockWidget.closeEvent(self, event)      
+        Qt.QDockWidget.closeEvent(self, event)
         TaurusBaseWidget.closeEvent(self, event)
 
 
 class TaurusGui(TaurusMainWindow):
     '''
-    This is main class for constructing the dynamic GUIs. TaurusGui is a 
-    specialised TaurusMainWindow which is able to handle "panels" and load 
+    This is main class for constructing the dynamic GUIs. TaurusGui is a
+    specialised TaurusMainWindow which is able to handle "panels" and load
     configuration files.
-    There are several ways of using TaurusGui. In the following we will give 
-    3 examples on how to create a simple GUI called "MyGui" which contains one 
+    There are several ways of using TaurusGui. In the following we will give
+    3 examples on how to create a simple GUI called "MyGui" which contains one
     panel called "Foo" and consisting of a `QWidget`:
-    
+
     **Example 1: use declarative configuration files.**
-    
-    You can create a purely declarative configuration file to be interpreted by 
+
+    You can create a purely declarative configuration file to be interpreted by
     the standard `taurusgui` script::
-    
+
         from taurus.qt.qtgui.taurusgui.utils import PanelDescription
 
         GUI_NAME = 'MyGui'
-        panel = PanelDescription('Foo', 
-                                 classname='taurus.external.qt.Qt.QWidget')   
-    
+        panel = PanelDescription('Foo',
+                                 classname='taurus.external.qt.Qt.QWidget')
+
     Note that this just a very simple example. For a much richer one, see the
     :mod:`taurus.qt.qtgui.taurusgui.conf.tgconf_example01`
-      
+
     **Example 2: do everything programmatically.**
-    
-    A stand-alone python script that launches the gui when executed. No 
-    configuration file is used here. Panels and other components are added 
+
+    A stand-alone python script that launches the gui when executed. No
+    configuration file is used here. Panels and other components are added
     programatically::
-    
+
         if __name__ == '__main__':
             from taurus.qt.qtgui.application import TaurusApplication
             from taurus.qt.qtgui.taurusgui import TaurusGui
             from taurus.external.qt import Qt
-            app = TaurusApplication(app_name='MyGui') 
+            app = TaurusApplication(app_name='MyGui')
             gui = TaurusGui()
             panel = Qt.QWidget()
             gui.createPanel(panel, 'Foo')
             gui.show()
             app.exec_()
-            
-            
+
+
     **Example 3: mixing declarative and programmatic ways**
-    
+
     It is also possible to create a stand-alone python script which loads itself
-    as a configuration file. In this way you can add things programmatically and 
+    as a configuration file. In this way you can add things programmatically and
     at the same time use the declarative way::
-    
-        GUI_NAME = 'MyGui' # <-- declarative! 
+
+        GUI_NAME = 'MyGui' # <-- declarative!
         if __name__ == '__main__':
             from taurus.qt.qtgui.application import TaurusApplication
             from taurus.qt.qtgui.taurusgui import TaurusGui
@@ -263,9 +269,14 @@ class TaurusGui(TaurusMainWindow):
             gui.createPanel(panel, 'Foo')  # <-- programmatic!
             gui.show()
             app.exec_()
-    
+
     '''
 
+    SelectedInstrument = Qt.pyqtSignal(str)
+    doorNameChanged = Qt.pyqtSignal(str)
+    macroserverNameChanged = Qt.pyqtSignal(str)
+    newShortMessage = Qt.pyqtSignal(str)
+
     IMPLICIT_ASSOCIATION = '__[IMPLICIT]__'
 
     def __init__(self, parent=None, confname=None, configRecursionDepth=None):
@@ -287,13 +298,16 @@ class TaurusGui(TaurusMainWindow):
         self.registerConfigProperty(self._getPermanentExternalApps,
                                     self._setPermanentExternalApps,
                                     'permanentexternalapps')
-        self.registerConfigProperty(self._getPermanentCustomPanels, self._setPermanentCustomPanels, 'permanentCustomPanels')
-        self.registerConfigProperty(self.getAllInstrumentAssociations, self.setAllInstrumentAssociations, 'instrumentAssociation')
+        self.registerConfigProperty(
+            self._getPermanentCustomPanels, self._setPermanentCustomPanels, 'permanentCustomPanels')
+        self.registerConfigProperty(self.getAllInstrumentAssociations,
+                                    self.setAllInstrumentAssociations, 'instrumentAssociation')
 
         from taurus import tauruscustomsettings
-        self.setCustomWidgetMap(getattr(tauruscustomsettings, 'T_FORM_CUSTOM_WIDGET_MAP', {}))
+        self.setCustomWidgetMap(
+            getattr(tauruscustomsettings, 'T_FORM_CUSTOM_WIDGET_MAP', {}))
 
-        #Create a global SharedDataManager
+        # Create a global SharedDataManager
         Qt.qApp.SDM = SharedDataManager(self)
 
         self.__initPanelsMenu()
@@ -306,21 +320,21 @@ class TaurusGui(TaurusMainWindow):
 
         self.loadConfiguration(confname)
 
-        #connect the main window itself as a reader/writer of "short messages"
+        # connect the main window itself as a reader/writer of "short messages"
         Qt.qApp.SDM.connectReader("shortMessage", self.onShortMessage)
         Qt.qApp.SDM.connectWriter("shortMessage", self, 'newShortMessage')
 
-        #emit a short message informing that we are ready to go
+        # emit a short message informing that we are ready to go
         msg = '%s is ready' % Qt.qApp.applicationName()
-        self.emit(Qt.SIGNAL('newShortMessage'), msg)
+        self.newShortMessage.emit(msg)
 
         if self.defaultConfigRecursionDepth >= 0:
             Qt.QMessageBox.information(self, "Fail-proof mode",
-                                   ('Running in fail-proof mode.' +
-                                    '\nLoading of potentially problematic settings is disabled.' +
-                                    '\nSome panels may not be loaded or may ignore previous user configuration' +
-                                    '\nThis will also apply when loading perspectives'),
-                                   Qt.QMessageBox.Ok, Qt.QMessageBox.NoButton)
+                                       ('Running in fail-proof mode.' +
+                                        '\nLoading of potentially problematic settings is disabled.' +
+                                        '\nSome panels may not be loaded or may ignore previous user configuration' +
+                                        '\nThis will also apply when loading perspectives'),
+                                       Qt.QMessageBox.Ok, Qt.QMessageBox.NoButton)
 
     def closeEvent(self, event):
         try:
@@ -346,41 +360,53 @@ class TaurusGui(TaurusMainWindow):
         panelsmenu = self.sender()
         permanent = (panelsmenu == self.__permPanelsMenu)
         panelsmenu.clear()
-        panelnames = sorted([n for n, p in self.__panels.items() if (p.isPermanent() == permanent)])
+        panelnames = sorted(
+            [n for n, p in self.__panels.items() if (p.isPermanent() == permanent)])
         for name in panelnames:
             panelsmenu.addAction(self.__panels[name].toggleViewAction())
 
     def __initPanelsMenu(self):
-        #Panels menu
+        # Panels menu
         self.__panelsMenu = Qt.QMenu('Panels', self)
         self.menuBar().insertMenu(self.helpMenu.menuAction(), self.__panelsMenu)
-        self.hideAllPanelsAction = self.__panelsMenu.addAction(getIcon(':/actions/hide.svg'), "Hide all panels", self.hideAllPanels)
-        self.showAllPanelsAction = self.__panelsMenu.addAction(getIcon(':/actions/show.svg'), "Show all panels", self.showAllPanels)
-        self.newPanelAction = self.__panelsMenu.addAction(getThemeIcon("window-new"), "New Panel...", self.createCustomPanel)
-        self.removePanelAction = self.__panelsMenu.addAction(getThemeIcon("edit-clear"), "Remove Panel...", self.removePanel)
-        self.__panelsMenu.addAction(getThemeIcon("preferences-desktop-personal"), "Switch temporary/permanent status...", self.updatePermanentCustomPanels)
-        #temporary and permanent panels submenus
+        self.hideAllPanelsAction = self.__panelsMenu.addAction(
+            Qt.QIcon('actions:hide.svg'), "Hide all panels", self.hideAllPanels)
+        self.showAllPanelsAction = self.__panelsMenu.addAction(
+            Qt.QIcon('actions:show.svg'), "Show all panels", self.showAllPanels)
+        self.newPanelAction = self.__panelsMenu.addAction(
+            Qt.QIcon.fromTheme("window-new"), "New Panel...",
+            self.createCustomPanel)
+        self.removePanelAction = self.__panelsMenu.addAction(
+            Qt.QIcon.fromTheme("edit-clear"), "Remove Panel...",
+            self.removePanel)
+        self.__panelsMenu.addAction(Qt.QIcon.fromTheme(
+            "preferences-desktop-personal"),
+            "Switch temporary/permanent status...",
+            self.updatePermanentCustomPanels)
+        # temporary and permanent panels submenus
         self.__panelsMenu.addSeparator()
         self.__permPanelsMenu = Qt.QMenu('Permanent Panels', self)
         self.__panelsMenu.addMenu(self.__permPanelsMenu)
-        self.connect(self.__permPanelsMenu, Qt.SIGNAL('aboutToShow()'), self.__updatePanelsMenu)
+        self.__permPanelsMenu.aboutToShow.connect(self.__updatePanelsMenu)
         self.__tempPanelsMenu = Qt.QMenu('Temporary Panels', self)
         self.__panelsMenu.addMenu(self.__tempPanelsMenu)
-        self.connect(self.__tempPanelsMenu, Qt.SIGNAL('aboutToShow()'), self.__updatePanelsMenu)
+        self.__tempPanelsMenu.aboutToShow.connect(self.__updatePanelsMenu)
         self.__panelsMenu.addSeparator()
 
     def __initViewMenu(self):
-        self.viewMenu.addSeparator()  #the superclass may already have added stuff to the viewMenu
-        #view locking
+        # the superclass may already have added stuff to the viewMenu
         self.viewMenu.addSeparator()
-        self._lockviewAction = Qt.QAction(getThemeIcon("system-lock-screen"), "Lock View", self)
+        # view locking
+        self.viewMenu.addSeparator()
+        self._lockviewAction = Qt.QAction(Qt.QIcon.fromTheme(
+            "system-lock-screen"), "Lock View", self)
         self._lockviewAction.setCheckable(True)
-        self.connect(self._lockviewAction, Qt.SIGNAL("toggled(bool)"), self.setLockView)
+        self._lockviewAction.toggled.connect(self.setLockView)
         self._lockviewAction.setChecked(not self.isModifiableByUser())
         self.viewMenu.addAction(self._lockviewAction)
 
     def __initPanelsToolBar(self):
-        #Panels toolbar
+        # Panels toolbar
         self.panelsToolBar = self.addToolBar("Panels")
         self.panelsToolBar.setObjectName("PanelsToolbar")
         self.panelsToolBar.addAction(self.newPanelAction)
@@ -389,11 +415,13 @@ class TaurusGui(TaurusMainWindow):
     def __initQuickAccessToolBar(self):
         self.quickAccessToolBar = self.addToolBar("Quick Access")
         self.quickAccessToolBar.setObjectName("quickAccessToolbar")
-        self.quickAccessToolBar.setToolButtonStyle(Qt.Qt.ToolButtonTextBesideIcon)
-        self.viewToolBarsMenu.addAction(self.quickAccessToolBar.toggleViewAction())
+        self.quickAccessToolBar.setToolButtonStyle(
+            Qt.Qt.ToolButtonTextBesideIcon)
+        self.viewToolBarsMenu.addAction(
+            self.quickAccessToolBar.toggleViewAction())
 
     def __initJorgBar(self):
-        #Fancy Stuff ToolBar (aka Jorg's Bar ;) )
+        # Fancy Stuff ToolBar (aka Jorg's Bar ;) )
         self.jorgsBar = Qt.QToolBar('Fancy ToolBar')
         self.jorgsBar.setObjectName('jorgsToolBar')
         self.addToolBar(Qt.Qt.RightToolBarArea, self.jorgsBar)
@@ -401,33 +429,42 @@ class TaurusGui(TaurusMainWindow):
         self.jorgsBar.setMovable(False)
 
     def __initSharedDataConnections(self):
-        #register the TAURUSGUI itself as a writer/reader for several shared data items
+        # register the TAURUSGUI itself as a writer/reader for several shared
+        # data items
         splashScreen = self.splashScreen()
         if splashScreen is not None:
             self.splashScreen().showMessage("setting up shared data connections")
-        Qt.qApp.SDM.connectWriter("macroserverName", self, 'macroserverNameChanged')
+        Qt.qApp.SDM.connectWriter(
+            "macroserverName", self, 'macroserverNameChanged')
         Qt.qApp.SDM.connectWriter("doorName", self, 'doorNameChanged')
-        Qt.qApp.SDM.connectReader("SelectedInstrument", self.onSelectedInstrument)
-        Qt.qApp.SDM.connectWriter("SelectedInstrument", self, 'SelectedInstrument')
+        Qt.qApp.SDM.connectReader(
+            "SelectedInstrument", self.onSelectedInstrument)
+        Qt.qApp.SDM.connectWriter(
+            "SelectedInstrument", self, 'SelectedInstrument')
         Qt.qApp.SDM.connectReader("executionStarted", self.setFocusToPanel)
         Qt.qApp.SDM.connectReader("selectedPerspective", self.loadPerspective)
-        Qt.qApp.SDM.connectWriter("perspectiveChanged", self, 'perspectiveChanged')
+        Qt.qApp.SDM.connectWriter(
+            "perspectiveChanged", self, 'perspectiveChanged')
 
     def __initToolsMenu(self):
         if self.toolsMenu is None:
             self.toolsMenu = Qt.QMenu("Tools")
         tm = self.toolsMenu
-        tm.addAction(getIcon(":/apps/preferences-system-session.svg"), "manage instrument-panel associations", self.onShowAssociationDialog)
-        tm.addAction(getThemeIcon("document-save"), "Export current Panel configuration to XML", self.onExportCurrentPanelConfiguration)
-        tm.addAction(getIcon(":/actions/data-transfer.svg"), "Show Shared Data Manager connections", self.showSDMInfo)
+        tm.addAction(Qt.QIcon("apps:preferences-system-session.svg"),
+                     "manage instrument-panel associations", self.onShowAssociationDialog)
+        tm.addAction(Qt.QIcon.fromTheme("document-save"),
+                     "Export current Panel configuration to XML",
+                     self.onExportCurrentPanelConfiguration)
+        tm.addAction(Qt.QIcon("actions:data-transfer.svg"),
+                     "Show Shared Data Manager connections", self.showSDMInfo)
 
         # tools->external apps submenu
         self.addExternalApplicationAction = self.externalAppsMenu.addAction(
-            getThemeIcon('list-add'),
+            Qt.QIcon.fromTheme('list-add'),
             'Add external application launcher...',
             self.createExternalApp)
         self.removeExternalApplicationAction = self.externalAppsMenu.addAction(
-            getThemeIcon('list-remove'),
+            Qt.QIcon.fromTheme('list-remove'),
             'Remove external appication launcher...',
             self.removeExternalApp)
         self.externalAppsMenu.addSeparator()
@@ -451,10 +488,10 @@ class TaurusGui(TaurusMainWindow):
             self._addExternalAppLauncher(name, action)
 
     def _addExternalAppLauncher(self, name, action):
-            action_name = str(action.text())
-            self.__external_app_actions[action_name] = action
-            self.addExternalAppLauncher(action)
-            self._external_app_names.append(name)
+        action_name = str(action.text())
+        self.__external_app_actions[action_name] = action
+        self.addExternalAppLauncher(action)
+        self._external_app_names.append(name)
 
     def removeExternalApp(self, name=None):
         '''Remove the given external application from the GUI.
@@ -469,8 +506,8 @@ class TaurusGui(TaurusMainWindow):
             msg1 = "Remove External application"
             msg2 = ("External application to be removed "
                     "(only custom external applications can be removed).")
-            name, ok = Qt.QInputDialog.getItem (self, msg1, msg2, items, 0,
-                                                False)
+            name, ok = Qt.QInputDialog.getItem(self, msg1, msg2, items, 0,
+                                               False)
             if not ok:
                 return
         name = unicode(name)
@@ -492,11 +529,11 @@ class TaurusGui(TaurusMainWindow):
         '''
         Sets the widget map that is used application-wide. This widget map will
         be used by default in all TaurusForm Panels belonging to this gui.
-        
+
         :param map: (dict<str,Qt.QWidget>) a dictionary whose keys are device
                     type strings (e.g. see :class:`PyTango.DeviceInfo`) and
                     whose values are widgets to be used
-                    
+
         .. seealso:: :meth:`TaurusForm.setCustomWidgetMap`, :meth:`getCustomWidgetMap`
         '''
         self._customWidgetMap = map
@@ -505,11 +542,11 @@ class TaurusGui(TaurusMainWindow):
         '''
         Returns the default map used to create custom widgets by the TaurusForms
         belonging to this GUI
-        
+
         :return: (dict<str,Qt.QWidget>) a dictionary whose keys are device
                  type strings (i.e. see :class:`PyTango.DeviceInfo`) and whose
                  values are widgets to be used
-        
+
         .. seealso:: :meth:`setCustomWidgetMap`
         '''
         return self._customWidgetMap
@@ -523,17 +560,18 @@ class TaurusGui(TaurusMainWindow):
 
     def removePanel(self, name=None):
         ''' remove the given panel from the GUI.
-        
+
         .. note:: The panel; is actually removed from the current perspective.
                   If the panel is saved in other perspectives, it should be removed from
                   them as well.
-        
+
         :param name: (str or None) the name of the panel to be removed
                      If None given, the user will be prompted
         '''
         if name is None:
-            items = sorted([n for n, p in self.__panels.iteritems() if p.isCustom()])
-            name, ok = Qt.QInputDialog.getItem (self, "Remove Panel",
+            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 (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
@@ -543,7 +581,9 @@ class TaurusGui(TaurusMainWindow):
             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
+            # in case the widget is a Taurus one and does some cleaning when
+            # setting model to None
+            panel.widget().setModel(None)
         except:
             pass
 
@@ -558,18 +598,18 @@ class TaurusGui(TaurusMainWindow):
                     permanent=False, icon=None, instrumentkey=None):
         '''
         Creates a panel containing the given widget.
-        
+
         :param wiget: (QWidget) the widget to be contained in the panel
         :param name: (str) the name of the panel. It will be used in tabs as well as for configuration
         :param floating: (bool) whether the panel should be docked or floating. (see note below)
         :param registerconfig: (bool) if True, the panel will be registered as a delegate for configuration
         :param custom: (bool) if True the panel is to be considered a "custom panel"
-        :param permanent: (bool) set this to True for panels that need to be recreated when restoring the app 
-        :param icon: (QIcon) icon for the panel  
+        :param permanent: (bool) set this to True for panels that need to be recreated when restoring the app
+        :param icon: (QIcon) icon for the panel
         :param instrumentkey: (str) name of an instrument to which this panel is to be associated
-        
+
         :return: (DockWidgetPanel) the created panel
-        
+
         .. note:: On a previous version, there was a mandatory parameter called
                   `area` (which accepted a Qt.DockWidgetArea or None as values)
                   this parameter has now been substituted by the keyword
@@ -580,9 +620,10 @@ class TaurusGui(TaurusMainWindow):
                   `None` is passed, it will be interpreted as floating=False.
         '''
 
-        #backwards compatibility:
+        # backwards compatibility:
         if not isinstance(floating, bool):
-            self.info('Deprecation warning: please note that the "area" argument is deprecated. See TaurusGui.createPanel doc')
+            self.info(
+                'Deprecation warning: please note that the "area" argument is deprecated. See TaurusGui.createPanel doc')
             floating = not(floating)
 
         name = unicode(name)
@@ -592,16 +633,18 @@ class TaurusGui(TaurusMainWindow):
 
         # create a panel
         panel = DockWidgetPanel(None, widget, name, self)
-        self.addDockWidget(Qt.Qt.TopDockWidgetArea, panel)  #we will only place panels in this area
+        # we will only place panels in this area
+        self.addDockWidget(Qt.Qt.TopDockWidgetArea, panel)
         if len(self.__panels) != 0:
             self.tabifyDockWidget(self.__panels.values()[-1], panel)
 
         panel.setFloating(floating)
 
-        #associate this panel with an instrument
+        # associate this panel with an instrument
         if instrumentkey is not None:
             if instrumentkey == self.IMPLICIT_ASSOCIATION:
-                #see if there is an item whose name is the same as that of the panel
+                # see if there is an item whose name is the same as that of the
+                # panel
                 for syn in self.__synoptics:
                     if name in syn.get_item_list():
                         self.setInstrumentAssociation(name, name)
@@ -612,30 +655,30 @@ class TaurusGui(TaurusMainWindow):
         if icon is not None:
             panel.toggleViewAction().setIcon(icon)
 
-        #set flags
+        # set flags
         panel.setCustom(custom)
         panel.setPermanent(permanent)
 
-        #register the panel for configuration
+        # register the panel for configuration
         if registerconfig:
             self.registerConfigDelegate(panel, name=name)
         self.__panels[name] = panel
 
-        #connect the panel visibility changes
-        self.connect(panel, Qt.SIGNAL('visibilityChanged(bool)'), self._onPanelVisibilityChanged)
+        # connect the panel visibility changes
+        panel.visibilityChanged.connect(self._onPanelVisibilityChanged)
 
         return panel
 
     def getPanel(self, name):
         '''get a panel object by name
-        
+
         :return: (DockWidgetPanel)
         '''
         return self.__panels[unicode(name)]
 
     def getPanelNames(self):
         '''returns the names of existing panels
-        
+
         :return: (list<str>)
         '''
         return copy.deepcopy(self.__panels.keys())
@@ -645,7 +688,7 @@ class TaurusGui(TaurusMainWindow):
 
         :param permCustomPanels: (list<str>) list of names of custom panels
         '''
-        #first create the panels if they don't actually exist
+        # first create the panels if they don't actually exist
         for name in permExternalApps:
             if name not in self._external_app_names:
                 # create empty action
@@ -658,48 +701,50 @@ class TaurusGui(TaurusMainWindow):
 
     def _setPermanentCustomPanels(self, permCustomPanels):
         '''creates empty panels for restoring custom panels.
-        
+
         :param permCustomPanels: (list<str>) list of names of custom panels
         '''
-        #first create the panels if they don't actually exist
+        # first create the panels if they don't actually exist
         for name in permCustomPanels:
             if name not in self.__panels:
                 self.createPanel(None, name, custom=True, permanent=True)
 
     def _getPermanentCustomPanels(self):
-        ''' 
+        '''
         returns a list of panel names for which the custom and permanent flags
         are True (i.e., those custom panels that should be stored in
         configuration and/or perspectives)
-        
-        :return: (list<str>) 
+
+        :return: (list<str>)
         '''
-        return [n for n, p in self.__panels.iteritems() if (p.isCustom() and  p.isPermanent())]
+        return [n for n, p in self.__panels.iteritems() if (p.isCustom() and p.isPermanent())]
 
     def updatePermanentCustomPanels(self, showAlways=True):
         '''
         Shows a dialog for selecting which custom panels should be permanently
-        stored in the configuration. 
-        
-        :param showAlways: (bool) forces showing the dialog even if there are no new custom Panels  
+        stored in the configuration.
+
+        :param showAlways: (bool) forces showing the dialog even if there are no new custom Panels
         '''
-        #check if there are some newly created panels that may be made permanent
+        # check if there are some newly created panels that may be made
+        # permanent
         perm = self._getPermanentCustomPanels()
-        temp = [n for n, p in self.__panels.iteritems() if (p.isCustom() and not p.isPermanent())]
+        temp = [n for n, p in self.__panels.iteritems() if (
+            p.isCustom() and not p.isPermanent())]
         if len(temp) > 0 or showAlways:
             dlg = QDoubleListDlg(winTitle='Stored panels',
-                     mainLabel='Select which of the panels should be stored',
-                     label1='Temporary (to be discarded)', label2='Permanent (to be stored)',
-                     list1=temp, list2=perm)
+                                 mainLabel='Select which of the panels should be stored',
+                                 label1='Temporary (to be discarded)', label2='Permanent (to be stored)',
+                                 list1=temp, list2=perm)
             result = dlg.exec_()
             if result == Qt.QDialog.Accepted:
-                #update the permanent Custom Panels
+                # update the permanent Custom Panels
                 registered = self.getConfigurableItemNames()
                 for name in dlg.getAll2():
                     if name not in registered:
                         self.__panels[name].setPermanent(True)
                         self.registerConfigDelegate(self.__panels[name], name)
-                #unregister any panel that is temporary
+                # unregister any panel that is temporary
                 for name in dlg.getAll1():
                     self.__panels[name].setPermanent(False)
                     self.unregisterConfigurableItem(name, raiseOnError=False)
@@ -711,7 +756,7 @@ class TaurusGui(TaurusMainWindow):
 
         :param showAlways: (bool) forces showing the dialog
         '''
-        #check if there are some newly created external applications that may
+        # check if there are some newly created external applications that may
         # be made permanent
         #permanet_ext_app = list(self._external_app_names)
         if len(self.__external_app) > 0 or showAlways:
@@ -737,15 +782,16 @@ class TaurusGui(TaurusMainWindow):
     def createCustomPanel(self, paneldesc=None):
         '''
         Creates a panel from a Panel Description and sets it as "custom panel".
-        
+
         :param paneldesc: (PanelDescription) description of the panel to be created
-                     
+
         .. seealso:: :meth:`createPanel`
         '''
 
         if paneldesc is None:
             from taurus.qt.qtgui.taurusgui import PanelDescriptionWizard
-            paneldesc, ok = PanelDescriptionWizard.getDialog(self, extraWidgets=self._extraCatalogWidgets)
+            paneldesc, ok = PanelDescriptionWizard.getDialog(
+                self, extraWidgets=self._extraCatalogWidgets)
             if not ok:
                 return
         w = paneldesc.getWidget(sdm=Qt.qApp.SDM, setModel=False)
@@ -761,11 +807,11 @@ class TaurusGui(TaurusMainWindow):
                          registerconfig=False, instrumentkey=paneldesc.instrumentkey,
                          permanent=False)
         msg = 'Panel %s created. Drag items to it or use the context menu to customize it' % w.name
-        self.emit(Qt.SIGNAL('newShortMessage'), msg)
+        self.newShortMessage.emit(msg)
 
     def createMainSynoptic(self, synopticname):
         '''
-        Creates a synoptic panel and registers it as "SelectedInstrument" 
+        Creates a synoptic panel and registers it as "SelectedInstrument"
         reader and writer (allowing  selecting instruments from synoptic
         '''
         try:
@@ -775,18 +821,21 @@ class TaurusGui(TaurusMainWindow):
             synoptic.setModel(jdwFileName)
             self.__synoptics.append(synoptic)
         except Exception, e:
-            #print repr(e)
+            # print repr(e)
             msg = 'Error loading synoptic file "%s".\nSynoptic won\'t be available' % jdwFileName
             self.error(msg)
             self.traceback(level=taurus.Info)
-            result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (msg, repr(e)) , Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
+            result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (
+                msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
             if result == Qt.QMessageBox.Abort:
                 sys.exit()
 
-        Qt.qApp.SDM.connectWriter("SelectedInstrument", synoptic, "graphicItemSelected(QString)")
-        Qt.qApp.SDM.connectReader("SelectedInstrument", synoptic.selectGraphicItem)
+        Qt.qApp.SDM.connectWriter(
+            "SelectedInstrument", synoptic, "graphicItemSelected")
+        Qt.qApp.SDM.connectReader(
+            "SelectedInstrument", synoptic.selectGraphicItem)
 
-        #find an unique (and short) name
+        # find an unique (and short) name
         name = os.path.splitext(os.path.basename(synopticname))[0]
         if len(name) > 10:
             name = 'Syn'
@@ -797,7 +846,8 @@ class TaurusGui(TaurusMainWindow):
             i += 1
 
         synopticpanel = self.createPanel(synoptic, name, permanent=True,
-                                         icon=getThemeIcon('image-x-generic'))
+                                         icon=Qt.QIcon.fromTheme(
+                                             'image-x-generic'))
         toggleSynopticAction = synopticpanel.toggleViewAction()
         self.quickAccessToolBar.addAction(toggleSynopticAction)
 
@@ -805,11 +855,13 @@ class TaurusGui(TaurusMainWindow):
         try:
             from taurus.qt.qtgui.console import TaurusConsole
         except ImportError:
-            self.warning('Cannot import taurus.qt.qtgui.console. The Console Panel will not be available')
+            self.warning(
+                'Cannot import taurus.qt.qtgui.console. The Console Panel will not be available')
             return
         console = TaurusConsole(kernels=kernels)
         consolePanel = self.createPanel(console, "Console", permanent=True,
-            icon=getThemeIcon('utilities-terminal'))
+                                        icon=Qt.QIcon.fromTheme(
+                                            'utilities-terminal'))
         toggleConsoleAction = consolePanel.toggleViewAction()
         self.quickAccessToolBar.addAction(toggleConsoleAction)
 
@@ -818,39 +870,46 @@ class TaurusGui(TaurusMainWindow):
         Creates a list of instrument panel descriptions by gathering the info
         from the Pool. Each panel is a TaurusForm grouping together all those
         elements that belong to the same instrument according to the Pool info
-        
-        :return: (list<PanelDescription>)                 
+
+        :return: (list<PanelDescription>)
         '''
         instrument_dict = {}
         try:
             ms = taurus.Device(macroservername)
             instruments = ms.getElementsOfType('Instrument')
-            if instruments is None: raise
+            if instruments is None:
+                raise
         except Exception, e:
             msg = 'Could not fetch Instrument list from "%s"' % macroservername
             self.error(msg)
-            result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
+            result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (
+                msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
             if result == Qt.QMessageBox.Abort:
                 sys.exit()
             return []
         for i in instruments.values():
             i_name = i.full_name
             #i_name, i_unknown, i_type, i_pools = i.split()
-            i_view = PanelDescription(i_name, classname='TaurusForm', floating=False, model=[])
+            i_view = PanelDescription(
+                i_name, classname='TaurusForm', floating=False, model=[])
             instrument_dict[i_name] = i_view
 
         from operator import attrgetter
-        pool_elements = sorted(ms.getElementsWithInterface('Moveable').values(), key=attrgetter('name'))
-        pool_elements += sorted(ms.getElementsWithInterface('ExpChannel').values(), key=attrgetter('name'))
-        pool_elements += sorted(ms.getElementsWithInterface('IORegister').values(), key=attrgetter('name'))
+        pool_elements = sorted(ms.getElementsWithInterface(
+            'Moveable').values(), key=attrgetter('name'))
+        pool_elements += sorted(ms.getElementsWithInterface(
+            'ExpChannel').values(), key=attrgetter('name'))
+        pool_elements += sorted(ms.getElementsWithInterface(
+            'IORegister').values(), key=attrgetter('name'))
         for elem in pool_elements:
             instrument = elem.instrument
             if instrument:
                 i_name = instrument
                 e_name = elem.full_name
                 instrument_dict[i_name].model.append(e_name)
-        #filter out empty panels
-        ret = [instrument for instrument in instrument_dict.values() if len(instrument.model) > 0]
+        # filter out empty panels
+        ret = [instrument for instrument in instrument_dict.values()
+               if len(instrument.model) > 0]
         return ret
 
     def __getVarFromXML(self, root, nodename, default=None):
@@ -859,16 +918,18 @@ class TaurusGui(TaurusMainWindow):
             return default
         else:
             return name.text
-        
+
     def _importConfiguration(self, confname):
-        '''returns the module corresponding to `confname` or to 
-        `tgconf_<confname>`. Note: the `conf` subdirectory of the directory in 
+        '''returns the module corresponding to `confname` or to
+        `tgconf_<confname>`. Note: the `conf` subdirectory of the directory in
         which taurusgui.py file is installed is temporally prepended to sys.path
         '''
-        confsubdir = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'conf')  #the path to a conf subdirectory of the place where taurusgui.py is
+        confsubdir = os.path.join(os.path.abspath(os.path.dirname(
+            __file__)), 'conf')  # the path to a conf subdirectory of the place where taurusgui.py is
         oldpath = sys.path
         try:
-            sys.path = [confsubdir] + sys.path  #add the conf subdirectory dir to the pythonpath
+            # add the conf subdirectory dir to the pythonpath
+            sys.path = [confsubdir] + sys.path
             conf = __import__(confname)
         except ImportError:
             altconfname = "tgconf_%s" % confname
@@ -877,37 +938,38 @@ class TaurusGui(TaurusMainWindow):
             except ImportError:
                 msg = 'cannot import %s or %s' % (confname, altconfname)
                 self.error(msg)
-                Qt.QMessageBox.critical(self, 'Initialization error', msg, Qt.QMessageBox.Abort)
+                Qt.QMessageBox.critical(
+                    self, 'Initialization error', msg, Qt.QMessageBox.Abort)
                 sys.exit()
         finally:
-            sys.path = oldpath  #restore the previous sys.path
+            sys.path = oldpath  # restore the previous sys.path
         return conf
-        
 
     def loadConfiguration(self, confname):
         '''Reads a configuration file
-        
-        :param confname: (str or None) the  name of module located in the 
+
+        :param confname: (str or None) the  name of module located in the
                          PYTHONPATH or in the conf subdirectory of the directory
                          in which taurusgui.py file is installed.
-                         This method will try to import <confname>.  
-                         If that fails, it will try to import 
+                         This method will try to import <confname>.
+                         If that fails, it will try to import
                          `tgconf_<confname>`.
-                         Alternatively, `confname` can be the path to the 
-                         configuration module (not necessarily in the 
+                         Alternatively, `confname` can be the path to the
+                         configuration module (not necessarily in the
                          PYTHONPATH).
                          `confname` can also be None, in which case a dummy
                          empty module will be used.
         '''
 
-        #import the python config file
+        # import the python config file
         try:
             if confname is None:
                 import types
-                conf = types.ModuleType('__dummy_conf_module__') #dummy module
+                conf = types.ModuleType(
+                    '__dummy_conf_module__')  # dummy module
                 confname = str(Qt.qApp.applicationName())
                 self._confDirectory = ''
-            elif os.path.exists(confname):  #if confname is a dir or file name
+            elif os.path.exists(confname):  # if confname is a dir or file name
                 import imp
                 path, name = os.path.split(confname)
                 name, _ = os.path.splitext(name)
@@ -916,28 +978,33 @@ class TaurusGui(TaurusMainWindow):
                     conf = imp.load_module(name, f, filename, data)
                     confname = name
                 except ImportError:
-                    conf =  self._importConfiguration(confname)
+                    conf = self._importConfiguration(confname)
+                self._confDirectory = os.path.dirname(conf.__file__)
+            else:  # if confname is not a dir name, we assume it is a module name in the python path
+                conf = self._importConfiguration(confname)
                 self._confDirectory = os.path.dirname(conf.__file__)
-            else:  #if confname is not a dir name, we assume it is a module name in the python path
-                conf =  self._importConfiguration(confname)
-                self._confDirectory = os.path.dirname(conf.__file__)   
         except Exception, e:
             import traceback
-            msg = 'Error loading configuration: %s' % traceback.format_exc()  #repr(e)
+            msg = 'Error loading configuration: %s' % traceback.format_exc()  # repr(e)
             self.error(msg)
-            Qt.QMessageBox.critical(self, 'Initialization error', msg, Qt.QMessageBox.Abort)
+            Qt.QMessageBox.critical(
+                self, 'Initialization error', msg, Qt.QMessageBox.Abort)
             sys.exit()
 
-        #Get the xml root node from the xml configuration file
+        # Get the xml root node from the xml configuration file
         XML_CONFIG = getattr(conf, 'XML_CONFIG', None)
         if XML_CONFIG is None:
             self._xmlConfigFileName = None
         else:
-            self._xmlConfigFileName = os.path.join(self._confDirectory, XML_CONFIG)
-        xmlroot = etree.fromstring('<root></root>')  #default fallback (in case of I/O or parse errors)
+            self._xmlConfigFileName = os.path.join(
+                self._confDirectory, XML_CONFIG)
+        # default fallback (in case of I/O or parse errors)
+        xmlroot = etree.fromstring('<root></root>')
         if XML_CONFIG is not None:
             try:
-                xmlfname = os.path.join(self._confDirectory, XML_CONFIG)  # If a relative name was given, the conf directory will be used as base path
+                # If a relative name was given, the conf directory will be used
+                # as base path
+                xmlfname = os.path.join(self._confDirectory, XML_CONFIG)
                 xmlFile = open(xmlfname, 'r')
                 xmlstring = xmlFile.read()
                 xmlFile.close()
@@ -946,115 +1013,144 @@ class TaurusGui(TaurusMainWindow):
                 msg = 'Error reading the XML file: "%s"' % xmlfname
                 self.error(msg)
                 self.traceback(level=taurus.Info)
-                result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\nReason:"%s"' % (msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
+                result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\nReason:"%s"' % (
+                    msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
                 if result == Qt.QMessageBox.Abort:
                     sys.exit()
 
-        #General Qt application settings and jorgs bar logos
-        APPNAME = getattr(conf, 'GUI_NAME', self.__getVarFromXML(xmlroot, "GUI_NAME", confname))
-        ORGNAME = getattr(conf, 'ORGANIZATION', self.__getVarFromXML(xmlroot, "ORGANIZATION", str(Qt.qApp.organizationName()) or 'Taurus'))
-        CUSTOMLOGO = getattr(conf, 'CUSTOM_LOGO', getattr(conf, 'LOGO', self.__getVarFromXML(xmlroot, "CUSTOM_LOGO", ':/taurus.png')))
-        if CUSTOMLOGO.startswith(':'):
-            customIcon = getIcon(CUSTOMLOGO)
+        # General Qt application settings and jorgs bar logos
+        APPNAME = getattr(conf, 'GUI_NAME', self.__getVarFromXML(
+            xmlroot, "GUI_NAME", confname))
+        ORGNAME = getattr(conf, 'ORGANIZATION', self.__getVarFromXML(
+            xmlroot, "ORGANIZATION", str(Qt.qApp.organizationName()) or 'Taurus'))
+        CUSTOMLOGO = getattr(conf, 'CUSTOM_LOGO', getattr(
+            conf, 'LOGO', self.__getVarFromXML(xmlroot, "CUSTOM_LOGO", 'logos:taurus.png')))
+        if Qt.QFile.exists(CUSTOMLOGO):
+            customIcon = Qt.QIcon(CUSTOMLOGO)
         else:
-            customIcon = Qt.QIcon(os.path.join(self._confDirectory, CUSTOMLOGO))
+            customIcon = Qt.QIcon(os.path.join(
+                self._confDirectory, CUSTOMLOGO))
         Qt.qApp.setApplicationName(APPNAME)
         Qt.qApp.setOrganizationName(ORGNAME)
         Qt.QApplication.instance().basicConfig()
 
-        ORGANIZATIONLOGO = getattr(conf, 'ORGANIZATION_LOGO', self.__getVarFromXML(xmlroot, "ORGANIZATION_LOGO", ':/logo.png'))
+        logo = getattr(tauruscustomsettings, 'ORGANIZATION_LOGO',
+                       "logos:taurus.png")
+        ORGANIZATIONLOGO = getattr(conf, 'ORGANIZATION_LOGO',
+                                   self.__getVarFromXML(xmlroot,
+                                                        "ORGANIZATION_LOGO",
+                                                        logo))
         ##
-        if ORGANIZATIONLOGO.startswith(':'):
-            organizationIcon = getIcon(ORGANIZATIONLOGO)
+        if Qt.QFile.exists(ORGANIZATIONLOGO):
+            organizationIcon = Qt.QIcon(ORGANIZATIONLOGO)
         else:
-            organizationIcon = Qt.QIcon(os.path.join(self._confDirectory, ORGANIZATIONLOGO))
+            organizationIcon = Qt.QIcon(os.path.join(
+                self._confDirectory, ORGANIZATIONLOGO))
 
-        #if required, enforce that only one instance of this GUI can be run
-        SINGLEINSTANCE = getattr(conf, 'SINGLE_INSTANCE', (self.__getVarFromXML(xmlroot, "SINGLE_INSTANCE", 'True').lower() == 'true'))
+        # if required, enforce that only one instance of this GUI can be run
+        SINGLEINSTANCE = getattr(conf, 'SINGLE_INSTANCE', (self.__getVarFromXML(
+            xmlroot, "SINGLE_INSTANCE", 'True').lower() == 'true'))
         if SINGLEINSTANCE:
             if not self.checkSingleInstance():
-                msg = 'Only one istance of %s is allowed to run the same time' % (APPNAME)
+                msg = 'Only one istance of %s is allowed to run the same time' % (
+                    APPNAME)
                 self.error(msg)
-                Qt.QMessageBox.critical(self, 'Multiple copies', msg, Qt.QMessageBox.Abort)
+                Qt.QMessageBox.critical(
+                    self, 'Multiple copies', msg, Qt.QMessageBox.Abort)
                 sys.exit(1)
 
-        #some initialization
+        # some initialization
         self.resetQSettings()
         self.setWindowTitle(APPNAME)
         self.setWindowIcon(customIcon)
         self.jorgsBar.addAction(organizationIcon, ORGNAME)
         self.jorgsBar.addAction(customIcon, APPNAME)
 
-        #get custom widget catalog entries
-        EXTRA_CATALOG_WIDGETS = getattr(conf, 'EXTRA_CATALOG_WIDGETS', [])  #@todo: support also loading from xml
+        # get custom widget catalog entries
+        # @todo: support also loading from xml
+        EXTRA_CATALOG_WIDGETS = getattr(conf, 'EXTRA_CATALOG_WIDGETS', [])
         self._extraCatalogWidgets = []
         for classname, pixmapname in EXTRA_CATALOG_WIDGETS:
-            if pixmapname and not pixmapname.startswith(":"):  # If a relative file name is given, the conf directory will be used as base path
+            # If a relative file name is given, the conf directory will be used
+            # as base path
+            if pixmapname and not Qt.QFile.exists(pixmapname):
                 pixmapname = os.path.join(self._confDirectory, pixmapname)
             self._extraCatalogWidgets.append((classname, pixmapname))
 
-
-        #manual panel
+        # manual panel
         MANUAL_URI = getattr(conf, 'MANUAL_URI',
                              self.__getVarFromXML(xmlroot, "MANUAL_URI",
                                                   taurus.Release.url))
         self.setHelpManualURI(MANUAL_URI)
 
         self.createPanel(self.helpManualBrowser, 'Manual', permanent=True,
-                         icon=getThemeIcon('help-browser'))
-
-        #configure the macro infrastructure
-        MACROSERVER_NAME = getattr(conf, 'MACROSERVER_NAME', self.__getVarFromXML(xmlroot, "MACROSERVER_NAME", 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
+                         icon=Qt.QIcon.fromTheme('help-browser'))
+
+        # configure the macro infrastructure
+        MACROSERVER_NAME = getattr(conf, 'MACROSERVER_NAME', self.__getVarFromXML(
+            xmlroot, "MACROSERVER_NAME", None))
+        MACRO_PANELS = getattr(conf, 'MACRO_PANELS', self.__getVarFromXML(
+            xmlroot, "MACRO_PANELS", True))
+        # macro infrastructure will only be created if MACROSERVER_NAME is set
+        if MACRO_PANELS and MACROSERVER_NAME is not None:
             from taurus.qt.qtgui.taurusgui import MacroBroker
             self.__macroBroker = MacroBroker(self)
         if MACROSERVER_NAME:
-            self.emit(Qt.SIGNAL("macroserverNameChanged"), MACROSERVER_NAME)
+            self.macroserverNameChanged.emit(MACROSERVER_NAME)
 
-        DOOR_NAME = getattr(conf, 'DOOR_NAME', self.__getVarFromXML(xmlroot, "DOOR_NAME", ''))
+        DOOR_NAME = getattr(conf, 'DOOR_NAME',
+                            self.__getVarFromXML(xmlroot, "DOOR_NAME", ''))
         if DOOR_NAME:
-            self.emit(Qt.SIGNAL("doorNameChanged"), DOOR_NAME)
+            self.doorNameChanged.emit(DOOR_NAME)
 
-        MACROEDITORS_PATH = getattr(conf, 'MACROEDITORS_PATH', self.__getVarFromXML(xmlroot, "MACROEDITORS_PATH", ''))
+        MACROEDITORS_PATH = getattr(conf, 'MACROEDITORS_PATH', self.__getVarFromXML(
+            xmlroot, "MACROEDITORS_PATH", ''))
         if MACROEDITORS_PATH:
             from sardana.taurus.qt.qtgui.extra_macroexecutor.macroparameterseditor.macroparameterseditor import ParamEditorManager
             ParamEditorManager().parsePaths(MACROEDITORS_PATH)
             ParamEditorManager().browsePaths()
 
-        #Synoptics
+        # Synoptics
         SYNOPTIC = getattr(conf, 'SYNOPTIC', None)
-        if isinstance(SYNOPTIC, basestring):  #old config file style
-            self.warning('Deprecated usage of SYNOPTIC keyword (now it expects a list of paths). Please update your configuration file to: "SYNOPTIC=[\'%s\']".' % SYNOPTIC)
+        if isinstance(SYNOPTIC, basestring):  # old config file style
+            self.warning(
+                'Deprecated usage of SYNOPTIC keyword (now it expects a list of paths). Please update your configuration file to: "SYNOPTIC=[\'%s\']".' % SYNOPTIC)
             SYNOPTIC = [SYNOPTIC]
-        if SYNOPTIC is None:  #we look in the xml config file if not present in the python config
+        if SYNOPTIC is None:  # we look in the xml config file if not present in the python config
             SYNOPTIC = []
             node = xmlroot.find("SYNOPTIC")
             if (node is not None) and (node.text is not None):
                 for child in node:
                     s = child.get("str")
-                    if s is not None and len(s):  #we do not append empty strings
+                    # we do not append empty strings
+                    if s is not None and len(s):
                         SYNOPTIC.append(s)
         for s in SYNOPTIC:
             self.createMainSynoptic(s)
 
-        #Get panel descriptions from pool if required
-        INSTRUMENTS_FROM_POOL = getattr(conf, 'INSTRUMENTS_FROM_POOL', (self.__getVarFromXML(xmlroot, "INSTRUMENTS_FROM_POOL", 'False').lower() == 'true'))
+        # Get panel descriptions from pool if required
+        INSTRUMENTS_FROM_POOL = getattr(conf, 'INSTRUMENTS_FROM_POOL', (self.__getVarFromXML(
+            xmlroot, "INSTRUMENTS_FROM_POOL", 'False').lower() == 'true'))
         if INSTRUMENTS_FROM_POOL:
-            try: self.splashScreen().showMessage("Gathering Instrument info from Pool")
-            except AttributeError: pass
-            POOLINSTRUMENTS = self.createInstrumentsFromPool(MACROSERVER_NAME)  #auto create instruments from pool
+            try:
+                self.splashScreen().showMessage("Gathering Instrument info from Pool")
+            except AttributeError:
+                pass
+            POOLINSTRUMENTS = self.createInstrumentsFromPool(
+                MACROSERVER_NAME)  # auto create instruments from pool
         else:
             POOLINSTRUMENTS = []
 
-        CONSOLE = getattr(conf, 'CONSOLE', self.__getVarFromXML(xmlroot, "CONSOLE", ['ipython']))
+        CONSOLE = getattr(conf, 'CONSOLE', self.__getVarFromXML(
+            xmlroot, "CONSOLE", ['ipython']))
         if CONSOLE:
             self.createConsole(CONSOLE)
 
-        #get custom panel descriptions from the python config file
-        CUSTOM_PANELS = [obj for name, obj in inspect.getmembers(conf) if isinstance(obj, PanelDescription)]
+        # get custom panel descriptions from the python config file
+        CUSTOM_PANELS = [obj for name, obj in inspect.getmembers(
+            conf) if isinstance(obj, PanelDescription)]
 
-        #add custom panel descriptions from xml config
+        # add custom panel descriptions from xml config
         panelDescriptions = xmlroot.find("PanelDescriptions")
         if (panelDescriptions is not None):
             for child in panelDescriptions:
@@ -1063,11 +1159,13 @@ class TaurusGui(TaurusMainWindow):
                     if pd is not None:
                         CUSTOM_PANELS.append(pd)
 
-        #create panels based on the panel descriptions gathered before
+        # create panels based on the panel descriptions gathered before
         for p in CUSTOM_PANELS + POOLINSTRUMENTS:
             try:
-                try: self.splashScreen().showMessage("Creating panel %s" % p.name)
-                except AttributeError: pass
+                try:
+                    self.splashScreen().showMessage("Creating panel %s" % p.name)
+                except AttributeError:
+                    pass
                 w = p.getWidget(sdm=Qt.qApp.SDM, setModel=False)
                 if hasattr(w, 'setCustomWidgetMap'):
                     w.setCustomWidgetMap(self.getCustomWidgetMap())
@@ -1075,21 +1173,27 @@ class TaurusGui(TaurusMainWindow):
                     w.setModel(p.model)
                 if p.instrumentkey is None:
                     instrumentkey = self.IMPLICIT_ASSOCIATION
-                registerconfig = p not in POOLINSTRUMENTS  #the pool instruments may change when the pool config changes, so we do not store their config
-                #create a panel
-                self.createPanel(w, p.name, floating=p.floating, registerconfig=registerconfig, instrumentkey=instrumentkey, permanent=True)
+                # the pool instruments may change when the pool config changes,
+                # so we do not store their config
+                registerconfig = p not in POOLINSTRUMENTS
+                # create a panel
+                self.createPanel(w, p.name, floating=p.floating, registerconfig=registerconfig,
+                                 instrumentkey=instrumentkey, permanent=True)
             except Exception, e:
-                msg = 'Cannot create panel %s' % getattr(p, 'name', '__Unknown__')
+                msg = 'Cannot create panel %s' % getattr(
+                    p, 'name', '__Unknown__')
                 self.error(msg)
                 self.traceback(level=taurus.Info)
-                result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
+                result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (
+                    msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
                 if result == Qt.QMessageBox.Abort:
                     sys.exit()
 
-        #get custom toolbars descriptions from the python config file
-        CUSTOM_TOOLBARS = [obj for name, obj in inspect.getmembers(conf) if isinstance(obj, ToolBarDescription)]
+        # get custom toolbars descriptions from the python config file
+        CUSTOM_TOOLBARS = [obj for name, obj in inspect.getmembers(
+            conf) if isinstance(obj, ToolBarDescription)]
 
-        #add custom toolbar descriptions from xml config
+        # add custom toolbar descriptions from xml config
         toolBarDescriptions = xmlroot.find("ToolBarDescriptions")
         if (toolBarDescriptions is not None):
             for child in toolBarDescriptions:
@@ -1098,41 +1202,48 @@ class TaurusGui(TaurusMainWindow):
                     if d is not None:
                         CUSTOM_TOOLBARS.append(d)
 
-        #create toolbars based on the descriptions gathered before
+        # create toolbars based on the descriptions gathered before
         for d in CUSTOM_TOOLBARS:
             try:
-                try: self.splashScreen().showMessage("Creating Toolbar %s" % d.name)
-                except AttributeError: pass
+                try:
+                    self.splashScreen().showMessage("Creating Toolbar %s" % d.name)
+                except AttributeError:
+                    pass
                 w = d.getWidget(sdm=Qt.qApp.SDM, setModel=False)
                 if d.model is not None:
                     w.setModel(d.model)
                 w.setWindowTitle(d.name)
-                #add the toolbar to the window
+                # add the toolbar to the window
                 self.addToolBar(w)
-                #add the toggleview action to the view menu
+                # add the toggleview action to the view menu
                 self.viewToolBarsMenu.addAction(w.toggleViewAction())
-                #register the toolbar as delegate if it supports it
+                # register the toolbar as delegate if it supports it
                 if isinstance(w, BaseConfigurableClass):
                     self.registerConfigDelegate(w, d.name)
 
             except Exception, e:
-                msg = 'Cannot add toolbar %s' % getattr(d, 'name', '__Unknown__')
+                msg = 'Cannot add toolbar %s' % getattr(
+                    d, 'name', '__Unknown__')
                 self.error(msg)
                 self.traceback(level=taurus.Info)
-                result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
+                result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (
+                    msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
                 if result == Qt.QMessageBox.Abort:
                     sys.exit()
 
         CUSTOM_APPLETS = []
-        #for backwards compatibility
-        MONITOR = getattr(conf, 'MONITOR', self.__getVarFromXML(xmlroot, "MONITOR", []))
+        # for backwards compatibility
+        MONITOR = getattr(
+            conf, 'MONITOR', self.__getVarFromXML(xmlroot, "MONITOR", []))
         if MONITOR:
-            CUSTOM_APPLETS.append(AppletDescription('monitor', classname='TaurusMonitorTiny', model=MONITOR))
+            CUSTOM_APPLETS.append(AppletDescription(
+                'monitor', classname='TaurusMonitorTiny', model=MONITOR))
 
-        #get custom applet descriptions from the python config file
-        CUSTOM_APPLETS += [obj for name, obj in inspect.getmembers(conf) if isinstance(obj, AppletDescription)]
+        # get custom applet descriptions from the python config file
+        CUSTOM_APPLETS += [obj for name, obj in inspect.getmembers(
+            conf) if isinstance(obj, AppletDescription)]
 
-        #add applet descriptions from xml config
+        # add applet descriptions from xml config
         appletDescriptions = xmlroot.find("AppletDescriptions")
         if (appletDescriptions is not None):
             for child in appletDescriptions:
@@ -1141,29 +1252,35 @@ class TaurusGui(TaurusMainWindow):
                     if d is not None:
                         CUSTOM_APPLETS.append(d)
 
-        #create applet based on the descriptions gathered before
+        # create applet based on the descriptions gathered before
         for d in CUSTOM_APPLETS:
             try:
-                try: self.splashScreen().showMessage("Creating applet %s" % d.name)
-                except AttributeError: pass
+                try:
+                    self.splashScreen().showMessage("Creating applet %s" % d.name)
+                except AttributeError:
+                    pass
                 w = d.getWidget(sdm=Qt.qApp.SDM, setModel=False)
                 if d.model is not None:
                     w.setModel(d.model)
-                #add the widget to the applets toolbar
+                # add the widget to the applets toolbar
                 self.jorgsBar.addWidget(w)
-                #register the toolbar as delegate if it supports it
+                # register the toolbar as delegate if it supports it
                 if isinstance(w, BaseConfigurableClass):
                     self.registerConfigDelegate(w, d.name)
             except Exception, e:
-                msg = 'Cannot add applet %s' % getattr(d, 'name', '__Unknown__')
+                msg = 'Cannot add applet %s' % getattr(
+                    d, 'name', '__Unknown__')
                 self.error(msg)
                 self.traceback(level=taurus.Info)
-                result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
+                result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % (
+                    msg, repr(e)), Qt.QMessageBox.Abort | Qt.QMessageBox.Ignore)
                 if result == Qt.QMessageBox.Abort:
                     sys.exit()
 
-        #add external applications from both the python and the xml config files
-        EXTERNAL_APPS = [obj for name, obj in inspect.getmembers(conf) if isinstance(obj, ExternalApp)]
+        # add external applications from both the python and the xml config
+        # files
+        EXTERNAL_APPS = [obj for name, obj in inspect.getmembers(
+            conf) if isinstance(obj, ExternalApp)]
 
         externalAppsNode = xmlroot.find("ExternalApps")
         if (externalAppsNode is not None):
@@ -1177,18 +1294,22 @@ class TaurusGui(TaurusMainWindow):
             self._external_app_names.append(str(a.getAction().text()))
             self.addExternalAppLauncher(a.getAction())
 
+        # get the "factory settings" filename. By default, it is called
+        # "default.ini" and resides in the configuration dir
+        INIFILE = getattr(conf, 'INIFILE', self.__getVarFromXML(
+            xmlroot, "INIFILE", "default.ini"))
+        # if a relative name is given, the conf dir is used as the root path
+        iniFileName = os.path.join(self._confDirectory, INIFILE)
 
-
-        #get the "factory settings" filename. By default, it is called "default.ini" and resides in the configuration dir
-        INIFILE = getattr(conf, 'INIFILE', self.__getVarFromXML(xmlroot, "INIFILE", "default.ini"))
-        iniFileName = os.path.join(self._confDirectory, INIFILE)  #if a relative name is given, the conf dir is used as the root path
-
-        #read the settings (or the factory settings if the regular file is not found)
+        # read the settings (or the factory settings if the regular file is not
+        # found)
         msg = "Loading previous state"
         if self.defaultConfigRecursionDepth >= 0:
             msg += " in Fail Proof mode"
-        try: self.splashScreen().showMessage(msg)
-        except AttributeError: pass
+        try:
+            self.splashScreen().showMessage(msg)
+        except AttributeError:
+            pass
         self.loadSettings(factorySettingsFileName=iniFileName)
 
     def setLockView(self, locked):
@@ -1213,10 +1334,10 @@ class TaurusGui(TaurusMainWindow):
         TaurusMainWindow.setModifiableByUser(self, modifiable)
 
     def onShortMessage(self, msg):
-        ''' Slot to be called when there is a new short message. Currently, the only action 
+        ''' Slot to be called when there is a new short message. Currently, the only action
         taken when there is a new message is to display it in the main window status bar.
-        
-        :param msg: (str) the short descriptive message to be handled 
+
+        :param msg: (str) the short descriptive message to be handled
         '''
         self.statusBar().showMessage(msg)
 
@@ -1233,35 +1354,37 @@ class TaurusGui(TaurusMainWindow):
     def onShowAssociationDialog(self):
         '''launches the instrument-panel association dialog (modal)'''
         dlg = AssociationDialog(self)
-        Qt.qApp.SDM.connectWriter("SelectedInstrument", dlg.ui.instrumentCB, "activated(QString)")
+        Qt.qApp.SDM.connectWriter(
+            "SelectedInstrument", dlg.ui.instrumentCB, "activated(QString)")
         dlg.exec_()
-        Qt.qApp.SDM.disconnectWriter("SelectedInstrument", dlg.ui.instrumentCB, "activated(QString)")
+        Qt.qApp.SDM.disconnectWriter(
+            "SelectedInstrument", dlg.ui.instrumentCB, "activated(QString)")
 
     def getInstrumentAssociation(self, instrumentname):
         '''
-        Returns the panel name associated to an instrument name 
-        
+        Returns the panel name associated to an instrument name
+
         :param instrumentname: (str or None) The name of the instrument whose associated panel is wanted
-                
+
         :return: (str or None) the associated panel name (or None).
         '''
         return self.__instrumentToPanelMap.get(instrumentname, None)
 
     def setInstrumentAssociation(self, instrumentname, panelname):
         '''
-        Sets the panel name associated to an instrument 
-        
-        :param instrumentname: (str) The name of the instrument 
-        :param panelname: (str or None) The name of the associated 
-                          panel or None to remove the association 
+        Sets the panel name associated to an instrument
+
+        :param instrumentname: (str) The name of the instrument
+        :param panelname: (str or None) The name of the associated
+                          panel or None to remove the association
                           for this instrument.
         '''
         instrumentname = unicode(instrumentname)
-        #remove a previous association if it exists
+        # remove a previous association if it exists
         oldpanelname = self.__instrumentToPanelMap.get(instrumentname, None)
         self.__panelToInstrumentMap.pop(oldpanelname, None)
 
-        #create the new association
+        # create the new association
         self.__instrumentToPanelMap[instrumentname] = panelname
         if panelname is not None:
             self.__panelToInstrumentMap[panelname] = instrumentname
@@ -1269,21 +1392,21 @@ class TaurusGui(TaurusMainWindow):
     def getAllInstrumentAssociations(self):
         '''
         Returns the dictionary of instrument-panel associations
-                
-        :return: (dict<str,str>) a dict whose keys are the instruments known to the gui 
+
+        :return: (dict<str,str>) a dict whose keys are the instruments known to the gui
                  and whose values are the corresponding associated panels (or None).
         '''
         return copy.deepcopy(self.__instrumentToPanelMap)
 
     def setAllInstrumentAssociations(self, associationsdict, clearExisting=False):
         '''
-        Sets the dictionary of instrument-panel associations. 
+        Sets the dictionary of instrument-panel associations.
         By default, it keeps any existing association not present in the associationsdict.
-        
+
         :param associationsdict: (dict<str,str>) a dict whose keys are the instruments names
                                  and whose values are the corresponding associated panels (or None)
-        :param clearExisting: (bool) if True, the the existing asociations are cleared. 
-                              If False (default) existing associations are 
+        :param clearExisting: (bool) if True, the the existing asociations are cleared.
+                              If False (default) existing associations are
                               updated with those in associationsdict
         '''
         if clearExisting:
@@ -1299,12 +1422,12 @@ class TaurusGui(TaurusMainWindow):
             panelname = unicode(self.sender().objectName())
             instrumentname = self.__panelToInstrumentMap.get(panelname)
             if instrumentname is not None:
-                self.emit(Qt.SIGNAL('SelectedInstrument'), instrumentname)
+                self.SelectedInstrument.emit(instrumentname)
 
     def onSelectedInstrument(self, instrumentname):
         ''' Slot to be called when the selected instrument has changed (e.g. by user
         clicking in the synoptic)
-        
+
         :param instrumentname: (str) The name that identifies the instrument.
         '''
         instrumentname = unicode(instrumentname)
@@ -1313,7 +1436,7 @@ class TaurusGui(TaurusMainWindow):
 
     def setFocusToPanel(self, panelname):
         ''' Method that sets a focus for panel passed via an argument
-        
+
         :param panelname: (str) The name that identifies the panel.
                                This name must be unique within the panels in the GUI.
         '''
@@ -1328,29 +1451,32 @@ class TaurusGui(TaurusMainWindow):
 
     def tabifyArea(self, area):
         ''' tabifies all panels in a given area.
-        
+
         :param area: (Qt.DockWidgetArea)
-        
+
         .. warning:: This method is deprecated
         '''
-        raise DeprecationWarning('tabifyArea is no longer supported (now all panels reside in the same DockWidget Area)')
+        raise DeprecationWarning(
+            'tabifyArea is no longer supported (now all panels reside in the same DockWidget Area)')
         panels = self.findPanelsInArea(area)
-        if len(panels) < 2: return
+        if len(panels) < 2:
+            return
         p0 = panels[0]
         for p in panels[1:]:
             self.tabifyDockWidget(p0, p)
 
     def findPanelsInArea(self, area):
         ''' returns all panels in the given area
-        
+
         :param area: (QMdiArea, Qt.DockWidgetArea, 'FLOATING' or None). If
                      area=='FLOATING', the dockwidgets that are floating will be
                      returned.
         :param area:  (Qt.DockWidgetArea or str )
-        
+
         .. warning:: This method is deprecated
         '''
-        raise DeprecationWarning('findPanelsInArea is no longer supported (now all panels reside in the same DockWidget Area)')
+        raise DeprecationWarning(
+            'findPanelsInArea is no longer supported (now all panels reside in the same DockWidget Area)')
         if area == 'FLOATING':
             return [p for p in self.__panels.values() if p.isFloating()]
         else:
@@ -1378,15 +1504,17 @@ class TaurusGui(TaurusMainWindow):
                 xmlroot = etree.fromstring(f.read())
                 f.close()
             except Exception, e:
-                self.error('Cannot parse file "%s": %s', self._xmlConfigFileName, str(e))
+                self.error('Cannot parse file "%s": %s',
+                           self._xmlConfigFileName, str(e))
                 return
 
-        #retrieve/create the PanelDescriptions node
+        # retrieve/create the PanelDescriptions node
         panelDescriptionsNode = xmlroot.find("PanelDescriptions")
         if panelDescriptionsNode is None:
-            panelDescriptionsNode = etree.SubElement(xmlroot, "PanelDescriptions")
+            panelDescriptionsNode = etree.SubElement(
+                xmlroot, "PanelDescriptions")
 
-        #Get all custom panels
+        # Get all custom panels
         dlg = QDoubleListDlg(winTitle='Export Panels to XML',
                              mainLabel='Select which of the custom panels you want to export as xml configuration',
                              label1='Not Exported', label2='Exported',
@@ -1396,7 +1524,7 @@ class TaurusGui(TaurusMainWindow):
             return
         exportlist = dlg.getAll2()
 
-        #create xml for those to be exported
+        # create xml for those to be exported
         registered = self.getConfigurableItemNames()
         for name in exportlist:
             panel = self.__panels[name]
@@ -1407,22 +1535,24 @@ class TaurusGui(TaurusMainWindow):
             panelDescriptionsNode.append(etree.fromstring(panelxml))
         xml = etree.tostring(xmlroot, pretty_print=True)
 
-        #write to file
+        # write to file
         while True:
             if fname is None:
-                fname = Qt.QFileDialog.getSaveFileName(self, "Open File", fname or self._confDirectory, self.tr("XML files (*.xml)"))
+                fname = Qt.QFileDialog.getSaveFileName(
+                    self, "Open File", fname or self._confDirectory, self.tr("XML files (*.xml)"))
                 if not fname:
                     return
             fname = str(fname)
-            #backup the file
+            # backup the file
             if os.path.exists(fname):
                 import shutil
                 try:
                     bckname = "%s.orig" % fname
                     shutil.copy(fname, bckname)
                 except:
-                    self.warning("%s will be overwritten but I could not create a backup in %s", fname, bckname)
-            #write the data
+                    self.warning(
+                        "%s will be overwritten but I could not create a backup in %s", fname, bckname)
+            # write the data
             try:
                 f = open(fname, 'w')
                 f.write(xml)
@@ -1431,15 +1561,17 @@ class TaurusGui(TaurusMainWindow):
             except Exception, e:
                 msg = 'Cannot write to %s: %s' % (fname, str(e))
                 self.error(msg)
-                Qt.QMessageBox.warning(self, "I/O problem", msg + '\nChoose a different location.', Qt.QMessageBox.Ok, Qt.QMessageBox.NoButton)
+                Qt.QMessageBox.warning(
+                    self, "I/O problem", msg + '\nChoose a different location.', Qt.QMessageBox.Ok, Qt.QMessageBox.NoButton)
                 fname = None
 
-
-        hint = "XML_CONFIG = '%s'" % os.path.relpath(fname, self._confDirectory)
+        hint = "XML_CONFIG = '%s'" % os.path.relpath(
+            fname, self._confDirectory)
         msg = 'Configuration written in %s' % fname
         self.info(msg)
         Qt.QMessageBox.information(self, "Configuration updated",
-                                   msg + '\nMake sure that the .py configuration file in %s contains\n%s' % (self._confDirectory, hint),
+                                   msg + '\nMake sure that the .py configuration file in %s contains\n%s' % (
+                                       self._confDirectory, hint),
                                    Qt.QMessageBox.Ok, Qt.QMessageBox.NoButton)
 
         return
@@ -1447,10 +1579,11 @@ class TaurusGui(TaurusMainWindow):
     def showSDMInfo(self):
         '''pops up a dialog showing the current information from the Shared Data Manager'''
         #w = Qt.QMessageBox( self)
-        text = 'Currently managing %i shared data objects:\n%s' % (len(Qt.qApp.SDM.activeDataUIDs()), ', '.join(Qt.qApp.SDM.activeDataUIDs()))
+        text = 'Currently managing %i shared data objects:\n%s' % (
+            len(Qt.qApp.SDM.activeDataUIDs()), ', '.join(Qt.qApp.SDM.activeDataUIDs()))
         nfo = Qt.qApp.SDM.info()
-        w = Qt.QMessageBox (Qt.QMessageBox.Information, 'Shared Data Manager Information', text,
-                             buttons=Qt.QMessageBox.Close, parent=self)
+        w = Qt.QMessageBox(Qt.QMessageBox.Information, 'Shared Data Manager Information', text,
+                           buttons=Qt.QMessageBox.Close, parent=self)
         w.setDetailedText(nfo)
         w.show()
         self.info(nfo)
@@ -1469,18 +1602,18 @@ def main():
     parser.set_usage("%prog [options] confname")
     parser.set_description("The taurus GUI application")
     parser.add_option("", "--config-dir", dest="config_dir", default=None,
-                  help="use the given configuration directory for initialization")
+                      help="use the given configuration directory for initialization")
     parser.add_option("", "--new-gui", action="store_true", dest="new_gui", default=None,
-                  help="launch a wizard for creating a new TaurusGUI application")
+                      help="launch a wizard for creating a new TaurusGUI application")
     parser.add_option("", "--fail-proof", action="store_true", dest="fail_proof", default=None,
-                  help="launch in fail proof mode (it prevents potentially problematic configs from being loaded)")
+                      help="launch in fail proof mode (it prevents potentially problematic configs from being loaded)")
 
     app = TaurusApplication(cmd_line_parser=parser, app_name="taurusgui",
                             app_version=taurus.Release.version)
     args = app.get_command_line_args()
     options = app.get_command_line_options()
 
-    if options.new_gui:  #launch app settings wizard instead of taurusgui
+    if options.new_gui:  # launch app settings wizard instead of taurusgui
         from taurus.qt.qtgui.taurusgui import AppSettingsWizard
         wizard = AppSettingsWizard()
         wizard.show()
@@ -1488,7 +1621,7 @@ def main():
 
     confname = options.config_dir
     if confname is None:
-        if len(args) == 1:  #for backwards compat, we allow to specify the confname without the "--config-dir" parameter
+        if len(args) == 1:  # for backwards compat, we allow to specify the confname without the "--config-dir" parameter
             confname = args[0]
         else:
             parser.print_help(sys.stderr)
@@ -1499,7 +1632,8 @@ def main():
     else:
         configRecursionDepth = None
 
-    gui = TaurusGui(None, confname=confname, configRecursionDepth=configRecursionDepth)
+    gui = TaurusGui(None, confname=confname,
+                    configRecursionDepth=configRecursionDepth)
 
     gui.show()
     ret = app.exec_()
@@ -1510,6 +1644,4 @@ def main():
 
 if __name__ == "__main__":
     main()
-    #xmlTest()
-
-
+    # xmlTest()
diff --git a/lib/taurus/qt/qtgui/taurusgui/ui/AssociationDialog.ui b/lib/taurus/qt/qtgui/taurusgui/ui/AssociationDialog.ui
old mode 100644
new mode 100755
diff --git a/lib/taurus/qt/qtgui/taurusgui/utils.py b/lib/taurus/qt/qtgui/taurusgui/utils.py
index 44464a7..73f95a3 100644
--- a/lib/taurus/qt/qtgui/taurusgui/utils.py
+++ b/lib/taurus/qt/qtgui/taurusgui/utils.py
@@ -2,49 +2,52 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 configuration contains base modules and classes that may be used 
+"""This configuration contains base modules and classes that may be used
 by specific TaurusGui-based GUIs"""
 
 __docformat__ = 'restructuredtext'
 
-import os,sys
+import os
+import sys
 from lxml import etree
 from taurus.qt.qtgui.util import ExternalAppAction
 from taurus.qt.qtgui.util import TaurusWidgetFactory
 from taurus.core.util.log import Logger
 
-#this is here only for backwards compatibility. It should not be used at all
-class Qt_Qt: 
+# this is here only for backwards compatibility. It should not be used at all
+
+
+class Qt_Qt:
     LeftDockWidgetArea = 1
     RightDockWidgetArea = 2
     BottomDockWidgetArea = 3
     TopDockWidgetArea = 4
 
-TAURUSGUI_AREAS = {'Left':Qt_Qt.LeftDockWidgetArea,
-                'Right':Qt_Qt.RightDockWidgetArea, 
-                'Top':Qt_Qt.TopDockWidgetArea, 
-                'Bottom':Qt_Qt.BottomDockWidgetArea}
+TAURUSGUI_AREAS = {'Left': Qt_Qt.LeftDockWidgetArea,
+                   'Right': Qt_Qt.RightDockWidgetArea,
+                   'Top': Qt_Qt.TopDockWidgetArea,
+                   'Bottom': Qt_Qt.BottomDockWidgetArea}
 
 
 class ExternalApp(object):
@@ -53,153 +56,158 @@ class ExternalApp(object):
     Uses the same initialization as that of :class:`ExternalAppAction`
     Use :meth:`getAction` to obtain an instance of a :class:`ExternalAppAction`
     '''
+
     def __init__(self, *args, **kwargs):
         ''' see :meth:`ExternalAppAction.__init__`'''
         self.args = args
         self.kwargs = kwargs
-        
+
     def getAction(self):
         '''
         Returns a :class:`ExternalAppAction` with the values used when
         initializing this ExternalApp instance
-        
+
         :return: (ExternalAppAction)
         '''
         return ExternalAppAction(*self.args, **self.kwargs)
-    
+
     @staticmethod
     def fromXml(xmlstring):
         ''' returns a ExternalApp object based on the xml string provided
-        
+
         :param xmlstring: (unicode) XML code defining the values for the
                           cmdargs, text, icon and parent variables
-        
-        :return: (ExternalApp) an instance of ExternalApp 
+
+        :return: (ExternalApp) an instance of ExternalApp
         '''
         try:
             root = etree.fromstring(xmlstring)
         except:
             raise ValueError('Invalid XML syntax')
-        
+
         commandNode = root.find("command")
         if (commandNode is not None) and (commandNode.text is not None):
             command = commandNode.text
         else:
             raise ValueError('Invalid XML: <command> is mandatory')
-        
+
         paramsNode = root.find("params")
         if (paramsNode is not None) and (paramsNode.text is not None):
             params = paramsNode.text
         else:
             params = ''
-            
+
         textNode = root.find("text")
         if (textNode is not None) and (textNode.text is not None):
             text = textNode.text
         else:
             text = None
-            
+
         iconNode = root.find("icon")
         if (iconNode is not None) and (iconNode.text is not None):
             icon = iconNode.text
         else:
             icon = None
-            
-        return ExternalApp(" ".join((command,params)), text=text, icon=icon)
-        
+
+        return ExternalApp(" ".join((command, params)), text=text, icon=icon)
+
 
 class TaurusGuiComponentDescription(object):
     '''
-    A base class for describing a taurusgui component. 
+    A base class for describing a taurusgui component.
     '''
-    def __init__(self,name, classname=None, modulename=None, widgetname=None, 
-                 sharedDataWrite=None, sharedDataRead=None, 
+
+    def __init__(self, name, classname=None, modulename=None, widgetname=None,
+                 sharedDataWrite=None, sharedDataRead=None,
                  model=None, floating=True, **kwargs):
         self._name = name
         self._modulename = modulename
         self.setClassname(classname)
         self.setWidgetname(widgetname)
-        if self.classname is None and (self.modulename is None or self.widgetname is None) :
-            raise ValueError('Module info must be given (except if passing a Taurus class name)')
+        if self.classname is None and (self.modulename is None or self.widgetname is None):
+            raise ValueError(
+                'Module info must be given (except if passing a Taurus class name)')
         self._floating = floating
-        if sharedDataWrite is None: sharedDataWrite = {}
+        if sharedDataWrite is None:
+            sharedDataWrite = {}
         self._sharedDataWrite = sharedDataWrite
-        if sharedDataRead is None: sharedDataRead = {}
+        if sharedDataRead is None:
+            sharedDataRead = {}
         self._sharedDataRead = sharedDataRead
         self._model = model
-        
+
     def getName(self):
         return self._name
-    
+
     def setName(self, name):
-        self._name = name 
-    
+        self._name = name
+
     def getClassname(self):
         return self._classname
-    
+
     def setClassname(self, classname):
         if classname is not None and '.' in classname:
-            modulename,classname = classname.rsplit('.',1)
+            modulename, classname = classname.rsplit('.', 1)
             self.setModulename(modulename)
         self._classname = classname
-    
+
     def getModulename(self):
         return self._modulename
-    
+
     def setModulename(self, modulename):
         self._modulename = modulename
-    
+
     def getWidgetname(self):
         return self._widgetname
-    
+
     def setWidgetname(self, widgetname):
         if widgetname is not None and '.' in widgetname:
-            modulename,widgetname = widgetname.rsplit('.',1)
+            modulename, widgetname = widgetname.rsplit('.', 1)
             self.setModulename(modulename)
         self._widgetname = widgetname
-        
+
     def getArea(self):
         raise DeprecationWarning('getArea is deprecated')
         return self._area
-    
+
     def setArea(self, area):
         raise DeprecationWarning('setArea is deprecated')
-        self._area = area        
-        
+        self._area = area
+
     def isFloating(self):
         return self._floating
-    
+
     def setFloating(self, floating):
         self._floating = floating
-        
+
     def getSharedDataWrite(self):
         return self._sharedDataWrite
-    
+
     def setSharedDataWrite(self, sharedDataWrite):
         self._sharedDataWrite = sharedDataWrite
-        
+
     def getSharedDataRead(self):
         return self._sharedDataRead
-    
+
     def setSharedDataRead(self, sharedDataRead):
         self._sharedDataRead = sharedDataRead
-        
+
     def getModel(self):
         return self._model
-    
+
     def setModel(self, model):
         self._model = model
-          
+
     def getWidget(self, sdm=None, setModel=True):
-        ''' Returns the widget to be inserted in the panel 
-        
-        :param sdm: (SharedDataManager) if given, the widget will be registered as reader 
+        ''' Returns the widget to be inserted in the panel
+
+        :param sdm: (SharedDataManager) if given, the widget will be registered as reader
                     and/or writer in this manager as defined by the sharedDataRead and sharedDataWrite properties
         :param setModel: (bool) if True (default) the widget will be given the model deined in the model property
-        
-        :return: (QWidget) a new widget instance matching the description 
+
+        :return: (QWidget) a new widget instance matching the description
         '''
-        #instantiate the widget
+        # instantiate the widget
         if self.modulename is None:
             klass = TaurusWidgetFactory().getWidgetClass(self.classname)
             w = klass()
@@ -210,22 +218,22 @@ class TaurusGuiComponentDescription(object):
             else:
                 klass = getattr(module, self.classname)
                 w = klass()
-        #set the model if setModel is True
+        # set the model if setModel is True
         if self.model is not None and setModel:
             w.setModel(self.model)
-        #connect (if an sdm is given)
+        # connect (if an sdm is given)
         if sdm is not None:
-            for dataUID,signalname in self.sharedDataWrite.iteritems(): 
+            for dataUID, signalname in self.sharedDataWrite.iteritems():
                 sdm.connectWriter(dataUID, w, signalname)
-            for dataUID,slotname in self.sharedDataRead.iteritems():
-                sdm.connectReader(dataUID, getattr(w,slotname))
-        #set the name
+            for dataUID, slotname in self.sharedDataRead.iteritems():
+                sdm.connectReader(dataUID, getattr(w, slotname))
+        # set the name
         w.name = self.name
         return w
-    
+
     def toXml(self):
         '''Returns a (unicode) XML code defining the PanelDescription object
-        
+
         :return: xmlstring
         '''
 
@@ -242,123 +250,128 @@ class TaurusGuiComponentDescription(object):
         floating.text = str(self._floating)
 
         sharedDataWrite = etree.SubElement(root, "sharedDataWrite")
-        for k,v in self._sharedDataWrite.iteritems():
-            item = etree.SubElement(sharedDataWrite, "item" ,datauid=k,signalName=v)
+        for k, v in self._sharedDataWrite.iteritems():
+            item = etree.SubElement(
+                sharedDataWrite, "item", datauid=k, signalName=v)
 
         sharedDataRead = etree.SubElement(root, "sharedDataRead")
-        for k,v in self._sharedDataRead.iteritems():
-            item = etree.SubElement(sharedDataRead, "item" ,datauid=k,slotName=v)
-            
+        for k, v in self._sharedDataRead.iteritems():
+            item = etree.SubElement(
+                sharedDataRead, "item", datauid=k, slotName=v)
+
         model = etree.SubElement(root, "model")
         model.text = self._model
-        
-        return  etree.tostring(root, pretty_print=True)
-    
+
+        return etree.tostring(root, pretty_print=True)
+
     @staticmethod
     def fromXml(xmlstring):
         '''returns a PanelDescription object based on the xml string provided
-        
+
         :param xmlstring: (unicode) XML code defining the values for the args
                           needed to initialize PanelDescription.
-        
+
         :return: (PanelDescription) object
         '''
-        
+
         try:
             root = etree.fromstring(xmlstring)
         except:
             return None
-        
+
         nameNode = root.find("name")
         if (nameNode is not None) and (nameNode.text is not None):
             name = nameNode.text
         else:
             return None
-        
+
         classnameNode = root.find("classname")
         if (classnameNode is not None) and (classnameNode.text is not None):
-                classname = classnameNode.text
+            classname = classnameNode.text
         else:
             classname = None
-        
+
         modulenameNode = root.find("modulename")
         if (modulenameNode is not None) and (modulenameNode.text is not None):
             modulename = modulenameNode.text
         else:
-            modulename = None    
-        
+            modulename = None
+
         widgetnameNode = root.find("widgetname")
         if (widgetnameNode is not None) and (widgetnameNode.text is not None):
             widgetname = widgetnameNode.text
         else:
             widgetname = None
-        
+
         floatingNode = root.find("floating")
         if (floatingNode is not None) and (floatingNode.text is not None):
             floating = floatingNode.text == str(True)
         else:
             floating = True
-        
+
         sharedDataWrite = {}
         sharedDataWriteNode = root.find("sharedDataWrite")
         if (sharedDataWriteNode is not None) and (sharedDataWriteNode.text is not None):
             for child in sharedDataWriteNode:
                 if (child.get("datauid") is not None) and (child.get("signalName") is not None):
-                    sharedDataWrite[child.get("datauid")] = child.get("signalName")
-            
+                    sharedDataWrite[child.get("datauid")] = child.get(
+                        "signalName")
+
         if not len(sharedDataWrite):
             sharedDataWrite = None
-        
+
         sharedDataRead = {}
         sharedDataReadNode = root.find("sharedDataRead")
         if (sharedDataReadNode is not None) and (sharedDataReadNode.text is not None):
             for child in sharedDataReadNode:
                 if (child.get("datauid") is not None) and (child.get("slotName") is not None):
-                    sharedDataRead[child.get("datauid")] = child.get("slotName") 
-            
+                    sharedDataRead[
+                        child.get("datauid")] = child.get("slotName")
+
         if not len(sharedDataRead):
-            sharedDataRead = None     
+            sharedDataRead = None
 
         modelNode = root.find("model")
         if (modelNode is not None) and (modelNode.text is not None):
             model = modelNode.text
         else:
             model = None
-        
-        
-        return PanelDescription(name, classname=classname, modulename=modulename, widgetname=widgetname, 
-                                floating=floating, sharedDataWrite=sharedDataWrite, sharedDataRead=sharedDataRead, 
+
+        return PanelDescription(name, classname=classname, modulename=modulename, widgetname=widgetname,
+                                floating=floating, sharedDataWrite=sharedDataWrite, sharedDataRead=sharedDataRead,
                                 model=model)
-        
-    #===============================================================================
+
+    #=========================================================================
     # Properties
-    #===============================================================================
+    #=========================================================================
     name = property(fget=getName, fset=setName)
     classname = property(fget=getClassname, fset=setClassname)
     modulename = property(fget=getModulename, fset=setModulename)
     widgetname = property(fget=getWidgetname, fset=setWidgetname)
     floating = property(fget=isFloating, fset=setFloating)
-    sharedDataWrite = property(fget=getSharedDataWrite, fset=setSharedDataWrite)
-    sharedDataRead = property(fget=getSharedDataRead, fset=setSharedDataRead) 
-    model = property(fget=getModel, fset=setModel) 
+    sharedDataWrite = property(
+        fget=getSharedDataWrite, fset=setSharedDataWrite)
+    sharedDataRead = property(fget=getSharedDataRead, fset=setSharedDataRead)
+    model = property(fget=getModel, fset=setModel)
 
 
 class PanelDescription(TaurusGuiComponentDescription):
     '''
-    A description of a taurusgui panel. 
+    A description of a taurusgui panel.
     This class is not a panel, but a container of the information required to
     build a panel.
     '''
+
     def __init__(self, *args, **kwargs):
         self.instrumentkey = kwargs.pop('instrumentkey', None)
         TaurusGuiComponentDescription.__init__(self, *args, **kwargs)
-        
+
     @staticmethod
     def fromPanel(panel):
         name = str(panel.objectName())
         classname = panel.getWidgetClassName()
         modulename = panel.getWidgetModuleName()
-        # in the case of classes known to the TaurusWidgetFactory, 
+        # in the case of classes known to the TaurusWidgetFactory,
         # do not store the modulename
         if modulename.startswith('taurus.') and \
            classname in TaurusWidgetFactory().getWidgetClassNames():
@@ -367,37 +380,37 @@ class PanelDescription(TaurusGuiComponentDescription):
         floating = panel.isFloating()
         sharedDataWrite = None
         sharedDataRead = None
-        model = getattr(panel.widget(),'model',None)   
+        model = getattr(panel.widget(), 'model', None)
         if model is None or isinstance(model, basestring):
             pass
-        elif hasattr(model,'__iter__'):
+        elif hasattr(model, '__iter__'):
             # if model is a sequence, convert to space-separated string
             try:
                 model = " ".join(model)
             except Exception, e:
-                msg = ('Cannot convert %s to a space-separated string: %s' % 
+                msg = ('Cannot convert %s to a space-separated string: %s' %
                        (model, e))
                 Logger().debug(msg)
                 model = None
         else:
             # ignore other "model" attributes (they are not from Taurus)
             model = None
-        return PanelDescription(name, classname=classname, 
+        return PanelDescription(name, classname=classname,
                                 modulename=modulename, widgetname=widgetname,
-                                floating=floating, 
-                                sharedDataWrite=sharedDataWrite, 
+                                floating=floating,
+                                sharedDataWrite=sharedDataWrite,
                                 sharedDataRead=sharedDataRead, model=model)
-        
+
 
 class ToolBarDescription(TaurusGuiComponentDescription):
     '''
-    A description of a toolbar to be inserted in a TaurusGUI. 
+    A description of a toolbar to be inserted in a TaurusGUI.
     '''
     pass
 
 
-class AppletDescription(TaurusGuiComponentDescription): 
+class AppletDescription(TaurusGuiComponentDescription):
     '''
-    A description of a widget to be inserted in the "applets bar" of the TaurusGUI. 
+    A description of a widget to be inserted in the "applets bar" of the TaurusGUI.
     '''
     pass
diff --git a/lib/taurus/qt/qtgui/test/__init__.py b/lib/taurus/qt/qtgui/test/__init__.py
index a50aaed..6d0ad1c 100644
--- a/lib/taurus/qt/qtgui/test/__init__.py
+++ b/lib/taurus/qt/qtgui/test/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/test/base.py b/lib/taurus/qt/qtgui/test/base.py
index 06c45f5..2fff74c 100644
--- a/lib/taurus/qt/qtgui/test/base.py
+++ b/lib/taurus/qt/qtgui/test/base.py
@@ -1,24 +1,24 @@
 #!/usr/bin/env python
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -28,10 +28,8 @@
 import taurus.core
 from taurus.external import unittest
 from taurus.qt.qtgui.application import TaurusApplication
-from taurus.test import skipUnlessGui
 
 
- at skipUnlessGui()
 class BaseWidgetTestCase(object):
 
     '''
@@ -53,23 +51,38 @@ class BaseWidgetTestCase(object):
     def setUp(self):
         """
         Preconditions:
-        
+
           - A TaurusApplication must be initialized.
           - The widget must be instantiated
-        
+
         """
         unittest.TestCase.setUp(self)
-        
+
+        from taurus.core.util.log import _DEPRECATION_COUNT
+        self._depCounter = _DEPRECATION_COUNT
+        self._depCounter.clear()
+
         app = TaurusApplication.instance()
         if app is None:
             app = TaurusApplication([])
         self._app = app
-        
+
         if self._klass is not None:
             self._widget = self._klass(*self.initargs, **self.initkwargs)
 
+    def assertMaxDeprecations(self, maximum, msg=None):
+        """Assertion method that checks that the number of deprecations issued
+        during the current test is equal to or below a given maximum
+
+        :param maximum: (int) maximum number of deprecation warnings allowed
+        """
+        deps = self._depCounter.getTotal()
+        if msg is None:
+            msg = ('%d deprecation warnings issued (max=%d):\n%s' %
+                   (deps, maximum, self._depCounter.pretty()))
+        self.assertTrue(deps <= maximum, msg)
+
 
- at skipUnlessGui()
 class GenericWidgetTestCase(BaseWidgetTestCase):
 
     '''a base class for testing common cases of arbitrary Taurus widget classes
@@ -90,7 +103,7 @@ class GenericWidgetTestCase(BaseWidgetTestCase):
     def setUp(self):
         """
         Preconditions:
-        
+
           - Those from :class:`BaseWidgetTestCase`
           - A list of models corresponding to the modelnames list
             should be created without using the widget being tested
@@ -98,10 +111,10 @@ class GenericWidgetTestCase(BaseWidgetTestCase):
             None should be used as a placeholder when a model cannot be created
             for a given modelname.
         """
-        #Make sure the basics are taken care of (QApplication, etc)
+        # Make sure the basics are taken care of (QApplication, etc)
         BaseWidgetTestCase.setUp(self)
 
-        #construct a list of models corresponding to the test model names
+        # construct a list of models corresponding to the test model names
         # provided by the widget
         taurusManager = taurus.core.TaurusManager()
         self._models = []
@@ -122,6 +135,7 @@ class GenericWidgetTestCase(BaseWidgetTestCase):
     def test00_Instantiation(self):
         '''Check that the widget instantiates correctly'''
         self.assertIsInstance(self._widget, self._klass)
+        self.assertMaxDeprecations(0)
 
     def test10_SetModelsSequentially(self):
         '''Check that we can set several models sequentially'''
@@ -137,7 +151,8 @@ class GenericWidgetTestCase(BaseWidgetTestCase):
             else:
                 self.assertIs(modelobj, model,
                               'failed to set model "%s" for %s' %
-                             (name, self._klass.__name__))
+                              (name, self._klass.__name__))
+        self.assertMaxDeprecations(0)
 
 #    def test10_ModelProperty(self):
 #        pass
@@ -148,9 +163,9 @@ if __name__ == "__main__":
 
     class TaurusLabelTest(GenericWidgetTestCase, unittest.TestCase):
         _klass = TaurusLabel
-        modelnames = ['sys/tg_test/1/wave', '', 'eval://1', None]
+        modelnames = ['sys/tg_test/1/wave', '', 'eval:1', None]
 
     suite = unittest.defaultTestLoader.loadTestsFromTestCase(TaurusLabelTest)
     unittest.TextTestRunner(descriptions=True, verbosity=2).run(suite)
-    #unittest.main()
-    #TaurusLabelTest().run()
+    # unittest.main()
+    # TaurusLabelTest().run()
diff --git a/lib/taurus/qt/qtgui/tree/__init__.py b/lib/taurus/qt/qtgui/tree/__init__.py
index 93576b1..01bbccc 100644
--- a/lib/taurus/qt/qtgui/tree/__init__.py
+++ b/lib/taurus/qt/qtgui/tree/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -30,4 +30,6 @@ __docformat__ = 'restructuredtext'
 from .qtree import *
 from .taurustree import *
 from .taurusdbtree import *
-from .taurusdevicetree import *
+
+# taurusdevicetree should be removed from taurus or merged with taurusdbtree
+# from .taurusdevicetree import *
diff --git a/lib/taurus/qt/qtgui/tree/qtree.py b/lib/taurus/qt/qtgui/tree/qtree.py
index 603d04d..733d197 100644
--- a/lib/taurus/qt/qtgui/tree/qtree.py
+++ b/lib/taurus/qt/qtgui/tree/qtree.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -32,7 +32,6 @@ __docformat__ = 'restructuredtext'
 from taurus.external.qt import Qt
 from taurus.qt.qtgui.model import QBaseModelWidget, BaseToolBar
 from taurus.qt.qtgui.util import ActionFactory
-from taurus.qt.qtgui.resource import getIcon, getThemeIcon
 
 
 class _NavigationWidget(Qt.QFrame):
@@ -47,7 +46,6 @@ class _NavigationWidget(Qt.QFrame):
         l.setContentsMargins(4, 0, 4, 0)
         self.setLayout(l)
         l.addWidget(self._label)
-        
 
     def treeWidget(self):
         return self._tree
@@ -63,7 +61,7 @@ class _NavigationWidget(Qt.QFrame):
         src_model = treeWidget.getBaseQModel()
         toolbar = self.toolBarWidget()
         txt = u""
-        
+
         while index.isValid():
             src_index = treeWidget._mapToSource(index)
             name = src_model.pyData(src_index, Qt.Qt.DisplayRole)
@@ -83,21 +81,25 @@ class _NavigationWidget(Qt.QFrame):
 
 class NavigationToolBar(BaseToolBar):
 
+    goIntoTriggered = Qt.pyqtSignal()
+    goUpTriggered = Qt.pyqtSignal()
+    goTopTriggered = Qt.pyqtSignal()
+
     def __init__(self, view=None, parent=None, designMode=False):
         BaseToolBar.__init__(self, name="Taurus selection toolbar", view=view,
                              parent=parent, designMode=designMode)
 
         af = ActionFactory()
         self._goIntoAction = af.createAction(self, "Go Into",
-                                             icon=getThemeIcon("go-down"),
+                                             icon=Qt.QIcon.fromTheme("go-down"),
                                              tip="Go into the selected item",
                                              triggered=self.goInto)
         self._goUpAction = af.createAction(self, "Go Up",
-                                            icon=getThemeIcon("go-up"),
-                                            tip="Go up one level",
-                                            triggered=self.goUp)
+                                           icon=Qt.QIcon.fromTheme("go-up"),
+                                           tip="Go up one level",
+                                           triggered=self.goUp)
         self._goTopAction = af.createAction(self, "Go Top",
-                                            icon=getThemeIcon("go-top"),
+                                            icon=Qt.QIcon.fromTheme("go-top"),
                                             tip="Go to top level",
                                             triggered=self.goTop)
         self.addAction(self._goIntoAction)
@@ -116,54 +118,63 @@ class NavigationToolBar(BaseToolBar):
         return self._goUpAction
 
     def goInto(self):
-        self.emit(Qt.SIGNAL("goIntoTriggered"))
+        self.goIntoTriggered.emit()
 
     def goUp(self):
-        self.emit(Qt.SIGNAL("goUpTriggered"))
+        self.goUpTriggered.emit()
 
     def goTop(self):
-        self.emit(Qt.SIGNAL("goTopTriggered"))
+        self.goTopTriggered.emit()
 
 
 class ExpansionBar(BaseToolBar):
 
+    expandTriggered = Qt.pyqtSignal()
+    collapseTriggered = Qt.pyqtSignal()
+    expandSelectionTriggered = Qt.pyqtSignal()
+    collapseSelectionTriggered = Qt.pyqtSignal()
+
     def __init__(self, view=None, parent=None, designMode=False):
         BaseToolBar.__init__(self, name="Taurus selection toolbar", view=view,
                              parent=parent, designMode=designMode)
 
         af = ActionFactory()
         self._expandAllAction = af.createAction(self, "Expand All",
-            icon=getIcon(":/actions/expand.png"),
-            tip="Expand all items",
-            triggered=self.onExpandAll)
+                                                icon=Qt.QIcon(
+                                                    "actions:expand.png"),
+                                                tip="Expand all items",
+                                                triggered=self.onExpandAll)
         self._collapseAllAction = af.createAction(self, "Collapse All",
-            icon=getIcon(":/actions/collapse.png"),
-            tip="Collapse all items",
-            triggered=self.onCollapseAll)
+                                                  icon=Qt.QIcon(
+                                                      "actions:collapse.png"),
+                                                  tip="Collapse all items",
+                                                  triggered=self.onCollapseAll)
         self._expandSelectionAction = af.createAction(self, "Expand selection",
-            icon=getIcon(":/actions/expand-selection.png"),
-            tip="Expand selection",
-            triggered=self.onExpandSelection)
+                                                      icon=Qt.QIcon(
+                                                          "actions:expand-selection.png"),
+                                                      tip="Expand selection",
+                                                      triggered=self.onExpandSelection)
         self._collapseSelectionAction = af.createAction(self, "Collapse All",
-            icon=getIcon(":/actions/collapse-selection.png"),
-            tip="Collapse selection",
-            triggered=self.onCollapseSelection)
+                                                        icon=Qt.QIcon(
+                                                            "actions:collapse-selection.png"),
+                                                        tip="Collapse selection",
+                                                        triggered=self.onCollapseSelection)
         self.addAction(self._expandAllAction)
         self.addAction(self._collapseAllAction)
         self.addAction(self._expandSelectionAction)
         self.addAction(self._collapseSelectionAction)
 
     def onExpandAll(self):
-        self.emit(Qt.SIGNAL("expandTriggered"))
+        self.expandTriggered.emit()
 
     def onCollapseAll(self):
-        self.emit(Qt.SIGNAL("collapseTriggered"))
+        self.collapseTriggered.emit()
 
     def onExpandSelection(self):
-        self.emit(Qt.SIGNAL("expandSelectionTriggered"))
+        self.expandSelectionTriggered.emit()
 
     def onCollapseSelection(self):
-        self.emit(Qt.SIGNAL("collapseSelectionTriggered"))
+        self.collapseSelectionTriggered.emit()
 
 
 class QBaseTreeWidget(QBaseModelWidget):
@@ -182,26 +193,27 @@ class QBaseTreeWidget(QBaseModelWidget):
             self._with_navigation_bar = None
 
         QBaseModelWidget.__init__(self, parent,
-            with_filter_widget=with_filter_widget,
-            with_selection_widget=with_selection_widget,
-            with_refresh_widget=with_refresh_widget,
-            perspective=perspective, proxy=proxy)
+                                  with_filter_widget=with_filter_widget,
+                                  with_selection_widget=with_selection_widget,
+                                  with_refresh_widget=with_refresh_widget,
+                                  perspective=perspective, proxy=proxy)
 
     def createToolArea(self):
         ta = QBaseModelWidget.createToolArea(self)
 
         e_bar = self._expandBar = ExpansionBar(view=self, parent=self)
-        self.connect(e_bar, Qt.SIGNAL("expandTriggered"), self.expandAllTree)
-        self.connect(e_bar, Qt.SIGNAL("collapseTriggered"), self.collapseAllTree)
-        self.connect(e_bar, Qt.SIGNAL("expandSelectionTriggered"), self.expandSelectionTree)
-        self.connect(e_bar, Qt.SIGNAL("collapseSelectionTriggered"), self.collapseSelectionTree)
+        e_bar.expandTriggered.connect(self.expandAllTree)
+        e_bar.collapseTriggered.connect(self.collapseAllTree)
+        e_bar.expandSelectionTriggered.connect(self.expandSelectionTree)
+        e_bar.collapseSelectionTriggered.connect(self.collapseSelectionTree)
         ta.append(e_bar)
 
         if self._with_navigation_bar:
-            n_bar = self._navigationToolBar = self._with_navigation_bar(view=self, parent=self)
-            self.connect(n_bar, Qt.SIGNAL("goIntoTriggered"), self.goIntoTree)
-            self.connect(n_bar, Qt.SIGNAL("goTopTriggered"), self.goTopTree)
-            self.connect(n_bar, Qt.SIGNAL("goUpTriggered"), self.goUpTree)
+            n_bar = self._navigationToolBar = self._with_navigation_bar(
+                view=self, parent=self)
+            n_bar.goIntoTriggered.connect(self.goIntoTree)
+            n_bar.goTopTriggered.connect(self.goTopTree)
+            n_bar.goUpTriggered.connect(self.goUpTree)
             ta.append(n_bar)
         else:
             self._navigationToolBar = None
@@ -220,9 +232,9 @@ class QBaseTreeWidget(QBaseModelWidget):
         tree.setDragEnabled(True)
         tree.setDropIndicatorShown(True)
 
-        self.connect(tree, Qt.SIGNAL("expanded(QModelIndex)"), self.onExpanded)
-        self.connect(tree, Qt.SIGNAL("clicked(QModelIndex)"), self._onClicked)
-        self.connect(tree, Qt.SIGNAL("doubleClicked(QModelIndex)"), self._onDoubleClicked)
+        tree.expanded.connect(self.onExpanded)
+        tree.clicked.connect(self._onClicked)
+        tree.doubleClicked.connect(self._onDoubleClicked)
         h = tree.header()
         h.setResizeMode(0, Qt.QHeaderView.Stretch)
         return tree
@@ -334,4 +346,3 @@ class QBaseTreeWidget(QBaseModelWidget):
 
         index = tree.rootIndex()
         self._navigationToolBar._navigationWidget.updateSelection(index)
-
diff --git a/lib/taurus/qt/qtgui/tree/taurusdbtree.py b/lib/taurus/qt/qtgui/tree/taurusdbtree.py
index eb903de..240749c 100644
--- a/lib/taurus/qt/qtgui/tree/taurusdbtree.py
+++ b/lib/taurus/qt/qtgui/tree/taurusdbtree.py
@@ -2,87 +2,90 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides widgets that display the database in a tree format"""
 
+# todo: tango-centric!!
+
 __all__ = ["TaurusDbTreeWidget"]
 
 __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 from taurus.core.taurusbasetypes import TaurusElementType
-from taurus.core.taurusdatabase import TaurusDatabase
+from taurus.core.taurusauthority import TaurusAuthority
 from taurus.qt.qtcore.model import *
 from taurus.qt.qtgui.base import TaurusBaseWidget
-from taurus.qt.qtgui.resource import getThemeIcon, getElementTypeIcon, getElementTypeIconName
+from taurus.qt.qtgui.icon import getElementTypeIcon, getElementTypeIconName
 from taurustree import TaurusBaseTreeWidget
 
+
 class TaurusDbTreeWidget(TaurusBaseTreeWidget):
     """A class:`taurus.qt.qtgui.tree.TaurusBaseTreeWidget` that connects to a
-    :class:`taurus.core.taurusdatabase.TaurusDatabase` model. It can show the list of database
+    :class:`taurus.core.taurusauthority.TaurusAuthority` model. It can show the list of database
     elements in four different perspectives:
-    
+
     - device : a three level hierarchy of devices (domain/family/name)
     - server : a server based perspective
     - class : a class based perspective
-    
+
     Filters can be inserted into this widget to restrict the tree nodes that are
     seen.
     """
-    
+
     KnownPerspectives = {
-        TaurusElementType.Device : {
-            "label"   : "By device",
-            "icon"    : getElementTypeIconName(TaurusElementType.Device),
-            "tooltip" : "View by device tree",
-            "model"   : [TaurusDbDeviceProxyModel, TaurusDbDeviceModel,],
+        TaurusElementType.Device: {
+            "label": "By device",
+            "icon": getElementTypeIconName(TaurusElementType.Device),
+            "tooltip": "View by device tree",
+            "model": [TaurusDbDeviceProxyModel, TaurusDbDeviceModel, ],
         },
-        'PlainDevice' : {
-            "label"   : "By plain device",
-            "icon"    : getElementTypeIconName(TaurusElementType.Device),
-            "tooltip" : "View by plain device tree (it may take a long time if there are problems with the exported devices)",
-            "model"   : [TaurusDbDeviceProxyModel, TaurusDbPlainDeviceModel,],
+        'PlainDevice': {
+            "label": "By plain device",
+            "icon": getElementTypeIconName(TaurusElementType.Device),
+            "tooltip": "View by plain device tree (it may take a long time if there are problems with the exported devices)",
+            "model": [TaurusDbDeviceProxyModel, TaurusDbPlainDeviceModel, ],
         },
 
-        TaurusElementType.Server : {
-            "label" : "By server",
-            "icon" : getElementTypeIconName(TaurusElementType.Server),
-            "tooltip" : "View by server tree",
-            "model" : [TaurusDbServerProxyModel, TaurusDbServerModel,],
+        TaurusElementType.Server: {
+            "label": "By server",
+            "icon": getElementTypeIconName(TaurusElementType.Server),
+            "tooltip": "View by server tree",
+            "model": [TaurusDbServerProxyModel, TaurusDbServerModel, ],
         },
-        TaurusElementType.DeviceClass : {
-            "label" : "By class",
-            "icon" : getElementTypeIconName(TaurusElementType.DeviceClass),
-            "tooltip" : "View by class tree",
-            "model" : [TaurusDbDeviceClassProxyModel, TaurusDbDeviceClassModel,], 
+        TaurusElementType.DeviceClass: {
+            "label": "By class",
+            "icon": getElementTypeIconName(TaurusElementType.DeviceClass),
+            "tooltip": "View by class tree",
+            "model": [TaurusDbDeviceClassProxyModel, TaurusDbDeviceClassModel, ],
         },
     }
 
     DftPerspective = TaurusElementType.Device
 
     def getModelClass(self):
-        return TaurusDatabase
-    
+        return TaurusAuthority
+
     def sizeHint(self):
         return Qt.QSize(1024, 512)
 
@@ -91,7 +94,7 @@ class TaurusDbTreeWidget(TaurusBaseTreeWidget):
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.tree'
         ret['group'] = 'Taurus Views'
-        ret['icon'] = ":/designer/listview.png"
+        ret['icon'] = "designer:listview.png"
         return ret
 
 
@@ -99,54 +102,61 @@ class _TaurusTreePanel(Qt.QWidget, TaurusBaseWidget):
     """A demonstration panel to show how :class:`taurus.qt.qtcore.TaurusDbBaseModel`
     models can interact with several model view widgets like QTreeView,
     QTableView, QListView and QComboBox"""
-    
-    def __init__(self, parent = None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         """doc please!"""
         name = self.__class__.__name__
         self.call__init__wo_kw(Qt.QWidget, parent)
         self.call__init__(TaurusBaseWidget, name, designMode=designMode)
         self.init(designMode)
-    
+
     def init(self, designMode):
         l = Qt.QGridLayout()
-        l.setContentsMargins(0,0,0,0)
+        l.setContentsMargins(0, 0, 0, 0)
         self.setLayout(l)
-        
+
 #        tb = self._toolbar = Qt.QToolBar("Taurus tree panel toolbar")
 #        tb.setFloatable(False)
-#        refreshAction = self._refreshAction = tb.addAction(getThemeIcon("view-refresh"),"Refresh", self.refresh)
+#        refreshAction = self._refreshAction = tb.addAction(Qt.QIcon.fromTheme("view-refresh"),"Refresh", self.refresh)
 
 #        l.addWidget(tb, 0, 0)
-        
+
         main_panel = Qt.QTabWidget()
-        self._device_tree_view = TaurusDbTreeWidget(perspective=TaurusElementType.Device)
+        self._device_tree_view = TaurusDbTreeWidget(
+            perspective=TaurusElementType.Device)
         self._device_table_view = Qt.QTableView()
         self._device_table_view.setModel(TaurusDbBaseModel())
         self._device_list_view = Qt.QListView()
         self._device_list_view.setModel(TaurusDbSimpleDeviceModel())
-        self._server_tree_view = TaurusDbTreeWidget(perspective=TaurusElementType.Server)
-        self._class_tree_view = TaurusDbTreeWidget(perspective=TaurusElementType.DeviceClass)
-        
+        self._server_tree_view = TaurusDbTreeWidget(
+            perspective=TaurusElementType.Server)
+        self._class_tree_view = TaurusDbTreeWidget(
+            perspective=TaurusElementType.DeviceClass)
+
         self._device_combo_view = Qt.QWidget()
         combo_form = Qt.QFormLayout()
         self._device_combo_view.setLayout(combo_form)
-        
-        self._combo_dev_tree_widget = TaurusDbTreeWidget(perspective=TaurusElementType.Device)
+
+        self._combo_dev_tree_widget = TaurusDbTreeWidget(
+            perspective=TaurusElementType.Device)
         qmodel = self._combo_dev_tree_widget.getQModel()
         qmodel.setSelectables([TaurusElementType.Member])
         device_combo = Qt.QComboBox()
         device_combo.setModel(qmodel)
         device_combo.setMaxVisibleItems(20)
         device_combo.setView(self._combo_dev_tree_widget.treeView())
-        combo_form.addRow("Device selector (by device hierarchy):", device_combo)
-        
-        self._combo_attr_tree_widget = TaurusDbTreeWidget(perspective=TaurusElementType.Device)
+        combo_form.addRow(
+            "Device selector (by device hierarchy):", device_combo)
+
+        self._combo_attr_tree_widget = TaurusDbTreeWidget(
+            perspective=TaurusElementType.Device)
         qmodel = self._combo_attr_tree_widget.getQModel()
         device_combo = Qt.QComboBox()
         device_combo.setModel(qmodel)
         device_combo.setMaxVisibleItems(20)
         device_combo.setView(self._combo_attr_tree_widget.treeView())
-        combo_form.addRow("Attribute selector (by device hierarchy):", device_combo)
+        combo_form.addRow(
+            "Attribute selector (by device hierarchy):", device_combo)
 
         self._combo_dev_table_view = Qt.QTableView()
         self._combo_dev_table_view.setModel(TaurusDbBaseModel())
@@ -157,18 +167,18 @@ class _TaurusTreePanel(Qt.QWidget, TaurusBaseWidget):
         device_combo.setMaxVisibleItems(20)
         device_combo.setView(self._combo_dev_table_view)
         combo_form.addRow("Device selector (by plain device):", device_combo)
-        
+
         main_panel.addTab(self._device_tree_view, "Device (Tree View)")
         main_panel.addTab(self._device_table_view, "Device (Table View)")
         main_panel.addTab(self._device_list_view, "Device (List View)")
         main_panel.addTab(self._server_tree_view, "Server (Tree View)")
         main_panel.addTab(self._class_tree_view, "Class (Tree View)")
         main_panel.addTab(self._device_combo_view, "ComboBox Views")
-        
+
         l.addWidget(main_panel, 1, 0)
-        
+
         self._main_panel = main_panel
-    
+
     def deviceTreeWidget(self):
         return self._device_tree_view
 
@@ -177,38 +187,38 @@ class _TaurusTreePanel(Qt.QWidget, TaurusBaseWidget):
 
     def deviceListWidget(self):
         return self._device_list_view
-    
+
     def serverTreeWidget(self):
         return self._server_tree_view
 
     def classTreeWidget(self):
         return self._class_tree_view
-    
+
     def sizeHint(self):
         return Qt.QSize(1024, 512)
 
     def _updateTreeModels(self):
         db_name, db = self.getModel(), self.getModelObj()
-        
+
         self._device_tree_view.setModel(db_name)
-        
+
         model = self._device_table_view.model()
         if model is not None:
             model.setDataSource(db)
-        
+
         model = self._device_list_view.model()
         if model is not None:
             model.setDataSource(db)
-        
+
         self._server_tree_view.setModel(db_name)
         self._class_tree_view.setModel(db_name)
         self._combo_dev_tree_widget.setModel(db_name)
         self._combo_attr_tree_widget.setModel(db_name)
-        
+
         model = self._combo_dev_table_view.model()
         if model is not None:
             model.setDataSource(db)
-        
+
     def refresh(self):
         db = self.getModelObj()
         if db is None:
@@ -219,16 +229,16 @@ class _TaurusTreePanel(Qt.QWidget, TaurusBaseWidget):
         self._device_list_view.model().refresh()
         self._server_tree_view.refresh()
         self._class_tree_view.refresh()
-    
+
     def goIntoTree(self):
         index = self._device_tree_view.currentIndex()
         if index is None:
             return
         #index_parent = index.parent()
-        #if index_parent is None:
+        # if index_parent is None:
         #    return
         self._device_tree_view.setRootIndex(index)
-    
+
     def goUpTree(self):
         index = self._device_tree_view.rootIndex()
         if index is None:
@@ -237,31 +247,31 @@ class _TaurusTreePanel(Qt.QWidget, TaurusBaseWidget):
         if index_parent is None:
             return
         self._device_tree_view.setRootIndex(index_parent)
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseWidget overwriting
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getModelClass(self):
-        return TaurusDatabase
-    
-    @Qt.pyqtSignature("setModel(QString)")
+        return TaurusAuthority
+
+    @Qt.pyqtSlot('QString')
     def setModel(self, model):
         """Sets/unsets the model name for this component
-        
+
         :param model: (str) the new model name"""
         super(_TaurusTreePanel, self).setModel(model)
         self._updateTreeModels()
-            
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # QT property definition
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    #: This property holds the unique URI string representing the model name 
-    #: with which this widget will get its data from. The convention used for 
+    #: This property holds the unique URI string representing the model name
+    #: with which this widget will get its data from. The convention used for
     #: the string can be found :ref:`here <model-concept>`.
-    #: 
-    #: In case the property :attr:`useParentModel` is set to True, the model 
+    #:
+    #: In case the property :attr:`useParentModel` is set to True, the model
     #: text must start with a '/' followed by the attribute name.
     #:
     #: **Access functions:**
@@ -283,6 +293,7 @@ def main_TaurusTreePanel(host):
     w.show()
     return w
 
+
 def main_TaurusDbTreeWidget(host, perspective=TaurusElementType.Device):
     w = TaurusDbTreeWidget(perspective=perspective)
     w.setWindowIcon(getElementTypeIcon(perspective))
@@ -291,34 +302,36 @@ def main_TaurusDbTreeWidget(host, perspective=TaurusElementType.Device):
     w.show()
     return w
 
+
 def demo():
     """DB panels"""
     import taurus
-    db = taurus.Database()
+    db = taurus.Authority()
     host = db.getNormalName()
-    w =main_TaurusTreePanel(host)
+    w = main_TaurusTreePanel(host)
     # w = main_TaurusDbTreeWidget(host, TaurusElementType.Device)
-    
+
     return w
 
+
 def main():
     import sys
     import taurus.qt.qtgui.application
     Application = taurus.qt.qtgui.application.TaurusApplication
-    
+
     app = Application.instance()
     owns_app = app is None
-    
+
     if owns_app:
         app = Application(app_name="DB model demo", app_version="1.0",
                           org_domain="Taurus", org_name="Tango community")
     w = demo()
     w.show()
-    
+
     if owns_app:
         sys.exit(app.exec_())
     else:
         return w
-    
+
 if __name__ == "__main__":
     main()
diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py
index 7f18130..6ec1ee1 100644
--- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py
+++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py
@@ -2,48 +2,61 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-taurusdevicetree.py: 
+taurusdevicetree.py:
 """
 
-__all__ = ["TaurusDevTree","TaurusSearchTree","TaurusDevTreeOptions"] #,"SearchEdit"] #"TaurusTreeNode"]
+# @todo: This module is not being used anywhere in Taurus and depends on
+# non-standard and non-provided modules. It is also quite specific and
+# tango-centric, so it should be removed from Taurus or merged with
+# Taurusdbtree
+
+# ,"SearchEdit"] #"TaurusTreeNode"]
+__all__ = ["TaurusDevTree", "TaurusSearchTree", "TaurusDevTreeOptions"]
 
-import time,os,re,traceback
+import time
+import os
+import traceback
 from functools import partial
-import PyTango # to change!!
+import PyTango  # to change!!
 
-try:import icons_dev_tree
-except:icons_dev_tree = None
+# @todo: icons_dev_tree is not an included or standard module.
+#        Is anybody using it? If not, the following lines should be removed and
+#        the TaurusDevTree.setStateIcon method should be cleaned
+try:
+    import icons_dev_tree
+except:
+    icons_dev_tree = None
 
 from taurus.external.qt import Qt
 
 import taurus.core
-from taurus.core.util.colors import DEVICE_STATE_PALETTE,ATTRIBUTE_QUALITY_PALETTE
+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.core.tango.search import *  # @TODO: Avoid implicit imports
 from taurus.qt.qtcore.util.emitter import SingletonWorker
-from taurus.qt.qtcore.mimetypes import *  #@TODO: Avoid implicit imports
+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.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget
@@ -53,169 +66,201 @@ TREE_ITEM_MIME_TYPE = 'application/x-qabstractitemmodeldatalist'
 
 ###############################################################################
 
+
 class TaurusTreeNodeContainer(object):
     """
     Interface that provides Node-focused methods to TaurusDevTree
     This methods should be moved to TaurusDevTreeNode class when it will be able to retrieve currentItem from Tree.
     """
-    _icon_map = {} #A dictionary like {device_regexp:pixmap_url}
-    
+    _icon_map = {}  # A dictionary like {device_regexp:pixmap_url}
+
+    addAttrSelected = Qt.pyqtSignal('QStringList')
+    removeAttrSelected = Qt.pyqtSignal('QStringList')
+
     def __init__(self):
-        raise Exception('This class is just an interface, do not instantiate it!')
-    
+        raise Exception(
+            'This class is just an interface, do not instantiate it!')
+
     @classmethod
-    def setIconMap(klass,filters):
+    def setIconMap(klass, filters):
         """A dictionary like {device_regexp:pixmap_url}"""
         klass._icon_map = filters
-        
+
     @classmethod
     def getIconMap(klass):
         return klass._icon_map
-    
-    def createItem(self,parent,value,text=None):
-        self.debug('createItem(%s,%s)'%(value,text))
+
+    def createItem(self, parent, value, text=None):
+        self.debug('createItem(%s,%s)' % (value, text))
         USE_TREE_NODE = False
-        if USE_TREE_NODE: item = TaurusTreeNode(parent)
-        else: item = Qt.QTreeWidgetItem(parent)
-        if text is None: text = value
+        if USE_TREE_NODE:
+            item = TaurusTreeNode(parent)
+        else:
+            item = Qt.QTreeWidgetItem(parent)
+        if text is None:
+            text = value
         item.isAttribute = False
         item.DeviceName = ''
         item.draggable = ''
-        item.setText(0,Qt.QApplication.translate('',text, None, Qt.QApplication.UnicodeUTF8))
-        self.setNodeParent(item,parent)
+        item.setText(0, Qt.QApplication.translate(
+            '', text, None, Qt.QApplication.UnicodeUTF8))
+        self.setNodeParent(item, parent)
         item.adminNode = None
         if not item.parentNode or '/' in text:
             f = item.font(0)
-            if not item.parentNode: f.setBold(True)
-            if '/' in text: f.setItalic(True)
-            item.setFont(0,f)
-        item.parentTree = self #hook used to call external methods with item as single argument
+            if not item.parentNode:
+                f.setBold(True)
+            if '/' in text:
+                f.setItalic(True)
+            item.setFont(0, f)
+        item.parentTree = self  # hook used to call external methods with item as single argument
         self.item_index[value.strip().split()[0]] = item
         try:
             icon = self.getNodeIcon(item)
-            if icon: item.setIcon(0,icon)
-        except: pass
+            if icon:
+                item.setIcon(0, icon)
+        except:
+            pass
         self.item_list.add(item)
         return item
 
     ###########################################################################
     # Item members methods
-    
-    def setNodeParent(self,node,parent):
+
+    def setNodeParent(self, node, parent):
         """ Used to know which parent attributes must be expanded if found """
-        node.parentNode = parent if isinstance(parent,Qt.QTreeWidgetItem) else None
-        
-    def setNodeAdmin(self,node,admin):
+        node.parentNode = parent if isinstance(
+            parent, Qt.QTreeWidgetItem) else None
+
+    def setNodeAdmin(self, node, admin):
         """ Used to assign a controller to its controlled devices in the tree """
-        node.adminNode = admin.getNodeText(admin) if isinstance(admin,Qt.QTreeWidgetItem) else None
+        node.adminNode = admin.getNodeText(admin) if isinstance(
+            admin, Qt.QTreeWidgetItem) else None
 
-    def getNodeAdmin(self,node):
+    def getNodeAdmin(self, node):
         return node.adminNode(node) if isCallable(node.adminNode) else node.adminNode
-        
-    def getNodeText(self,node=None,full=False):
+
+    def getNodeText(self, node=None, full=False):
         """ Get the text of the node as shown in the tree, @full allows to get the first word or the whole text"""
-        if node is None: node = self.currentItem()
-        if hasattr(node,'text'):
+        if node is None:
+            node = self.currentItem()
+        if hasattr(node, 'text'):
             txt = str(node.text(0)).strip()
-            if not full: return txt.split()[0]
+            if not full:
+                return txt.split()[0]
             return txt
-        else: return ''
-    
-    def getNodeDeviceName(self,node = None):
-        if node is None: node = self.currentItem()
-        return str(getattr(node,'DeviceName','')) or self.getNodeText(node)
-
-    def getNodeParentName(self,node=None):
-        if node is None: node = self.currentItem()
+        else:
+            return ''
+
+    def getNodeDeviceName(self, node=None):
+        if node is None:
+            node = self.currentItem()
+        return str(getattr(node, 'DeviceName', '')) or self.getNodeText(node)
+
+    def getNodeParentName(self, node=None):
+        if node is None:
+            node = self.currentItem()
         return self.getNodeText(node.parentNode)
-        
-    def getNodePath(self,node=None):
+
+    def getNodePath(self, node=None):
         """ Returns all parent nodes prior to current """
-        if node is None: node = self.currentItem()
-        p,path,names = node.parentNode,[],[]
+        if node is None:
+            node = self.currentItem()
+        p, path, names = node.parentNode, [], []
         while p is not None:
-            path.insert(0,p)
-            names.insert(0,self.getNodeDeviceName(p))
+            path.insert(0, p)
+            names.insert(0, self.getNodeDeviceName(p))
             p = p.parentNode
         return path
-        
-    def getNodeAlias(self,node = None):
-        if node is None: node = self.currentItem()        
-        alias = getattr(node,'AttributeAlias','')
+
+    def getNodeAlias(self, node=None):
+        if node is None:
+            node = self.currentItem()
+        alias = getattr(node, 'AttributeAlias', '')
         return (alias or self.getNodeText(node))
 
-    def getNodeIcon(self,node=None):
+    def getNodeIcon(self, node=None):
         #self.debug('TaurusDevTree.getNodeIcon(node) not implemented, overrided in subclasses')
-        
+
         #self,url = node.parentTree,''
-        if node is None: node = self.getNode()
+        if node is None:
+            node = self.getNode()
         try:
-            name,url = self.getNodeText(node),''
-            for k,v in self.getIconMap().items():
-                if re.match(k.lower(),name.lower()): url = v
+            name, url = self.getNodeText(node), ''
+            for k, v in self.getIconMap().items():
+                if re.match(k.lower(), name.lower()):
+                    url = v
             if not url:
-                for k,v in self.getIconMap().items():
-                    if k.lower() in name.lower(): url = v
-            #if name.count('/')==2:
-                #if any(a.startswith(name+'/') for a in getArchivedAttributes()):
+                for k, v in self.getIconMap().items():
+                    if k.lower() in name.lower():
+                        url = v
+            # if name.count('/')==2:
+                # if any(a.startswith(name+'/') for a in getArchivedAttributes()):
                     #url = wdir('image/icons/clock.png')
-                #else:
+                # else:
                     #url = wdir('image/equips/icon-%s.gif'%name.split('/')[2].split('-')[0].lower())
-            #elif name.count('/')==3:
+            # elif name.count('/')==3:
                 #url = filterAttributes(name) or wdir('image/icons/closetab.png')
-            #else:
+            # else:
                 #url = wdir('image/equips/icon-%s.gif'%name.lower())
         except:
             self.warning(traceback.format_exc())
-        if not url or not os.path.isfile(url): return None
-        else: return Qt.QIcon(url)
-    
-    def getNodeDraggable(self,node = None):
+        if not url or not os.path.isfile(url):
+            return None
+        else:
+            return Qt.QIcon(url)
+
+    def getNodeDraggable(self, node=None):
         """ This method will return True only if the selected node belongs to a numeric Tango attribute """
-        numtypes = [PyTango.DevDouble,PyTango.DevFloat,PyTango.DevLong,PyTango.DevLong64,PyTango.DevULong,PyTango.DevShort,PyTango.DevUShort,PyTango.DevBoolean]
-        if node is None: node = self.currentItem()
+        numtypes = [PyTango.DevDouble, PyTango.DevFloat, PyTango.DevLong, PyTango.DevLong64,
+                    PyTango.DevULong, PyTango.DevShort, PyTango.DevUShort, PyTango.DevBoolean]
+        if node is None:
+            node = self.currentItem()
         try:
             name = self.getNodeText(node).lower()
             drag = name
-            if node.isAttribute and getattr(node,'DeviceName','') and '/' not in name: name = node.DeviceName+'/'+name
-            if name.count('/')==2: #A Device Name
-                drag = name#+'/state' #False
-            elif name.count('/')==3: #An Attribute Name
+            if node.isAttribute and getattr(node, 'DeviceName', '') and '/' not in name:
+                name = node.DeviceName + '/' + name
+            if name.count('/') == 2:  # A Device Name
+                drag = name  # +'/state' #False
+            elif name.count('/') == 3:  # An Attribute Name
                 #dtype = PyTango.AttributeProxy(name).get_config().data_type
                 #if dtype in numtypes: self.debug('The attribute %s is a Numeric Attribute'%(name))
-                drag = getattr(node,'draggable','') or name
-                #else: drag = False
-            self.debug('Node(%s,%s,%s): drag: %s'%(name,node.isAttribute,node.DeviceName,drag))
+                drag = getattr(node, 'draggable', '') or name
+                # else: drag = False
+            self.debug('Node(%s,%s,%s): drag: %s' %
+                       (name, node.isAttribute, node.DeviceName, drag))
             return drag.split()[0]
         except:
             import traceback
             self.warning(traceback.format_exc())
-            return False 
-            
+            return False
+
     ###########################################################################
     # Context Menu Actions
-    
+
     @staticmethod
     def setDefaultPanelClass(other):
         TaurusTreeNodeContainer._defaultClass = other
+
     @staticmethod
     def defaultPanelClass():
-        if not hasattr(TaurusTreeNodeContainer,'_defaultClass'): 
+        if not hasattr(TaurusTreeNodeContainer, '_defaultClass'):
             from taurus.qt.qtgui.panel import TaurusDevicePanel
             TaurusTreeNodeContainer._defaultClass = TaurusDevicePanel
         obj = TaurusTreeNodeContainer._defaultClass
         return obj
-            
+
     def showPanel(self):
         '''Display widget taurusDevicePanel'''
         device = self.getNodeText()
         nameclass = self.defaultPanelClass()()
         nameclass.setModel(device)
         nameclass.show()
-        ##nameclass.setSpectraAtkMode(True)
-        #Dialog is used to make new floating panels persistent
-        if isinstance(nameclass,TaurusWidget):
-            PopupDialog(self,nameclass)
+        # nameclass.setSpectraAtkMode(True)
+        # Dialog is used to make new floating panels persistent
+        if isinstance(nameclass, TaurusWidget):
+            PopupDialog(self, nameclass)
 
     def showProperties(self):
         '''Display widget TaurusPropTable'''
@@ -224,54 +269,47 @@ class TaurusTreeNodeContainer(object):
         nameclass = taurus.qt.qtgui.table.TaurusPropTable()
         nameclass.setTable(device)
         nameclass.show()
-        #Dialog is used to make new floating panels persistent
-        PopupDialog(self,nameclass)
+        # Dialog is used to make new floating panels persistent
+        PopupDialog(self, nameclass)
 
     def addToPlot(self):
         """ This method will send a signal with the current selected node """
         items = self.getSelectedNodes()
         for item in items:
             attr = self.getNodeAlias(item)
-            self.trace('In addToPlot(%s->%s)'%(item.text(0),attr))
+            self.trace('In addToPlot(%s->%s)' % (item.text(0), attr))
             self.addAttrToPlot(attr)
         return
-        
-    def addAttrToPlot(self,attr):
+
+    def addAttrToPlot(self, attr):
         """ This method will send a signal with the given attr name, in a separate method to be called with a pre-filled list  """
-        self.emit(Qt.SIGNAL("addAttrSelected(QStringList)"),Qt.QStringList([str(attr)]))
+        self.addAttrSelected.emit(Qt.QStringList([str(attr)]))
 
     def removeFromPlot(self):
         """ This method will send a signal with the current selected node """
         items = self.getSelectedNodes()
         for item in items:
             item = self.currentItem()
-            attr = getattr(item,'AttributeAlias','') or self.getNodeText(item)
+            attr = getattr(item, 'AttributeAlias',
+                           '') or self.getNodeText(item)
             self.removeAttrFromPlot(attr)
         return
-        
-    def removeAttrFromPlot(self,attr):
-        """ This method will send a signal with the given attr name, in a separate method to be called with a pre-filled list """        
-        self.emit(Qt.SIGNAL("removeAttrSelected(QStringList)"),Qt.QStringList([str(attr)]))
+
+    def removeAttrFromPlot(self, attr):
+        """ This method will send a signal with the given attr name, in a separate method to be called with a pre-filled list """
+        self.removeAttrSelected.emit(Qt.QStringList([str(attr)]))
 
 
 ###############################################################################
-        
-class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
-    ''' 
+
+class TaurusDevTree(TaurusTreeNodeContainer, Qt.QTreeWidget, TaurusBaseWidget):
+    '''
     This widget displays a list of servers, devices or instances.
     To set a new Model use either setModel(filters), addModels(list), setFilters(...) or loadTree(filters)
     setModel and loadTree are equivalent; adding a new branch to the tree
     addModels merges the tree with new models
     setFilters clears previous models and adds new one
     '''
-    __pyqtSignals__ = (
-        "modelChanged(const QString &)",
-        "deviceSelected(QString)",
-        "addAttrSelected(QStringList)",
-        "removeAttrSelected(QStringList)",
-        "refreshTree",
-        "nodeFound"
-        )
     __properties__ = (
         'ModelInConfig',
         'modifiableByUser',
@@ -282,25 +320,31 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
         'ShowColors',
         'ShowNotExported',
         'MaxDevices',
-        )
+    )
     __slots__ = (
         "setTangoHost",
         #"setModel",
         #"setFilters",
         "addModels",
         "setModelCheck",
-        "loadTree", #Applies regexp filters to database
+        "loadTree",  # Applies regexp filters to database
         "setTree",
         "findInTree",
         "setIcons",
         "expandAll",
         "expandNode",
         "collapseNode",
-        )
-        
+    )
+
     TRACE_ALL = False
 
-    def __init__(self, parent=None, designMode = False):
+    refreshTree = Qt.pyqtSignal()
+    nodeFound = Qt.pyqtSignal()
+    deviceSelected = Qt.pyqtSignal('QString')
+    addAttrSelected = Qt.pyqtSignal('QStringList')
+    removeAttrSelected = Qt.pyqtSignal('QStringList')
+
+    def __init__(self, parent=None, designMode=False):
         name = "TaurusDevTree"
         self._useParentModel = True
         self._localModel = ''
@@ -310,44 +354,49 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
         self.setObjectName(name)
         self._filters = []
         self.__attr_filter = None
-        self.__expand =1
+        self.__expand = 1
         self.collapsing_search = True
         self.index = 0
         self._nameTopItem = ""
 
-        self.excludeFromSearch = [] #This is a list of regular expressions to exclude objects from searches
+        # This is a list of regular expressions to exclude objects from
+        # searches
+        self.excludeFromSearch = []
         self.dictionary = {}
         self.item_index = CaselessDict()
-        self.item_list = set() #NOTE: as several nodes may share the same name this list will be different from item_index.values()!!!
+        # NOTE: as several nodes may share the same name this list will be
+        # different from item_index.values()!!!
+        self.item_list = set()
         self.setSelectionMode(self.ExtendedSelection)
-        
-        self.ContextMenu=[]
-        self.ExpertMenu=[]
 
-        #The SingletonWorker Threads are used for expanding nodes and also for loading a new tree; both objects are the same thread, but read from different queues
+        self.ContextMenu = []
+        self.ExpertMenu = []
+
+        # The SingletonWorker Threads are used for expanding nodes and also for
+        # loading a new tree; both objects are the same thread, but read from
+        # different queues
         self.__loader = None
         self.__expander = None
 
         if not designMode:
             self.Loader
             self.Expander
-        
+
         self.initConfig()
-        
-        #Signal
-        Qt.QObject.connect(self,Qt.SIGNAL("itemClicked(QTreeWidgetItem *,int)"),self.deviceClicked)
-        Qt.QObject.connect(self,Qt.SIGNAL("nodeFound"),self,Qt.SLOT("expandNode"))
-        
+
+        # Signal
+        self.itemclicked.connect(self.deviceClicked)
+        self.nodeFound.connect(self.expandNode)
         self.setDragDropMode(Qt.QAbstractItemView.DragDrop)
         self.setModifiableByUser(True)
-        self.setModelInConfig(False) #We store Filters instead!
+        self.setModelInConfig(False)  # We store Filters instead!
         self.setAcceptDrops(True)
         self.viewport().setAcceptDrops(True)
         self.setDragEnabled(True)
         self.setSupportedMimeTypes([
-            TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_ATTR_MIME_TYPE, 
+            TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_ATTR_MIME_TYPE,
             TAURUS_MODEL_MIME_TYPE, TREE_ITEM_MIME_TYPE, 'text/plain'])
-        
+
         self.setTangoHost()
         self.defineStyle()
 
@@ -365,63 +414,74 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
         expander = self.__expander
         if expander is None:
             expander = SingletonWorker(parent=self, name='NodeExpander',
-                                       method=lambda node, expand : node.setExpanded(expand),
+                                       method=lambda node, expand: node.setExpanded(
+                                           expand),
                                        cursor=True, start=True)
             self.__expander = expander
         return expander
 
-    def getConfig(self,name): 
-        properties.get_property(self,name)
-    
+    def getConfig(self, name):
+        properties.get_property(self, name)
+
     def initConfig(self):
         """
         Initializing the attributes that will be kept persitent as Qt settings.
         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,'Models','QStringList',default='',
-            #setter = self.setFilters,
-            setter = self.addModels, #Not trivial!; it avoids QSettings erasing default model
-            #set_callback=lambda v,s=self:v and s.loadTree(v,clear=True),
-            #reset_callback=lambda s=self:s.setFilters(''),
-            qt=False,config=True
-            )
-        properties.set_property_methods(self,'MaxDevices','int',default=150,qt=False,config=True)
-        properties.set_property_methods(self,'ShowAlias','bool',default=False,qt=False,config=True)
-        properties.set_property_methods(self,'ShowNotExported','bool',default=True,qt=False,config=True)
-        properties.set_property_methods(self,'ShowColors','bool',default=True,qt=False,config=True)
-        #properties.set_property_methods(self,'Expand','int',default=0)
-        
+        properties.set_property_methods(self, 'Models', 'QStringList', default='',
+                                        #setter = self.setFilters,
+                                        setter=self.addModels,  # Not trivial!; it avoids QSettings erasing default model
+                                        #set_callback=lambda v,s=self:v and s.loadTree(v,clear=True),
+                                        #reset_callback=lambda s=self:s.setFilters(''),
+                                        qt=False, config=True
+                                        )
+        properties.set_property_methods(
+            self, 'MaxDevices', 'int', default=150, qt=False, config=True)
+        properties.set_property_methods(
+            self, 'ShowAlias', 'bool', default=False, qt=False, config=True)
+        properties.set_property_methods(
+            self, 'ShowNotExported', 'bool', default=True, qt=False, config=True)
+        properties.set_property_methods(
+            self, 'ShowColors', 'bool', default=True, qt=False, config=True)
+        # properties.set_property_methods(self,'Expand','int',default=0)
+
     @staticmethod
     def setDefaultAttrFilter(other):
         TaurusDevTree._defattrfilter = staticmethod(other)
-        
+
     @staticmethod
     def defaultAttrFilter():
-        if not hasattr(TaurusDevTree,'_defattrfilter'): TaurusDevTree._defattrfilter = None
+        if not hasattr(TaurusDevTree, '_defattrfilter'):
+            TaurusDevTree._defattrfilter = None
         return TaurusDevTree._defattrfilter
-    
-    def setAttrFilter(self,other):
+
+    def setAttrFilter(self, other):
         self._attrfilter = other
-        
+
     def getAttrFilter(self):
-        if not isCallable(getattr(self,'_attrfilter',None)): self._attrfilter = None
+        if not isCallable(getattr(self, '_attrfilter', None)):
+            self._attrfilter = None
         return self._attrfilter
-    
-    def matchAttrFilter(self,target):
-        def printf(s): print(s)
-        if self.getAttrFilter() and isCallable(self._attrfilter): return self._attrfilter(target,p=printf)
-        elif TaurusDevTree.defaultAttrFilter() and isCallable(TaurusDevTree._defattrfilter): return TaurusDevTree._defattrfilter(target,p=printf)
-        else: return True
-        
+
+    def matchAttrFilter(self, target):
+        def printf(s):
+            print(s)
+        if self.getAttrFilter() and isCallable(self._attrfilter):
+            return self._attrfilter(target, p=printf)
+        elif TaurusDevTree.defaultAttrFilter() and isCallable(TaurusDevTree._defattrfilter):
+            return TaurusDevTree._defattrfilter(target, p=printf)
+        else:
+            return True
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # TaurusBaseWidget over writing methods 
+    # TaurusBaseWidget over writing methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def sizeHint(self):
@@ -435,116 +495,124 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
         ret = TaurusBaseWidget.getQtDesignerPluginInfo()
         ret['module'] = 'taurus.qt.qtgui.tree'
         ret['group'] = 'Taurus Views'
-        ret['icon'] = ":/designer/listview.png"
+        ret['icon'] = "designer:listview.png"
         return ret
-    
+
     def defineStyle(self):
         self.setWindowTitle('TaurusDevTree')
-        self.setHeaderLabel('Device Browser (right-click on any element to search/show options)')
-        self.setGeometry(Qt.QRect(90,60,256,192))
+        self.setHeaderLabel(
+            'Device Browser (right-click on any element to search/show options)')
+        self.setGeometry(Qt.QRect(90, 60, 256, 192))
         self.actionFindInTree = Qt.QAction(self)
         self.actionFindInTree.setShortcut(Qt.QKeySequence.Find)
-        self.connect(self.actionFindInTree, Qt.SIGNAL("triggered()"), self.findDialog)
+        self.actionFindInTree.triggered[()].connect(self.findDialog)
         #self.connect(self, Qt.SIGNAL("itemClicked"), self.clickedEvent)
-        from taurus.qt.qtgui.table.qdictionary import QDictionaryEditor,QListEditor
+        from taurus.qt.qtgui.table.qdictionary import QDictionaryEditor, QListEditor
         self.ExpertMenu.append(
             ('Edit Model Filters',
-            lambda:QListEditor.main(
-                self._filters,
-                modal=True,
-                title='Edit Model Filters',
-                callback=lambda d:self.loadTree(d)
-                )
-            #lambda:self.loadTree(
+             lambda: QListEditor.main(
+                 self._filters,
+                 modal=True,
+                 title='Edit Model Filters',
+                 callback=lambda d: self.loadTree(d)
+             )
+                # lambda:self.loadTree(
                 #str(Qt.QInputDialog.getText(None,'Set Tree Model','Enter a list of regexp separated by comma:',Qt.QLineEdit.Normal,','.join(str(f) for f in self._filters))[0])
-                #or None)
-            ))
+                # or None)
+             ))
         self.ExpertMenu.append(
             ('Edit Tree',
-            lambda:QDictionaryEditor.main(self.dictionary,modal=True,title='Edit Tree',callback=lambda d:self.setTree(d,clear=True))
-            ))
+             lambda: QDictionaryEditor.main(
+                 self.dictionary, modal=True, title='Edit Tree', callback=lambda d: self.setTree(d, clear=True))
+             ))
         self.ExpertMenu.append(
             ('Expand All',
-            lambda:self.expandAll()
-            ))
+             lambda: self.expandAll()
+             ))
         self.ExpertMenu.append(
             ('Collapse All',
-            lambda: self.collapseNode(ALL=True)
-            ))
+             lambda: self.collapseNode(ALL=True)
+             ))
         self.ExpertMenu.append(
             ('Save Config',
-            lambda:self.saveConfigFile()
-            ))
-        if not getattr(self,'DeviceMenu',None): self.DeviceMenu = {}
+             lambda: self.saveConfigFile()
+             ))
+        if not getattr(self, 'DeviceMenu', None):
+            self.DeviceMenu = {}
         self.DeviceMenu.update({
-            'Show Properties':'showProperties',
-            'Refresh Tree':'refreshTree',
-            })
-        if not getattr(self,'AttributeMenu',None): self.AttributeMenu = []
-        [self.AttributeMenu.append(a) for a in  [
-            ('Add to trends','addToPlot'),
-            ('Remove from trends','removeFromPlot'),
-            ] if a not in self.AttributeMenu]
+            'Show Properties': 'showProperties',
+            'Refresh Tree': 'refreshTree',
+        })
+        if not getattr(self, 'AttributeMenu', None):
+            self.AttributeMenu = []
+        [self.AttributeMenu.append(a) for a in [
+            ('Add to trends', 'addToPlot'),
+            ('Remove from trends', 'removeFromPlot'),
+        ] if a not in self.AttributeMenu]
         try:
             from PyTangoArchiving.widget.history import show_history
             self.debug('Adding show_history from archiving...')
-            self.AttributeMenu.append(('Show History',show_history))
-        except: pass
-            
-    def trace(self,msg):
-        if self.TRACE_ALL or self.getLogLevel() in ('DEBUG',40,):
-            print 'TaurusDevTree.%s: %s'%(self.getLogLevel(),msg) #@TODO: use the taurus logger instead! ~~cpascual 20121121
-        
-    def setTangoHost(self,tango_host=None):
-        self.db = taurus.Database(tango_host)
-        
-    #model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, 
-                                #TaurusBaseWidget.setModel, 
-                                #TaurusBaseWidget.resetModel)
-        
+            self.AttributeMenu.append(('Show History', show_history))
+        except:
+            pass
+
+    def trace(self, msg):
+        if self.TRACE_ALL or self.getLogLevel() in ('DEBUG', 40,):
+            # @TODO: use the taurus logger instead! ~~cpascual 20121121
+            print 'TaurusDevTree.%s: %s' % (self.getLogLevel(), msg)
+
+    def setTangoHost(self, tango_host=None):
+        self.db = taurus.Authority(tango_host)
+
+    # model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
+        # TaurusBaseWidget.setModel,
+        # TaurusBaseWidget.resetModel)
+
     def getModel(self):
-        return self._filters    
-    
+        return self._filters
+
     def getModelClass(self):
-        return list #taurus.core.taurusdatabase.TaurusDatabase
-        
-    def setModel(self,model):
-        TaurusBaseWidget.setModel(self,model)
-    
-    def setModelCheck(self,model):
+        return list  # taurus.core.taurusauthority.TaurusAuthority
+
+    def setModel(self, model):
+        TaurusBaseWidget.setModel(self, model)
+
+    def setModelCheck(self, model):
         # Called from TaurusBaseWidget.setModel()
-        self.trace('setModelCheck(%s)'%str(model)[:80])
+        self.trace('setModelCheck(%s)' % str(model)[:80])
         self.loadTree(model)
-        
-    @Qt.pyqtSignature("addModels(QStringList)")
+
+    @Qt.pyqtSlot('QStringList')
     def addModels(self, modelNames):
         '''Adds models to the existing ones:
         :param modelNames:  (sequence<str>) the names of the models to be added
         .. seealso:: :meth:`removeModels`
         '''
-        self.trace('In addModels(%s)'%str(modelNames)[:80])
+        self.trace('In addModels(%s)' % str(modelNames)[:80])
         modelNames = split_model_list(modelNames)
-        self.setTree(self.getTangoDict(modelNames),clear=False)
+        self.setTree(self.getTangoDict(modelNames), clear=False)
         if isSequence(modelNames):
-            self._filters = sorted(set(split_model_list(self._filters)+modelNames))
+            self._filters = sorted(
+                set(split_model_list(self._filters) + modelNames))
         elif isMap(modelNames):
-            if isMap(self._filters): self._filters.update(modelNames)
-            else: self._filters = modelNames
-        
-    ############################################################################
+            if isMap(self._filters):
+                self._filters.update(modelNames)
+            else:
+                self._filters = modelNames
+
+    ##########################################################################
     # Loading/Cleaning the tree
 
-    #@Qt.pyqtSignature("loadTree(QString)")
-    #def loadTree(self,filters,clear=False):
+    # def loadTree(self,filters,clear=False):
         #'''
-        #This method show a list of instances and devices depending on the given servers in QTProperty or in another widget, 
-        #this method can be used to connect TauDevTree with another widget such as LineEdit.
+        # This method show a list of instances and devices depending on the given servers in QTProperty or in another widget,
+        # this method can be used to connect TauDevTree with another widget such as LineEdit.
         #'''
         #self.trace('In loadTree(%s)'%str(filters))
         #if clear: self.setWindowTitle('TaurusDevTree:%s'%str(filters))
-        #self.setTree(self.getTangoDict(filters),clear=clear,alias=False)
-    
-    def loadTree(self,filters):
+        # self.setTree(self.getTangoDict(filters),clear=clear,alias=False)
+
+    def loadTree(self, filters):
         try:
             if isString(filters):
                 try:
@@ -552,99 +620,121 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
                     filters = dict(filters)
                 except:
                     filters = split_model_list(filters)
-            self.trace('loadTree(%s)'%(filters))
-            assert isMap(filters) or isSequence(filters), "Filters have to be map, string or list type!"
-            properties.set_property(self,'Filters',filters) #self._filters = filters
+            self.trace('loadTree(%s)' % (filters))
+            assert isMap(filters) or isSequence(
+                filters), "Filters have to be map, string or list type!"
+            # self._filters = filters
+            properties.set_property(self, 'Filters', filters)
             if isSequence(filters):
-                self.setWindowTitle('TaurusDevTree:%s'%str(filters))
+                self.setWindowTitle('TaurusDevTree:%s' % str(filters))
                 dct = self.getTangoDict(filters)
-            else: #if isMap(filters):
-                self.setWindowTitle('TaurusDevTree:%s'%','.join(filters.keys()))
+            else:  # if isMap(filters):
+                self.setWindowTitle('TaurusDevTree:%s' %
+                                    ','.join(filters.keys()))
+
                 def expand_dict(d):
-                    return [x for v in d.values() for x in (expand_dict(v) if hasattr(v,'values') else (v,))] 
-                targets = [t.upper() for t in get_matching_devices(['*%s*'%f if '*' not in f else f for f in expand_dict(filters)])]
+                    return [x for v in d.values() for x in (expand_dict(v) if hasattr(v, 'values') else (v,))]
+                targets = [t.upper() for t in get_matching_devices(
+                    ['*%s*' % f if '*' not in f else f for f in expand_dict(filters)])]
+
                 def get_devs(f):
-                    return dict.fromkeys(t for t in targets if matchCl(f,t))
+                    return dict.fromkeys(t for t in targets if matchCl(f, t))
+
                 def expand_filter(f):
-                    return dict((k,expand_filter(v) if hasattr(v,'values') else get_devs(v)) for k,v in f.items() if v)
+                    return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in f.items() if v)
                 dct = expand_filter(filters)
-            #self.Loader.next([self.setTree,dct,True])
-            self.setTree(dct,clear=True)
+            # self.Loader.next([self.setTree,dct,True])
+            self.setTree(dct, clear=True)
         except:
-            self.warning('TaurusDeviceTree.loadTree(%s):\n%s'%(filters,traceback.format_exc()))
-        
-    def setTree(self,diction,clear=False):
+            self.warning('TaurusDeviceTree.loadTree(%s):\n%s' %
+                         (filters, traceback.format_exc()))
+
+    def setTree(self, diction, clear=False):
         """
         Initializes the tree from a dictionary {'Node0.0':{'Node1.0':None,'Node1.1':None}}
         """
         K = len(str(dict(diction)))
-        self.trace('In setTree(%d) ...'%K)
+        self.trace('In setTree(%d) ...' % K)
         self.debug(diction)
-        if diction is None: return
-        if clear or self.dictionary: 
-            if not clear: diction = djoin(diction,self.dictionary) #Merging new and old models
+        if diction is None:
+            return
+        if clear or self.dictionary:
+            if not clear:
+                # Merging new and old models
+                diction = djoin(diction, self.dictionary)
             self.clear()
         self.dictionary = diction
-        if len(diction): 
-            self.setNodeTree(self,diction,alias=(self.getShowAlias() or K<self.getMaxDevices()*20))
-            #Auto-Expand caused problems when loading filters from QSettings
-            if 0<len(self.item_list)<self.getMaxDevices(): self.expandAll(queue=False)
-        
-    def setNodeTree(self,parent,diction,alias=False):
+        if len(diction):
+            self.setNodeTree(self, diction, alias=(
+                self.getShowAlias() or K < self.getMaxDevices() * 20))
+            # Auto-Expand caused problems when loading filters from QSettings
+            if 0 < len(self.item_list) < self.getMaxDevices():
+                self.expandAll(queue=False)
+
+    def setNodeTree(self, parent, diction, alias=False):
         """
         It has parent as argument to allow itself to be recursive
         Initializes the node tree from a dictionary {'Node0.0':{'Node1.0':None,'Node1.1':None}}
         """
-        self.debug('In setNodeTree(%d,alias=%s) ...'%(len(diction),alias))
-        if not hasattr(diction,'keys'): diction = dict.fromkeys(diction)
+        self.debug('In setNodeTree(%d,alias=%s) ...' % (len(diction), alias))
+        if not hasattr(diction, 'keys'):
+            diction = dict.fromkeys(diction)
         for node in sorted(diction.keys()):
-            assert int(self.index)<10000000000,'TooManyIterations!'
+            assert int(self.index) < 10000000000, 'TooManyIterations!'
             self.index = self.index + 1
-            dev_alias = alias and str(node).count('/')==2 and get_alias_for_device(node)
-            text = '%s (%s)'%(node,dev_alias) if dev_alias else node
+            dev_alias = alias and str(node).count(
+                '/') == 2 and get_alias_for_device(node)
+            text = '%s (%s)' % (node, dev_alias) if dev_alias else node
             if diction[node] and any(diction[node]):
-                item = self.createItem(parent,node,text)
-                self.setNodeTree(item,diction[node],alias)
+                item = self.createItem(parent, node, text)
+                self.setNodeTree(item, diction[node], alias)
             else:
-                item = self.createItem(parent,node,text)
-        
+                item = self.createItem(parent, node, text)
+
     def clear(self):
-        while not self.Expander.getQueue().empty(): self.Expander.getQueue().get()
+        while not self.Expander.getQueue().empty():
+            self.Expander.getQueue().get()
         self.item_index.clear()
-        while self.item_list: self.item_list.pop()
+        while self.item_list:
+            self.item_list.pop()
         Qt.QTreeWidget.clear(self)
-        
+
     def refreshTree(self):
         self.loadTree(self._filters)
-        self.emit(Qt.SIGNAL("refreshTree"))
+        self.refreshTree.emit()
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    ## @name Methods for building server/devices/attributes tree
+    # @name Methods for building server/devices/attributes tree
     # @{
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    def getTangoDict(self,filters):
-        self.trace('In TaurusDevTree.getTangoDict(%s(%s))'%(type(filters),str(filters)[:80]))
-        if filters is None: return
+
+    def getTangoDict(self, filters):
+        self.trace('In TaurusDevTree.getTangoDict(%s(%s))' %
+                   (type(filters), str(filters)[:80]))
+        if filters is None:
+            return
         result = {}
         filters = split_model_list(filters)
         targets = get_matching_devices(filters)
         targets = [t.upper() for t in targets]
         domains = set(t.split('/')[0] for t in targets)
         for d in domains:
-            families = set(t.split('/')[1] for t in targets if t.startswith('%s/'%d))
-            result[d] = dict((f,dict.fromkeys(t for t in targets if t.startswith('%s/%s/'%(d,f)))) for f in families)
+            families = set(t.split('/')[1]
+                           for t in targets if t.startswith('%s/' % d))
+            result[d] = dict((f, dict.fromkeys(
+                t for t in targets if t.startswith('%s/%s/' % (d, f)))) for f in families)
         return result
-    
-    def addAttrToDev(self,my_device,expert=False,allow_types=None):
+
+    def addAttrToDev(self, my_device, expert=False, allow_types=None):
         """ This command returns the list of attributes of a given device applying display level and type filters.
         @argin expert If False only PyTango.DispLevel.OPERATOR attributes are displayed
         @argin allow_types Only those types included in the list will be displayed (e.g. may be restricted to numeric types only)
         """
-        numeric_types = [PyTango.DevDouble,PyTango.DevFloat,PyTango.DevLong,PyTango.DevLong64,PyTango.DevULong,PyTango.DevShort,PyTango.DevUShort,PyTango.DevBoolean,PyTango.DevState]
-        allow_types = allow_types or [PyTango.DevString]+numeric_types
+        numeric_types = [PyTango.DevDouble, PyTango.DevFloat, PyTango.DevLong, PyTango.DevLong64,
+                         PyTango.DevULong, PyTango.DevShort, PyTango.DevUShort, PyTango.DevBoolean, PyTango.DevState]
+        allow_types = allow_types or [PyTango.DevString] + numeric_types
         dct = {}
-        self.trace('In addAttrToDev(%s)'%my_device)
+        self.trace('In addAttrToDev(%s)' % my_device)
         try:
             proxy = PyTango.DeviceProxy(my_device)
             timeout = proxy.get_timeout_millis()
@@ -653,27 +743,33 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
             list_attr = proxy.attribute_list_query()
             proxy.set_timeout_millis(timeout)
 
-            for aname,my_attr in sorted([(a.name,a) for a in list_attr]):
-                if allow_types and my_attr.data_type not in allow_types: continue
-                if not expert and my_attr.disp_level==PyTango.DispLevel.EXPERT: continue
-                label = aname==my_attr.label and aname.lower() or "%s (%s)"%(aname.lower(),my_attr.label)
-                dct[str(my_device).lower()+'/'+label] = 0
-        except PyTango.DevFailed,e:
-            self.warning('addAttrToDev(%s): %s'%(my_device,str(e)))
-            qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical,'%s Error'%my_device,'%s not available'%my_device,Qt.QMessageBox.Ok,self)
+            for aname, my_attr in sorted([(a.name, a) for a in list_attr]):
+                if allow_types and my_attr.data_type not in allow_types:
+                    continue
+                if not expert and my_attr.disp_level == PyTango.DispLevel.EXPERT:
+                    continue
+                label = aname == my_attr.label and aname.lower(
+                ) or "%s (%s)" % (aname.lower(), my_attr.label)
+                dct[str(my_device).lower() + '/' + label] = 0
+        except PyTango.DevFailed, e:
+            self.warning('addAttrToDev(%s): %s' % (my_device, str(e)))
+            qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' %
+                                  my_device, '%s not available' % my_device, Qt.QMessageBox.Ok, self)
             qmsg.show()
-        except Exception,e:
-            self.warning('addAttrToDev(%s): %s'%(my_device,str(e)))
-            qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical,'%s Error'%my_device,str(e),Qt.QMessageBox.Ok,self)
+        except Exception, e:
+            self.warning('addAttrToDev(%s): %s' % (my_device, str(e)))
+            qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' %
+                                  my_device, str(e), Qt.QMessageBox.Ok, self)
             qmsg.show()
         return dct
-            
+
     def addAttrToNode(self, node=None, full=False):
         node = node or self.currentItem()
         dev = self.getNodeDeviceName(node)
-        self.trace('In addAttrToNode(%s)'%dev)
+        self.trace('In addAttrToNode(%s)' % dev)
         attrs = self.addAttrToDev(dev)
-        children = [str(node.child(i).text(0)).lower() for i in range(node.childCount())]
+        children = [str(node.child(i).text(0)).lower()
+                    for i in range(node.childCount())]
         for aname in sorted(attrs):
             tag = aname.rsplit('/')[-1]
             if tag.lower() in children:
@@ -681,213 +777,249 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
             elif not full and not self.matchAttrFilter(aname):
                 continue
             else:
-                natt = self.createItem(node,value=aname,text=tag)
+                natt = self.createItem(node, value=aname, text=tag)
                 natt.draggable = aname.split()[0].strip()
                 natt.isAttribute = True
                 natt.DeviceName = dev
                 icon = self.getNodeIcon(natt)
-                if icon: natt.setIcon(0,icon) 
-                alias = getattr(node,'AttributeAlias',{}) #it gets all aliases for this device attributes
-                if alias: 
-                    self.trace('Got aliases for %s: %s' % (aname,alias))
-                    [setattr(natt,'AttributeAlias',v) for k,v in alias.items() if k in aname.lower()]
-                else: 
+                if icon:
+                    natt.setIcon(0, icon)
+                # it gets all aliases for this device attributes
+                alias = getattr(node, 'AttributeAlias', {})
+                if alias:
+                    self.trace('Got aliases for %s: %s' % (aname, alias))
+                    [setattr(natt, 'AttributeAlias', v)
+                     for k, v in alias.items() if k in aname.lower()]
+                else:
                     natt.AttributeAlias = aname.split()[0].strip()
         node.setExpanded(True)
         return
-                        
+
     ###########################################################################
     # Node getters
-    
-    def getNode(self,target=None):
+
+    def getNode(self, target=None):
         """ Gets currrent node or node by name or by regexp """
-        if target is None: 
+        if target is None:
             return self.currentItem()
-        else: 
-            nodes = self.getMatchingNodes(target,1)
+        else:
+            nodes = self.getMatchingNodes(target, 1)
             if not nodes:
                 return None
             else:
                 return nodes[0]
         return
-        
-    def getNodeByName(self,key):
+
+    def getNodeByName(self, key):
         return self.item_index[key]
-    
+
     def getNodeList(self):
         return self.item_index.keys()
 
-    def getMatchingNodes(self,regexp,limit=0, all=False, exclude=None):
+    def getMatchingNodes(self, regexp, limit=0, all=False, exclude=None):
         """ It returns all nodes matching the given expression. """
-        result,regexp = [],str(regexp).lower()
-        exclude = exclude or []        
-        self.trace('In TauDevTree.getMatchingNodes(%s,%s,%s,%s)'%(regexp,limit,all,exclude))
+        result, regexp = [], str(regexp).lower()
+        exclude = exclude or []
+        self.trace('In TauDevTree.getMatchingNodes(%s,%s,%s,%s)' %
+                   (regexp, limit, all, exclude))
         if not all:
-            node = self.item_index.get(regexp,None)
+            node = self.item_index.get(regexp, None)
             if node is not None:
                 return [node]
         regexp = re.compile(extend_regexp(regexp))
-        for k,node in self.item_index.iteritems():
-            nname = self.getNodeText(node,full=True).lower()
+        for k, node in self.item_index.iteritems():
+            nname = self.getNodeText(node, full=True).lower()
             if (regexp.match(k) or regexp.match(nname)) and \
-                (not exclude or not any(re.match(x.lower(),y) for x in exclude for y in (k.lower(),nname))):
+                    (not exclude or not any(re.match(x.lower(), y) for x in exclude for y in (k.lower(), nname))):
                 result.append(node)
-                if not all and len(result)==1: break
-                if limit and len(result)>=limit: break
+                if not all and len(result) == 1:
+                    break
+                if limit and len(result) >= limit:
+                    break
         return result
-        
+
     def getSelectedNodes(self):
         return self.selectedItems()
-    
+
     def getAllNodes(self):
         """ Returns a list with all node objects. """
-        def get_child_nodes(dct,node,fun=None):
-            if fun: fun(node)
-            dct.update([(str(node.text(0)),node)])
+        def get_child_nodes(dct, node, fun=None):
+            if fun:
+                fun(node)
+            dct.update([(str(node.text(0)), node)])
             for j in range(node.childCount()):
-                get_child_nodes(dct,node.child(j))
+                get_child_nodes(dct, node.child(j))
             return dct
         dct = {}
         for i in range(self.topLevelItemCount()):
-            get_child_nodes(dct,self.topLevelItem(i))
-        return dct 
+            get_child_nodes(dct, self.topLevelItem(i))
+        return dct
 
     def unpackChildren(self):
         """ removes all nodes from the tree and returns them in a list, used for resorting """
         allChildren = []
         nodes = self.getAllNodes().values()
-    
+
         for node in nodes:
             allChildren.extend(node.takeChildren())
-        while self.topLevelItemCount(): 
+        while self.topLevelItemCount():
             allChildren.append(self.takeTopLevelItem(0))
-        return allChildren    
-    
-    ## @}
-    ########################################################################################################################
-            
+        return allChildren
+
+    # @}
+    ##########################################################################
+
     ###########################################################################
     # Expand/Collapse/Search nodes
-    
-    def collapseNode(self,ALL=False,filters='',fun=None):
+
+    def collapseNode(self, ALL=False, filters='', fun=None):
         """ Collapses the whole tree or from a given node.
         @argin ALL tells whether to collapse from current item or the whole tree
         @argin filters Allows to set a list of nodes to not be filtered
-        
+
         """
         filters = str(filters).lower()
         found = ''
-        self.debug( 'In TaurusTree.collapseAll(%s)'%filters)
+        self.debug('In TaurusTree.collapseAll(%s)' % filters)
         todelete = []
+
         def expand_child_nodes(node):
             result = int(bool(filters))
-            if fun: fun(node)
-            if not node: return ''
+            if fun:
+                fun(node)
+            if not node:
+                return ''
             for j in range(node.childCount()):
                 child = node.child(j)
                 result = expand_child_nodes(child)
-                if filters and re.search(filters,str(child.text(0)).lower()):
-                    self.debug( 'In TaurusTree.collapseAll(%s): %s matches!'%(filters,str(child.text(0)).lower()))
+                if filters and re.search(filters, str(child.text(0)).lower()):
+                    self.debug('In TaurusTree.collapseAll(%s): %s matches!' % (
+                        filters, str(child.text(0)).lower()))
                     result = True
                 elif not result:
                     child.setExpanded(False)
-                aname = '/'.join(['[0-9a-zA-Z\-\_]+']*4) #When collapsing all attribute lists are cleaned up
-                if re.match(aname,str(child.text(0))):
-                    todelete.append((node,child))
-            if not result: node.setExpanded(False)
+                # When collapsing all attribute lists are cleaned up
+                aname = '/'.join(['[0-9a-zA-Z\-\_]+'] * 4)
+                if re.match(aname, str(child.text(0))):
+                    todelete.append((node, child))
+            if not result:
+                node.setExpanded(False)
             return result
         if ALL:
             for i in range(self.topLevelItemCount()):
                 found = expand_child_nodes(self.topLevelItem(i)) or found
-        else: found = expand_child_nodes(self.currentItem()) or found
-        for node,child in todelete: #Pruning attribute nodes
+        else:
+            found = expand_child_nodes(self.currentItem()) or found
+        for node, child in todelete:  # Pruning attribute nodes
             node.removeChild(child)
             del child
         return found
 
     ###########################################################################
     # New expand/search methods
-            
-    #@Qt.pyqtSignature("expandNode")
-    def expandNode(self,node=None,expand=True):
+
+    def expandNode(self, node=None, expand=True):
         """ Needed to do threaded expansion of the tree """
-        if node is None: node = self.getNode()
-        if isinstance(node,(basestring,Qt.QString)): name,node = str(node),self.getNode(node)
-        else: name = self.getNodeText(node)
+        if node is None:
+            node = self.getNode()
+        if isinstance(node, (basestring, Qt.QString)):
+            name, node = str(node), self.getNode(node)
+        else:
+            name = self.getNodeText(node)
         node.setExpanded(expand)
         return expand
-        
-    def expandAll(self,queue=True):
-        self.findInTree('*',select=False,queue=queue)
-        
+
+    def expandAll(self, queue=True):
+        self.findInTree('*', select=False, queue=queue)
+
     def findDialog(self):
-        self.findInTree(str(Qt.QInputDialog.getText(self,'Search ...','Write a part of the name',Qt.QLineEdit.Normal)[0]))
-        
-    @Qt.pyqtSignature("findInTree(const QString &)")
-    def findInTree(self,regexp,collapseAll=None,exclude=None,select=True,queue=True):
-        self.trace( 'In TauTree.findInTree(%s)'%regexp)
-        if collapseAll is None: collapseAll = self.collapsing_search
+        self.findInTree(str(Qt.QInputDialog.getText(
+            self, 'Search ...', 'Write a part of the name', Qt.QLineEdit.Normal)[0]))
+
+    @Qt.pyqtSlot('QString')
+    def findInTree(self, regexp, collapseAll=None, exclude=None, select=True, queue=True):
+        self.trace('In TauTree.findInTree(%s)' % regexp)
+        if collapseAll is None:
+            collapseAll = self.collapsing_search
         regexp = str(regexp).lower().strip()
-        exclude = (lambda x: x if hasattr(x,'__iter__') else [x])(exclude or self.excludeFromSearch or [])
-        if not regexp: return
+        exclude = (lambda x: x if hasattr(x, '__iter__') else [x])(
+            exclude or self.excludeFromSearch or [])
+        if not regexp:
+            return
         try:
             t0 = time.time()
-            nodes = self.getMatchingNodes(regexp,all=True,exclude=exclude)
-            if len(nodes)>150:
-                v = Qt.QMessageBox.warning(None,'Device Tree Search',
-                    'Your search matches too many devices (%d) and may slow down the application.\nDo you want to continue?'%len(nodes),
-                    Qt.QMessageBox.Ok|Qt.QMessageBox.Cancel)
+            nodes = self.getMatchingNodes(regexp, all=True, exclude=exclude)
+            if len(nodes) > 150:
+                v = Qt.QMessageBox.warning(None, 'Device Tree Search',
+                                           'Your search matches too many devices (%d) and may slow down the application.\nDo you want to continue?' % len(
+                                               nodes),
+                                           Qt.QMessageBox.Ok | Qt.QMessageBox.Cancel)
                 if v == Qt.QMessageBox.Cancel:
                     self.debug('Search cancelled by user.')
                     return
             if nodes:
-                #It's good to have first node matched to be selected fast
-                if select: 
+                # It's good to have first node matched to be selected fast
+                if select:
                     nodes[0].setSelected(True)
                     self.setCurrentItem(nodes[0])
-                    self.deviceSelected(self.getNodeDeviceName(nodes[0])) #Searches must not trigger events!
-                    self.debug('The selected node is %s'%self.getNodeText(nodes[0]))
-                #Then proceed to expand/close the rest of nodes
-                parents = set(parent for node in nodes for parent in self.getNodePath(node) if parent)
+                    # Searches must not trigger events!
+                    self.deviceSelected(self.getNodeDeviceName(nodes[0]))
+                    self.debug('The selected node is %s' %
+                               self.getNodeText(nodes[0]))
+                # Then proceed to expand/close the rest of nodes
+                parents = set(
+                    parent for node in nodes for parent in self.getNodePath(node) if parent)
                 for item in self.item_list:
-                    matched,expanded = item in parents,item.isExpanded()
+                    matched, expanded = item in parents, item.isExpanded()
                     if (matched and not expanded):
-                        if queue: self.Expander.getQueue().put((item,True))
-                        else: item.setExpanded(True)
+                        if queue:
+                            self.Expander.getQueue().put((item, True))
+                        else:
+                            item.setExpanded(True)
                     elif (not matched and expanded and self.collapsing_search):
-                        if queue: self.Expander.getQueue().put((item,False))
-                        else: item.setExpanded(False)
+                        if queue:
+                            self.Expander.getQueue().put((item, False))
+                        else:
+                            item.setExpanded(False)
                 if select:
-                    self.scrollTo(self.indexFromItem(nodes[0]),Qt.QAbstractItemView.PositionAtTop)#Center)
-                self.debug('\tfindInTree(%s): %d nodes found in %f s' %(regexp,len(nodes),time.time()-t0))
+                    self.scrollTo(self.indexFromItem(
+                        nodes[0]), Qt.QAbstractItemView.PositionAtTop)  # Center)
+                self.debug('\tfindInTree(%s): %d nodes found in %f s' %
+                           (regexp, len(nodes), time.time() - t0))
             else:
-                if collapseAll: 
-                    if queue: [self.Expander.getQueue().put((item,False)) for item in self.item_list if item.isExpanded()]
-                    else: [item.setExpanded(False) for item in self.item_list if item.isExpanded()]
-                self.debug( 'findInTree(%s): Node not found'%(regexp))
-            if queue: self.Expander.next()
-        except: 
-            self.warning( 'findInTree(%s): failed'%(regexp))
+                if collapseAll:
+                    if queue:
+                        [self.Expander.getQueue().put((item, False))
+                         for item in self.item_list if item.isExpanded()]
+                    else:
+                        [item.setExpanded(False)
+                         for item in self.item_list if item.isExpanded()]
+                self.debug('findInTree(%s): Node not found' % (regexp))
+            if queue:
+                self.Expander.next()
+        except:
+            self.warning('findInTree(%s): failed' % (regexp))
             self.error(traceback.format_exc())
-            
-    def sortCustom(self,order):
+
+    def sortCustom(self, order):
         assert order and len(order), 'sortCustom(order) must not be empty'
         allChildren = {}
-        while self.topLevelItemCount(): 
+        while self.topLevelItemCount():
             it = self.takeTopLevelItem(0)
-            allChildren[str(it.text(0))]=it
-
-        sorter = lambda k,ks=[re.compile(c) for c in order]: str((i for i,r in enumerate(ks) if r.match(k.lower())).next())+str(k)
-        for c,it in sorted(allChildren.items(),key=lambda k:sorter(k[0])):
-            self.debug( 'tree.sortCustom(%s): %s inserted at %d' % (order,it.text(0),self.topLevelItemCount()))
-            self.insertTopLevelItem(self.topLevelItemCount(),it)
+            allChildren[str(it.text(0))] = it
+
+        sorter = lambda k, ks=[re.compile(c) for c in order]: str(
+            (i for i, r in enumerate(ks) if r.match(k.lower())).next()) + str(k)
+        for c, it in sorted(allChildren.items(), key=lambda k: sorter(k[0])):
+            self.debug('tree.sortCustom(%s): %s inserted at %d' %
+                       (order, it.text(0), self.topLevelItemCount()))
+            self.insertTopLevelItem(self.topLevelItemCount(), it)
         return
 
     ###########################################################################
     # Update node colors
-    
-    #@Qt.pyqtSignature("setIcons")
-    def setIcons(self,dct={},root_name=None,regexps=True):
+
+    def setIcons(self, dct={}, root_name=None, regexps=True):
         '''
         This method change the icons depending of the status of the devices
         Dict is a dictionary with name of device and colors such as {name_device:color,name_device2:color2}
@@ -895,119 +1027,129 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
         '''
         #secs = time.time()
         #ID = int(100*random.random())
-        state2color = lambda state: Qt.QColor(DEVICE_STATE_PALETTE.number(state))
+        state2color = lambda state: Qt.QColor(
+            DEVICE_STATE_PALETTE.number(state))
         #quality2color = lambda attr: Qt.QColor(ATTRIBUTE_QUALITY_PALETTE.number(quality))
 
-        def update_node(node,key,dct):
-            if hasattr(node,'CustomForeground'):
-                node.setForeground(0,Qt.QBrush(Qt.QColor(node.CustomForeground)))
-            if hasattr(node,'CustomBackground'):
-                node.setBackground(0,Qt.QBrush(Qt.QColor(node.CustomBackground)))            
-            elif hasattr(node,'StateBackground'):
-                node.setBackground(0,Qt.QBrush(state2color(dct[key])))
-            if hasattr(node,'CustomIcon'):
-                node.setIcon(0,Qt.QIcon(node.CustomIcon))
+        def update_node(node, key, dct):
+            if hasattr(node, 'CustomForeground'):
+                node.setForeground(0, Qt.QBrush(
+                    Qt.QColor(node.CustomForeground)))
+            if hasattr(node, 'CustomBackground'):
+                node.setBackground(0, Qt.QBrush(
+                    Qt.QColor(node.CustomBackground)))
+            elif hasattr(node, 'StateBackground'):
+                node.setBackground(0, Qt.QBrush(state2color(dct[key])))
+            if hasattr(node, 'CustomIcon'):
+                node.setIcon(0, Qt.QIcon(node.CustomIcon))
             else:
                 #key = str(node.text(0)).split(' ')[0]
-                if key.count('/')==2:
-                    self.setStateIcon(node,dct and dct[key] or '')
+                if key.count('/') == 2:
+                    self.setStateIcon(node, dct and dct[key] or '')
             return
 
-        if not isinstance(dct,dict): 
-            dct = dict.fromkeys(dct,'')    
+        if not isinstance(dct, dict):
+            dct = dict.fromkeys(dct, '')
         nodes = self.getAllNodes()
-        for name,node in nodes.iteritems():
+        for name, node in nodes.iteritems():
             name = str(name).split()[0]
-            if node.isHidden(): continue
+            if node.isHidden():
+                continue
             if regexps:
-                matches = [v for k,v in dct.items() if re.match(k.lower(),name.lower())]
-                if matches: 
-                    update_node(node,name,{name:matches[0]})
+                matches = [v for k, v in dct.items() if re.match(
+                    k.lower(), name.lower())]
+                if matches:
+                    update_node(node, name, {name: matches[0]})
             elif name in dct or not dct:
-                update_node(node,name,dct or {name:''})
+                update_node(node, name, dct or {name: ''})
         return
 
-    def setStateIcon(self,child,color):
-        if icons_dev_tree is None: 
+    def setStateIcon(self, child, color):
+        if icons_dev_tree is None:
             self.debug('In setStateIcon(...): Icons for states not available!')
             return
-        if color=="#00ff00" or color in 'ON,OPEN,EXTRACT':
+        if color == "#00ff00" or color in 'ON,OPEN,EXTRACT':
             icon = Qt.QIcon(":/ICON_GREEN")
-            child.setIcon(0,icon)
-        elif color=="#ff0000" or color in 'OFF,FAULT':
+            child.setIcon(0, icon)
+        elif color == "#ff0000" or color in 'OFF,FAULT':
             icon = Qt.QIcon(":/ICON_RED")
-            child.setIcon(0,icon)
-        elif color=="#ff8c00" or color in 'ALARM':
+            child.setIcon(0, icon)
+        elif color == "#ff8c00" or color in 'ALARM':
             icon = Qt.QIcon(":/ICON_ORANGE")
-            child.setIcon(0,icon)
-        elif color=="#ffffff" or color in 'CLOSE,INSERT':
+            child.setIcon(0, icon)
+        elif color == "#ffffff" or color in 'CLOSE,INSERT':
             icon = Qt.QIcon(":/ICON_WHITE")
-            child.setIcon(0,icon)
-        elif color=="#80a0ff" or color in 'MOVING,RUNNING':
+            child.setIcon(0, icon)
+        elif color == "#80a0ff" or color in 'MOVING,RUNNING':
             icon = Qt.QIcon(":/ICON_BLUE")
-            child.setIcon(0,icon)
-        elif color=="#ffff00" or color in 'STANDBY':
+            child.setIcon(0, icon)
+        elif color == "#ffff00" or color in 'STANDBY':
             icon = Qt.QIcon(":/ICON_YELLOW")
-            child.setIcon(0,icon)
-        elif color=="#cccc7a" or color in 'INIT':
+            child.setIcon(0, icon)
+        elif color == "#cccc7a" or color in 'INIT':
             icon = Qt.QIcon(":/ICON_BRAWN")
-            child.setIcon(0,icon)
-        elif color=="#ff00ff" or color in 'DISABLE':
+            child.setIcon(0, icon)
+        elif color == "#ff00ff" or color in 'DISABLE':
             icon = Qt.QIcon(":/ICON_PINK")
-            child.setIcon(0,icon)
-        elif color=="#808080f" or color in 'UNKNOWN':
+            child.setIcon(0, icon)
+        elif color == "#808080f" or color in 'UNKNOWN':
             icon = Qt.QIcon(":/ICON_GREY")
-            child.setIcon(0,icon)
+            child.setIcon(0, icon)
         else:
             icon = Qt.QIcon(":/ICON_WHITE")
-            child.setIcon(0,icon)        
-        
-    ############################################################################
+            child.setIcon(0, icon)
+
+    ##########################################################################
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Event methods
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    def deviceClicked(self,item,column):
-        self.trace("In TaurusDevTree.deviceClicked(%s)"%item.text(column))
+    def deviceClicked(self, item, column):
+        self.trace("In TaurusDevTree.deviceClicked(%s)" % item.text(column))
         self.deviceSelected(self.getNodeDeviceName())
-        
-    def deviceSelected(self,device_name=''):
+
+    def deviceSelected(self, device_name=''):
         '''QSIGNAL: this method is used to emit deviceSelected(QString) signal'''
-        self.trace("In TaurusDevTree.deviceSelected(%s)"%device_name)
+        self.trace("In TaurusDevTree.deviceSelected(%s)" % device_name)
         try:
             #item = self.currentItem()
-            device_name = device_name or self.getNodeDeviceName()#item.text(0)
-            if str(device_name).count('/')!=2: return
-            #Signal
-            self.trace('TaurusTree emit deviceSelected(%s) signal ...'%device_name)
-            self.emit(Qt.SIGNAL("deviceSelected(QString)"), Qt.QString(device_name))
+            device_name = device_name or self.getNodeDeviceName()  # item.text(0)
+            if str(device_name).count('/') != 2:
+                return
+            # Signal
+            self.trace('TaurusTree emit deviceSelected(%s) signal ...' %
+                       device_name)
+            self.deviceSelected.emit(Qt.QString(device_name))
         except:
             self.error(traceback.format_exc())
             pass
-            
+
     def getModelMimeData(self):
-        '''Returns a MimeData object containing the model data. The default implementation 
+        '''Returns a MimeData object containing the model data. The default implementation
         fills the `TAURUS_MODEL_MIME_TYPE`. If the widget's Model class is
         Attribute or Device, it also fills `TAURUS_ATTR_MIME_TYPE` or
         `TAURUS_DEV_MIME_TYPE`, respectively
         '''
         mimeData = Qt.QMimeData()
-        node = self.currentItem() 
+        node = self.currentItem()
         draggable = self.getNodeDraggable(node)
         if draggable:
-            slashes = draggable.count('/')-draggable.count(':')
-            #mimeData.setData('application/x-qabstractitemmodeldatalist',draggable)
-            if slashes==3: mimeData.setData(TAURUS_ATTR_MIME_TYPE, draggable)
-            elif slashes==2: mimeData.setData(TAURUS_DEV_MIME_TYPE, draggable)
-            else: mimeData.setData(TAURUS_MODEL_MIME_TYPE, draggable)
+            slashes = draggable.count('/') - draggable.count(':')
+            # mimeData.setData('application/x-qabstractitemmodeldatalist',draggable)
+            if slashes == 3:
+                mimeData.setData(TAURUS_ATTR_MIME_TYPE, draggable)
+            elif slashes == 2:
+                mimeData.setData(TAURUS_DEV_MIME_TYPE, draggable)
+            else:
+                mimeData.setData(TAURUS_MODEL_MIME_TYPE, draggable)
         return mimeData
-            
-    def checkHeaderClicked(self,position):
+
+    def checkHeaderClicked(self, position):
         if self.itemAt(position) is self.headerItem():
             node = self.headerItem()
-            self.showNodeContextMenu(node,event)
-            #node.ContextMenu = ['Search ...']            
-        
+            self.showNodeContextMenu(node, event)
+            #node.ContextMenu = ['Search ...']
+
     def mouseMoveEvent(self, event):
         '''
         copied from TaurusBaseWidget to provide drag events
@@ -1016,196 +1158,219 @@ class TaurusDevTree(TaurusTreeNodeContainer,Qt.QTreeWidget, TaurusBaseWidget):
         self.debug('In TaurusDevTree.mouseMoveEvent')
         if not self._dragEnabled or not event.buttons() & Qt.Qt.LeftButton:
             return self.getQtClass().mouseMoveEvent(self, event)
-        if (event.pos() - self.dragStartPosition).manhattanLength()  < Qt.QApplication.startDragDistance():
+        if (event.pos() - self.dragStartPosition).manhattanLength() < Qt.QApplication.startDragDistance():
             return self.getQtClass().mouseMoveEvent(self, event)
-        #The mouseMoveEvent of QTreeWidget do not allow drag, commented
-        ret = None #self.getQtClass().mouseMoveEvent(self, event) #call the superclass
-        event.accept() #we make sure we accept after having called the superclass so that it is not propagated (many default implementations of mouseMoveEvent call event.ignore())
+        # The mouseMoveEvent of QTreeWidget do not allow drag, commented
+        ret = None  # self.getQtClass().mouseMoveEvent(self, event) #call the superclass
+        event.accept()  # we make sure we accept after having called the superclass so that it is not propagated (many default implementations of mouseMoveEvent call event.ignore())
         drag = Qt.QDrag(self)
         drag.setMimeData(self.getModelMimeData())
         drag.exec_(Qt.Qt.CopyAction, Qt.Qt.CopyAction)
         return ret
-    
+
     def mimeTypes(self):
         return self.getSupportedMimeTypes()
-        
+
     def dropEvent(self, event):
         '''reimplemented to support dropping of modelnames in forms'''
-        self.debug('dropEvent(%s): %s,%s'%(event,event.mimeData(),split_model_list(event.mimeData().formats())))
+        self.debug('dropEvent(%s): %s,%s' % (event, event.mimeData(),
+                                             split_model_list(event.mimeData().formats())))
         if event.source() is self:
             self.info('Internal drag/drop not allowed')
             return
         if any(s in event.mimeData().formats() for s in self.getSupportedMimeTypes()):
-            #mtype = self.handleMimeData(event.mimeData(),self.addModels)#lambda m:self.addModels('^%s$'%m))
+            # mtype =
+            # self.handleMimeData(event.mimeData(),self.addModels)#lambda
+            # m:self.addModels('^%s$'%m))
             event.acceptProposedAction()
         else:
             self.warning('Invalid model in dropped data')
-        
-    ########################################################################################################################3      
-    ## @name Context Menu Actions
+
+    # 3
+    # @name Context Menu Actions
     # @{
-        
-    def contextMenuEvent(self,event):
-        ''' 
-        This function is called when right clicking on TaurusDevTree area. 
+
+    def contextMenuEvent(self, event):
         '''
-        node = self.currentItem() 
-        self.showNodeContextMenu(node,event)
+        This function is called when right clicking on TaurusDevTree area.
+        '''
+        node = self.currentItem()
+        self.showNodeContextMenu(node, event)
         return
-        
-    def showNodeContextMenu(self,node,event):
+
+    def showNodeContextMenu(self, node, event):
         """
-        A pop up menu will be shown with the available options. 
+        A pop up menu will be shown with the available options.
         Menus are managed using two tuple lists for each node: node.ContextMenu and node.ExpertMenu
         """
         obj = self.getNodeDraggable(node)
         position = event.globalPos()
-        self.debug('showNodeContextMenu(%s)'%obj)
+        self.debug('showNodeContextMenu(%s)' % obj)
         if self.itemAt(position) is self.headerItem():
             node = self.headerItem()
             #node.ContextMenu = ['Search ...']
         if node is None:
             node = self
         else:
-            if not hasattr(node,'ContextMenu'):
-                node.ContextMenu=[]
-            if not 'Search ...' in [k for k,a in node.ContextMenu]: ##Creating default menu
+            if not hasattr(node, 'ContextMenu'):
+                node.ContextMenu = []
+            # Creating default menu
+            if not 'Search ...' in [k for k, a in node.ContextMenu]:
                 # DEVICE NODE CONTEXT MENU
-                if obj.count('/')==2:
-                    
+                if obj.count('/') == 2:
+
                     node.ContextMenu.append(("Open Panel", self.showPanel))
-                    node.ContextMenu.append(("Show Attributes",self.addAttrToNode))
+                    node.ContextMenu.append(
+                        ("Show Attributes", self.addAttrToNode))
                     if self.getNodeAdmin(node):
-                        node.ContextMenu.append(("Go to %s"%self.getNodeAdmin(node),\
-                            lambda p=self.getNodeAdmin(node): p and self.findInTree(p)
-                            ))
-                    if not hasattr(node,'ExpertMenu'): setattr(node,'ExpertMenu',self.ExpertMenu)#[])
-                    if not 'Show Properties' in [k for k,a in node.ExpertMenu]:
-                        node.ExpertMenu.append(("Show Properties", self.showProperties))
+                        node.ContextMenu.append(("Go to %s" % self.getNodeAdmin(node),
+                                                 lambda p=self.getNodeAdmin(
+                                                     node): p and self.findInTree(p)
+                                                 ))
+                    if not hasattr(node, 'ExpertMenu'):
+                        setattr(node, 'ExpertMenu', self.ExpertMenu)  # [])
+                    if not 'Show Properties' in [k for k, a in node.ExpertMenu]:
+                        node.ExpertMenu.append(
+                            ("Show Properties", self.showProperties))
+
                         def test_device():
                             device = str(self.getNodeDeviceName())
                             if device:
-                                comm = 'tg_devtest %s &'%device
+                                comm = 'tg_devtest %s &' % device
                                 os.system(comm)
-                            else: self.debug('TaurusDevTree.TestDevice: Selected Device is None!')
+                            else:
+                                self.debug(
+                                    'TaurusDevTree.TestDevice: Selected Device is None!')
                         node.ExpertMenu.append(("Test Device", test_device))
-                        node.ExpertMenu.append(("Show ALL Attributes", lambda s=self:s.addAttrToNode(full=True)))
-                    node.ContextMenu.append(('',None))
-                    
+                        node.ExpertMenu.append(
+                            ("Show ALL Attributes", lambda s=self: s.addAttrToNode(full=True)))
+                    node.ContextMenu.append(('', None))
+
                 # ATTRIBUTE NODE CONTEXT MENU
-                elif obj.count('/')==3:
-                    for k,v in self.AttributeMenu:
-                        self.debug('Adding action %s'%k)
-                        if type(v) is str and hasattr(self,v):
-                            node.ContextMenu.append((k, getattr(self,v)))
+                elif obj.count('/') == 3:
+                    for k, v in self.AttributeMenu:
+                        self.debug('Adding action %s' % k)
+                        if type(v) is str and hasattr(self, v):
+                            node.ContextMenu.append((k, getattr(self, v)))
                         else:
-                            node.ContextMenu.append((k, lambda s=self.getNodeAlias(node): v(s)))
+                            node.ContextMenu.append(
+                                (k, lambda s=self.getNodeAlias(node): v(s)))
                     #node.ContextMenu.append(("add to Trends", self.addToPlot))
                     #node.ContextMenu.append(("remove from Trends", self.removeFromPlot))
-                    node.ContextMenu.append(('',None))    
-                elif not hasattr(node,'ExpertMenu'): 
-                    setattr(node,'ExpertMenu',self.ExpertMenu)#[])
+                    node.ContextMenu.append(('', None))
+                elif not hasattr(node, 'ExpertMenu'):
+                    setattr(node, 'ExpertMenu', self.ExpertMenu)  # [])
                 #node.ContextMenu.append(("Expand Node", self.expandNode))
                 #node.ContextMenu.append(("Collapse Node", self.collapseNode))
-                if node.isExpanded() and node.childCount()<10 and all(self.getNodeText(node.child(j)).count('/')==2 for j in range(node.childCount())):
-                    node.ContextMenu.append(("Show Attributes", lambda n=node,s=self: [s.addAttrToNode(n.child(j)) for j in range(n.childCount())]))
-                node.ContextMenu.append(("Search ...",\
-                    lambda: self.findInTree(str(Qt.QInputDialog.getText(self,'Search ...','Write a part of the name',Qt.QLineEdit.Normal)[0]))
-                    ))
+                if node.isExpanded() and node.childCount() < 10 and all(self.getNodeText(node.child(j)).count('/') == 2 for j in range(node.childCount())):
+                    node.ContextMenu.append(("Show Attributes", lambda n=node, s=self: [
+                                            s.addAttrToNode(n.child(j)) for j in range(n.childCount())]))
+                node.ContextMenu.append(("Search ...",
+                                         lambda: self.findInTree(str(Qt.QInputDialog.getText(
+                                             self, 'Search ...', 'Write a part of the name', Qt.QLineEdit.Normal)[0]))
+                                         ))
         #configDialogAction = menu.addAction("Refresh Tree")
         #self.connect(configDialogAction, Qt.SIGNAL("triggered()"), self.refreshTree)
         menu = Qt.QMenu(self)
-        
-        if hasattr(node,'ContextMenu'):
+
+        if hasattr(node, 'ContextMenu'):
             last_was_separator = True
             for t in (type(node.ContextMenu) is dict and node.ContextMenu.items() or node.ContextMenu):
                 try:
-                    k,action = t
+                    k, action = t
                     if k:
                         configDialogAction = menu.addAction(k)
-                        if action: self.connect(configDialogAction, Qt.SIGNAL("triggered()"), action)
-                        else: configDialogAction.setEnabled(False)
+                        if action:
+                            configDialogAction.triggered.connect(action)
+                        else:
+                            configDialogAction.setEnabled(False)
                         last_was_separator = False
-                    elif not last_was_separator: 
+                    elif not last_was_separator:
                         menu.addSeparator()
                         last_was_separator = True
-                except Exception,e: 
-                    self.warning('Unable to add Menu Action: %s:%s'%(t,e))
-        
-        if hasattr(node,'ExpertMenu'):
+                except Exception, e:
+                    self.warning('Unable to add Menu Action: %s:%s' % (t, e))
+
+        if hasattr(node, 'ExpertMenu'):
             menu.addSeparator()
             expert = menu.addMenu('Expert')
-            #expert.addSeparator()
+            # expert.addSeparator()
             last_was_separator = True
             for t in (type(node.ContextMenu) is dict and node.ExpertMenu.items() or node.ExpertMenu):
                 try:
-                    k,action = t
+                    k, action = t
                     if k:
                         configDialogAction = expert.addAction(k)
-                        if action: self.connect(configDialogAction, Qt.SIGNAL("triggered()"), action)
-                        else: configDialogAction.setEnabled(False)
+                        if action:
+                            configDialogAction.triggered.connect(action)
+                        else:
+                            configDialogAction.setEnabled(False)
                         last_was_separator = False
-                    elif not last_was_separator: 
+                    elif not last_was_separator:
                         expert.addSeparator()
                         last_was_separator = True
-                except Exception,e: 
-                    self.warning('Unable to add Expert Action: %s:%s'%(t,e))            
-        #menu.addSeparator()
+                except Exception, e:
+                    self.warning('Unable to add Expert Action: %s:%s' % (t, e))
+        # menu.addSeparator()
         menu.exec_(event.globalPos())
         del menu
 
 
 class PopupDialog(Qt.QDialog):
-    """ 
-    This class create the dialog 
+    """
+    This class create the dialog
     Dialog is used to make new floating panels persistent
     """
-    def __init__(self, parent = None,target = None):
+
+    def __init__(self, parent=None, target=None):
         Qt.QDialog.__init__(self, parent)
-        if target: self.initComponents(target)
-        
-    def initComponents(self,newWidget,show=True):
+        if target:
+            self.initComponents(target)
+
+    def initComponents(self, newWidget, show=True):
         widgetLayout = Qt.QVBoxLayout(self)
-        widgetLayout.setContentsMargins(10,10,10,10)
+        widgetLayout.setContentsMargins(10, 10, 10, 10)
         widgetLayout.addWidget(newWidget)
         self.setWindowTitle(newWidget.windowTitle())
         self.setModal(False)
         self.setVisible(True)
-        if show: self.exec_()
-        
-#####################################################################################
-            
+        if show:
+            self.exec_()
+
+##########################################################################
+
+
 class TaurusTreeNode(Qt.QTreeWidgetItem, TaurusBaseComponent):
     """
     Unused; one day should replace TaurusTreeNodeContainer and all methods moved here.
     Base class for all Taurus Tree Node Items
     """
-    
-    #---------------------------------------------------------------------------
+
+    #-------------------------------------------------------------------------
     # Write your own code here to define the signals generated by this widget
     #
-    __pyqtSignals__ = ("modelChanged(const QString &)",)    
-    #__pyqtSignals__ = ("refreshIcon",)
-    
-    def __init__(self, name = None, parent = None):
+
+    modelChanged = Qt.pyqtSignal('const QString &')
+
+    def __init__(self, name=None, parent=None):
         name = name or self.__class__.__name__
-        self.call__init__wo_kw(Qt.QTreeWidgetItem, parent)        
+        self.call__init__wo_kw(Qt.QTreeWidgetItem, parent)
         self.call__init__(TaurusBaseComponent, name, parent)
-        #self.defineStyle()
-    
-    #def defineStyle(self):
+        # self.defineStyle()
+
+    # def defineStyle(self):
         #""" Defines the initial style for the widget """
-        ##-----------------------------------------------------------------------
-        ## Write your own code here to set the initial style of your widget
+        # -----------------------------------------------------------------------
+        # Write your own code here to set the initial style of your widget
         ##
-        #self.updateStyle()        
-        
+        # self.updateStyle()
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Mandatory methods to be implemented in any subclass of TaurusComponent
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
     def getParentTaurusComponent(self):
-        """ Returns a parent Taurus component or None if no parent TaurusBaseComponent 
+        """ Returns a parent Taurus component or None if no parent TaurusBaseComponent
             is found."""
         p = self.parentItem()
         while p and not isinstance(p, TaurusTreeNode):
@@ -1215,24 +1380,27 @@ class TaurusTreeNode(Qt.QTreeWidgetItem, TaurusBaseComponent):
     def updateStyle(self):
         """ Method called when the component detects an event that triggers a change
             in the style."""
-        
-        #if self.scene():
+
+        # if self.scene():
         #    self.scene().updateSceneItem(self)
-            
-        #-----------------------------------------------------------------------
+
+        #----------------------------------------------------------------------
         # Write your own code here to update your widget style
-        
+
         # send a repaint in the end
-        #self.repaint()
+        # self.repaint()
         #if self._parent: self._parent.repaint()
-        
-        state2color = lambda state: Qt.QColor(DEVICE_STATE_PALETTE.number(state))
-        quality2color = lambda attr: Qt.QColor(ATTRIBUTE_QUALITY_PALETTE.number(attr))
+
+        state2color = lambda state: Qt.QColor(
+            DEVICE_STATE_PALETTE.number(state))
+        quality2color = lambda attr: Qt.QColor(
+            ATTRIBUTE_QUALITY_PALETTE.number(attr))
         v = self.getModelValueObj()
-        if isinstance(v,PyTango.DevState):
-            node.setBackground(0,Qt.QBrush(state2color(v))) #@TODO: node is undefined. Check code
-        if hasattr(v,'quality'):
-            self.setForeground(0,Qt.QBrush(quality2color(v.quality)))
+        if isinstance(v, PyTango.DevState):  # TODO: maybe change to Taurus.tango.DevState
+            # @TODO: node is undefined. Check code
+            node.setBackground(0, Qt.QBrush(state2color(v)))
+        if hasattr(v, 'quality'):
+            self.setForeground(0, Qt.QBrush(quality2color(v.quality)))
 
     def isReadOnly(self):
         return True
@@ -1242,144 +1410,153 @@ class TaurusTreeNode(Qt.QTreeWidgetItem, TaurusBaseComponent):
 
     def getModelClass(self):
         return taurus.core.taurusdevice.TaurusDevice
-    
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TaurusBaseComponent over writing
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
-    #def attach(self):
+
+    # def attach(self):
         #"""Attaches the widget to the model"""
-        #if self.isAttached():
-            #return True
-        ##-----------------------------------------------------------------------
-        ## Write your own code here before attaching widget to attribute connect 
-        ## the proper signal so that the first event is correctly received by the
-        ## widget
+        # if self.isAttached():
+        # return True
+        # -----------------------------------------------------------------------
+        # Write your own code here before attaching widget to attribute connect
+        # the proper signal so that the first event is correctly received by the
+        # widget
         ##
-        ## Typical code is:
-        ##self.connect(self, Qt.SIGNAL('valueChangedDueToEvent(QString)'), 
-        ##             self.setTextValue)
+        # Typical code is:
+        # self.connect(self, Qt.SIGNAL('valueChangedDueToEvent(QString)'),
+        # self.setTextValue)
         #ret = TaurusBaseWidget.attach(self)
-        ## by default enable/disable widget according to attach state
-        #self.setEnabled(ret)
-        #return ret
+        # by default enable/disable widget according to attach state
+        # self.setEnabled(ret)
+        # return ret
 
-    #def detach(self):
+    # def detach(self):
         #"""Detaches the widget from the model"""
-        #TaurusBaseWidget.detach(self)
+        # TaurusBaseWidget.detach(self)
 
-        ##-----------------------------------------------------------------------
-        ## Write your own code here after detaching the widget from the model 
+        # -----------------------------------------------------------------------
+        # Write your own code here after detaching the widget from the model
         ##
-        ## Typical code is:
-        ##self.emit(Qt.SIGNAL('valueChangedDueToEvent(QString)'), 
-        ##          Qt.QString(value_str))
-        ##self.disconnect(self, Qt.SIGNAL('valueChangedDueToEvent(QString)'),
-        ##                self.setTextValue)
-        ## by default disable widget when dettached
-        #self.setEnabled(False)
-
-    
+        # Typical code is:
+        # self.emit(Qt.SIGNAL('valueChangedDueToEvent(QString)'),
+        # Qt.QString(value_str))
+        # self.disconnect(self, Qt.SIGNAL('valueChangedDueToEvent(QString)'),
+        # self.setTextValue)
+        # by default disable widget when dettached
+        # self.setEnabled(False)
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, 
-                                TaurusBaseWidget.setModel, 
-                                TaurusBaseWidget.resetModel)
-                                
+    model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel,
+                            TaurusBaseWidget.setModel,
+                            TaurusBaseWidget.resetModel)
+
     useParentModel = Qt.pyqtProperty("bool",
-                                         TaurusBaseWidget.getUseParentModel, 
-                                         TaurusBaseWidget.setUseParentModel,
-                                         TaurusBaseWidget.resetUseParentModel)
+                                     TaurusBaseWidget.getUseParentModel,
+                                     TaurusBaseWidget.setUseParentModel,
+                                     TaurusBaseWidget.resetUseParentModel)
 
-    #---------------------------------------------------------------------------
+    #-------------------------------------------------------------------------
     # Write your own code here for your own widget properties
-    
+
+
 class TaurusDevTreeOptions(Qt.QWidget):
     """ This class provides a search(QString) signal to be connected to TaurusDevTree.findInTree slot """
-    __pyqtSignals__ = (
-      "search(QString)",
-      "loadTree(QString)",
-      "hideUnexported",
-      "hideUnarchived",
-      )
-    
-    def __init__(self,parent=None,icon=None):
-        Qt.QWidget.__init__(self,parent)
-        
+
+    search = Qt.pyqtSignal('QString')
+    loadTree = Qt.pyqtSignal('QString')
+    hideUnarchived = Qt.pyqtSignal()
+    hideUnexported = Qt.pyqtSignal()
+
+    def __init__(self, parent=None, icon=None):
+        Qt.QWidget.__init__(self, parent)
+
         self.setLayout(Qt.QHBoxLayout())
         try:
             self._pixmap = Qt.QPixmap(icon or 'image/icons/search.png')
             self._label = Qt.QLabel(self)
             self._label.setPixmap(self._pixmap)
-            self.layout().addWidget(self._label)    
+            self.layout().addWidget(self._label)
         except:
             pass
-        
+
         self._edit = Qt.QLineEdit()
         self._button = Qt.QPushButton()
         self._button.setText('Search')
-        self.connect(self._edit,Qt.SIGNAL('returnPressed()'),self._button.animateClick)
-        self.connect(self._button,Qt.SIGNAL('clicked()'),self._emitSearch)
+        self._edit.returnPressed.connect(self._button.animateClick)
+        self._button.clicked.connect(self._emitSearch)
         self.layout().addWidget(self._edit)
         self.layout().addWidget(self._button)
 
-    def connectWithTree(self,tree):
-        Qt.QObject.connect(self,Qt.SIGNAL("search(QString)"),tree.findInTree)
-    
+    def connectWithTree(self, tree):
+        self.search.connect(tree.findInTree)
+
     def _emitSearch(self):
         text = self._edit.text()
-        if text: 
-            self.emit(Qt.SIGNAL("search(QString)"), text)
+        if text:
+            self.search.emit(text)
         return
 
 SearchEdit = TaurusDevTreeOptions
-    
-#####################################################################################
-    
+
+##########################################################################
+
+
 class ServerBrowser(TaurusDevTree):
     """ This class is used only when browsing by Server/Instance instead of Domain/Family/Member scheme """
-    
-    def getDeviceDict(self,filters):
+
+    def getDeviceDict(self, filters):
         '''
         This method build a dictionary of instances and devices depending on the given servers,devices or instances in QTProperty or in another widget
         --- filters is a string with names of devices/servers such as "LT/VC/ALL,LT02/VC/IP-01" or "modbus,pyplc"
         --- filters is a list of devices such as ["LT/VC/ALL","LT02/VC/IP-01"]
         '''
-        self.trace('In TaurusDevTree.buildDictFromFilters(%s)'%filters)
+        self.trace('In TaurusDevTree.buildDictFromFilters(%s)' % filters)
         self._filters = filters
-        if type(filters)==type("") or isinstance(filters,Qt.QString):#@TODO:QString and QStringList should not be used (They disappear in API2)
+        # @TODO:QString and QStringList should not be used (They disappear in API2)
+        if type(filters) == type("") or isinstance(filters, Qt.QString):
             filters = str(filters).split(',')
-        elif isinstance(filters,Qt.QStringList): #@TODO:QString and QStringList should not be used (They disappear in API2)
+        # @TODO:QString and QStringList should not be used (They disappear in API2)
+        elif isinstance(filters, Qt.QStringList):
             filters = list(filters)
-        elif type(filters)!=type([]):
+        elif type(filters) != type([]):
             self.debug("'filters' has to be a string or the list type!")
         vals = {}
-        if not filters: return vals
-        if filters[0].count('/')==0:
-            self.debug('In TaurusDevTree.buildDictFromFilters(%s): Getting Servers'%filters)
-            targets,addMe = self.db.get_server_name_list(),self.addInstToServ #Searching servers
-        elif filters[0].count('/')==1:
-            self.debug('In TaurusDevTree.buildDictFromFilters(%s): Getting Instances'%filters)
-            targets,addMe = self.db.get_server_list(),self.addDevToInst #Searching instances
-        elif filters[0].count('/')==2:
-            self.debug('In TaurusDevTree.buildDictFromFilters(%s): Getting Devices'%filters)
-            targets,addMe = self.db.get_device_exported("*"),lambda s: {s:{}} #self.addAttrToDev #Searching devices
+        if not filters:
+            return vals
+        if filters[0].count('/') == 0:
+            self.debug(
+                'In TaurusDevTree.buildDictFromFilters(%s): Getting Servers' % filters)
+            targets, addMe = self.db.get_server_name_list(
+            ), self.addInstToServ  # Searching servers
+        elif filters[0].count('/') == 1:
+            self.debug(
+                'In TaurusDevTree.buildDictFromFilters(%s): Getting Instances' % filters)
+            targets, addMe = self.db.get_server_list(), self.addDevToInst  # Searching instances
+        elif filters[0].count('/') == 2:
+            self.debug(
+                'In TaurusDevTree.buildDictFromFilters(%s): Getting Devices' % filters)
+            targets, addMe = self.db.get_device_exported(
+                "*"), lambda s: {s: {}}  # self.addAttrToDev #Searching devices
         else:
-            raise Exception('UnknownFilter!: %s'%filters[0])
-        
+            raise Exception('UnknownFilter!: %s' % filters[0])
+
         for t in targets:
             for f in filters:
                 f = str(f)
-                exp = f.replace('*','.*').lower() if '*' in f and '.*' not in f else f.lower()
-                if re.match(exp,t.lower()):
-                    self.debug('Adding node %s'%t)
-                    vals[t] = addMe(t) 
-        self.trace('Out of TaurusDevTree.getDeviceDict(%s)'%filters)
+                exp = f.replace(
+                    '*', '.*').lower() if '*' in f and '.*' not in f else f.lower()
+                if re.match(exp, t.lower()):
+                    self.debug('Adding node %s' % t)
+                    vals[t] = addMe(t)
+        self.trace('Out of TaurusDevTree.getDeviceDict(%s)' % filters)
         return vals
 
-    def addInstToServ(self,my_server):
+    def addInstToServ(self, my_server):
         dict = {}
         list_inst = self.get_instances_for_server(my_server)
         lower_list_inst = [s.lower() for s in list_inst]
@@ -1390,60 +1567,53 @@ class ServerBrowser(TaurusDevTree):
                 dict[my_inst] = 0
         return dict
 
-    def addDevtoInst(self,my_inst,expand_attrs = False):
+    def addDevtoInst(self, my_inst, expand_attrs=False):
         d = {}
         list_dev = self.get_devices_for_instance(my_inst)
         lower_list_dev = [s.lower() for s in list_dev]
         for my_dev in lower_list_dev:
             if self._expand:
-                d[my_dev] = self.addAttrToDev(my_dev) if expand_attrs else {my_dev:{}}
+                d[my_dev] = self.addAttrToDev(
+                    my_dev) if expand_attrs else {my_dev: {}}
             else:
                 d[my_dev] = 0
         return d
-            
-    def addFamilyToDomain(self,prev,expand_attrs):
+
+    def addFamilyToDomain(self, prev, expand_attrs):
         d = {}
         #children = self.get_devices_for_instance(my_inst)
-        lower_list_dev = [s.lower() for s in list_dev] #@TODO: list_dev is undefined. Check code
+        # @TODO: list_dev is undefined. Check code
+        lower_list_dev = [s.lower() for s in list_dev]
         for my_dev in lower_list_dev:
             if self._expand:
-                d[my_dev] = self.addAttrToDev(my_dev) if expand_attrs else {my_dev:{}}
+                d[my_dev] = self.addAttrToDev(
+                    my_dev) if expand_attrs else {my_dev: {}}
             else:
                 d[my_dev] = 0
         return d
-            
 
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # Methods  for database commands
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def get_instances_for_server(self, server_name):
         #executable_name = class_name
         instances = self.db.get_instance_name_list(server_name)
-        return [server_name+'/'+instance for instance in instances]
+        return [server_name + '/' + instance for instance in instances]
 
     def get_devices_for_instance(self, instance_name):
         devslist = self.db.get_device_class_list(instance_name)
-        return [dev for dev in devslist if '/' in dev and not dev.startswith('dserver')]            
-            
-            
-    ##@}
-                    
-#####################################################################################
+        return [dev for dev in devslist if '/' in dev and not dev.startswith('dserver')]
+
+    # @}
+
+##########################################################################
+
 
 class TaurusSearchTree(TaurusWidget):
     """
     This Class is a mere wrapper providing a TaurusDevTree connected with an options panel and some optional checkboxes.
     """
-    __pyqtSignals__ = list(getattr(TaurusWidget,'__pyqtSignals__',[]))+[
-        "search(QString)",
-        "modelChanged(const QString &)",
-        "deviceSelected(QString)",
-        "addAttrSelected(QStringList)",
-        "removeAttrSelected(QStringList)",
-        "refreshTree",
-        "nodeFound"
-        ]
     __slots__ = (
         "setTangoHost",
         #"setModel",
@@ -1453,13 +1623,21 @@ class TaurusSearchTree(TaurusWidget):
         "findInTree",
         "expandAll",
         "loadTree",
-        )        
-    
+    )
+
+    refreshTree = Qt.pyqtSignal()
+    nodeFound = Qt.pyqtSignal()
+    deviceSelected = Qt.pyqtSignal('QString')
+    addAttrSelected = Qt.pyqtSignal('QStringList')
+    removeAttrSelected = Qt.pyqtSignal('QStringList')
+    modelChanged = Qt.pyqtSignal('const QString &')
+    search = Qt.pyqtSignal('QString')
+
     @staticmethod
-    def method_forwarder(*args,**kwargs):
-        m,o = kwargs['method'],kwargs['object']
-        #print 'Calling %s.%s'%(o,m)
-        getattr(o.__class__,m)(o,*args)
+    def method_forwarder(*args, **kwargs):
+        m, o = kwargs['method'], kwargs['object']
+        # print 'Calling %s.%s'%(o,m)
+        getattr(o.__class__, m)(o, *args)
 
     def defineStyle(self):
         #print('In TaurusSearchTree.defineStyle()')
@@ -1470,63 +1648,77 @@ class TaurusSearchTree(TaurusWidget):
         self.layout().addWidget(self.edit)
         self.layout().addWidget(self.tree)
         self.registerConfigDelegate(self.tree)
-        #Slot forwarding ...
+        # Slot forwarding ...
         for k in TaurusDevTree.__dict__.keys():
-            #if k in ['__init__','defineStyle']: continue
-            if k not in self.__slots__: continue
-            try: setattr(self,k,partial(self.method_forwarder,method=k,object=self.tree))
-            except Exception,e: self.warning('Unable to add slot %s: %s'%(k,e))
-        #Event forwarding ...
-        for signal in TaurusDevTree.__pyqtSignals__:
-            #Qt.QObject.connect(self,Qt.SIGNAL("search(QString)"),tree.findInTree)
-            #self.emit(Qt.SIGNAL("search(QString)"), text)
-            Qt.QObject.connect(self.tree,Qt.SIGNAL(signal),lambda args,f=self,s=signal:f.emit(Qt.SIGNAL(s),args))
+            # if k in ['__init__','defineStyle']: continue
+            if k not in self.__slots__:
+                continue
+            try:
+                setattr(self, k, partial(
+                    self.method_forwarder, method=k, object=self.tree))
+            except Exception, e:
+                self.warning('Unable to add slot %s: %s' % (k, e))
+        # Event forwarding ...
+        self.tree.refreshTree.connect(self.refreshTree)
+        self.tree.nodeFound.connect(self.nodeFound)
+        self.tree.deviceSelected[str].connect(self.deviceSelected)
+        self.tree.search[str].connect(self.search)
+        self.tree.addAttrSelected[str].connect(self.addAttrSelected)
+        self.tree.removeAttrSelected[str].connect(self.removeAttrSelected)
+        self.tree.modelChanged[str].connect(self.modelChanged)
+        #for signal in TaurusDevTree.__pyqtSignals__:
+        #    getattr(self.tree, signal).connect(
+        #        lambda args, f=self, s=signal: getattr(f, signal).emit(args))
         self.edit.connectWithTree(self)
         return
-        
 
-#####################################################################################
+
+##########################################################################
 
 def taurusDevTreeMain():
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
     from taurus.core.util import argparse
-    
+
     if False:
         app = Qt.QApplication([])
         args = sys.argv[1:]
         #args = app.get_command_line_args()
         #app = TaurusApplication(sys.argv)
-        if not args: args = ['database']
+        if not args:
+            args = ['database']
     else:
         taurus.setLogLevel(taurus.Debug)
         parser = argparse.get_taurus_parser()
         parser.set_usage("%prog [options] devname [attrs]")
-        parser.set_description("Taurus Application inspired in Jive and Atk Panel")
+        parser.set_description(
+            "Taurus Application inspired in Jive and Atk Panel")
         parser.add_option("--config", "--config-file", dest="config_file", default=None,
-                  help="use the given config file for initialization")
-        app = TaurusApplication(cmd_line_parser=parser,app_name="TaurusDevicePanel",
+                          help="use the given config file for initialization")
+        app = TaurusApplication(cmd_line_parser=parser, app_name="TaurusDevicePanel",
                                 app_version=taurus.Release.version)
         args = app.get_command_line_args()
         options = app.get_command_line_options()
-        
+
     form = TaurusSearchTree()
-    #try:
-        #if options.tango_host is None:
-            #options.tango_host = taurus.Database().getNormalName()
-        #form.setTangoHost(options.tango_host)
-    #except: pass
-    
-    def trace(m): print(m)
-    [setattr(form.tree,f,trace) for f in ('info','warning','error','trace')]
-    
+    # try:
+    # if options.tango_host is None:
+    #options.tango_host = taurus.Authority().getNormalName()
+    # form.setTangoHost(options.tango_host)
+    # except: pass
+
+    def trace(m):
+        print(m)
+    [setattr(form.tree, f, trace)
+     for f in ('info', 'warning', 'error', 'trace')]
+
     form.setLogLevel(taurus.Debug)
     form.tree.setLogLevel(taurus.Debug)
-    #set a model list from the command line or launch the chooser  
-    if options.config_file is not None: 
+    # set a model list from the command line or launch the chooser
+    if options.config_file is not None:
         form.tree.loadConfigFile(options.config_file)
-    if len(args)>0:
-        models=args
+    if len(args) > 0:
+        models = args
         form.setModel(models)
     form.show()
     sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/tree/taurustree.py b/lib/taurus/qt/qtgui/tree/taurustree.py
index 8697233..f6d2493 100644
--- a/lib/taurus/qt/qtgui/tree/taurustree.py
+++ b/lib/taurus/qt/qtgui/tree/taurustree.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides a base widget that can be used to display a taurus 
+"""This module provides a base widget that can be used to display a taurus
 model in a tree widget"""
 
 __all__ = ["TaurusBaseTreeWidget"]
diff --git a/lib/taurus/qt/qtgui/util/__init__.py b/lib/taurus/qt/qtgui/util/__init__.py
index 44c8730..225e41f 100644
--- a/lib/taurus/qt/qtgui/util/__init__.py
+++ b/lib/taurus/qt/qtgui/util/__init__.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 package provides a set of taurus wiget utilities like color management, 
+"""This package provides a set of taurus wiget utilities like color management,
 configuration, actions."""
 
 __docformat__ = 'restructuredtext'
@@ -35,3 +35,4 @@ from .tauruswidgetfactory import *
 from .taurusscreenshot import *
 from .qdraganddropdebug import *
 from .ui import *
+from .validator import *
diff --git a/lib/taurus/qt/qtgui/util/qdraganddropdebug.py b/lib/taurus/qt/qtgui/util/qdraganddropdebug.py
index c767e01..5d3d9ce 100644
--- a/lib/taurus/qt/qtgui/util/qdraganddropdebug.py
+++ b/lib/taurus/qt/qtgui/util/qdraganddropdebug.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -28,21 +28,22 @@ __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 
+
 class DropDebugger(Qt.QLabel):
-    '''A simple utility for debugging drag&drop. 
-    This widget will accept drops and show a pop-up with the contents 
-    of the MIME data passed in the drag&drop'''  
+    '''A simple utility for debugging drag&drop.
+    This widget will accept drops and show a pop-up with the contents
+    of the MIME data passed in the drag&drop'''
 
     def __init__(self, parent=None):
         Qt.QLabel.__init__(self, parent)
         self.setAcceptDrops(True)
         self.setText('Drop something here')
-        self.setMinimumSize(300,200)
+        self.setMinimumSize(300, 200)
         self.setWindowTitle('Drag&Drop Debugger')
-             
-    def dragEnterEvent(self,event):
-        event.acceptProposedAction() 
-        
+
+    def dragEnterEvent(self, event):
+        event.acceptProposedAction()
+
     def dropEvent(self, event):
         '''reimplemented to support drag&drop of models. See :class:`QWidget`'''
         msg = '<b>MIMETYPE</b>: DATA. <ul>'
@@ -50,15 +51,15 @@ class DropDebugger(Qt.QLabel):
         for format in mimedata.formats():
             data = mimedata.data(format)
             msg += '<li><b>{0}</b>: "{1}"</li>'.format(format, data)
-        msg+='</ul>'
-        Qt.QMessageBox.information( self, "Drop event received", msg)
-        
+        msg += '</ul>'
+        Qt.QMessageBox.information(self, "Drop event received", msg)
+
 
-if __name__=='__main__':
+if __name__ == '__main__':
     import sys
     from taurus.qt.qtgui.application import TaurusApplication
 
     app = TaurusApplication()
-    w=DropDebugger()
+    w = DropDebugger()
     w.show()
     sys.exit(app.exec_())
diff --git a/lib/taurus/qt/qtgui/util/taurusaction.py b/lib/taurus/qt/qtgui/util/taurusaction.py
index 1c46911..698dc6d 100644
--- a/lib/taurus/qt/qtgui/util/taurusaction.py
+++ b/lib/taurus/qt/qtgui/util/taurusaction.py
@@ -2,30 +2,40 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 is designed to provide a library of taurus Qt actions"""
 
-#__all__ = []
+__all__ = ["ExternalAppAction",
+           "TaurusMenu",
+           "TaurusAction",
+           "SeparatorAction",
+           "AttributeHistoryAction",
+           "AttributeAllConfigAction",
+           "AttributeMonitorDeviceAction",
+           "AttributeImageDisplayAction",
+           "AttributeMenu",
+           "ConfigurationMenu",
+           ]
 
 __docformat__ = 'restructuredtext'
 
@@ -34,18 +44,21 @@ import xml.dom.minidom
 
 from taurus.external.qt import Qt
 from taurus.qt.qtcore.configuration import BaseConfigurableClass
-from taurus.qt.qtgui.resource import getThemeIcon
+
 
 class ExternalAppAction(Qt.QAction, BaseConfigurableClass):
     """ An specialized QAction for launching external applications
-    
+
     Signals: apart of those from QAction, it emits a  "cmdArgsChanged" signal
     with the current cmdArgs list as its argument.
     """
     DEFAULT_ICON_NAME = 'application-x-executable'
+
+    cmdArgsChanged = Qt.pyqtSignal(list)
+
     def __init__(self, cmdargs, text=None, icon=None, parent=None, interactive=True):
         '''creator
-        
+
         :param cmdargs: (list<str> or str) A list of strings to be passed to
                         :meth:`subprocess.Popen` for launching the external
                         application. It can also be a single string containing a
@@ -58,27 +71,29 @@ class ExternalAppAction(Qt.QAction, BaseConfigurableClass):
             import shlex
             cmdargs = shlex.split(str(cmdargs))
         self.path = os.path.realpath(cmdargs and cmdargs[0] or '')
-        if text is None: text = os.path.basename(cmdargs and cmdargs[0] or '')
+        if text is None:
+            text = os.path.basename(cmdargs and cmdargs[0] or '')
         if icon is None:
-            icon = getThemeIcon(self.DEFAULT_ICON_NAME)
-        elif isinstance(icon,basestring):
-            tmp = getThemeIcon(icon) 
-            if not tmp.isNull(): icon=tmp
+            icon = Qt.QIcon.fromTheme(self.DEFAULT_ICON_NAME)
+        elif isinstance(icon, basestring):
+            tmp = Qt.QIcon.fromTheme(icon)
+            if not tmp.isNull():
+                icon = tmp
 
         Qt.QAction.__init__(self, Qt.QIcon(icon), text, parent)
         BaseConfigurableClass.__init__(self)
         self.interactive = interactive
         self._process = []
         self.setCmdArgs(cmdargs)
-        self.connect(self, Qt.SIGNAL("triggered()"), self.actionTriggered)
-        self.setToolTip("Launches %s (external application)"%text)
+        self.triggered.connect(self.actionTriggered)
+        self.setToolTip("Launches %s (external application)" % text)
         self.registerConfigProperty(self.cmdArgs, self.setCmdArgs, 'cmdArgs')
-    
+
     def setCmdArgs(self, cmdargs, emitsignal=True):
         '''Sets the command args for executing this external application.
-        
-        It emits the "cmdArgsChanged" signal with the new cmdArgs list 
-        
+
+        It emits the "cmdArgsChanged" signal with the new cmdArgs list
+
         :param cmdargs: (list<str> or str) A list of strings to be passed to
                         :meth:`subprocess.Popen` for launching the external
                         application. It can also be a string containing a
@@ -89,13 +104,13 @@ class ExternalAppAction(Qt.QAction, BaseConfigurableClass):
             cmdargs = shlex.split(str(cmdargs))
         self.__cmdargs = cmdargs
         if emitsignal:
-            self.emit(Qt.SIGNAL("cmdArgsChanged"), self.__cmdargs)
-        
+            self.cmdArgsChanged.emit(self.__cmdargs)
+
     def cmdArgs(self):
         return self.__cmdargs
-    
-    @Qt.pyqtSignature("triggered()")
-    def actionTriggered(self,args=None):
+
+    @Qt.pyqtSlot(name='triggered', result=bool)
+    def actionTriggered(self, args=None):
         '''launches the external application as a subprocess'''
         import subprocess
         try:
@@ -103,8 +118,8 @@ class ExternalAppAction(Qt.QAction, BaseConfigurableClass):
                 if isinstance(args, (basestring, Qt.QString)):
                     import shlex
                     args = shlex.split(str(args))
-                args = self.cmdArgs()+args
-            else: 
+                args = self.cmdArgs() + args
+            else:
                 args = self.cmdArgs()
             if any(args):
                 #Qt.QMessageBox.warning(self.parentWidget(),'Warning','In ExternalAppAction(%s)'%args)
@@ -113,52 +128,55 @@ class ExternalAppAction(Qt.QAction, BaseConfigurableClass):
             else:
                 return False
         except OSError:
-            err = "Error launching %s"%unicode(self.text())
+            err = "Error launching %s" % unicode(self.text())
             msg = "Cannot launch application:\n" + \
                   " ".join(self.__cmdargs) + \
-                  "\nHint: Check that %s is installed and in the path"%unicode(self.text())
-            if self.interactive: 
+                  "\nHint: Check that %s is installed and in the path" % unicode(
+                      self.text())
+            if self.interactive:
                 Qt.QMessageBox.warning(self.parentWidget(), err, msg)
             from taurus.core.util import Logger
-            Logger().warning('%s:\n%s'%(err,msg))
+            Logger().warning('%s:\n%s' % (err, msg))
             return False
-    
+
     def kill(self):
-        #Kills all processes opened by this application
+        # Kills all processes opened by this application
         [p.kill() for p in self._process]
-                                   
+
     def check(self):
         '''Returns True if the application is available for executing
-        
+
         :return: (bool)
         '''
-        #raise NotImplementedError  #@todo: implement a checker (check if self.cmdargs[0] is in the execution path and is executable
+        # raise NotImplementedError  #@todo: implement a checker (check if
+        # self.cmdargs[0] is in the execution path and is executable
         path = os.path.realpath(self.cmdArgs()[0])
-        try: 
+        try:
             os.stat(path)
             return True
         except:
             return False
 
+
 class TaurusMenu(Qt.QMenu):
     """Base class for Taurus Menus"""
-    
+
     def __init__(self, parent):
         Qt.QMenu.__init__(self, parent)
-    
+
     def build(self, data):
         m_node = xml.dom.minidom.parseString(data).childNodes[0]
         self.buildFromXML(m_node)
-    
+
     def getActionFactory(self):
         import taurusactionfactory
         return taurusactionfactory.ActionFactory()
-        
+
     def buildFromXML(self, m_node):
         widget = self.parent()
         if m_node.hasAttribute('label'):
             self.setTitle(m_node.getAttribute('label'))
-            
+
         for node in m_node.childNodes:
             name = node.nodeName
             if name == 'Menu':
@@ -173,65 +191,66 @@ class TaurusMenu(Qt.QMenu):
 
 class TaurusAction(Qt.QAction):
     """Base class for Taurus Actions"""
-    
+
     def __init__(self, parent):
         import taurus.qt.qtgui.base
-        
+
         if (parent is None) or \
-            (not isinstance(parent, Qt.QWidget)) or \
-            (not isinstance(parent, taurus.qt.qtgui.base.TaurusBaseComponent)):
-            raise RuntimeError("Invalid parent. Must be a valid Taurus widget.") 
-        
+                (not isinstance(parent, Qt.QWidget)) or \
+                (not isinstance(parent, taurus.qt.qtgui.base.TaurusBaseComponent)):
+            raise RuntimeError(
+                "Invalid parent. Must be a valid Taurus widget.")
+
         Qt.QAction.__init__(self, parent)
-        
-        self.connect(parent, Qt.SIGNAL('modelChanged(const QString &)'), self.modelChanged)
-        self.connect(self, Qt.SIGNAL("triggered()"), self.actionTriggered)
-        
+
+        parent.modelChanged.connect(self.modelChanged)
+        self.triggered.connect(self.actionTriggered)
+
         self.update()
-        
+
     def update(self):
         model = self.parent().getModelObj()
         self.setDisabled(model is None)
-        
-    @Qt.pyqtSignature("modelChanged(const QString &)")
+
+    @Qt.pyqtSlot('QString')
     def modelChanged(self, modelName):
         self.update()
-        
-    @Qt.pyqtSignature("triggered()")
+
+    @Qt.pyqtSlot(name='triggered')
     def actionTriggered(self):
         pass
 
 
 class SeparatorAction(TaurusAction):
-    
+
     menuID = "_Separator_"
-    
+
     def __init__(self, parent=None):
         Qt.QAction.__init__(self, parent)
         self.setSeparator(True)
 
 
 class AttributeHistoryAction(TaurusAction):
-    
+
     menuID = "AttrHistory"
-    
+
     def __init__(self, parent=None):
         TaurusAction.__init__(self, parent)
         self.setText("Show history...")
-        
+
     def actionTriggered(self):
         dialog = Qt.QDialog()
         dialog.exec_()
-    
+
 
 class AttributeAllConfigAction(TaurusAction):
-    
+
     menuID = "AttrConfig"
-    
+
     def __init__(self, parent=None):
         TaurusAction.__init__(self, parent)
         self.setText("All...")
-        
+
     def actionTriggered(self):
         taurus_widget = self.parent()
         from taurus.qt.qtgui.dialog.taurusconfigurationdialog import (
@@ -242,13 +261,13 @@ class AttributeAllConfigAction(TaurusAction):
 
 
 class AttributeMonitorDeviceAction(TaurusAction):
-    
+
     menuID = "MonitorDevice"
-    
+
     def __init__(self, parent=None):
         TaurusAction.__init__(self, parent)
         self.setText("&Monitor device ...")
-        
+
     def actionTriggered(self):
         taurus_widget = self.parent()
         model_name = taurus_widget.getModelName()
@@ -257,23 +276,23 @@ class AttributeMonitorDeviceAction(TaurusAction):
             dev_name = model_name
         elif len(w) == 4:
             dev_name = w[0] + "/" + w[1] + "/" + w[2]
-        elif len(w) == 5:#FB: If the first parameter is the database
+        elif len(w) == 5:  # FB: If the first parameter is the database
             dev_name = w[1] + "/" + w[2] + "/" + w[3]
         else:
             return
-        
+
         cmd = "atkpanel " + dev_name + " &"
         os.system(cmd)
-        
-        
+
+
 class AttributeImageDisplayAction(TaurusAction):
-    
+
     menuID = "ImageDisplay"
-    
+
     def __init__(self, parent=None):
         TaurusAction.__init__(self, parent)
         self.setText("&Image Display ...")
-        
+
     def actionTriggered(self):
         taurus_widget = self.parent()
         model_name = taurus_widget.getModelName()
@@ -284,35 +303,34 @@ class AttributeImageDisplayAction(TaurusAction):
             dev_name = w[0] + "/" + w[1] + "/" + w[2]
         else:
             return
-        
+
         attr_name = dev_name + "/Image"
-        
+
         import qub
         im = qub._TaurusQubDataImageDisplay(data=attr_name)
         im.show()
-       
+
 
 class AttributeMenu(TaurusMenu):
-    
+
     menuID = "AttrMenu"
     menuData = "<Menu label='Attribute'>" \
-    "<MenuItem class='AttrHistory'/>"\
-    "<MenuItem class='_Separator_'/>"\
-    "<Menu class='AttrConfig'/>"\
-    "</Menu>"
-    
+        "<MenuItem class='AttrHistory'/>"\
+        "<MenuItem class='_Separator_'/>"\
+        "<Menu class='AttrConfig'/>"\
+        "</Menu>"
+
     def __init__(self, parent):
         TaurusMenu.__init__(self, parent)
         self.build(self.menuData)
-        
-        
+
+
 class ConfigurationMenu(TaurusMenu):
     menuID = "AttrConfigMenu"
     menuData = "<Menu label='Configuration'>" \
-    "<MenuItem class='AttrConfig'/>"\
-    "</Menu>"
-    
+        "<MenuItem class='AttrConfig'/>"\
+        "</Menu>"
+
     def __init__(self, parent):
         TaurusMenu.__init__(self, parent)
         self.build(self.menuData)
-        
diff --git a/lib/taurus/qt/qtgui/util/taurusactionfactory.py b/lib/taurus/qt/qtgui/util/taurusactionfactory.py
index 53ced98..645167b 100644
--- a/lib/taurus/qt/qtgui/util/taurusactionfactory.py
+++ b/lib/taurus/qt/qtgui/util/taurusactionfactory.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -32,7 +32,6 @@ __docformat__ = 'restructuredtext'
 from taurus.core.util.log import Logger
 from taurus.core.util.singleton import Singleton
 from taurus.external.qt import Qt
-from taurus.qt.qtgui.resource import getThemeIcon
 
 import taurusaction
 
@@ -49,7 +48,7 @@ class ActionFactory(Singleton, Logger):
         self.call__init__(Logger, 'ActionFactory')
         self.actions = self.__getActions()
         self.menus = self.__getMenus()
-    
+
     def __getClasses(self, super_class):
         ret = {}
         klass_type = type(super_class)
@@ -60,18 +59,18 @@ class ActionFactory(Singleton, Logger):
             if (type(klass) == klass_type and issubclass(klass, super_class)):
                 ret[klass.menuID] = klass
         return ret
-    
+
     def __getActions(self):
         """Calculates the map of existing action classes"""
         return self.__getClasses(taurusaction.TaurusAction)
 
     def __getMenus(self):
-        """Calculates the map of existing menu classes""" 
+        """Calculates the map of existing menu classes"""
         return self.__getClasses(taurusaction.TaurusMenu)
 
     def getActions(self):
         return self.actions
-    
+
     def getMenus(self):
         return self.menus
 
@@ -86,29 +85,29 @@ class ActionFactory(Singleton, Logger):
         doc = xml.dom.minidom.parseString(data)
         m_node = doc.childNodes[0]
         return self.buildMenu(widget, m_node)
-    
+
     def buildAction(self, widget, a_node):
         if not a_node.hasAttribute('class'):
             return None
-        
+
         id = a_node.getAttribute('class')
         action = self.getNewAction(widget, id)
-        
+
         # if node has alternative label, display it instead
         if a_node.hasAttribute('label'):
             action.setText(a_node.getAttribute('label'))
-            
+
         if a_node.hasAttribute('checkable'):
             action.setCheckable(bool(a_node.getAttribute('checkable')))
-        
+
         if a_node.hasAttribute('icon'):
             icon = a_node.getAttribute('icon')
-            #TODO
-            #action.setIcon(icon)
+            # TODO
+            # action.setIcon(icon)
         return action
-    
+
     def buildMenu(self, widget, m_node):
-        menu = None 
+        menu = None
         if m_node.hasAttribute('class'):
             klass = self.menus.get(m_node.getAttribute('class'))
             if klass is None:
@@ -118,21 +117,21 @@ class ActionFactory(Singleton, Logger):
             menu = taurusaction.TaurusMenu(widget)
             menu.buildFromXML(m_node)
         return menu
-    
+
     def createAction(self, parent, text, shortcut=None, icon=None, tip=None,
                      toggled=None, triggered=None, data=None,
                      context=Qt.Qt.WindowShortcut):
         """Create a QAction"""
         action = Qt.QAction(text, parent)
         if triggered is not None:
-            parent.connect(action, Qt.SIGNAL("triggered()"), triggered)
+            action.triggered.connect(triggered)
         if toggled is not None:
-            parent.connect(action, Qt.SIGNAL("toggled(bool)"), toggled)
+            action.toggled.connect(toggled)
             action.setCheckable(True)
         if icon is not None:
             if isinstance(icon, (str, unicode)):
-                icon = getThemeIcon(icon)
-            action.setIcon( icon )
+                icon = Qt.QIcon.fromTheme(icon)
+            action.setIcon(icon)
         if shortcut is not None:
             action.setShortcut(shortcut)
         if tip is not None:
@@ -140,8 +139,8 @@ class ActionFactory(Singleton, Logger):
             action.setStatusTip(tip)
         if data is not None:
             action.setData(data)
-        #TODO: Hard-code all shortcuts and choose context=Qt.WidgetShortcut
+        # TODO: Hard-code all shortcuts and choose context=Qt.WidgetShortcut
         # (this will avoid calling shortcuts from another dockwidget
         #  since the context thing doesn't work quite well with these widgets)
         action.setShortcutContext(context)
-        return action
\ No newline at end of file
+        return action
diff --git a/lib/taurus/qt/qtgui/util/tauruscolor.py b/lib/taurus/qt/qtgui/util/tauruscolor.py
index eb450ef..3ddb262 100644
--- a/lib/taurus/qt/qtgui/util/tauruscolor.py
+++ b/lib/taurus/qt/qtgui/util/tauruscolor.py
@@ -2,35 +2,43 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 provides Qt color management for taurus"""
 
+__all__ = ["QtColorPalette",
+           "QT_DEVICE_STATE_PALETTE",
+           "QT_ATTRIBUTE_QUALITY_PALETTE",
+           ]
+
 __docformat__ = 'restructuredtext'
 
 from taurus.external.qt import Qt
 
 from taurus.core.util.colors import ColorPalette, \
     DEVICE_STATE_DATA, ATTRIBUTE_QUALITY_DATA
+from taurus.core.taurusbasetypes import AttrQuality
+from taurus.core.tango import DevState  # TODO: Tango-centric
+
 
 class QtColorPalette(ColorPalette):
 
@@ -44,7 +52,7 @@ class QtColorPalette(ColorPalette):
         self._qvariant_cache_bg = dict()
 
     def qbrush(self, stoq):
-        #print stoq
+        # print stoq
         """Returns the brush for the specified state or quality"""
         name = self._decoder(stoq)
 
@@ -58,7 +66,7 @@ class QtColorPalette(ColorPalette):
             if name == 'None':
                 b[name].setStyle(Qt.Qt.BDiagPattern)
 
-        return ( b[name], f[name] )
+        return (b[name], f[name])
 
     def qcolor(self, stoq):
         """Returns the color for the specified state or quality"""
@@ -72,7 +80,7 @@ class QtColorPalette(ColorPalette):
         if not b.has_key(name):
             b[name] = Qt.QColor(self.number(name))
 
-        return ( b[name], f[name] )
+        return (b[name], f[name])
 
     def qvariant(self, stoq):
         """Returns the color for the specified state or quality"""
@@ -81,13 +89,13 @@ class QtColorPalette(ColorPalette):
         f = self._qvariant_cache_fg
         b = self._qvariant_cache_bg
         if not f.has_key(name):
-            (back,fore) = self.qcolor(name)
+            (back, fore) = self.qcolor(name)
             f[name] = Qt.QVariant(fore)
             b[name] = Qt.QVariant(back)
 
-        return ( b[name], f[name] )
+        return (b[name], f[name])
 
-import PyTango
 
-QT_DEVICE_STATE_PALETTE = QtColorPalette(DEVICE_STATE_DATA, PyTango.DevState)
-QT_ATTRIBUTE_QUALITY_PALETTE = QtColorPalette(ATTRIBUTE_QUALITY_DATA, PyTango.AttrQuality)
+QT_DEVICE_STATE_PALETTE = QtColorPalette(DEVICE_STATE_DATA, DevState)
+QT_ATTRIBUTE_QUALITY_PALETTE = QtColorPalette(ATTRIBUTE_QUALITY_DATA,
+                                              AttrQuality)
diff --git a/lib/taurus/qt/qtgui/util/taurusropepatch.py b/lib/taurus/qt/qtgui/util/taurusropepatch.py
index 4c7a429..27dde8f 100644
--- a/lib/taurus/qt/qtgui/util/taurusropepatch.py
+++ b/lib/taurus/qt/qtgui/util/taurusropepatch.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -29,17 +29,20 @@ __all__ = ["apply"]
 
 __docformat__ = 'restructuredtext'
 
+
 def apply():
     """Monkey patching rope for better performances"""
     import rope
     if rope.VERSION not in ('0.9.3', '0.9.2'):
         raise ImportError, "rope %s can't be patched" % rope.VERSION
-    
-    # Patching pycore.PyCore, so that forced builtin modules (i.e. modules 
+
+    # Patching pycore.PyCore, so that forced builtin modules (i.e. modules
     # that were declared as 'extension_modules' in rope preferences)
     # will be indeed recognized as builtins by rope, as expected
     from rope.base import pycore
+
     class PatchedPyCore(pycore.PyCore):
+
         def get_module(self, name, folder=None):
             """Returns a `PyObject` if the module was found."""
             # check if this is a builtin module
@@ -49,15 +52,17 @@ def apply():
             module = self.find_module(name, folder)
             if module is None:
                 raise pycore.ModuleNotFoundError(
-                                            'Module %s not found' % name)
+                    'Module %s not found' % name)
             return self.resource_to_pyobject(module)
     pycore.PyCore = PatchedPyCore
-    
-    # Patching BuiltinFunction for the calltip/doc functions to be 
+
+    # Patching BuiltinFunction for the calltip/doc functions to be
     # able to retrieve the function signatures with forced builtins
     from rope.base import builtins, pyobjects
     from spyderlib.utils.dochelpers import getargs
+
     class PatchedBuiltinFunction(builtins.BuiltinFunction):
+
         def __init__(self, returned=None, function=None, builtin=None,
                      argnames=[], parent=None):
             builtins._BuiltinElement.__init__(self, builtin, parent)
@@ -71,17 +76,20 @@ def apply():
             self.function = function
     builtins.BuiltinFunction = PatchedBuiltinFunction
 
-    # Patching BuiltinName for the go to definition feature to simply work 
+    # Patching BuiltinName for the go to definition feature to simply work
     # with forced builtins
     from rope.base import libutils
     import inspect
+
     class PatchedBuiltinName(builtins.BuiltinName):
+
         def _pycore(self):
             p = self.pyobject
             while p.parent is not None:
                 p = p.parent
             if isinstance(p, builtins.BuiltinModule) and p.pycore is not None:
                 return p.pycore
+
         def get_definition_location(self):
             if not inspect.isbuiltin(self.pyobject):
                 _lines, lineno = inspect.getsourcelines(self.pyobject.builtin)
diff --git a/lib/taurus/qt/qtgui/util/taurusscreenshot.py b/lib/taurus/qt/qtgui/util/taurusscreenshot.py
index 8dea6e6..f83edc7 100644
--- a/lib/taurus/qt/qtgui/util/taurusscreenshot.py
+++ b/lib/taurus/qt/qtgui/util/taurusscreenshot.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -38,6 +38,7 @@ from taurus.core.util.log import Logger
 
 _LOGGER = None
 
+
 def _getLogger():
     global _LOGGER
     if _LOGGER is None:
@@ -46,7 +47,7 @@ def _getLogger():
 
 
 class GrabberThread(threading.Thread):
-    
+
     def __init__(self, widget, fileName, period):
         threading.Thread.__init__(self, name="Grabber")
         self.daemon = True
@@ -55,32 +56,34 @@ class GrabberThread(threading.Thread):
         self._period = period
         self._continue = True
         self._grabber = Grabber(widget, fileName)
-        
+
     def run(self):
         period = self._period
         while self._continue:
             self._grabber.grabTrigger()
             time.sleep(period)
-    
+
     def stop(self):
         self._continue = False
-    
+
 
 class Grabber(Qt.QObject, Logger):
-    
+
+    grab = Qt.pyqtSignal()
+
     def __init__(self, widget, fileName):
         Qt.QObject.__init__(self)
         Logger.__init__(self)
         self._widget = widget
         self._fileName = fileName
-        self.connect(self, Qt.SIGNAL("grab"), self.onGrab)
-    
+        self.grab.connect(self.onGrab)
+
     def grabTrigger(self):
-        self.emit(Qt.SIGNAL("grab"))
-        
+        self.grab.emit()
+
     def onGrab(self):
         Grabber._grabWidget(self._widget, self._fileName)
-    
+
     @staticmethod
     def _grabWidget(widget, fileName):
         _getLogger().debug("Grabbing widget to '%s':", fileName)
@@ -90,7 +93,7 @@ class Grabber(Qt.QObject, Logger):
                 from taurus.external.qt import QtSvg
                 generator = QtSvg.QSvgGenerator()
                 generator.setFileName(fileName)
-                generator.setSize(pixmap.size());
+                generator.setSize(pixmap.size())
                 if hasattr(generator, 'setViewBox'):
                     viewBox = Qt.QRect(Qt.QPoint(0, 0), pixmap.size())
                     generator.setViewBox(viewBox)
@@ -108,13 +111,13 @@ class Grabber(Qt.QObject, Logger):
         except:
             _getLogger().warning("Could not save file into '%s':", fileName,
                                  exc_info=1)
-    
+
     @staticmethod
     def grabWidget(widget, fileName, period=None):
         """Grabs the given widget into the given image filename. If period is
         not given (or given with None) means grab immediately once and return.
         If period is given and >0 means grab the image every period seconds
-        
+
         .. warning:
             this method **MUST** be called from the same thread which created
             the widget
@@ -132,5 +135,5 @@ class Grabber(Qt.QObject, Logger):
 
 def grabWidget(widget, fileName, period=None):
     return Grabber.grabWidget(widget, fileName, period=period)
-    
+
 grabWidget.__doc__ = Grabber.grabWidget.__doc__
diff --git a/lib/taurus/qt/qtgui/util/tauruswidget_template b/lib/taurus/qt/qtgui/util/tauruswidget_template
index 3cab2f0..db296b4 100644
--- a/lib/taurus/qt/qtgui/util/tauruswidget_template
+++ b/lib/taurus/qt/qtgui/util/tauruswidget_template
@@ -2,140 +2,135 @@
 
 """ module containing the Tau Widget: <_TauClass_> """
 
-from taurus.qt import QtGui, QtCore
+from taurus.qt import QtGui, QtCore, Qt
 import tau.core
 from tau.widget import TauBaseWidget
 
-class <_TauClass_>(<_SuperClass_>, TauBaseWidget):
+class < _TauClass_ > ( < _SuperClass_ > , TauBaseWidget):
     """ <_TauClass_> is a Tau widget designed to represent..."""
-    
-    #---------------------------------------------------------------------------
+
+    #-------------------------------------------------------------------------
     # Write your own code here to define the signals generated by this widget
     #
-    __pyqtSignals__ = ("modelChanged(const QString &)",)
-    
-    def __init__(self, parent = None, designMode = False):
+
+    def __init__(self, parent=None, designMode=False):
         name = self.__class__.__name__
-        
-        self.call__init__wo_kw(<_SuperClass_>, parent)
+
+        self.call__init__wo_kw(< _SuperClass_ > , parent)
         self.call__init__(TauBaseWidget, name, parent, designMode=designMode)
 
         self.defineStyle()
-    
+
     def defineStyle(self):
         """ Defines the initial style for the widget """
-        #-----------------------------------------------------------------------
+        #----------------------------------------------------------------------
         # Write your own code here to set the initial style of your widget
         #
         self.updateStyle()
 
     def sizeHint(self):
-        return <_SuperClass_>.sizeHint(self)
+        return < _SuperClass_ > .sizeHint(self)
 
     def minimumSizeHint(self):
-        return <_SuperClass_>.minimumSizeHint(self)
-    
+        return < _SuperClass_ > .minimumSizeHint(self)
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
     # TauBaseWidget over writing
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    
+
     def getModelClass(self):
-        #-----------------------------------------------------------------------
+        #----------------------------------------------------------------------
         # [MANDATORY]
         # Replace your own code here
         # ex.: return tau.core.Attribute
-        raise RuntimeError("Forgot to overwrite %s.getModelClass" % str(self)) 
-            
-    
+        raise RuntimeError("Forgot to overwrite %s.getModelClass" % str(self))
+
     def attach(self):
         """Attaches the widget to the model"""
-        
+
         if self.isAttached():
             return True
-        
-        #-----------------------------------------------------------------------
-        # Write your own code here before attaching widget to attribute connect 
+
+        #----------------------------------------------------------------------
+        # Write your own code here before attaching widget to attribute connect
         # the proper signal so that the first event is correctly received by the
         # widget
         #
         # Typical code is:
-        #self.connect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'), 
+        # self.connect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'),
         #             self.setTextValue)
-        
-        
+
         ret = TauBaseWidget.attach(self)
-        
+
         # by default enable/disable widget according to attach state
         self.setEnabled(ret)
         return ret
 
     def detach(self):
         """Detaches the widget from the model"""
-        
+
         TauBaseWidget.detach(self)
 
-        #-----------------------------------------------------------------------
-        # Write your own code here after detaching the widget from the model 
+        #----------------------------------------------------------------------
+        # Write your own code here after detaching the widget from the model
         #
         # Typical code is:
-        #self.emit(QtCore.SIGNAL('valueChangedDueToEvent(QString)'), 
+        # self.emit(QtCore.SIGNAL('valueChangedDueToEvent(QString)'),
         #          QtCore.QString(value_str))
-        #self.disconnect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'),
+        # self.disconnect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'),
         #                self.setTextValue)
-        
+
         # by default disable widget when dettached
         self.setEnabled(False)
 
     def eventReceived(self, src, type, data):
         """ eventReceived(src, TauEventType type, data) -> None
-        
+
             Called by the model when an event is fired.
-            
+
             Parameters:
-              src: Source of the event. Usually a tau.core.Attribute or 
+              src: Source of the event. Usually a tau.core.Attribute or
                    tau.core.Device object
               type: a TauEventType describing the type of event.
               data: A PyTango object with the event data. It can be None.
-                    - For TauEventType.change events is a PyTango.AttributeValue 
+                    - For TauEventType.change events is a PyTango.AttributeValue
                     object or None;
-                    - For TauEventType.attr_conf events is a 
+                    - For TauEventType.attr_conf events is a
                     PyTango.AttrConfEventData object or None.
             Return:
               None
         """
-        #-----------------------------------------------------------------------
+        #----------------------------------------------------------------------
         # Write your own code here to handle event
         pass
-    
-    #---------------------------------------------------------------------------
+
+    #-------------------------------------------------------------------------
     # [MANDATORY]
-    # Uncomment the following method if your superclass does not provide with a 
+    # Uncomment the following method if your superclass does not provide with a
     # isReadOnly() method or if you need to change its behavior
-    
-    #def isReadOnly(self):
+
+    # def isReadOnly(self):
     #    return True
-    
+
     def updateStyle(self):
-        #-----------------------------------------------------------------------
+        #----------------------------------------------------------------------
         # Write your own code here to update your widget style
-        
+
         # send a repaint in the end
         self.repaint()
-        
+
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-    # QT properties 
+    # QT properties
     #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
-    model = QtCore.pyqtProperty("QString", TauBaseWidget.getModel, 
-                                TauBaseWidget.setModel, 
+    model = QtCore.pyqtProperty("QString", TauBaseWidget.getModel,
+                                TauBaseWidget.setModel,
                                 TauBaseWidget.resetModel)
-                                
+
     useParentModel = QtCore.pyqtProperty("bool",
-                                         TauBaseWidget.getUseParentModel, 
+                                         TauBaseWidget.getUseParentModel,
                                          TauBaseWidget.setUseParentModel,
                                          TauBaseWidget.resetUseParentModel)
 
-    #---------------------------------------------------------------------------
+    #-------------------------------------------------------------------------
     # Write your own code here for your own widget properties
-    
-
diff --git a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
index 8a45c5f..26c407a 100644
--- a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
+++ b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py
@@ -2,29 +2,29 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-tauruswidgetfactory.py: 
+tauruswidgetfactory.py:
 """
 
 __all__ = ["TaurusWidgetFactory", "getWidgetsOfType"]
@@ -41,22 +41,24 @@ from taurus.core.util.singleton import Singleton
 
 import taurus.qt.qtgui.base
 
+
 def _getWidgetsOfType(widget, widgets, class_or_type_or_tuple):
-    
+
     if isinstance(widget, class_or_type_or_tuple):
         widgets.append(widget)
     for w in widget.children():
         if isinstance(w, Qt.QWidget):
             _getWidgetsOfType(w, widgets, class_or_type_or_tuple)
 
+
 def getWidgetsOfType(widget, class_or_type_or_tuple):
     """Returns all widgets in a hierarchy of a certain type
-    
+
     :param widget: the widget to be inspected
     :type widget: Qt.QWidget
     :param class-or-type-or-tuple: type to be checked
     :type class-or-type-or-tuple: type class or a tuple of type classes
-    
+
     :return: a sequence containning all widgets in the hierarchy that match the
              given type
     :rtype: seq<Qt.QWidget>"""
@@ -72,13 +74,13 @@ class TaurusWidgetFactory(Singleton, Logger):
     TaurusWidgetFactory is a singleton class so you can freely create new
     instances since they will all reference the same object.
     Usage::
-    
+
         from taurus.qt.qtgui.util import TaurusWidgetFactory
-        
+
         wf = TaurusWidgetFactory()
         print wf.getTaurusWidgetClassNames()"""
-        
-    skip_modules = ('widget', 'util', 'qtdesigner', 'uic')
+
+    skip_modules = ('widget', 'util', 'qtdesigner', 'uic', 'resource')
 
     def __init__(self):
         """ Initialization. Nothing to be done here for now."""
@@ -87,25 +89,24 @@ class TaurusWidgetFactory(Singleton, Logger):
         """Singleton instance initialization."""
         name = self.__class__.__name__
         self.call__init__(Logger, name)
-        
+
         path = os.path.dirname(os.path.abspath(__file__))
         path, tail = os.path.split(path)
-        self._taurus_widgets, self._qt_widgets = self._buildWidgets('taurus.qt.qtgui', path)
+        self._taurus_widgets, self._qt_widgets = self._buildWidgets(
+            'taurus.qt.qtgui', path)
         self._addExtraTaurusWidgets(self._taurus_widgets, self._qt_widgets)
 
-    def _buildWidgets(self, module_name, path, recursive = True):
+    def _buildWidgets(self, module_name, path, recursive=True):
         import taurus.qt.qtgui.base
-        
+
         if Qt.QApplication.instance() is None:
             app = Qt.QApplication([])
-            #raise Exception("Cannot build widget list without an instance of "\
-            #                "QApplication. Please create one before.")
 
         elems = os.listdir(path)
         taurus_ret, qt_ret = {}, {}
         if not '__init__.py' in elems:
             return taurus_ret, qt_ret
-        
+
         try:
             m = __import__(module_name, fromlist=['*'], level=0)
             dir_names = dir(m)
@@ -121,19 +122,20 @@ class TaurusWidgetFactory(Singleton, Logger):
                             taurus_ret[dir_name] = package, attr
                 except Exception, e:
                     pass
-        except Exception,e:
+        except Exception, e:
             return taurus_ret, qt_ret
-            
+
         if not recursive:
             return taurus_ret, qt_ret
-        
+
         for elem in elems:
             abs_elem = os.path.join(path, elem)
             if (not elem.startswith('.')) and os.path.isdir(abs_elem) and \
                (not elem in self.skip_modules):
                 m_name = os.path.splitext(elem)[0]
                 new_module_name = '%s.%s' % (module_name, m_name)
-                new_taurus_ret, new_qt_ret = self._buildWidgets(new_module_name, abs_elem, True)
+                new_taurus_ret, new_qt_ret = self._buildWidgets(
+                    new_module_name, abs_elem, True)
                 taurus_ret.update(new_taurus_ret)
                 qt_ret.update(new_qt_ret)
         return taurus_ret, qt_ret
@@ -145,7 +147,7 @@ class TaurusWidgetFactory(Singleton, Logger):
         designer_path = designer_path.split(os.path.pathsep)
         for path in designer_path:
             self._addExtraTaurusWidgetsPath(taurus_ret, qt_widgets, path)
-    
+
     def _addExtraTaurusWidgetsPath(self, taurus_ret, qt_widgets, path):
         self.debug("Trying extra taurus widgets in %s", path)
         path = os.path.abspath(path)
@@ -154,7 +156,8 @@ class TaurusWidgetFactory(Singleton, Logger):
         elems = os.listdir(path)
         for elem in elems:
             m_name, ext = os.path.splitext(elem)
-            if ext != '.py': continue
+            if ext != '.py':
+                continue
             try:
                 self.debug("Trying to find extra module %s", m_name)
                 f, fname, data = imp.find_module(m_name, [path])
@@ -180,30 +183,30 @@ class TaurusWidgetFactory(Singleton, Logger):
                             qt_info = attr.getQtDesignerPluginInfo()
                             taurus_ret[dir_name] = qt_info['module'], attr
                             qt_widgets[dir_name] = qt_info['module'], attr
-                            self.debug("registered taurus widget %s", dir_name) 
+                            self.debug("registered taurus widget %s", dir_name)
                 except Exception, e:
                     pass
-        
+
     def getWidgets(self):
         return self._qt_widgets
 
     def getTaurusWidgets(self):
         return self._taurus_widgets
-    
+
     def getWidgetClassNames(self):
         return self._qt_widgets.keys()
-    
+
     def getWidgetClasses(self):
-        return [ klass for mod_name, klass in self._qt_widgets.values()]
-    
+        return [klass for mod_name, klass in self._qt_widgets.values()]
+
     def getWidgetClass(self, name):
         return self._qt_widgets[name][1]
-    
+
     def getTaurusWidgetClassNames(self):
         return self._taurus_widgets.keys()
-    
+
     def getTaurusWidgetClasses(self):
-        return [ klass for mod_name, klass in self._taurus_widgets.values()]
-    
+        return [klass for mod_name, klass in self._taurus_widgets.values()]
+
     def getTaurusWidgetClass(self, name):
         return self._taurus_widgets.get(name)[1]
diff --git a/lib/taurus/qt/qtgui/util/tauruswidgettree.py b/lib/taurus/qt/qtgui/util/tauruswidgettree.py
index dbaecc4..77948d8 100644
--- a/lib/taurus/qt/qtgui/util/tauruswidgettree.py
+++ b/lib/taurus/qt/qtgui/util/tauruswidgettree.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -40,16 +40,18 @@ 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) 
+            _build_qobjects_as_dict(child, childs)
+
 
 def get_qobject_tree_as_dict(qobject=None):
-    
-    if qobject is None:    
+
+    if qobject is None:
         app = Qt.QApplication.instance()
         qobjects = app.topLevelWidgets()
     else:
@@ -61,18 +63,20 @@ def get_qobject_tree_as_dict(qobject=None):
 
     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]) 
+            _build_qobjects_as_list(child, node[1])
+
 
 def get_qobject_tree_as_list(qobject=None):
-    
-    if qobject is None:    
+
+    if qobject is None:
         app = Qt.QApplication.instance()
         qobjects = app.topLevelWidgets()
     else:
@@ -86,6 +90,7 @@ def get_qobject_tree_as_list(qobject=None):
 
 get_qobject_tree = get_qobject_tree_as_list
 
+
 def _get_qobject_str(qobject, representation):
     if representation == QObjectRepresentation.ClassName:
         return qobject.__class__.__name__
@@ -95,17 +100,19 @@ def _get_qobject_str(qobject, representation):
         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))        
+    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)
@@ -120,13 +127,13 @@ QR = QObjectRepresentation
 
 class TreeQObjecttItem(TaurusBaseTreeItem):
 
-    def __init__(self, model, data, parent = None):
+    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)  
+                _get_qobject_str(data, QR.ObjectName)
+            self.setData(0, dat)
 
 
 class TreeQObjectModel(TaurusBaseModel):
@@ -150,7 +157,7 @@ class TreeQObjectModel(TaurusBaseModel):
 
     def roleSize(self, taurus_role):
         return Qt.QSize(300, 70)
-    
+
     def roleToolTip(self, role):
         return "widget information"
 
@@ -168,26 +175,25 @@ class TreeQObjectModel(TaurusBaseModel):
         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],
+        "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, 
+        QBaseTreeWidget.__init__(self, parent, designMode=designMode,
                                  with_navigation_bar=with_navigation_bar,
                                  with_filter_widget=with_filter_widget,
                                  perspective=perspective, proxy=proxy)
@@ -218,10 +224,10 @@ def main():
     app = TaurusApplication()
 
     w = build_gui()
-    tree = TreeQObjectWidget(qobject_root=w)    
+    tree = TreeQObjectWidget(qobject_root=w)
     tree.show()
     #import pprint
-    #pprint.pprint(get_qobject_tree_str())
+    # pprint.pprint(get_qobject_tree_str())
     w.dumpObjectTree()
     app.exec_()
 
diff --git a/lib/taurus/qt/qtgui/util/test/__init__.py b/lib/taurus/qt/qtgui/util/test/__init__.py
index bfa1d38..856a864 100644
--- a/lib/taurus/qt/qtgui/util/test/__init__.py
+++ b/lib/taurus/qt/qtgui/util/test/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
diff --git a/lib/taurus/qt/qtgui/util/test/test_ui/__init__.py b/lib/taurus/qt/qtgui/util/test/test_ui/__init__.py
index c8c1e55..6f67525 100644
--- a/lib/taurus/qt/qtgui/util/test/test_ui/__init__.py
+++ b/lib/taurus/qt/qtgui/util/test/test_ui/__init__.py
@@ -2,28 +2,28 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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 package provides a set of taurus wiget utilities like color management, 
+"""This package provides a set of taurus wiget utilities like color management,
 configuration, actions."""
 
 from .test_ui import *
diff --git a/lib/taurus/qt/qtgui/util/test/test_ui/mywidget3/__init__.py b/lib/taurus/qt/qtgui/util/test/test_ui/mywidget3/__init__.py
index 9ffe6b5..0355fe6 100644
--- a/lib/taurus/qt/qtgui/util/test/test_ui/mywidget3/__init__.py
+++ b/lib/taurus/qt/qtgui/util/test/test_ui/mywidget3/__init__.py
@@ -2,33 +2,34 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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 taurus.external.qt import Qt
 from taurus.qt.qtgui.util.ui import UILoadable
-        
+
+
 @UILoadable
 class MyWidget3(Qt.QWidget):
-    
+
     def __init__(self, parent=None):
         Qt.QWidget.__init__(self, parent)
         self.loadUi()
diff --git a/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py b/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py
index 29d3b3e..c922293 100644
--- a/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py
+++ b/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -38,10 +38,10 @@ class UILoadableTestCase(unittest.TestCase):
     """
     Test cases for UILoadable decorator
     """
-    
+
     @UILoadable
     class MyWidget1(Qt.QWidget):
-        
+
         def __init__(self, parent=None):
             Qt.QWidget.__init__(self, parent)
             self.loadUi()
@@ -55,13 +55,13 @@ class UILoadableTestCase(unittest.TestCase):
             path = os.path.join(os.path.dirname(__file__), "ui", "mywidget2")
             self.loadUi(filename="mywidget2_custom.ui", path=path)
             self.ui.my_button.setText("This is MY2 button")
-        
+
     def setUp(self):
         app = Qt.QApplication.instance()
         if app is None:
             app = Qt.QApplication([])
         self.__app = app
-        
+
     def test_uiloadable_default(self):
         """Test UILoadable with default arguments"""
         widget = self.MyWidget1()
@@ -80,19 +80,20 @@ class UILoadableTestCase(unittest.TestCase):
         self.assertEquals(widget.ui.my_button.text(), "This is MY2 button",
                           "button text differs from expected")
 
-         
+
 class Bug151_TestCase(BaseWidgetTestCase, unittest.TestCase):
     '''Test for bug 151: https://sourceforge.net/p/tauruslib/tickets/151/'''
+
     def test_bug151(self):
         '''Check inheritance of UILoadable classes across packages (bug #151)
         '''
         class Bug151_Widget(MyWidget3):
-                pass 
+            pass
         try:
             Bug151_Widget()
         except:
             self.fail('Inheriting from UILoadable from another package fails')
-        
+
 
 def main():
     unittest.main()
diff --git a/lib/taurus/qt/qtgui/util/ui.py b/lib/taurus/qt/qtgui/util/ui.py
index 0c93973..d22ef8d 100644
--- a/lib/taurus/qt/qtgui/util/ui.py
+++ b/lib/taurus/qt/qtgui/util/ui.py
@@ -2,29 +2,33 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
 """utilities to load ui files for widgets"""
 
+__all__ = ["loadUi",
+           "UILoadable",
+           ]
+
 import os
 import sys
 import functools
@@ -55,9 +59,9 @@ def loadUi(obj, filename=None, path=None, with_ui=None):
                  [default: None, meaning calculate path with algorithm explained
                  before]
     :type path: str
-    :param with_ui: if True, the objects defined in the ui file will be 
+    :param with_ui: if True, the objects defined in the ui file will be
                     accessible as submembers of an ui member of the widget. If
-                    False, such objects will directly be members of the widget. 
+                    False, such objects will directly be members of the widget.
     :type with_ui: bool
     """
     if path is None:
@@ -82,7 +86,8 @@ def loadUi(obj, filename=None, path=None, with_ui=None):
             delattr(obj, member_name)
     else:
         uic.loadUi(full_name, baseinstance=obj)
-        
+
+
 def UILoadable(klass=None, with_ui=None):
     """
     A class decorator intended to be used in a Qt.QWidget to make its UI
@@ -90,13 +95,13 @@ def UILoadable(klass=None, with_ui=None):
     This decorator will add a :func:`loadUi` method to the decorated class and
     optionaly a property with a name given by *with_ui* parameter.
 
-    The folowing example assumes the existence of the ui file 
+    The folowing example assumes the existence of the ui file
     :file:`<my_widget_dir>/ui/MyWidget.ui` which is a QWidget panel with *at
     least* a QPushButton with objectName *my_button* ::
 
         from taurus.external.qt import Qt
         from taurus.qt.qtgui.util.ui import UILoadable
-        
+
         @UILoadable
         class MyWidget(Qt.QWidget):
 
@@ -110,10 +115,10 @@ def UILoadable(klass=None, with_ui=None):
     member *_ui* ::
 
         import os.path
-        
+
         from taurus.external.qt import Qt
         from taurus.qt.qtgui.util.ui import UILoadable
-        
+
         @UILoadable(with_ui="_ui")
         class MyWidget(Qt.QWidget):
 
@@ -136,7 +141,7 @@ def UILoadable(klass=None, with_ui=None):
 
             @UILoadable(with_ui="_ui")
             class MyWidget(Qt.QWidget):
- 
+
                 def __init__(self, parent=None):
                     Qt.QWidget.__init__(self, parent)
                     self.my_button = "hello"
@@ -160,16 +165,16 @@ def UILoadable(klass=None, with_ui=None):
         if path is None:
             path = klass_path
         return loadUi(self, filename=filename, path=path, with_ui=with_ui)
-    
+
     klass.loadUi = _loadUi
     return klass
 
 
 def main():
     from taurus.qt.qtgui.application import TaurusApplication
-    
+
     app = TaurusApplication([])
-    
+
     @UILoadable(with_ui="ui")
     class A(Qt.QWidget):
 
@@ -178,10 +183,10 @@ def main():
             import taurus.qt.qtgui.panel.ui
             path = os.path.dirname(taurus.qt.qtgui.panel.ui.__file__)
             self.loadUi(filename='TaurusMessagePanel.ui', path=path)
-    
+
     gui = A()
     gui.show()
     app.exec_()
-    
+
 if __name__ == "__main__":
     main()
diff --git a/lib/taurus/qt/qtgui/util/validator.py b/lib/taurus/qt/qtgui/util/validator.py
new file mode 100755
index 0000000..598e085
--- /dev/null
+++ b/lib/taurus/qt/qtgui/util/validator.py
@@ -0,0 +1,122 @@
+#############################################################################
+##
+# This file is part of Taurus
+##
+# http://taurus-scada.org
+##
+# 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__ = ["PintValidator"]
+
+from taurus.external.qt import Qt
+from taurus.external.pint import (Quantity, DimensionalityError, UR)
+
+
+class PintValidator(Qt.QValidator):
+    """A QValidator for pint Quantities"""
+    _top = None
+    _bottom = None
+    _implicit_units = None
+
+    @property
+    def top(self):
+        """
+        :return: (Quantity or None) maximum accepted or None if it is not
+                 enforced
+        """
+        return self._top
+
+    def setTop(self, top):
+        """
+        Set maximum limit
+
+        :param top: (Quantity or None) maximum acceptable value or None if it is
+                    not to be enforced
+        """
+        self._top = Quantity(top)
+
+    @property
+    def units(self):
+        """
+        :return: (pint.Unit or None) base units or None if it should not
+                 be enforced
+        """
+        return self._implicit_units
+
+    def setUnits(self, units):
+        """
+        Set implicit units. They will be assumed when the text does not explicit
+        the unit. They will also be used for dimensionality coherence checks.
+
+        :param units: (pint.Unit or None). The implicit unit. If None, implicit
+                      dimension is "dimensionless" and no dimensionality checks
+                      will be performed (other than those inherent to range
+                      enforcement)
+        """
+        self._implicit_units = units
+
+    @property
+    def bottom(self):
+        """
+        :return: (Quantity or None) minimum accepted or None if it is not
+                 enforced
+        """
+        return self._bottom
+
+    def setBottom(self, bottom):
+        """
+        Set minimum limit
+
+        :param bottom: (Quantity or None) minimum acceptable value or None if it
+                       is not to be enforced
+        """
+        self._bottom = Quantity(bottom)
+
+    def _validate(self, input, pos):
+        """Reimplemented from :class:`QValidator` to validate if the input
+        string is a representation of a quantity within the set bottom and top
+        limits
+        """
+        try:
+            q = Quantity(input)
+        except:
+            return Qt.QValidator.Intermediate, input, pos
+        if self._implicit_units is not None:
+            if q.dimensionless:
+                # "cast" to implicit units
+                q = Quantity(q.magnitude, self.units)
+            # check coherence with implicit units
+            elif self._implicit_units.dimensionality != q.dimensionality:
+                return Qt.QValidator.Intermediate, input, pos
+        try:
+            if self.bottom is not None and q < self.bottom:
+                return Qt.QValidator.Intermediate, input, pos
+            if self.top is not None and q > self.top:
+                return Qt.QValidator.Intermediate, input, pos
+        except DimensionalityError:
+            return Qt.QValidator.Intermediate, input, pos
+        return Qt.QValidator.Acceptable, input, pos
+
+    def _validate_oldQt(self, input, pos):
+        """Old Qt (v4.4.) -compatible implementation of validate"""
+        state, _, pos = self._validate(input, pos)
+        return state, pos
+
+    # select the appropriate implementation of validate. See:
+    # https://www.mail-archive.com/pyqt@riverbankcomputing.com/msg26344.html
+    validate = Qt.PYQT_QSTRING_API_1 and _validate_oldQt or _validate
diff --git a/lib/taurus/qt/qtgui/util/widgetgen.py b/lib/taurus/qt/qtgui/util/widgetgen.py
index 757950a..de12538 100644
--- a/lib/taurus/qt/qtgui/util/widgetgen.py
+++ b/lib/taurus/qt/qtgui/util/widgetgen.py
@@ -2,41 +2,44 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
 """
-widgetgen.py: 
+widgetgen.py:
 """
 
 #!/usr/bin/env python
 
-import os, sys
+import os
+import sys
 
-usage = "usage: %s <widget class name> <widget super class> <output file name> [<qt designer plugin file>]" % os.path.basename(sys.argv[0])
+usage = "usage: %s <widget class name> <widget super class> <output file name> [<qt designer plugin file>]" % os.path.basename(sys.argv[
+                                                                                                                               0])
 
 DftModule = "taurus.widget"
 DftIconFilename = "label.png"
 DftIsContainer = str(False)
 
+
 def go(class_name, super_class, output_name):
 
     path = ''
@@ -64,13 +67,13 @@ def go(class_name, super_class, output_name):
         o = o.replace('<_IconFileName_>', DftIconFilename)
         o = o.replace('<_Container_>', DftIsContainer)
         output.write(o)
-    
+
     input.close()
     output.close()
-    
+
 
 def go_with_designer(class_name, super_class, output_name, plugin_output_name):
-    
+
     go(class_name, super_class, output_name)
 
     path = ''
@@ -78,8 +81,9 @@ def go_with_designer(class_name, super_class, output_name, plugin_output_name):
         path = os.path.dirname(__file__)
     except:
         pass
-    input_name = os.path.realpath(path) + '/tauruswidget_qtdesignerplugin_template'
-    
+    input_name = os.path.realpath(
+        path) + '/tauruswidget_qtdesignerplugin_template'
+
     try:
         output = open(plugin_output_name, 'w')
     except:
@@ -90,10 +94,10 @@ def go_with_designer(class_name, super_class, output_name, plugin_output_name):
     except:
         output.close()
         raise
-    
+
     for s in input:
-        o = s.replace('<_SuperClass_>',super_class)
-        o = o.replace('<_TaurusClass_>',class_name)
+        o = s.replace('<_SuperClass_>', super_class)
+        o = o.replace('<_TaurusClass_>', class_name)
         o = o.replace('<_Module_>', DftModule)
         o = o.replace('<_IconFileName_>', DftIconFilename)
         o = o.replace('<_Container_>', DftIsContainer)
@@ -101,14 +105,13 @@ def go_with_designer(class_name, super_class, output_name, plugin_output_name):
 
     input.close()
     output.close()
-    
+
 if __name__ == "__main__":
-    
+
     argc = len(sys.argv)
     if argc < 4:
         print usage
     elif argc == 4:
-        go(sys.argv[1],sys.argv[2],sys.argv[3])
+        go(sys.argv[1], sys.argv[2], sys.argv[3])
     else:
-        go_with_designer(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4])
-        
\ No newline at end of file
+        go_with_designer(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
diff --git a/lib/taurus/qt/qtopengl/__init__.py b/lib/taurus/qt/qtopengl/__init__.py
deleted file mode 100644
index 9afdcc0..0000000
--- a/lib/taurus/qt/qtopengl/__init__.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""The taurus.qt.qtopengl submodule. It contains QtOpenGL-specific part of taurus"""
-
-__docformat__ = 'restructuredtext'
diff --git a/lib/taurus/qt/uic/__init__.py b/lib/taurus/qt/uic/__init__.py
deleted file mode 100644
index 1130eca..0000000
--- a/lib/taurus/qt/uic/__init__.py
+++ /dev/null
@@ -1,219 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""The taurus.qt.uic submodule. It contains uic tools"""
-
-__all__ = ["tau2taurus", "resolve_inheritance"]
-
-__docformat__ = 'restructuredtext'
-
-import os
-import sys
-import optparse
-import lxml.etree
-
-import taurus.qt.qtgui.util
-from taurus.external.qt import Qt
-
-import tau2taurus_map
-
-def print_tau2taurus_map(class_map):
-    """
-    Prints the dictionary assuming it was built by reading a tau2taurus CSV file
-    
-    :param class_map: the dictionary containing tau2taurus information
-    :type class_map: dict
-    """
-    for old_mod, v in class_map.items():
-        for old_class, data in v.items():
-            new_mod, new_class = data
-            print "%s.%s -> %s.%s" % (old_mod,old_class,new_mod,new_class) 
-
-def tau2taurus(xml_source):
-    """
-    Replaces tau occurences with taurus using a CSV table file.
-    
-    :param xml_source: xml object
-    :type xml_source: lxml.etree.Element
-    :return: the xml object transformed
-    :rtype: lxml.etree.Element
-    """
-    
-    class_map = tau2taurus_map.TAU_2_TAURUS_MAP
-    custom_widgets = xml_source.findall(".//customwidget")
-    widget_factory = taurus.qt.qtgui.util.TaurusWidgetFactory()
-    widget_klasses = widget_factory.getWidgets()
-    
-    new_custom_widget_name_list = []
-    new_custom_widget_node_list = []
-    
-    for custom_widget in custom_widgets:
-        header_node = custom_widget.find("header")
-        class_node = custom_widget.find("class")
-        extends_node = custom_widget.find("extends")
-        header_name = header_node.text
-        class_name = class_node.text
-        extends_name = extends_node.text
-        
-        # non tau widget... do nothing
-        if not header_name.startswith("tau."):
-            new_custom_widget_name_list.append(class_name)
-            new_custom_widget_node_list.append(custom_widget)
-            continue
-        
-        mod_dict = class_map.get(header_name)
-        if mod_dict is None:
-            print("tau module '%s' not found in map_file. Aborting..." % header_name)
-            sys.exit(1)
-        
-        class_info = mod_dict.get(class_name)
-        if class_info is None:
-            print("tau class '%s' in module '%s' not found in map_file. Aborting..." % (class_name,
-                header_name))
-            sys.exit(2)
-        
-        new_class_name = class_info[1]
-        new_widget_info = widget_klasses[new_class_name]
-        new_mod_name, widget_klass = new_widget_info
-        new_super_name = widget_klass.__base__.__name__
-        
-        print("replacing reference to %s.%s(%s) with %s.%s(%s)" % (header_name, 
-            class_name, extends_name, new_mod_name, new_class_name, new_super_name))
-    
-        if class_name != new_class_name:
-            widgets = xml_source.findall(".//widget[@class='%s']" % class_name)
-            for widget in widgets:
-                print("\treplacing widget %s (%s) with %s" % (class_name, 
-                    widget.get("name"), new_class_name))
-                widget.set("class", new_class_name)
-        
-        if new_class_name in new_custom_widget_name_list:
-            continue
-        
-        print("\treplacing customWidget node %s.%s with %s.%s" % (header_name,
-            class_name, new_mod_name, new_class_name))
-    
-        new_custom_widget_node = lxml.etree.Element("customwidget")
-        class_node = lxml.etree.SubElement(new_custom_widget_node, "class")
-        extends_node = lxml.etree.SubElement(new_custom_widget_node, "extends")
-        header_node = lxml.etree.SubElement(new_custom_widget_node, "header")
-
-        header_node.text = new_mod_name
-        class_node.text = new_class_name
-        extends_node.text = new_super_name
-        new_custom_widget_name_list.append(new_class_name)
-        new_custom_widget_node_list.append(new_custom_widget_node)
-
-    if len(new_custom_widget_node_list) > 0:
-        custom_widgets_node = xml_source.find(".//customwidgets")
-        if custom_widgets_node is None:
-            ui_node = xml_source.getroot()
-            custom_widgets_node = lxml.etree.SubElement(ui_node, "customwidgets")
-        custom_widgets_node.clear() # remove all children
-        custom_widgets_node.extend(new_custom_widget_node_list)
-
-    return xml_source
-
-def resolve_inheritance(xml_source):
-    """
-    Resolves custom widget inheritance.
-    
-    :param xml_source: xml object
-    :type xml_source: lxml.etree.Element
-    :return: the xml object transformed
-    :rtype: lxml.etree.Element
-    """
-    
-    custom_widgets = xml_source.findall(".//customwidget")
-    widget_factory = taurus.qt.qtgui.util.TaurusWidgetFactory()
-    widget_klasses = widget_factory.getWidgets()
-    custom_widget_list = xml_source.xpath(".//customwidget/class/text()")
-    
-    new_custom_widgets = []
-    for custom_widget in custom_widgets:
-        class_node = custom_widget.find("class")
-        class_name = class_node.text
-        if not class_name in widget_klasses:
-            continue
-        extends_node = custom_widget.find("extends")
-        super_name = extends_node.text
-        if super_name in custom_widget_list:
-            continue
-        if super_name in dir(Qt):
-            continue
-        if super_name not in widget_klasses:
-            xml = _build_plain_widget(super_name)
-        else:
-            module_name, widget_klass = widget_klasses[super_name]
-            xml = _build_widget(module_name, widget_klass, widget_klasses, custom_widget_list)
-        new_custom_widgets.extend(xml)
-    
-    if len(new_custom_widgets) > 0:
-        custom_widgets_node = xml_source.find(".//customwidgets")
-        if custom_widgets_node is None:
-            ui_node = xml_source.getroot()
-            custom_widgets_node = lxml.etree.SubElement(ui_node, "customwidgets")
-        custom_widgets_node.extend(new_custom_widgets)
-    return xml_source
-
-def _build_plain_widget(widget_klass_name):
-    custom_widget_node = lxml.etree.Element("customwidget")
-    ret = [ custom_widget_node ]
-    class_node = lxml.etree.SubElement(custom_widget_node, "class")
-    header_node = lxml.etree.SubElement(custom_widget_node, "header")
-    
-    class_node.text = widget_klass_name
-    header_node.text = ""
-    return ret
-
-def _build_widget(module_name, widget_klass, widget_klasses, existing_widgets):
-    """Builds a set of "customwidget" xml nodes necessary for the given widget"""
-    
-    custom_widget_node = lxml.etree.Element("customwidget")
-    ret = [ custom_widget_node ]
-    class_node = lxml.etree.SubElement(custom_widget_node, "class")
-    extends_node = lxml.etree.SubElement(custom_widget_node, "extends")
-    header_node = lxml.etree.SubElement(custom_widget_node, "header")
-
-    widget_klass_name = widget_klass.__name__
-    widget_super_klass = widget_klass.__base__
-    widget_super_klass_name = widget_super_klass.__name__
-    
-    header_node.text = module_name
-    class_node.text = widget_klass_name
-    extends_node.text = widget_super_klass_name
-    
-    existing_widgets.append(widget_klass_name)
-    
-    if widget_super_klass_name not in widget_klasses and widget_super_klass_name not in dir(Qt):
-        new_custom_widget_nodes = _build_plain_widget(widget_super_klass_name)
-        ret.extend(new_custom_widget_nodes)
-    else:
-        if widget_super_klass_name in widget_klasses and widget_super_klass_name not in existing_widgets:
-            super_module_name, super_klass = widget_klasses[widget_super_klass_name]
-            new_custom_widget_nodes = _build_widget(super_module_name, super_klass, widget_klasses, existing_widgets)
-            ret.extend(new_custom_widget_nodes)
-    
-    return ret
\ No newline at end of file
diff --git a/lib/taurus/qt/uic/pyuic4/taurus.py b/lib/taurus/qt/uic/pyuic4/taurus.py
deleted file mode 100644
index 9c616e6..0000000
--- a/lib/taurus/qt/uic/pyuic4/taurus.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-# if pluginType is CW_FILTER, the plugin loader will call the getFilter
-# method, which must be defined
-pluginType = CW_FILTER
-
-# the variables CW_FILTER, MATCH and NO_MATCH are inserted into the
-# local namespace by the plugin loader
-
-# getFilter must return a callable that accepts three arguments.
-# The filter will be called with widget name, base class name and
-# module name as given in the UI file
-# the filter must return a tuple
-# (match_result, data)
-# If the filter matches, "match_result" is MATCH and "data"
-# contains the modified argument tuple
-# In the other case, "match_result" is NO_MATCH, and data is ignored
-
-# Any other result will load to an error and a program exit
-
-def getFilter():
-    import taurus.qt.qtgui.util
-    WF = taurus.qt.qtgui.util.TaurusWidgetFactory
-    wf = WF()
-    taurus_widgets = wf.getWidgets()
-        
-    def _taurusfilter(widgetname, baseclassname, module):
-        if widgetname in taurus_widgets:
-            return (MATCH, (widgetname, baseclassname, taurus_widgets[widgetname][0]))
-        else:
-            return (NO_MATCH, None)
-         
-    return _taurusfilter
\ No newline at end of file
diff --git a/lib/taurus/qt/uic/tau2taurus_map.py b/lib/taurus/qt/uic/tau2taurus_map.py
deleted file mode 100644
index ae082d1..0000000
--- a/lib/taurus/qt/uic/tau2taurus_map.py
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""The taurus.qt.uic submodule. It contains uic tools"""
-
-__all__ = [""]
-
-__docformat__ = 'restructuredtext'
-
-TAU_2_TAURUS_LIST = [
-["tau.widget","AbstractGraphicsFactory","taurus.qt.qtgui.graphic","TaurusBaseGraphicsFactory"],
-["tau.widget","ActionFactory","taurus.qt.qtgui.util","ActionFactory"],
-["tau.widget","BaseConfigurableClass","taurus.qt.qtcore.configuration","BaseConfigurableClass"],
-["tau.widget","Led","taurus.qt.qtgui.display","QLed"],
-["tau.widget","LedColor","taurus.qt.qtgui.display","LedColor"],
-["tau.widget","LedSize","taurus.qt.qtgui.display","LedSize"],
-["tau.widget","LedStatus","taurus.qt.qtgui.display","LedStatus"],
-["tau.widget","QT_ATTRIBUTE_QUALITY_PALETTE","taurus.qt.qtgui.util","QT_ATTRIBUTE_QUALITY_PALETTE"],
-["tau.widget","QT_DEVICE_STATE_PALETTE","taurus.qt.qtgui.util","QT_DEVICE_STATE_PALETTE"],
-["tau.widget","Release","taurus.core","Release"],
-["tau.widget","TauAttrForm","taurus.qt.qtgui.panel","TaurusAttrForm"],
-["tau.widget","TauAttrListComboBox","taurus.qt.qtgui.input","TaurusAttrListComboBox"],
-["tau.widget","TauBaseComponent","taurus.qt.qtgui.base","TaurusBaseComponent"],
-["tau.widget","TauBaseConfigurableClass","None","None"],
-["tau.widget","TauBaseContainer","taurus.qt.qtgui.container","TaurusBaseContainer"],
-["tau.widget","TauBaseWidget","taurus.qt.qtgui.base","TaurusBaseWidget"],
-["tau.widget","TauBaseWritableWidget","taurus.qt.qtgui.base","TaurusBaseWritableWidget"],
-["tau.widget","TauBoolLed","taurus.qt.qtgui.display","TaurusLed"],
-["tau.widget","TauButtonBox","taurus.qt.qtgui.button","QButtonBox"],
-["tau.widget","TauCircularGauge","taurus.qt.qtgui.gauge","TaurusCircularGauge"],
-["tau.widget","TauClassTable","None","None"],
-["tau.widget","TauCommandButton","taurus.qt.qtgui.button","TaurusCommandButton"],
-["tau.widget","TauCommandsForm","taurus.qt.qtgui.panel","TaurusCommandsForm"],
-["tau.widget","TauConfigLabel","taurus.qt.qtgui.display","TaurusLabel"],
-["tau.widget","TauConfigLineEdit","taurus.qt.qtgui.input","TaurusConfigLineEdit"],
-["tau.widget","TauDevTree","taurus.qt.qtgui.tree","TaurusDevtree"],
-["tau.widget","TauEllipseStateItem","taurus.qt.qtgui.graphic","TaurusEllipseStateItem"],
-["tau.widget","TauForm","taurus.qt.qtgui.panel","TaurusForm"],
-["tau.widget","TauFrame","taurus.qt.qtgui.container","TaurusFrame"],
-["tau.widget","TauGraphicsAttributeItem","taurus.qt.qtgui.graphic","TaurusGraphicsAttributeItem"],
-["tau.widget","TauGraphicsItem","taurus.qt.qtgui.graphic","TaurusGraphicsItem"],
-["tau.widget","TauGraphicsScene","taurus.qt.qtgui.graphic","TaurusGraphicsScene"],
-["tau.widget","TauGraphicsStateItem","taurus.qt.qtgui.graphic","TaurusGraphicsStateItem"],
-["tau.widget","TauGraphicsView","taurus.qt.qtgui.graphic","TaurusGraphicsView"],
-["tau.widget","TauGrid","taurus.qt.qtgui.table","TaurusGrid"],
-["tau.widget","TauGroupBox","taurus.qt.qtgui.container","TaurusGroupBox"],
-["tau.widget","TauGroupStateItem","taurus.qt.qtgui.graphic","TaurusGroupStateItem"],
-["tau.widget","TauJDrawSynopticsView","taurus.qt.qtgui.graphic","TaurusJDrawSynopticsView"],
-["tau.widget","TauLCDValue","taurus.qt.qtgui.display","TaurusLCD"],
-["tau.widget","TauLauncherButton","taurus.qt.qtgui.button","TaurusLauncherButton"],
-["tau.widget","TauLimitSwitch","taurus.qt.qgui.display","TaurusLed"],
-["tau.widget","TauLinearGauge","taurus.qt.qtgui.gauge","TaurusLinearGauge"],
-["tau.widget","TauLoggerTable","taurus.qt.qtgui.table","TaurusLoggerTable"],
-["tau.widget","TauLoggerWidget","taurus.qt.qtgui.table","TaurusLoggerWidget"],
-["tau.widget","TauLogo","taurus.qt.qtgui.display","QLogo"],
-["tau.widget","TauMainWindow","taurus.qt.qtgui.container","TaurusMainWindow"],
-["tau.widget","TauPolygonStateItem","taurus.qt.qtgui.graphic","TaurusPolygonStateItem"],
-["tau.widget","TauPropTable","taurus.qt.qtgui.table","TaurusPropTable"],
-["tau.widget","TauQueryComboBox","None","None"],
-["tau.widget","TauRectStateItem","taurus.qt.qtgui.graphic","TaurusRectStateItem"],
-["tau.widget","TauScrollArea","taurus.qt.qtgui.container","TaurusScrollArea"],
-["tau.widget","TauStateLabel","taurus.qt.qtgui.display","TaurusLabel"],
-["tau.widget","TauStateLed","taurus.qt.qtgui.display","TaurusLed"],
-["tau.widget","TauTextAttributeItem","taurus.qt.qtgui.graphic","TaurusTextAttributeItem"],
-["tau.widget","TauTextStateItem","taurus.qt.qtgui.graphic","TaurusTextStateItem"],
-["tau.widget","TauValue","taurus.qt.qtgui.panel","TaurusValue"],
-["tau.widget","TauValueCheckBox","taurus.qt.qtgui.input","TaurusValueCheckBox"],
-["tau.widget","TauValueComboBox","taurus.qt.qtgui.input","TaurusValueComboBox"],
-["tau.widget","TauValueLabel","taurus.qt.qtgui.display","TaurusLabel"],
-["tau.widget","TauValueLineEdit","taurus.qt.qtgui.input","TaurusValueLineEdit"],
-["tau.widget","TauValueSpinBox","taurus.qt.qtgui.input","TaurusValueSpinBox"],
-["tau.widget","TauValuesFrame","taurus.qt.qtgui.container","TaurusValuesFrame"],
-["tau.widget","TauValuesTable","taurus.qt.qtgui.table","TaurusValuesTable"],
-["tau.widget","TauWheelEdit","taurus.qt.qtgui.input","TaurusWheelEdit"],
-["tau.widget","TauWidget","taurus.qt.qtgui.container","TaurusWidget"],
-["tau.widget","TauWidgetFactory","taurus.qt.qtgui.util","TaurusWidgetFactory"],
-["tau.widget.actions","AttributeAllConfigAction","taurus.qt.qtgui.util","AttributeAllConfigAction"],
-["tau.widget.actions","AttributeDisplayAction","taurus.qt.qtgui.util","AttributeDisplayAction"],
-["tau.widget.actions","AttributeHistoryAction","taurus.qt.qtgui.util","AttributeHistoryAction"],
-["tau.widget.actions","AttributeImageDisplayAction","taurus.qt.qtgui.util","AttributeImageDisplayAction"],
-["tau.widget.actions","AttributeMenu","taurus.qt.qtgui.util","AttributeMenu"],
-["tau.widget.actions","AttributeMonitorDeviceAction","taurus.qt.qtgui.util","AttributeMonitorDeviceAction"],
-["tau.widget.actions","AttributeRangesAction ","taurus.qt.qtgui.util","AttributeRangesAction "],
-["tau.widget.actions","AttributeUnitsAction","taurus.qt.qtgui.util","AttributeUnitsAction"],
-["tau.widget.actions","ConfigurationMenu","taurus.qt.qtgui.util","ConfigurationMenu"],
-["tau.widget.actions","SeparatorAction","taurus.qt.qtgui.util","SeparatorAction"],
-["tau.widget.actions","TauAction","taurus.qt.qtgui.util","TauAction"],
-["tau.widget.actions","TauMenu","taurus.qt.qtgui.util","TauMenu"],
-["tau.widget.configbrowser","ConfigViewer","taurus.qt.qtgui.panel","QConfigViewer"],
-["tau.widget.dialog","AttrChooser","taurus.qt.qtgui.panel","TaurusAttributeChooser"],
-["tau.widget.dialog","DataExportDlg","taurus.qt.qtgui.panel","QDataExportDialog"],
-["tau.widget.dialog","RawDataWidget","taurus.qt.qtgui.panel","QRawDataWidget"],
-["tau.widget.edit","WheelEdit","taurus.qt.qtgui.input","QWheelEdit"],
-["tau.widget.qwt","TauArrayEditor","taurus.qt.qtgui.plot","TaurusArrayEditor"],
-["tau.widget.qwt","TauPlot","taurus.qt.qtgui.plot","TaurusPlot"],
-["tau.widget.qwt","TauTrend","taurus.qt.qtgui.plot","TaurusTrend"],
-["tau.widget.utils","initTauQtLogger","taurus.qt.qtcore.util","initTaurusQtLogger"],
-["tau.widget.utils","getQtLogger","taurus.qt.qtcore.util","getQtLogger"],
-["tau.widget.extra_xterm","XTermWidget","taurus.qt.qtgui.extra_xterm","QXTermWidget"],
-["tau.widget.extra_tauservers","TauServersWidget","taurus.qt.qtgui.extra_tauservers","TaurusServersWidget"],
-["tau.widget.extra_motor","TauMotorH","taurus.qt.qtgui.extra_pool","TaurusMotorH"],
-["tau.widget.extra_motor","TauMotorH2","taurus.qt.qtgui.extra_pool","TaurusMotorH2"],
-["tau.widget.extra_motor","TauMotorV","taurus.qt.qtgui.extra_pool","TaurusMotorV"],
-["tau.widget.extra_motor","TauMotorV2","taurus.qt.qtgui.extra_pool","TaurusMotorV2"],
-["tau.widget.extra_motor","PoolMotorSlim","taurus.qt.qtgui.extra_pool","PoolMotorSlim"],
-["tau.widget.macroexecutor","TauMacroExecutorWidget","taurus.qt.qtgui.extra_macroexecutor","TaurusMacroExecutorWidget"],
-["tau.widget.macroexecutor","TauMacroExecutor","taurus.qt.qtgui.extra_macroexecutor","TaurusMacroExecutor"],
-["tau.widget.macroexecutor","TauSequencer","taurus.qt.qtgui.extra_macroexecutor","TaurusSequencer"],
-["tau.widget.macroexecutor","TauMacroConfigurationDialog","taurus.qt.qtgui.extra_macroexecutor","TaurusMacroConfigurationDialog"],
-["tau.widget.macroexecutor","TauMacroDescriptionViewer","taurus.qt.qtgui.extra_macroexecutor","TaurusMacroDescriptionViewer"],
-["tau.widget.macroexecutor","DoorOutput","taurus.qt.qtgui.extra_macroexecutor","DoorOutput"],
-["tau.widget.macroexecutor","DoorDebug","taurus.qt.qtgui.extra_macroexecutor","DoorDebug"],
-["tau.widget.macroexecutor","DoorResult","taurus.qt.qtgui.extra_macroexecutor","DoorResult"],
-]
-
-TAU_2_TAURUS_MAP = {}
-for old_mod, old_klass, new_mod, new_klass in TAU_2_TAURUS_LIST:
-    item = TAU_2_TAURUS_MAP.get(old_mod)
-    if item is None:
-        item = {}
-        TAU_2_TAURUS_MAP[old_mod] = item
-    item[old_klass] = new_mod, new_klass
-    
diff --git a/lib/taurus/tauruscustomsettings.py b/lib/taurus/tauruscustomsettings.py
old mode 100644
new mode 100755
index 971e9c2..11c7763
--- a/lib/taurus/tauruscustomsettings.py
+++ b/lib/taurus/tauruscustomsettings.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -35,34 +35,43 @@ aspects of Taurus.
 # 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', (), {})
-    }
+    {'SimuMotor': ('sardana.taurus.qt.qtgui.extra_pool.PoolMotorTV', (), {}),
+     'Motor': ('sardana.taurus.qt.qtgui.extra_pool.PoolMotorTV', (), {}),
+     'PseudoMotor': ('sardana.taurus.qt.qtgui.extra_pool.PoolMotorTV', (), {}),
+     'PseudoCounter': ('sardana.taurus.qt.qtgui.extra_pool.PoolChannelTV', (), {}),
+     'CTExpChannel': ('sardana.taurus.qt.qtgui.extra_pool.PoolChannelTV', (), {}),
+     'ZeroDExpChannel': ('sardana.taurus.qt.qtgui.extra_pool.PoolChannelTV', (), {}),
+     'OneDExpChannel': ('sardana.taurus.qt.qtgui.extra_pool.PoolChannelTV', (), {}),
+     'TwoDExpChannel': ('sardana.taurus.qt.qtgui.extra_pool.PoolChannelTV', (), {}),
+     'IORegister': ('sardana.taurus.qt.qtgui.extra_pool.PoolIORegisterTV', (), {})
+     }
 
 # Compact mode for widgets
 # True sets the preferred mode of TaurusForms to use "compact" widgets
 T_FORM_COMPACT = False
 
+# Strict RFC3986 URI names in models
+# True makes Taurus only use the strict URI names
+# False enables a backwards-compatibility mode for pre-sep3 model names
+STRICT_MODEL_NAMES = False
+
+
 # Lightweight imports:
 # True enables delayed imports (may break older code).
 # False (or commented out) for backwards compatibility
 LIGHTWEIGHT_IMPORTS = False
 
+# Set your default scheme (if not defined, "tango" is assumed)
+DEFAULT_SCHEME = "tango"
+
 # Extra Taurus schemes. You can add a list of modules to be loaded for
 # providing support to new schemes
 # EXTRA_SCHEME_MODULES = ['myownschememodule']
 
 # ----------------------------------------------------------------------------
-# PLY (lex/yacc) optimization: 1=Active (default) , 0=disabled. 
-# Set PLY_OPTIMIZE = 0 if you are getting yacc exceptions while loading 
-# synoptics   
+# PLY (lex/yacc) optimization: 1=Active (default) , 0=disabled.
+# Set PLY_OPTIMIZE = 0 if you are getting yacc exceptions while loading
+# synoptics
 # ----------------------------------------------------------------------------
 
 PLY_OPTIMIZE = 1
@@ -112,3 +121,31 @@ QT_AUTO_INIT_RES = DEFAULT_QT_AUTO_INIT_RES
 
 #: Remove input hook (only valid for PyQt4)
 QT_AUTO_REMOVE_INPUTHOOK = DEFAULT_QT_AUTO_REMOVE_INPUTHOOK
+
+#: Select the theme to be used: set the theme dir  and the theme name.
+#: The path can be absolute or relative to the dir of taurus.qt.qtgui.icon
+#: If not set, the dir of taurus.qt.qtgui.icon will be used
+QT_THEME_DIR = ''
+#: The name of the icon theme (e.g. 'Tango', 'Oxygen', etc). Default='Tango'
+QT_THEME_NAME = 'Tango'
+#: In Linux the QT_THEME_NAME is not applied (to respect the system theme)
+#: setting QT_THEME_FORCE_ON_LINUX=True overrides this.
+QT_THEME_FORCE_ON_LINUX = True
+
+
+# ----------------------------------------------------------------------------
+# Deprecation handling:
+# Note: this API is still experimental and may be subject to change
+# (hence the "_" in the options)
+# ----------------------------------------------------------------------------
+
+# set the maximum number of same-message deprecations to be logged.
+# None (or not set) indicates no limit. -1 indicates that an exception should
+# be raised instead of logging the message (useful for finding obsolete code)
+_MAX_DEPRECATIONS_LOGGED = 1
+
+# Custom organization logo. Set the absolute path to an image file to be used as your
+# organization logo. Qt registered paths can also be used. 
+# If not set, it defaults to 'logos:taurus.png" 
+# (note that "logos:" is a Qt a registered path for "<taurus>/qt/qtgui/icon/logos/")
+# ORGANIZATION_LOGO = "logos:taurus.png"
diff --git a/lib/taurus/test/__init__.py b/lib/taurus/test/__init__.py
index 5418d26..2bf24ed 100644
--- a/lib/taurus/test/__init__.py
+++ b/lib/taurus/test/__init__.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -66,6 +66,5 @@ the Taurus testing framework, please refer to the
 
 from .moduleexplorer import ModuleExplorer
 from .resource import getResourcePath
-from .skip import GUI_TESTS_ENABLED, skipUnlessGui
 from .base import insertTest
 from .fuzzytest import calculateTestFuzziness, loopSubprocess, loopTest
diff --git a/lib/taurus/test/base.py b/lib/taurus/test/base.py
index 31a5c61..0adc8f2 100644
--- a/lib/taurus/test/base.py
+++ b/lib/taurus/test/base.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
+# This file is part of Taurus
 ##
-## 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/>.
+# http://taurus-scada.org
+##
+# 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/>.
 ##
 #############################################################################
 
@@ -31,54 +31,61 @@ import functools
 
 
 def insertTest(klass=None, helper_name=None, test_method_name=None,
-               test_method_doc=None, tested_name=None, **helper_kwargs):
+               test_method_doc=None, tested_name=None, test_skip=None,
+               **helper_kwargs):
     """Decorator that inserts test methods from a helper method that accepts
     arguments.
     `insertTest` provides a very economic API for creating new tests for a given
     class based on a helper method.
     `insertTest` accepts the following arguments:
-    
+
       - helper_name (str): the name of the helper method. `insertTest` will
                            insert a test method which calls the helper with
                            any the helper_kwargs (see below).
       - test_method_name (str): Optional. Name of the test method to be used.
                                 If None given, one will be generated from the
                                 tested class and helper names.
-      - test_method_doc (str): Optional. The docstring for the inserted test 
-                               method (this shows in the unit test output). 
+      - test_method_doc (str): Optional. The docstring for the inserted test
+                               method (this shows in the unit test output).
                                If None given, a default one is generated which
                                includes the input parameters and the helper
                                name.
-      - tested_name (str): Optional. The name of the class or feature being 
-                           tested (if given, it will be used in default method 
+      - tested_name (str): Optional. The name of the class or feature being
+                           tested (if given, it will be used in default method
                            names and docstrings).
+
+      - test_skip (str): Optional. A reason for skipping the test. If None
+                         given, the test will not be skipped
+
       - \*\*helper_kwargs: All remaining keyword arguments are passed to the
                            helper.
-    
+
     This decorator can be considered a "base" decorator. It is often used to
-    create other decorators in which the helper method is pre-set, as in 
+    create other decorators in which the helper method is pre-set, as in
     the following example::
-        
+
         isPos = functools.partial(insertTest, helper_name='isPositive')
-        
+
         @isPos(x=2)
         @isPos(x=10)
         class Foo(unittest.TestCase):
             def isPositive(self, x):
                 self.assertTrue(x > 0)
-    
+
     """
     # Recipe to support decorating with and without arguments
-    if klass is None: 
+    if klass is None:
         return functools.partial(insertTest, helper_name=helper_name,
                                  test_method_name=test_method_name,
                                  test_method_doc=test_method_doc,
-                                 tested_name=tested_name, **helper_kwargs)
-    
+                                 tested_name=tested_name,
+                                 test_skip=test_skip,
+                                 **helper_kwargs)
+
     # Check arguments and provide defaults
     if helper_name is None:
         raise ValueError('helper_name argument is not optional')
-    
+
     if test_method_name is None:
         test_method_name = 'test_'
         if tested_name:
@@ -90,7 +97,7 @@ def insertTest(klass=None, helper_name=None, test_method_name=None,
         i += 1
         name = "%s_%i" % (test_method_name, i)
     test_method_name = name
-    
+
     if test_method_doc is None:
         argsrep = ', '.join(['%s=%s' % (k, repr(v))
                              for k, v in helper_kwargs.items()])
@@ -99,29 +106,34 @@ def insertTest(klass=None, helper_name=None, test_method_name=None,
                                                           helper_name, argsrep)
         else:
             test_method_doc = 'Testing %s(%s)' % (helper_name, argsrep)
-    
+
     # New test implementation
     def newTest(obj):
         helper = getattr(obj, helper_name)
         return helper(**helper_kwargs)
-    
+
     # Add the custom docstring
     newTest.__doc__ = test_method_doc
-    
+
+    # Skip the test if the test_skip kwarg was passed
+    if test_skip is not None:
+        import unittest
+        newTest = unittest.skip(test_skip)(newTest)
+
     # Add the new test method with the new implementation
     setattr(klass, test_method_name, newTest)
-    
+
     return klass
-    
+
 
 if __name__ == '__main__':
-    
+
     # a demo of use of insertTest
 
     from taurus.external import unittest
 
     isPos = functools.partial(insertTest, helper_name='isPositive')
-    isNeg = functools.partial(insertTest, helper_name='isPositive', 
+    isNeg = functools.partial(insertTest, helper_name='isPositive',
                               expected=False)
 
     @isPos
@@ -130,8 +142,8 @@ if __name__ == '__main__':
     @isPos(x=5)
     @isNeg(x=-1)
     class FooTest(unittest.TestCase):
+
         def isPositive(self, x=1, expected=True):
             self.assertEqual(x > 0, expected)
-   
+
     unittest.main(verbosity=2)
-    
diff --git a/lib/taurus/test/fuzzytest.py b/lib/taurus/test/fuzzytest.py
index 95625da..f6d1716 100644
--- a/lib/taurus/test/fuzzytest.py
+++ b/lib/taurus/test/fuzzytest.py
@@ -2,38 +2,39 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
 '''Utility functions to deal with non-ideal (fuzzy) tests'''
 
+
 def loopTest(testname, maxtries=100, maxfails=10):
-    '''Run a test `maxtries` times or until it fails `maxfails` times and 
+    '''Run a test `maxtries` times or until it fails `maxfails` times and
     report the number of tries and failures.
-    
-    :param testname: (str) test name. see: 
+
+    :param testname: (str) test name. see:
                      :meth:`unittest.TestLoader.loadTestsFromName`
     :param maxtries: (int) maximum number of runs
     :param maxfails: (int) maximum number of failed runs
-    
+
     :return: (tuple) a tuple of ints: tries, failures
     '''
     from taurus.external import unittest
@@ -47,22 +48,23 @@ def loopTest(testname, maxtries=100, maxfails=10):
             f += 1
     return i, f
 
-def loopSubprocess(target, maxtries=100, maxfails=10, okvalues=(0,), args=(), 
+
+def loopSubprocess(target, maxtries=100, maxfails=10, okvalues=(0,), args=(),
                    kwargs=None):
-    '''Run a callable as a subprocess `maxtries` times or until it fails 
+    '''Run a callable as a subprocess `maxtries` times or until it fails
     `maxfails` times and report the number of tries and failures.
-    The callable is run as a subprocess and it is considered to run fine if 
+    The callable is run as a subprocess and it is considered to run fine if
     the subprocess exit code is in the okValues list.
-    
-    :param target: (callable) a callable test 
+
+    :param target: (callable) a callable test
     :param maxtries: (int) maximum number of runs
     :param maxfails: (int) maximum number of failed runs
     :param okvalues: (seq) a sequence containing exit values of cmd which
                      are considered to be successful runs.
     :param args: (seq) arguments for running the target function
     :param kwargs: (dict) keyword arguments for running the target function
-                     
-                     
+
+
     :return: (tuple) a tuple of ints: tries, failures
     '''
     if kwargs is None:
@@ -77,37 +79,38 @@ def loopSubprocess(target, maxtries=100, maxfails=10, okvalues=(0,), args=(),
         if p.exitcode not in okvalues:
             f += 1
     return i, f
-    
+
+
 def calculateTestFuzziness(test, maxtries=100, maxfails=10, **kwargs):
     '''Estimate the fuzziness of a test by running it many times and counting
-    the failures. In this context, we assume that there is an underlying 
-    problem and but that the test is not perfect and only fails (triggers the 
-    problem) with a certain failure rate. 
-    
-    :param testname: (str) test name. see: 
+    the failures. In this context, we assume that there is an underlying
+    problem and but that the test is not perfect and only fails (triggers the
+    problem) with a certain failure rate.
+
+    :param testname: (str) test name. see:
                      :meth:`unittest.TestLoader.loadTestsFromName`
     :param maxtries: (int) maximum number of runs
     :param maxfails: (int) maximum number of failed runs
-    
-    :return: (tuple) a tuple (f,df,n) where f is the failure rate, df is its 
-             standard deviation, and n is the number of consecutive 
-             times that the test should be passed to have a confidence>99%% 
+
+    :return: (tuple) a tuple (f,df,n) where f is the failure rate, df is its
+             standard deviation, and n is the number of consecutive
+             times that the test should be passed to have a confidence>99%%
              that the bug is fixed'
     '''
-    print ("Running the test %i times (or until it fails %i times)" + 
+    print ("Running the test %i times (or until it fails %i times)" +
            "to estimate the failure rate") % (maxtries, maxfails)
     import numpy
-    
-    if isinstance(test, str): 
+
+    if isinstance(test, str):
         tries, fails = loopTest(test, maxtries=maxtries, maxfails=maxfails)
     else:
-        tries, fails = loopSubprocess(test, maxtries=maxtries, 
+        tries, fails = loopSubprocess(test, maxtries=maxtries,
                                       maxfails=maxfails, **kwargs)
-    r = float(fails)/tries
-    dr = numpy.sqrt(fails)/tries
-    print 'Failure rate = %g +/- %g  (%i/%i)'%(r, dr, fails, tries)
-    #calculating n using p-value=1% and failure rate with -1 sigma
-    n = numpy.ceil(numpy.log(.01)/numpy.log(1-(r-dr)))
+    r = float(fails) / tries
+    dr = numpy.sqrt(fails) / tries
+    print 'Failure rate = %g +/- %g  (%i/%i)' % (r, dr, fails, tries)
+    # calculating n using p-value=1% and failure rate with -1 sigma
+    n = numpy.ceil(numpy.log(.01) / numpy.log(1 - (r - dr)))
     print ('Number of consecutive times that the test should be passed ' +
            'to have a confidence>99%% that the bug is fixed: %g') % n
     return r, dr, n
@@ -116,19 +119,17 @@ def calculateTestFuzziness(test, maxtries=100, maxfails=10, **kwargs):
 if __name__ == "__main__":
 
     def kk():
-        #exits with fail 1/3 of the times
+        # exits with fail 1/3 of the times
         from numpy.random import randint, seed
         seed()
-        k =  randint(3)
+        k = randint(3)
         if not k:
             exit(1)
         return
-     
+
     print calculateTestFuzziness(kk)
-    
+
 #     print calculateTestFuzziness('test_pytango_bug659.TestPyTango_Bug659')
-# 
-#   _, f = loopTest('test_pytango_bug659.TestPyTango_Bug659', 
+#
+#   _, f = loopTest('test_pytango_bug659.TestPyTango_Bug659',
 #                  maxtries=100, maxfails=1)
-
-    
\ No newline at end of file
diff --git a/lib/taurus/test/moduleexplorer.py b/lib/taurus/test/moduleexplorer.py
index f1d18d8..dddd64d 100644
--- a/lib/taurus/test/moduleexplorer.py
+++ b/lib/taurus/test/moduleexplorer.py
@@ -3,24 +3,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 ###########################################################################
 
@@ -50,7 +50,7 @@ class ModuleExplorer(object):
         for p in paterns:
             if re.match(p, name) is not None:
                 if self.verbose:
-                    print 'excluding "%s"' % name
+                    print 'excluding "%s" (matches %s)' % (name, p.pattern)
                 return True
         return False
 
@@ -77,7 +77,7 @@ class ModuleExplorer(object):
         return inspect.isclass(obj) and hasattr(obj, '__init__')
 
     def _isenumeration(self, obj):
-#        return isinstance(obj, taurus.core.util)
+        #        return isinstance(obj, taurus.core.util)
         return False  # @todo
 
     def exploreModule(self, modulename):
@@ -114,28 +114,30 @@ class ModuleExplorer(object):
 
         submodulenames = sorted(self._getSubmodulesFromPath(modulepath))
         localclassnames = sorted(
-            self._getlocalmembernames(module, self._isclass_with_init))
+             [n for n, _ in inspect.getmembers(module, self._isclass_with_init)]
+        )
         localfunctionnames = sorted(
-            self._getlocalmembernames(module, inspect.isfunction))
+             [n for n, _ in inspect.getmembers(module, inspect.isfunction)]
+        )
         localenumerationnames = sorted([])  # @todo
         externalmembernames = sorted([])  # @todo
-#        localmembers = list(submodules) + localfunctionnames + localclassnames + localenumerationnames
+# 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
+        # filter out excluded members
         submodulenames = [n for n in submodulenames if not self._matchesAnyPattern(
-            os.path.join(modulename, n), self.exclude_patterns)]
+            '.'.join((modulename, n)), self.exclude_patterns)]
         localclassnames = [n for n in localclassnames if not self._matchesAnyPattern(
-            os.path.join(modulename, n), self.exclude_patterns)]
+            '.'.join((modulename, n)), self.exclude_patterns)]
         localfunctionnames = [n for n in localfunctionnames if not self._matchesAnyPattern(
-            os.path.join(modulename, n), self.exclude_patterns)]
+            '.'.join((modulename, n)), self.exclude_patterns)]
         localenumerationnames = [n for n in localenumerationnames if not self._matchesAnyPattern(
-            os.path.join(modulename, n), self.exclude_patterns)]
+            '.'.join((modulename, n)), self.exclude_patterns)]
         externalmembernames = [n for n in externalmembernames if not self._matchesAnyPattern(
-            os.path.join(modulename, n), self.exclude_patterns)]
+            '.'.join((modulename, n)), self.exclude_patterns)]
 
-        #recurse
+        # recurse
         submodules = {}
         for n in submodulenames:
             sm_name = '.'.join((modulename, n))
@@ -198,7 +200,17 @@ class ModuleExplorer(object):
         return minfo, ModuleExplorer.getAll(minfo, 'warnings')
 
 
-def main(modulename='taurus', exclude_patterns=('.*/ui')):
+def main(modulename='taurus', exclude_patterns=(
+                                    '_[^\.]*[^_]',
+                                    '.*\.test',
+                                    'taurus\.external',
+                                    'taurus\.qt\.qtgui\.extra_sardana',
+                                    'taurus\.qt\.qtgui\.extra_pool',
+                                    'taurus\.qt\.qtgui\.extra_macroexecutor',
+                                    'taurus\.qt\.qtgui\.resource',
+                                    'taurus\.qt\.qtgui\.taurusgui\.conf',
+                                    )
+         ):
     moduleinfo, allw = ModuleExplorer.explore(
         modulename, exclude_patterns=exclude_patterns, verbose=True)
     print '\n\n' + '*' * 50
@@ -209,6 +221,9 @@ def main(modulename='taurus', exclude_patterns=('.*/ui')):
     print
     assert len(allw) == 0
 
+    # import pprint
+    # pprint.pprint(moduleinfo)
+
 
 if __name__ == "__main__":
     main()
diff --git a/lib/taurus/test/resource.py b/lib/taurus/test/resource.py
index bcd1842..c756bf8 100644
--- a/lib/taurus/test/resource.py
+++ b/lib/taurus/test/resource.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 ###########################################################################
 
@@ -53,7 +53,7 @@ def getResourcePath(resmodule, fname=''):
     '''
     __import__(resmodule)
     module = sys.modules[resmodule]  # We use this because __import__('x.y')
-                                    #returns x instead of y !!
+    # returns x instead of y !!
     dirpath = os.path.abspath(os.path.dirname(module.__file__))
     path = os.path.join(dirpath, fname)
     if not os.path.exists(path):
@@ -64,6 +64,6 @@ def getResourcePath(resmodule, fname=''):
 if __name__ == "__main__":
     print getResourcePath('taurus.test')
     print getResourcePath('taurus.test', 'resource.py')
-    #print getResourcePath('taurus.qt.qtgui.plot', 'taurusplot.py')
-    #print getResourcePath('taurus.test', 'kk.py')
-    #print getResourcePath('taurus.kk', 'resource.py')
+    # print getResourcePath('taurus.qt.qtgui.plot', 'taurusplot.py')
+    # print getResourcePath('taurus.test', 'kk.py')
+    # print getResourcePath('taurus.kk', 'resource.py')
diff --git a/lib/taurus/test/skip.py b/lib/taurus/test/skip.py
index ed52c1e..803f8c0 100644
--- a/lib/taurus/test/skip.py
+++ b/lib/taurus/test/skip.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -31,6 +31,7 @@ __docformat__ = 'restructuredtext'
 
 from taurus.external import unittest
 from taurus import tauruscustomsettings
+from taurus import Logger
 
 
 def skipUnlessGui():
@@ -57,6 +58,8 @@ def skipUnlessGui():
         @skipunless(taurus.test.GUI_TESTS_ENABLED, 'requires GUI')
 
     '''
+    Logger.deprecated(dep='skipUnlessGui', rel='4.0',
+                      alt='taurustestsuite --exclude-pattern')
     return unittest.skipUnless(GUI_TESTS_ENABLED, 'requires GUI')
 
 
diff --git a/lib/taurus/test/test_import.py b/lib/taurus/test/test_import.py
index a1f98f3..215d4b5 100644
--- a/lib/taurus/test/test_import.py
+++ b/lib/taurus/test/test_import.py
@@ -1,24 +1,24 @@
 #!/usr/bin/env python
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -46,7 +46,9 @@ class TaurusImportTestCase(unittest.TestCase):
         Expected Results: It is expected to get no warning message
         on module importing
         """
-        moduleinfo, wrn = self.explore('taurus', verbose=False)
+        exclude_patterns = (r'taurus.qt.qtgui.extra_.*',)
+        moduleinfo, wrn = self.explore('taurus', verbose=False,
+                                       exclude_patterns=exclude_patterns)
         msg = None
         if wrn:
             msg = '\n%s' % '\n'.join(zip(*wrn)[1])
diff --git a/lib/taurus/test/testsuite.py b/lib/taurus/test/testsuite.py
index 0cdcdef..34fc050 100644
--- a/lib/taurus/test/testsuite.py
+++ b/lib/taurus/test/testsuite.py
@@ -2,24 +2,24 @@
 
 #############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# You should have received a copy of the GNU Lesser General Public License
+# along with Taurus.  If not, see <http://www.gnu.org/licenses/>.
 ##
 #############################################################################
 
@@ -35,33 +35,90 @@ Usage::
 __docformat__ = 'restructuredtext'
 
 import os
+import re
 from taurus.external import unittest
 import taurus
 
 
-def run(disableLogger=True):
-    '''Runs all tests for the taurus package'''
+def _filter_suite(suite, exclude_pattern, ret=None):
+    """removes TestCases from a suite based on regexp matching on the Test id"""
+    if ret is None:
+        ret = unittest.TestSuite()
+    for e in suite:
+        if isinstance(e, unittest.TestCase):
+            if re.match(exclude_pattern, e.id()):
+                print "Excluded %s" % e.id()
+                continue
+            ret.addTest(e)
+        else:
+            _filter_suite(e, exclude_pattern, ret=ret)
+    return ret
+
+
+def get_taurus_suite(exclude_pattern='(?!)'):
+    """discover all tests in taurus, except those matching `exclude_pattern`"""
+    loader = unittest.defaultTestLoader
+    start_dir = os.path.dirname(taurus.__file__)
+    suite = loader.discover(start_dir, top_level_dir=os.path.dirname(start_dir))
+    return _filter_suite(suite, exclude_pattern)
+
+
+def run(disableLogger=True, exclude_pattern='(?!)'):
+    """Runs tests for the taurus package"""
     # disable logging messages
     if disableLogger:
         taurus.disableLogOutput()
-    # discover all tests within the taurus/lib directory
-    loader = unittest.defaultTestLoader
-    suite = loader.discover(os.path.dirname(taurus.__file__))
+    # discover tests within the taurus/lib directory
+    suite = get_taurus_suite(exclude_pattern=exclude_pattern)
     # use the basic text test runner that outputs to sys.stderr
     runner = unittest.TextTestRunner(descriptions=True, verbosity=2)
     # run the test suite
-    runner.run(suite)
+    return runner.run(suite)
 
-if __name__ == '__main__':
+
+def main():
+    import sys
+    import taurus.test.skip
     from taurus.external import argparse
-    parser = argparse.ArgumentParser(description=
-                                     'Main test suite for Taurus')
+    from taurus import Release
+    parser = argparse.ArgumentParser(description='Main test suite for Taurus')
     parser.add_argument('--skip-gui-tests', dest='skip_gui',
                         action='store_true', default=False,
                         help='Do not perform tests requiring GUI')
+    # TODO: Define the default exclude patterns as a tauruscustomsettings
+    # variable.
+    help = """regexp pattern matching test ids to be excluded.
+    (e.g. 'taurus\.core\..*' would exclude taurus.core tests)
+    """
+    parser.add_argument('-e', '--exclude-pattern',
+                        dest='exclude_pattern',
+                        default='(?!)',
+                        help=help)
+    parser.add_argument('--version', action='store_true', default=False,
+                        help="show program's version number and exit")
     args = parser.parse_args()
 
+    if args.version:
+        print Release.version
+        sys.exit(0)
+
     if args.skip_gui:
         import taurus.test.skip
         taurus.test.skip.GUI_TESTS_ENABLED = False
-    run()
+    if not taurus.test.skip.GUI_TESTS_ENABLED:
+        exclude_pattern = '(taurus\.qt\..*)|(%s)' % args.exclude_pattern
+    else:
+        exclude_pattern = args.exclude_pattern
+
+    ret = run(exclude_pattern=exclude_pattern)
+
+    # calculate exit code (0 if OK and 1 otherwise)
+    if ret.wasSuccessful():
+        exit_code = 0
+    else:
+        exit_code = 1
+    sys.exit(exit_code)
+
+
+if __name__ == '__main__':
+    main()
\ No newline at end of file
diff --git a/lib/taurus/web/__init__.py b/lib/taurus/web/__init__.py
deleted file mode 100644
index b8e01ed..0000000
--- a/lib/taurus/web/__init__.py
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-"""
-
-__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
deleted file mode 100644
index ecccf2f..0000000
--- a/lib/taurus/web/examples/tornado/countclient.html
+++ /dev/null
@@ -1,130 +0,0 @@
-<!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
deleted file mode 100644
index 0058bd3..0000000
--- a/lib/taurus/web/examples/tornado/countserver.py
+++ /dev/null
@@ -1,148 +0,0 @@
-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
deleted file mode 100644
index a2c5cde..0000000
--- a/lib/taurus/web/examples/tornado/demo.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!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/web/examples/tornado/demo.py b/lib/taurus/web/examples/tornado/demo.py
deleted file mode 100644
index 7fac5c5..0000000
--- a/lib/taurus/web/examples/tornado/demo.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-"""
-
-__docformat__ = "restructuredtext"
-
-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")
-
-class DemoPageHandler(RequestHandler):
-    
-    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() 
-    
-    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
deleted file mode 100644
index 5c1edf8..0000000
--- a/lib/taurus/web/examples/tornado/demo1.html
+++ /dev/null
@@ -1,189 +0,0 @@
-<!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
deleted file mode 100644
index 277ae89..0000000
--- a/lib/taurus/web/examples/tornado/demo2.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!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
deleted file mode 100644
index c6e5339..0000000
--- a/lib/taurus/web/examples/tornado/demo3.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!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
deleted file mode 100644
index 4b55b24..0000000
--- a/lib/taurus/web/examples/tornado/demo4.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!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
deleted file mode 100644
index 03201df..0000000
--- a/lib/taurus/web/examples/tornado/machinestatus.html
+++ /dev/null
@@ -1,184 +0,0 @@
-<!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/web/examples/tornado/machinestatus.py b/lib/taurus/web/examples/tornado/machinestatus.py
deleted file mode 100644
index 059ee2a..0000000
--- a/lib/taurus/web/examples/tornado/machinestatus.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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/>.
-##
-#############################################################################
-
-"""
-"""
-
-__docformat__ = "restructuredtext"
-
-import os.path
-
-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() 
-    
-    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
deleted file mode 100644
index a0056bf..0000000
--- a/lib/taurus/web/examples/tornado/static/css/demo.css
+++ /dev/null
@@ -1,83 +0,0 @@
-
-.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
deleted file mode 100644
index 1a91ea5..0000000
--- a/lib/taurus/web/examples/tornado/static/css/machinestatus.css
+++ /dev/null
@@ -1,76 +0,0 @@
-
-.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
deleted file mode 100644
index bb11f5c..0000000
--- a/lib/taurus/web/examples/tornado/static/js/countclient.coffee
+++ /dev/null
@@ -1,75 +0,0 @@
-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
deleted file mode 100644
index 106978d..0000000
--- a/lib/taurus/web/examples/tornado/static/js/countclient.js
+++ /dev/null
@@ -1,94 +0,0 @@
-// 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
deleted file mode 100644
index a1ed2b6..0000000
--- a/lib/taurus/web/examples/tornado/static/js/demo.js
+++ /dev/null
@@ -1,14 +0,0 @@
-
-(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
deleted file mode 100644
index ebca6a1..0000000
--- a/lib/taurus/web/examples/tornado/static/js/demo1.js
+++ /dev/null
@@ -1,14 +0,0 @@
-
-(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
deleted file mode 100644
index 9f8fa5a..0000000
--- a/lib/taurus/web/examples/tornado/static/js/demo2.js
+++ /dev/null
@@ -1,41 +0,0 @@
-
-(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
deleted file mode 100644
index 0bc6e8e..0000000
--- a/lib/taurus/web/examples/tornado/static/js/demo3.js
+++ /dev/null
@@ -1,44 +0,0 @@
-
-(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
deleted file mode 100644
index 4a35cf6..0000000
--- a/lib/taurus/web/examples/tornado/static/js/demo4.js
+++ /dev/null
@@ -1,14 +0,0 @@
-
-(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
deleted file mode 100644
index 4164093..0000000
--- a/lib/taurus/web/examples/tornado/static/js/machinestatus.coffee
+++ /dev/null
@@ -1,9 +0,0 @@
-
-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
deleted file mode 100644
index 95dca01..0000000
--- a/lib/taurus/web/examples/tornado/static/js/machinestatus.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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
deleted file mode 100644
index 16b2f6c..0000000
Binary files a/lib/taurus/web/static/css/digital.ttf and /dev/null differ
diff --git a/lib/taurus/web/static/css/taurus.css b/lib/taurus/web/static/css/taurus.css
deleted file mode 100644
index 93d9456..0000000
--- a/lib/taurus/web/static/css/taurus.css
+++ /dev/null
@@ -1,5 +0,0 @@
-
- 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
deleted file mode 100644
index 7793294..0000000
Binary files a/lib/taurus/web/static/favicon.ico and /dev/null differ
diff --git a/lib/taurus/web/static/js/taurus.coffee b/lib/taurus/web/static/js/taurus.coffee
deleted file mode 100644
index 0cb0a96..0000000
--- a/lib/taurus/web/static/js/taurus.coffee
+++ /dev/null
@@ -1,42 +0,0 @@
-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
deleted file mode 100644
index 32d134f..0000000
--- a/lib/taurus/web/static/js/taurus.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// 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
deleted file mode 100644
index 54abfad..0000000
--- a/lib/taurus/web/taurustornado.py
+++ /dev/null
@@ -1,253 +0,0 @@
-#!/usr/bin/env python
-
-#############################################################################
-##
-## This file is part of Taurus
-## 
-## http://taurus-scada.org
-##
-## 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
deleted file mode 100644
index 63cf184..0000000
--- a/lib/taurus/web/template/index.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!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/tau2taurus b/scripts/tau2taurus
deleted file mode 100755
index 5d53432..0000000
--- a/scripts/tau2taurus
+++ /dev/null
@@ -1,74 +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/>.
-##
-#############################################################################
-
-"""tau upgrade tool"""
-
-__docformat__ = 'restructuredtext'
-
-import os
-import sys
-import optparse
-import lxml.etree
-
-import taurus.qt.uic
-
-def main():
-    version = "tau2taurus %s" % (taurus.Release.version)
-    usage = "usage: %prog [options] inputfile"
-    description = "tau to taurus ui file translator"
-    parser = optparse.OptionParser(usage=usage, version=version, description=description)
-    
-    parser.add_option("-o", '--output', dest="output", default="",
-                      help="output FILE [default=console]", metavar="FILE")
-
-    options, args = parser.parse_args()
-
-    if len(args) != 1:
-        parser.error("incorrect number of arguments")
-    
-    try:
-        source = file(args[0])
-    except Exception, e:
-            parser.error(str(e))
-    
-    xml = lxml.etree.parse(source)
-    source.close()
-
-    if len(options.output) == 0:
-        output = sys.stdout
-    else:
-        try:
-            output = file(options.output, "w")
-        except Exception, e:
-            parser.error(str(e))
-
-    xml = taurus.qt.uic.tau2taurus(xml)
-    xml = taurus.qt.uic.resolve_inheritance(xml)
-
-    output.write(lxml.etree.tostring(xml, pretty_print=True))
-    output.close()
-    
-if __name__ == "__main__":
-    main()
diff --git a/scripts/taurusconfigbrowser b/scripts/taurusconfigbrowser
deleted file mode 100755
index 77990e0..0000000
--- a/scripts/taurusconfigbrowser
+++ /dev/null
@@ -1,27 +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/>.
-##
-#############################################################################
-
-from taurus.qt.qtgui.panel.taurusconfigeditor import main
-main()
diff --git a/scripts/tauruscurve b/scripts/tauruscurve
deleted file mode 100755
index 515bd93..0000000
--- a/scripts/tauruscurve
+++ /dev/null
@@ -1,30 +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/>.
-##
-#############################################################################
-
-try:
-	from taurus.qt.qtgui.extra_guiqwt.plot import taurusCurveDlgMain
-	taurusCurveDlgMain()
-except Exception, e:
-	print 'taurusCurveDlgMain cannot be launched.\n Reason: %s\n\n'%repr(e)
diff --git a/scripts/taurusdemo b/scripts/taurusdemo
deleted file mode 100755
index 27f0be1..0000000
--- a/scripts/taurusdemo
+++ /dev/null
@@ -1,142 +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/>.
-##
-#############################################################################
-
-import sys
-import operator
-
-import taurus.core.util
-import taurus.qt.qtgui.util
-import taurus.qt.qtgui.application
-
-from taurus.external.qt import Qt
-
-class TaurusDemoPanel(Qt.QWidget):
-
-    def __init__(self, parent=None):
-        Qt.QWidget.__init__(self, parent)
-        self._groups = {}
-
-        layout = Qt.QGridLayout()
-        self.setLayout(layout)
-
-        wf = taurus.qt.qtgui.util.TaurusWidgetFactory()
-
-        taurus_widgets = wf.getWidgets()
-
-        demos = {}
-        for widget_name in taurus_widgets:
-            widget_module_name, widget_class = taurus_widgets[widget_name]
-            internal_widget_module_name = widget_class.__module__
-            if internal_widget_module_name in demos:
-                continue
-            internal_widget_module = sys.modules[internal_widget_module_name]
-            if hasattr(internal_widget_module, "demo"):
-                if operator.isCallable(internal_widget_module.demo):
-                    demos[internal_widget_module_name] = internal_widget_module.demo
-
-        groups = set()
-
-        for demo_name in demos.keys():
-            parts = demo_name.split(".")
-            group = parts[-2]
-            groups.add(group)
-
-        for group in groups:
-            self.addGroup(group)
-
-        for demo_name in sorted(demos.keys()):
-            demo_func = demos[demo_name]
-            parts = demo_name.split(".")
-            group = parts[-2]
-            if not demo_func.__doc__:
-                continue
-            try:
-                self.addDemo(demo_func.__doc__, demo_func, group)
-            except Exception, e:
-                print 80*"-"
-                print "Problems adding demo", demo_name
-                print e
-
-    def addGroup(self, name):
-        g = Qt.QGroupBox(name)
-        layout = self.layout()
-        layout.addWidget(g, layout.rowCount(), 0)
-        l = Qt.QGridLayout()
-        g.setLayout(l)
-        self._groups[name] = g
-
-    def addDemo(self, name, f, group):
-        g = self._groups[group]
-        layout = g.layout()
-        row = layout.rowCount()
-        #label = Qt.QLabel(name, self)
-        button = Qt.QPushButton(name, self)
-        button._f = f
-        layout.addWidget(button, row, 0)
-        button.connect(button, Qt.SIGNAL("clicked()"), self.go)
-
-    def go(self):
-        b = self.sender()
-        f = b._f
-        dialog = None
-        try:
-            w = f()
-            if w is None or not isinstance(w, Qt.QWidget):
-                raise Exception("demo function does not return a valid widget")
-            dialog = Qt.QDialog()
-            layout = Qt.QVBoxLayout()
-            dialog.setLayout(layout)
-            layout.addWidget(w)
-            dialog.exec_()
-        except Exception, e:
-            if dialog is not None:
-                dialog.done(0)
-                dialog.hide()
-                dialog = None
-            print str(e)
-            return
-            d = Qt.QErrorMessage()
-            d.showMessage(str(e))
-
-
-def main():
-    import taurus.core.util.argparse
-    parser = taurus.core.util.argparse.get_taurus_parser()
-    parser.set_description("A demo application for taurus")
-    app = taurus.qt.qtgui.application.TaurusApplication(cmd_line_parser=parser,
-                                                        app_name="taurusdemo",
-                                                        app_version="1.0",
-                                                        org_domain="Taurus",
-                                                        org_name="Tango community")
-    gui = TaurusDemoPanel()
-    gui.setWindowTitle(app.applicationName())
-    gui.show()
-    sys.exit(app.exec_())
-
-if __name__ == "__main__":
-    main()
-
-
-
diff --git a/scripts/taurusdesigner b/scripts/taurusdesigner
deleted file mode 100755
index 54a7ec6..0000000
--- a/scripts/taurusdesigner
+++ /dev/null
@@ -1,35 +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/>.
-##
-#############################################################################
-
-import sys
-import os.path
-import optparse 
-
-import taurus
-from taurus.external.qt import Qt
-from taurus.qt.qtdesigner.taurusdesigner import main
-
-if __name__ == "__main__":
-    main()
diff --git a/scripts/taurusdevicepanel b/scripts/taurusdevicepanel
deleted file mode 100755
index 6749732..0000000
--- a/scripts/taurusdevicepanel
+++ /dev/null
@@ -1,27 +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 2013 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 taurus.qt.qtgui.panel.taurusdevicepanel import TaurusDevicePanelMain
-TaurusDevicePanelMain()
diff --git a/scripts/taurusdoc b/scripts/taurusdoc
deleted file mode 100755
index 707cb10..0000000
--- a/scripts/taurusdoc
+++ /dev/null
@@ -1,217 +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 script is designed to provide taurus developers with a fast way to test
-sphinx documentation from source code files or RST files.
-"""
-
-import sys
-import os
-import shutil
-import optparse
-
-from sphinx.application import Sphinx
-from sphinx.util.console import darkred, nocolor, color_terminal
-
-import taurus.core
-
-def abspath(*path):
-    """A method to determine absolute path for a given relative path to the
-    directory where this script is located"""
-    taurusdoc_dir = os.path.dirname(os.path.abspath(__file__))
-    return os.path.join(taurusdoc_dir, *path)
-
-sys.path.append(abspath('..', 'doc'))
-
-try:
-    import auto_rst4api
-except ImportError:
-    print "taurusdoc can only be executed from a source distribution of taurus"
-    sys.exit(1)
-
-__INDEX = """
-TaurusDoc
----------
-
-This document has been autogenerated by taurusdoc for test purposes.
-Any modifications will be lost.
-  
-.. toctree::
-    
-    {name}
-"""
-
-class RstCreator(auto_rst4api.Auto_rst4API_Creator):
-    
-    def documentClass(self, module, classname, docparentpath):
-        '''Documents a single class
-        
-        :param module: (module) python module where class resides
-        :param classname: (str) class name
-        :docparentpath: (str) path to the directory in which the documentation 
-                        files will be written
-        '''
-        ofname = os.path.join(docparentpath,"_%s.rst"%classname)
-
-        if self.verbose: print 'creating "%s" ...' % ofname,
-        info = dict(modulename = module.__name__,
-                    basemodulename = module.__name__.split('.')[-1],
-                    modulepath = module.__path__,
-                    submodulenames = [], 
-                    localclassnames = [classname],
-                    localfunctionnames = [],
-                    localenumerationnames = [],
-                    externalmembernames = [],
-                    submodules = [],
-                    warnings = [])
-        if not os.path.exists(ofname) or self.overwrite_old:
-            text = self.classtemplate.render(info=info, classname=classname)
-            f = open(ofname, "w")
-            f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
-            f.close()
-            if self.verbose: print ' ok.'
-        else:
-            if self.verbose: print ' skipping (file already exists)'
-        
-
-def main():
-    version = "taurusdoc %s" % (taurus.Release.version)
-    usage = "usage: %prog [options]"
-    description = "a tool to help developers preview the documentation "\
-                  "generated by their code"
-    parser = optparse.OptionParser(usage=usage, version=version, description=description)
-    
-    parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
-                      help="display a lot of information [default]", default=True)
-    parser.add_option("-q", "--quiet", dest="verbose", action="store_false",
-                      help="be really silent")
-    parser.add_option("--build-dir", dest="build_dir",
-                      help="build directory [default=./build]")
-    parser.add_option("-a", "--all-files", dest="all_files", default=True, action="store_true",
-                      help="generate from scratch [default]")
-    parser.add_option("--cache", dest="all_files", action="store_false",
-                      help="use previously generated files")
-
-    #o_group = optparse.OptionGroup(parser, "output options",
-    #                             "options regarding the ouput")
-    
-    parser.add_option("--format", dest="builder", default="html",
-                      help="output format [default=html]")
-
-    parser.add_option("--prefix", dest="prefix",
-                      help="output directory")
-
-    #i_group = optparse.OptionGroup(parser, "input options",
-    #                               "provide one and **only** one  of these!")
-                      
-    parser.add_option("--class", dest="klass", default=None,
-                      help="full class name to generate doc for (ex.: taurus.qt.qtgui.display.TaurusLabel")
-    parser.add_option("--package", dest="package", default=None,
-                      help="full package name to generate doc for (ex.: taurus.qt.qtgui.display)")
-    parser.add_option("--file", dest="filename", default=None,
-                      help="RST file")
-
-    options, args = parser.parse_args()
-
-    if not options.klass and not options.package and not options.filename:
-        parser.error("must give one of --class or --package or --file")
-    
-    if int(bool(options.klass)) + int(bool(options.package)) + int(bool(options.filename)) > 1:
-        parser.error("options --class and --package and --file are mutually exclusive")
-
-    fromlist = []
-    
-    if options.klass:
-        package_name, class_name = options.klass.rsplit(".", 1)
-        if package_name.find(".") >= 0:
-            fromlist.append( package_name.split(".", 1)[0] )
-        mod = __import__(package_name, fromlist=fromlist)
-    elif options.package:
-        package_name = options.package
-        mod = __import__(package_name, fromlist=fromlist)
-    else:
-        filename = options.filename
-    
-    if options.build_dir is None:
-        options.build_dir = os.path.join(os.path.abspath(os.path.curdir), "build")
-
-    # clean build dir
-    if options.all_files:
-        if os.path.isdir(options.build_dir):
-            shutil.rmtree(options.build_dir)
-    
-    if not os.path.isdir(options.build_dir):
-        os.makedirs(options.build_dir)
-    
-    if options.prefix is None:
-        options.prefix = os.path.join(os.path.abspath(os.path.curdir), "sphinx")
-
-    if not os.path.isdir(options.prefix):
-        os.makedirs(options.prefix)
-    
-    doc_dir = abspath("..", "doc")
-
-    if options.verbose:
-        out = sys.stdout
-    else:
-        import StringIO
-        out = StringIO.StringIO()
-
-    if not options.filename:
-        rstCreator = RstCreator(exclude_patterns=['.*\.ui'], templatespath=doc_dir,
-                                overwrite_old=True, verbose=options.verbose,
-                                classtemplate='api_class_simple.rst')
-
-        rstCreator.cleanAutogenerated(options.build_dir)
-
-    # create index.rst
-    index_rst = os.path.join(options.build_dir, 'index.rst')
-    f = file(index_rst, "w")
-    if options.klass:
-        r = rstCreator.documentClass(mod, class_name, options.build_dir)
-        txt = __INDEX.format(name="_%s" % class_name)
-    elif options.package:
-        r = rstCreator.documentModule(package_name, options.build_dir)
-        txt = __INDEX.format(name=package_name.rsplit(".", 1)[-1])
-    else:
-        shutil.copy(options.filename, options.build_dir)
-        txt = __INDEX.format(name=os.path.basename(options.filename))
-    f.write(txt)
-    f.close()
-
-    # directory where conf.py resides
-    config_dir = os.path.join(doc_dir, 'source')
-    doctree_dir = os.path.join(options.build_dir, 'doctrees')
-
-    app = Sphinx(options.build_dir, config_dir, options.prefix,
-                 doctree_dir, options.builder,
-                 confoverrides=None, status=out, warning=sys.stderr,
-                 freshenv=False, warningiserror=False, tags=None)
-
-    app.build()
-    
-if __name__ == "__main__":
-    main()
\ No newline at end of file
diff --git a/scripts/taurusform b/scripts/taurusform
deleted file mode 100755
index 4400211..0000000
--- a/scripts/taurusform
+++ /dev/null
@@ -1,27 +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/>.
-##
-#############################################################################
-
-from taurus.qt.qtgui.panel.taurusform import taurusFormMain
-taurusFormMain()
diff --git a/scripts/taurusgui b/scripts/taurusgui
deleted file mode 100755
index 22ba33f..0000000
--- a/scripts/taurusgui
+++ /dev/null
@@ -1,27 +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/>.
-##
-#############################################################################
-
-from taurus.qt.qtgui.taurusgui.taurusgui import main
-main()
diff --git a/scripts/taurusimage b/scripts/taurusimage
deleted file mode 100755
index ab60a16..0000000
--- a/scripts/taurusimage
+++ /dev/null
@@ -1,30 +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/>.
-##
-#############################################################################
-
-try:
-	from taurus.qt.qtgui.extra_guiqwt.plot import taurusImageDlgMain
-	taurusImageDlgMain()
-except Exception, e:
-	print 'taurusImageDlgMain cannot be launched.\n Reason: %s\n\n'%repr(e)
diff --git a/scripts/tauruspanel b/scripts/tauruspanel
deleted file mode 100755
index bf950f0..0000000
--- a/scripts/tauruspanel
+++ /dev/null
@@ -1,27 +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/>.
-##
-#############################################################################
-
-from taurus.qt.qtgui.panel.taurusdevicepanel import TaurusPanelMain
-TaurusPanelMain()
diff --git a/scripts/taurusplot b/scripts/taurusplot
deleted file mode 100755
index 1697e18..0000000
--- a/scripts/taurusplot
+++ /dev/null
@@ -1,27 +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/>.
-##
-#############################################################################
-
-from taurus.qt.qtgui.plot.taurusplot import main
-main()
diff --git a/scripts/taurusremotelogmonitor b/scripts/taurusremotelogmonitor
deleted file mode 100755
index e8435a3..0000000
--- a/scripts/taurusremotelogmonitor
+++ /dev/null
@@ -1,94 +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/>.
-##
-#############################################################################
-
-import optparse
-import logging.handlers
-import socket
-
-import taurus
-from taurus.qt.qtgui.application import TaurusApplication
-from taurus.qt.qtgui.table import QLoggingWidget
-
-def main():
-    import taurus
-    dft_port = logging.handlers.DEFAULT_TCP_LOGGING_PORT
-    host = socket.gethostname()
-
-    help_gui = "gui mode [default]"
-    help_con = "console mode"
-    help_port = "port where log server is running [default: %d]" % dft_port
-    help_name = "filter specific log object [default: None, meaning don't " \
-                "filter]"
-    help_level = "filter specific log level." \
-                 "Allowed values are (case insensitive): critical, "\
-                 "error, warning/warn, info, debug, trace [default: debug]."
-
-    parser = optparse.OptionParser()
-    parser.set_description("Table that displays the taurus logging messages")
-    parser.add_option("-g", "--gui", dest="gui", default=True,
-                      action="store_true", help=help_gui)
-    parser.add_option("-c", "--console", dest="gui",
-                      action="store_false", help=help_con)
-    parser.add_option("--log-port", dest="log_port", default=dft_port,
-                      type="int", help=help_port)
-    parser.add_option("--log-name", dest="log_name", default=None,
-                      type="string", help=help_name)
-    parser.add_option("--log-level", dest="log_level", default="debug",
-                      type="string", help=help_level)
-
-    app = TaurusApplication(app_name="Taurus remote logger",
-                            app_version="1.0",
-                            org_domain="Taurus", org_name="Taurus community",
-                            cmd_line_parser=parser)
-
-    options = app.get_command_line_options()
-
-    port, name = options.log_port, options.log_name
-    level_str = options.log_level.capitalize()
-    gui = options.gui
-
-    level = taurus.Trace
-    if hasattr(taurus, level_str):
-        level = getattr(taurus, level_str)
-
-    if gui:
-        w = QLoggingWidget(perspective="Remote")
-        w.setMinimumSize(1024, 600)
-        
-        filterbar = w.getFilterBar()
-        filterbar.setLogLevel(level)                
-        if name is not None:
-            filterbar.setFilterText(name)
-        w.getPerspectiveBar().setEnabled(False)
-        w.getQModel().connect_logging(host, port)
-        w.show()
-        app.exec_()
-        w.getQModel().disconnect_logging()
-    else:
-        import taurus.core.util.remotelogmonitor
-        taurus.core.util.remotelogmonitor.log(host=host, port=port, name=name,
-                                              level=level)
-if __name__ == '__main__':
-    main()
diff --git a/scripts/taurustrend b/scripts/taurustrend
deleted file mode 100755
index c2de247..0000000
--- a/scripts/taurustrend
+++ /dev/null
@@ -1,27 +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/>.
-##
-#############################################################################
-
-from taurus.qt.qtgui.plot.taurustrend import main
-main()
\ No newline at end of file
diff --git a/scripts/taurustrend1d b/scripts/taurustrend1d
deleted file mode 100755
index 37b6b29..0000000
--- a/scripts/taurustrend1d
+++ /dev/null
@@ -1,30 +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/>.
-##
-#############################################################################
-
-try:
-	from taurus.qt.qtgui.extra_guiqwt.plot import taurusTrendDlgMain
-	taurusTrendDlgMain()
-except Exception, e:
-	print 'TaurusTrend1D cannot be launched.\n Reason: %s\n\n'%repr(e)
diff --git a/scripts/taurustrend2d b/scripts/taurustrend2d
deleted file mode 100755
index 3ff9a64..0000000
--- a/scripts/taurustrend2d
+++ /dev/null
@@ -1,30 +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/>.
-##
-#############################################################################
-
-try:
-	from taurus.qt.qtgui.extra_guiqwt.taurustrend2d import taurusTrend2DMain
-	taurusTrend2DMain()
-except Exception, e:
-	print 'TaurusTrend2D cannot be launched.\n Reason: %s\n\n'%repr(e)
diff --git a/scripts/taurusui b/scripts/taurusui
deleted file mode 100755
index 8e9039a..0000000
--- a/scripts/taurusui
+++ /dev/null
@@ -1,56 +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/>.
-##
-#############################################################################
-
-import sys
-import taurus
-
-def main():
-    taurus.setLogLevel(taurus.Warning)
-
-    from taurus.external.qt import Qt, uic
-    from taurus.core.util.argparse import get_taurus_parser
-    from taurus.qt.qtgui.application import TaurusApplication
-
-    parser = get_taurus_parser()
-    parser.set_usage("%prog [options] <ui_file1> [<ui_file2> ...]")
-    parser.set_description("a taurus application that launches GUI(s) for the "
-                           "given .ui file(s)")
-    app = TaurusApplication(cmd_line_parser=parser,
-                            app_name="taurusui", app_version="1.0",
-                            org_domain="Taurus", org_name="Taurus community")
-
-    args = app.get_command_line_args()
-    if len(args) < 1:
-        print("Need to supply UI file name")
-        sys.exit(1)
-
-    for ui_file in args:
-        gui = uic.loadUi(ui_file)
-        gui.show()
-    sys.exit(app.exec_())
-
-
-if __name__ == "__main__":
-    main()
diff --git a/scripts/taurusuic4 b/scripts/taurusuic4
deleted file mode 100755
index ba630a5..0000000
--- a/scripts/taurusuic4
+++ /dev/null
@@ -1,318 +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/>.
-##
-#############################################################################
-
-import sys
-import time
-import atexit
-import optparse
-import os.path
-import lxml.etree
-import PyQt4.Qt as Qt
-
-import taurus.core.util
-import taurus.qt.qtgui.util
-import taurus.qt.uic
-
-_template = """#!/usr/bin/env python
-
-# Code implementation generated from reading ui file '{filename}'
-#
-# Created: {ctime} 
-#      by: Taurus UI code generator {version}
-#
-# WARNING! All changes made in this file will be lost!
-
-__docformat__ = 'restructuredtext'
-
-import sys
-import PyQt4.Qt as Qt
-from {pyui_modulename} import {ui_klass}
-from {super_modulename} import {super_klass}
-
-class {klass}({super_klass}):
-
-    def __init__(self, parent=None, designMode=False):
-        {super_klass}.__init__(self, parent, designMode=designMode)
-        
-        self._ui = {ui_klass}()
-        self._ui.setupUi(self)
-        
-    {qt_info}
-
-def main():
-    app = Qt.QApplication(sys.argv)
-    w = {klass}()
-    w.show()
-    sys.exit(app.exec_())
-
-if __name__ == "__main__":
-    main()
-"""
-
-_template_qt_info = """
-    @classmethod
-    def getQtDesignerPluginInfo(cls):
-        ret = {super_klass}.getQtDesignerPluginInfo()
-        ret['module'] = '{qt_module}'
-        ret['group'] = '{qt_group}'
-        ret['container'] = '{qt_icon}'
-        ret['container'] = {qt_container}
-        return ret
-"""
-
-def ask_yes_no(prompt,default=None):
-    """Asks a question and returns a boolean (y/n) answer.
-
-    If default is given (one of 'y','n'), it is used if the user input is
-    empty. Otherwise the question is repeated until an answer is given.
-
-    An EOF is treated as the default answer.  If there is no default, an
-    exception is raised to prevent infinite loops.
-
-    Valid answers are: y/yes/n/no (match is not case sensitive)."""
-    answers = {'y':True,'n':False,'yes':True,'no':False}
-    ans = None
-    if default is not None:
-        d_l = default.lower()
-        if d_l in ('y','yes'):
-            prompt += " (Y/n) ?"
-        elif d_l in ('n','no'):
-            prompt += " (N/y) ?"
-    
-    while ans not in answers.keys():
-        try:
-            ans = raw_input(prompt+' ').lower()
-            if not ans:  # response was an empty string
-                ans = default
-        except KeyboardInterrupt:
-            pass
-        except EOFError:
-            if default in answers.keys():
-                ans = default
-                print
-            else:
-                raise
-
-    return answers[ans]
-
-_ARGS = None
-
-def parse_args():
-    version = "taurusuic4 %s" % (taurus.Release.version)
-    usage = "taurusuic4 [options] <ui-file>"
-    description = "a taurus customized pyuic4"
-    parser = optparse.OptionParser(usage=usage, description=description,
-                                   version=version)
-    # Default pyuic4 parameters
-    parser.add_option("-p", "--preview")
-    parser.add_option("-o", "--output", dest="output", default="-", metavar="FILE",
-            help="write generated code to FILE instead of stdout")
-    parser.add_option("-x", "--execute", dest="execute", action="store_true",
-            default=False,
-            help="generate extra code to test and display the class")
-    parser.add_option("-d", "--debug", dest="debug", action="store_true",
-            default=False, help="show debug output")
-    parser.add_option("-i", "--indent", dest="indent", action="store", type="int",
-            default=4, metavar="N",
-            help="set indent width to N spaces, tab if N is 0 (default: 4)")
-    parser.add_option("-w", "--pyqt3-wrapper", dest="pyqt3_wrapper",
-            action="store_true", default=False,
-            help="generate a PyQt v3 style wrapper")
-
-    # Extra taurus parameters
-    parser.add_option("-T", action="store_true", dest="tauruswidget",
-                      default=None, help="generate an additional taurus python file")
-
-    return parser.parse_args()
-
-
-def _generate_widget():
-    
-    factory = taurus.qt.qtgui.util.TaurusWidgetFactory()
-    
-    global _ARGS
-    opts, args = _ARGS
-    ui_filename = args[0]
-    pyui_path = opts.output
-    pyui_dirname, pyui_filename = os.path.split(pyui_path)
-    pyui_modulename = os.path.splitext(pyui_filename)[0]
-    
-    source = file(ui_filename)
-    xml_source = lxml.etree.parse(source)
-    root_node = xml_source.getroot()
-    assert(root_node.tag == "ui")
-    klass_node = root_node.find("class")
-    widget_node = root_node.find("widget")
-    klass_name = klass_node.text
-    ui_klass = "Ui_%s" % klass_name
-    super_klass_name = widget_node.get("class") 
-
-    if super_klass_name not in factory.getTaurusWidgetClassNames():
-        return
-    
-    if pyui_filename == '-':
-        return
-         
-    if not ask_yes_no("Do you whish to generate a Taurus widget", default='n'):
-        return
-    
-    orig_output_filename = os.path.join(pyui_dirname, "%s.py" % klass_name.lower())
-    output_filename = raw_input("Python file name (%s) ? " % orig_output_filename)
-    if output_filename == "": output_filename = orig_output_filename
-    
-    package_parts = os.path.split(os.path.splitext(output_filename)[0])
-    package_parts = [ part for part in package_parts if len(part)>0 ]
-    orig_package_name = ".".join(package_parts)
-    package_name = raw_input("Python package name (%s) ? " % orig_package_name)
-    if package_name == "": package_name = orig_package_name
-    
-    klass_name = raw_input("Python class name (%s) ? " % klass_name)
-    if klass_name == "": klass_name = klass_node.text
-    
-    super_klass_name = raw_input("Python super class name (%s) ? " % super_klass_name)
-    if super_klass_name == "": super_klass_name = widget_node.get("class") 
-    
-    super_module_name, super_klass = factory.getTaurusWidgets()[super_klass_name]
-
-    qt_info = ""
-    if ask_yes_no("Generate Qt designer info", default='y'):
-        super_qt_info = super_klass.getQtDesignerPluginInfo()
-        qt_module = package_name
-        qt_group = super_qt_info['group']
-        qt_group = raw_input("\tQt group (%s) ? " % qt_group)
-        if qt_group == '': qt_group = super_qt_info['group']
-        qt_icon = super_qt_info['icon']
-        qt_icon = raw_input("\tQt icon (%s) ? " % qt_icon)
-        if qt_icon == '': qt_icon = super_qt_info['icon']
-        qt_container = ask_yes_no("\tQt container", default='n')
-        if qt_container == '': qt_container = super_qt_info['container']
-        qt_info = _template_qt_info.format(super_klass=super_klass_name,
-                                           qt_module=qt_module, qt_group=qt_group,
-                                           qt_icon=qt_icon, qt_container=qt_container)
-        
-    pars = { 'filename'         : ui_filename,
-             'ctime'            : time.ctime(),
-             'version'          : taurus.Release.version,
-             'pyui_modulename'  : pyui_modulename,
-             'ui_klass'         : ui_klass,
-             'klass'            : klass_name,
-             'super_klass'      : super_klass_name,
-             'super_modulename' : super_module_name,
-             'qt_info'          : qt_info,
-    }
-
-    f = file(output_filename, "w")
-    f.write(_template.format(**pars))
-    f.close()
-
-def generate_widget():
-    try:
-        _generate_widget()
-    except KeyboardInterrupt:
-        print "\n\nCanceled Taurus widget creation by user\n"
-
-def is_pyuic4_recent():
-    # keep the import local
-    import PyQt4.uic
-    return hasattr(PyQt4.uic, "widgetPluginPath")
-
-def pyuic4():
-    atexit.register(generate_widget)
-       
-    # this import does all the stuff
-    import PyQt4.uic.pyuic
-    
-def generate():
-    """Generate. This version needs a 'recent' pyuic4"""
-    
-    # keep the import local
-    import PyQt4.uic
-
-    # find taurus directory which contains uic plugin
-    taurus_base_file = os.path.abspath(taurus.__file__)
-    taurus_base_dir = os.path.dirname(taurus_base_file)
-    plugin_dir = os.path.join(taurus_base_dir, 'qt', 'uic', 'pyuic4')
-
-    if not os.path.isdir(plugin_dir):
-        raise Exception("Expected uic plugin directory '%s' not found" % plugin_dir)
-    
-    # 'new' pyuic4: add taurus plugin path to pyuic
-    PyQt4.uic.widgetPluginPath.append(plugin_dir)
-    
-    pyuic4()
-
-def generate_with_old_pyuic4():
-    # keep the import local
-    import tempfile
-    import PyQt4.uic
-
-    # create a temporary .ui file with extra info so that pyuic4 is able to 
-    # properly generate python code
-    orig_ui_filename = sys.argv[-1]
-    tmp_ui = tempfile.NamedTemporaryFile(suffix=".ui", delete=False)
-    new_ui_filename = tmp_ui.name
-    
-    orig_ui_file = file(orig_ui_filename)
-    xml = lxml.etree.parse(orig_ui_file)
-    orig_ui_file.close()
-    xml = taurus.qt.uic.resolve_inheritance(xml)
-    tmp_ui.write(lxml.etree.tostring(xml, pretty_print=True))
-    tmp_ui.close()
-    
-    # intercept the call to compileUi
-    compileUi_orig = PyQt4.uic.compileUi
-
-    def compileUi_new(uifname, pyfile, execute, indent, pyqt3_wrapper):
-        # ignore the 'uifname' and use our temporary file
-        return compileUi_orig(new_ui_filename, pyfile, execute, indent, pyqt3_wrapper)
-    
-    PyQt4.uic.compileUi = compileUi_new
-    
-    pyuic4()
-    
-    os.remove(new_ui_filename)
-
-msg = ('taurusuic4 is deprecated since SEP11 ' + 
-       '(http://sf.net/p/sardana/wiki/SEP11)\n' +
-       'Consider using the taurus.qt.qtgui.util.UILoadable decorator instead')
-
-def main():
-    print "*"*79
-    print msg
-    print "*"*79
-    try:
-        if is_pyuic4_recent():
-            go = generate
-        else:
-            go = generate_with_old_pyuic4
-        global _ARGS
-        _ARGS = parse_args()
-        go()
-    except Exception, e:
-        print "Error running taurusuic4:"
-        print str(e)
-        
-if __name__ == "__main__":
-    main()
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..861a9f5
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,5 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
index 020167e..a69e547 100644
--- a/setup.py
+++ b/setup.py
@@ -2,254 +2,120 @@
 
 ##############################################################################
 ##
-## This file is part of Taurus
+# This file is part of Taurus
 ##
-## http://taurus-scada.org
+# http://taurus-scada.org
 ##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# 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 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.
+# 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/>.
+# 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
-
 import os
-import sys
-import copy
-import shutil
 import imp
-import StringIO
-
-from distutils import log
-from distutils.core import setup, Command
-from distutils.command.build import build as dftbuild
-from distutils.command.clean import clean as dftclean
-from distutils.command.install import install as dftinstall
-from distutils.command.install_lib import install_lib as dftinstall_lib
-from distutils.command.install_scripts import install_scripts as dftinstall_scripts
+from setuptools import setup, find_packages
 
-try:
-    import sphinx
-    import sphinx.util.console
-    sphinx.util.console.color_terminal = lambda : False
-except:
-    sphinx = None
-
-def abspath(*path):
-    """A method to determine absolute path for a given relative path to the
-    directory where this setup.py script is located"""
-    setup_dir = os.path.dirname(os.path.abspath(__file__))
-    return os.path.join(setup_dir, *path)
 
 def get_release_info():
     name = "release"
-    release_dir = abspath('lib', 'taurus', 'core')
+    setup_dir = os.path.dirname(os.path.abspath(__file__))
+    release_dir = os.path.join(setup_dir, 'lib', 'taurus', 'core')
     data = imp.find_module(name, [release_dir])
-    release = imp.load_module(name, *data)
-    return release
+    ret = imp.load_module(name, *data)
+    return ret
 
-Release = get_release_info()
-
-author = Release.authors['Tiago']
-maintainer = Release.authors['Pascual-Izarra']
-
-package_dir = { 'taurus' : abspath('lib', 'taurus') }
-
-packages = [
-    'taurus',
-    'taurus.test',
+release = get_release_info()
 
-    'taurus.external',
-    'taurus.external.argparse',
-    'taurus.external.enum',
-    'taurus.external.ordereddict',
-    'taurus.external.pint',
-    'taurus.external.qt',
-    'taurus.external.unittest',
-    'taurus.external.test',
+package_dir = {'': 'lib'}
 
-    'taurus.core',
-    'taurus.core.util',
-    'taurus.core.util.argparse',
-    'taurus.core.util.decorator',
-    'taurus.core.util.report',
-    'taurus.core.utils',  # old, deprecated: maintain for compatibility
-
-    'taurus.core.resource',
-
-    'taurus.core.simulation',
-
-    'taurus.core.evaluation',
-
-    'taurus.core.tango',
-    'taurus.core.tango.img',
-
-    'taurus.console',
-    'taurus.console.util',
-
-    'taurus.qt',
-
-    'taurus.qt.qtcore',
-    'taurus.qt.qtcore.communication',
-    'taurus.qt.qtcore.configuration',
-    'taurus.qt.qtcore.mimetypes',
-    'taurus.qt.qtcore.model',
-    'taurus.qt.qtcore.tango',
-
-    'taurus.qt.qtcore.util',
-
-    'taurus.qt.qtdesigner',
-    'taurus.qt.qtdesigner.taurusplugin',
-
-    'taurus.qt.qtgui',
-    'taurus.qt.qtgui.test',
-    'taurus.qt.qtgui.application',
-    'taurus.qt.qtgui.base',
-    'taurus.qt.qtgui.button',
-    'taurus.qt.qtgui.button.test',
-    'taurus.qt.qtgui.button.test.res',
-    'taurus.qt.qtgui.compact',
-#    'taurus.qt.qtgui.console',
-    'taurus.qt.qtgui.container',
-    'taurus.qt.qtgui.dialog',
-    'taurus.qt.qtgui.display',
-    'taurus.qt.qtgui.display.test',
-    'taurus.qt.qtgui.display.demo',
-    'taurus.qt.qtgui.editor',
-    'taurus.qt.qtgui.gauge',
-    'taurus.qt.qtgui.gauge.demo',
-    'taurus.qt.qtgui.graphic',
-    'taurus.qt.qtgui.graphic.jdraw',
-    'taurus.qt.qtgui.graphic.jdraw.test.res',
-    'taurus.qt.qtgui.help',
-    'taurus.qt.qtgui.image',
-    'taurus.qt.qtgui.input',
-    'taurus.qt.qtgui.model',
-    'taurus.qt.qtgui.panel',
-    'taurus.qt.qtgui.panel.test',
-    'taurus.qt.qtgui.panel.report',
-    'taurus.qt.qtgui.plot',
-    'taurus.qt.qtgui.resource',
-#    'taurus.qt.qtgui.shell',
-    'taurus.qt.qtgui.style',
-    'taurus.qt.qtgui.table',
-    'taurus.qt.qtgui.taurusgui',
-    'taurus.qt.qtgui.taurusgui.conf',
-    'taurus.qt.qtgui.tree',
-    'taurus.qt.qtgui.ui',
-    'taurus.qt.qtgui.util',
-    'taurus.qt.qtgui.util.test',
-    'taurus.qt.qtgui.util.test.test_ui',
-    'taurus.qt.qtgui.util.test.test_ui.mywidget3',
-    'taurus.qt.uic',
-]
-
-extra_packages = [
-    'taurus.qt.qtgui.extra_nexus',
-    'taurus.qt.qtgui.extra_xterm',
-    'taurus.qt.qtgui.extra_guiqwt',
-
-    'taurus.qt.qtgui.taurusgui.conf.tgconf_example01',
-    'taurus.qt.qtgui.taurusgui.conf.tgconf_macrogui',
-    
-    #For backwards compat. They may be removed later on:
-    'taurus.qt.qtgui.extra_macroexecutor',
-    'taurus.qt.qtgui.extra_sardana',
-    'taurus.qt.qtgui.extra_pool',
-]
+packages = find_packages(where='lib')
 
 provides = [
     'taurus',
     'taurus.core',
     'taurus.qt',
+    # 'Taurus-Tango',  # [Taurus-Tango]
+    # 'Taurus-Qt',  # [Taurus-Qt]
+    # 'Taurus-Qt-PyQwt',  # [Taurus-Qt-Plot]
+    # 'Taurus-Qt-Synoptic',  # [Taurus-Qt-Synoptic]
+    # 'Taurus-TaurusGUI',  # [Taurus-TaurusGUI]
+    # 'Taurus-Editor',  # [Taurus-Editor] --> or maybe move it to sardana
+    # 'Taurus-Qt-Guiqwt',
 ]
 
 requires = [
     'numpy (>=1.1)',
-    'PyTango (>=7.1)',
-    'PyQt4 (>=4.4)',
-    'PyQt4.Qwt5 (>=5.2.0)',   # plotting
-    'ply (>=2.3)',            # jdraw parser
-    'lxml (>=2.1)',           # tau2taurus, taurusuic4
-    'spyder (>=2.2)',         # shell, editor
+    'PyTango (>=7.1)',  # [Taurus-Tango]
+    'PyQt4 (>=4.8)',  # [Taurus-Qt]
+    'PyQt4.Qwt5 (>=5.2.0)',  # [Taurus-Qt-Plot]
+    'ply (>=2.3)',  # [Taurus-Qt-Synoptic]
+    'lxml (>=2.1)',  # [Taurus-TaurusGUI]
+    'spyder (>=2.2)',  # [Taurus-Editor] --> or maybe move it to sardana
+    'guiqwt (==2.3.1)',
 ]
 
-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'],
-    'taurus.qt.uic'            : ['pyuic4/*'],
-    'taurus.qt.qtgui.taurusgui.conf.tgconf_example01' : ['images/*'],
-    'taurus.qt.qtgui.button.test' : ['res/*'],
-    'taurus.qt.qtgui.graphic.jdraw.test' : ['res/*'],
-        
-    'taurus.qt.qtgui.help': ['ui/*.ui'],
-    'taurus.qt.qtgui.panel.report': ['ui/*.ui'],
-    'taurus.qt.qtgui.panel': ['ui/*.ui'],
-    'taurus.qt.qtgui.plot': ['ui/*.ui'],
-    'taurus.qt.qtgui.taurusgui': ['ui/*.ui'],
-    'taurus.qt.qtgui.extra_guiqwt': ['ui/*.ui'],
-    'taurus.qt.qtgui.util.test.test_ui' : ['ui/*.ui', 'ui/mywidget2/*.ui'],
-    'taurus.qt.qtgui.util.test.test_ui.mywidget3' : ['ui/*.ui'],
+extras_require = {
+    # 'Taurus-Tango': ['PyTango>=7.1'],  # [Taurus-Tango]
+    # 'Taurus-Qt': ['PyQt4>=4.8'],  # [Taurus-Qt]
+    # 'Taurus-Qt-PyQwt': ['PyQt4.Qwt5>=5.2.0'],  # [Taurus-Qt-Plot]
+    # 'Taurus-Qt-Synoptic': ['ply>=2.3'],  # [Taurus-Qt-Synoptic]
+    # 'Taurus-TaurusGUI': ['lxml>=2.1'],  # [Taurus-TaurusGUI]
+    # 'Taurus-Editor': ['spyder>=2.2'],  # [Taurus-Editor] --> or maybe move it to sardana
+    # 'Taurus-Qt-Guiqwt': ['guiqwt==2.3.1','guidata==1.6.1'],
+    # 'Taurus-Nexus': ['PyMca<5'],
 }
 
-
-# The files listed here will be made executable when installed.
-# The file names are relative to the dir containing setup.py
-# Note: They must also be listed in packages or package_data
-executable_data = [
-    'taurus/qt/qtgui/button/test/res/Timeout',
+console_scripts = [
+    'taurustestsuite = taurus.test.testsuite:main',
+    # TODO: taurusdoc,
 ]
 
-# check if local implementations of enum and pint are here (debian removes them
-# before running setup to avoid license issues)
-if os.path.isdir(abspath('lib', 'taurus', 'external', 'enum', 'enum')):
-    packages.append('taurus.external.enum.enum')
-if os.path.isdir(abspath('lib', 'taurus', 'external', 'pint', 'pint')):
-    packages.append('taurus.external.pint.pint')
-    package_data['taurus.external.pint.pint'] = ['*.txt']
-    
-
-def get_script_files():
-    scripts_dir = abspath('scripts')
-    scripts = []
-    for item in os.listdir(scripts_dir):
-        # avoid hidden files
-        if item.startswith("."):
-            continue
-        abs_item = os.path.join(scripts_dir, item)
-        # avoid non files
-        if not os.path.isfile(abs_item):
-            continue
-        # avoid files that have any extension
-        if len(os.path.splitext(abs_item)[1]) > 0:
-            continue
-        scripts.append('scripts/' + item)
-    return scripts
-
-scripts = get_script_files()
-
-data_files = [
+gui_scripts = [
+    'taurusconfigbrowser = taurus.qt.qtgui.panel.taurusconfigeditor:main',
+    'taurusplot = taurus.qt.qtgui.plot.taurusplot:main',
+    'taurustrend = taurus.qt.qtgui.plot.taurustrend:main',
+    'taurusform = taurus.qt.qtgui.panel.taurusform:taurusFormMain',
+    'tauruspanel = taurus.qt.qtgui.panel.taurusdevicepanel:TaurusPanelMain',
+    'taurusdevicepanel = taurus.qt.qtgui.panel.taurusdevicepanel:TaurusDevicePanelMain',
+    'taurusgui = taurus.qt.qtgui.taurusgui.taurusgui:main',
+    'taurusdesigner = taurus.qt.qtdesigner.taurusdesigner:main',
+    'tauruscurve = taurus.qt.qtgui.extra_guiqwt.plot:taurusCurveDlgMain',
+    'taurustrend1d = taurus.qt.qtgui.extra_guiqwt.plot:taurusTrendDlgMain',
+    'taurusimage = taurus.qt.qtgui.extra_guiqwt.plot:taurusImageDlgMain',
+    'taurustrend2d = taurus.qt.qtgui.extra_guiqwt.taurustrend2d:taurusTrend2DMain',
+    'taurusiconcatalog = taurus.qt.qtgui.icon.catalog:main',
+    # 'taurusconfigbrowser = taurus.qt.qtgui.panel.taurusconfigeditor:main [Taurus-Qt]',
+    # 'taurusplot = taurus.qt.qtgui.plot.taurusplot:main [Taurus-Qt-Plot]',
+    # 'taurustrend = taurus.qt.qtgui.plot.taurustrend:main [Taurus-Qt-Plot]',
+    # 'taurusform = taurus.qt.qtgui.panel.taurusform:taurusFormMain [Taurus-Qt]',
+    # 'tauruspanel = taurus.qt.qtgui.panel.taurusdevicepanel:TaurusPanelMain [Taurus-Qt]',
+    # 'taurusdevicepanel = taurus.qt.qtgui.panel.taurusdevicepanel:TaurusDevicePanelMain [Taurus-Qt-Plot]',
+    # 'taurusgui = taurus.qt.qtgui.taurusgui.taurusgui:main [Taurus-Qt-Plot,Taurus-Qt-Synoptic]',
+    # 'taurusdesigner = taurus.qt.qtdesigner.taurusdesigner:main [Taurus-Qt]',
+    # 'tauruscurve = taurus.qt.qtgui.extra_guiqwt.plot:taurusCurveDlgMain [Taurus-Qt-Guiqwt]',
+    # 'taurustrend1d = taurus.qt.qtgui.extra_guiqwt.plot:taurusTrendDlgMain [Taurus-Qt-Guiqwt]',
+    # 'taurusimage = taurus.qt.qtgui.extra_guiqwt.plot:taurusImageDlgMain [Taurus-Qt-Guiqwt]',
+    # 'taurustrend2d = taurus.qt.qtgui.extra_guiqwt.taurustrend2d:taurusTrend2DMain [Taurus-Qt-Guiqwt]',
+    # TODO: taurusremotelogmonitor
+    # TODO: taurusdemo
 ]
 
+entry_points={'console_scripts': console_scripts,
+              'gui_scripts': gui_scripts,
+              }
+
 classifiers = [
     'Development Status :: 3 - Alpha',
     'Environment :: Console',
@@ -264,6 +130,7 @@ classifiers = [
     'Operating System :: Unix',
     'Operating System :: OS Independent',
     'Programming Language :: Python',
+    'Programming Language :: Python :: 2.7',
     'Topic :: Scientific/Engineering',
     'Topic :: Software Development :: Libraries',
     'Topic :: Software Development :: User Interfaces',
@@ -271,852 +138,25 @@ classifiers = [
 ]
 
 
-class build_resources(Command):
-
-    description = "\"build\" Qt resource files"
-    user_options = [('logo=', None, "alternative logo file (default is taurus.png)")]
-    AllowedExt = ('svg', 'png', 'jpg', 'jpeg', 'gif')
-
-    def initialize_options (self):
-        self.resource_dir = abspath('lib', 'taurus', 'qt', 'qtgui', 'resource')
-        self.taurus = os.path.join(self.resource_dir, 'taurus.png')
-        self.logo = None  #os.path.join(self.resource_dir,'taurus.png')
-        if self.distribution.verbose:
-            self.out = sys.stdout
-        else:
-            self.out = StringIO.StringIO()
-
-    def finalize_options (self):
-        if self.logo is None:
-            build = self.get_finalized_command('build')
-            if build:
-                self.logo = build.logo
-            if self.logo is None:
-                self.logo = self.taurus
-        if not os.path.isabs(self.logo):
-            self.logo = os.path.abspath(self.logo)
-        self.logo = os.path.realpath(self.logo)
-
-        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:
-                msg = "Cannot find QT installation. " \
-                    "You should set the env. variable QTDIR " \
-                    "pointing to the Qt C++ installation directory"
-                if build.with_tango_icons:
-                    msg += ". Skipping creation of rcc files"
-                    print (msg, file=self.out, end='')
-                    self.rcc_exec = None
-                else:
-                    msg += " or allow skipping creation of the rcc files by " \
-                           "passing --with-tango-icons parameter to the build command"
-                    raise Exception(msg)
-        else:
-            self.rcc_exec = 'rcc'
-
-    def run(self):
-        orig_dir = os.path.abspath(os.curdir)
-        os.chdir(self.resource_dir)
-        try:
-            cur_dir = os.path.abspath(os.curdir)
-
-            result = self._build_general_res()
-            result2 = self._build_res(cur_dir)
-
-            result[0].extend(result2[0])
-            result[1].extend(result2[1])
-        finally:
-            os.chdir(orig_dir)
-
-    def _build_general_res(self):
-        qrc_filename = 'general.qrc'
-        rcc_filename = 'qrc_general.rcc'
-        out = self.out
-        print("Generating %s... " % qrc_filename, file=out, end='')
-        out.flush()
-        f = file(qrc_filename, 'w')
-        try:
-            logo_relpath = os.path.relpath(self.logo)
-            taurus_relpath = os.path.relpath(self.taurus)
-            f.write('<RCC>\n    <qresource>\n')
-            f.write('        <file alias="logo.png">%s</file>\n' % logo_relpath)
-            f.write('        <file alias="taurus.png">%s</file>\n' % taurus_relpath)
-            f.write('    </qresource>\n')
-            f.write('</RCC>\n')
-        except Exception, e:
-            print("[FAILED]\nDescription:\n%s" % str(e), file=out)
-            raise e
-        finally:
-            f.close()
-        print("[DONE]", file=out)
-
-        # Generate binary rcc file
-
-        if self.rcc_exec:
-            print("Generating %s... " % rcc_filename, file=out, end='')
-            out.flush()
-            cmd = '%s -binary %s -o %s' % (self.rcc_exec, qrc_filename, rcc_filename)
-            if os.system(cmd):
-                print("[FAILED]", file=out)
-            else:
-                print("[DONE]", file=out)
-
-        return [ [qrc_filename], [rcc_filename]]
-
-    def _build_res(self, abs_dir, bases=list()):
-        """Builds the resources in the abs_dir recursively.
-        The result is a list of 2 items:
-            - a list of generated qrc files
-            - a list of generated rcc files
-        """
-        result = [[], []]
-        res_name = os.path.basename(abs_dir)
-        local_elems, local_bases = [], copy.copy(bases)
-        local_bases.append(res_name)
-        out = self.out
-        for elem in os.listdir(abs_dir):
-            if elem.startswith('.'): continue
-            abs_elem = os.path.abspath(os.path.join(abs_dir, elem))
-            if os.path.isdir(abs_elem):
-                ret = self._build_res(abs_elem, local_bases)
-                result[0].extend(ret[0])
-                result[1].extend(ret[1])
-            elif os.path.splitext(abs_elem)[1][1:].lower() in build_resources.AllowedExt:
-                local_elems.append(elem)
-
-        if local_elems and local_bases[1:]:
-            base_dir = os.path.join(*local_bases[1:])
-            base_filename = "_".join(local_bases[1:])
-            base_filename = base_filename.replace('-', '_')
-            qrc_filename = base_filename + ".qrc"
-            rcc_filename = 'qrc_' + base_filename + ".rcc"
-
-            # Generate qrc file
-            print("Generating %s... " % qrc_filename, file=out, end='')
-            out.flush()
-            f = file(qrc_filename, 'w')
-            try:
-                qres_prefix = ""
-                if len(local_bases) > 2:
-                    qres_prefix = "/" + "/".join(local_bases[2:])
-                    f.write('<RCC>\n    <qresource prefix="%s">\n' % qres_prefix)
-                else:
-                    f.write('<RCC>\n    <qresource>\n')
-                qres_prefix = ":" + qres_prefix
-                qres_prefix += "/"
-                for elem in local_elems:
-                    rel_elem = os.path.join(base_dir, elem)
-                    f.write('        <file alias="%s">%s</file>\n' % (elem, rel_elem))
-                f.write('    </qresource>\n</RCC>')
-            except Exception, e:
-                print("[FAILED]\nDescription:\n%s" % str(e), file=out)
-                raise e
-            finally:
-                f.close()
-            result[0].append(qrc_filename)
-            print("[DONE]", file=out)
-
-            # Generate binary rcc file
-            if self.rcc_exec:
-                print("Generating %s... " % rcc_filename, file=out, end='')
-                out.flush()
-                cmd = '%s -binary %s -o %s' % (self.rcc_exec, qrc_filename, rcc_filename)
-                if os.system(cmd):
-                    print("[FAILED]", file=out)
-                else:
-                    result[1].append(rcc_filename)
-                    print("[DONE]", file=out)
-
-        return result
-
-
-class build(dftbuild):
-
-    user_options = dftbuild.user_options + \
-        [('logo=', None, "alternative logo file (default is taurus.png)"),
-         ('with-extra-widgets', None, "distribute extra widgets"),
-         ('no-doc', None, "do not build documentation"),
-         ('with-tango-icons', None, "add Tango icons too (not just *.rcc files)")]
-
-    boolean_options = dftbuild.boolean_options + ['with-extra-widgets', 'no-doc']
-
-    def initialize_options (self):
-        dftbuild.initialize_options(self)
-        self.logo = None
-        self.doc_fmt = None
-        self.no_doc = None
-        self.with_tango_icons = None
-        self.with_extra_widgets = True
-
-    def finalize_options (self):
-        dftbuild.finalize_options(self)
-        if self.logo is None:
-            self.logo = abspath('lib', 'taurus', 'qt', 'qtgui', 'resource', 'taurus.png')
-
-    def run(self):
-        self.build_package_data()
-        dftbuild.run(self)
-
-    def build_package_data(self):
-        packages = self.distribution.packages
-        package_data = self.distribution.package_data
-        if self.with_extra_widgets:
-            packages.extend(extra_packages)
-        resource_package_data = self.get_extra_resource_package_data()
-        package_data['taurus.qt.qtgui.resource'].extend(resource_package_data)
-        
-    def has_doc(self):
-        if self.no_doc:
-            return False
-        if not sphinx:
-            print("Sphinx not available: Documentation will not be build!")
-            return False
-        return os.path.isdir(abspath('doc'))
-
-    def has_resources(self):
-        return os.path.isdir(abspath('lib', 'taurus', 'qt', 'qtgui', 'resource'))
-
-    def get_extra_resource_package_data(self):
-        data = []
-        import PyQt4.Qt
-        if self.with_tango_icons or not hasattr(PyQt4.Qt.QIcon, "fromTheme"):
-            tango_icons_dir = abspath('lib', 'taurus', 'qt', 'qtgui', 'resource',
-                                      'tango-icons')
-            for tango_icon_item in os.listdir(tango_icons_dir):
-                if tango_icon_item.startswith("."):
-                    continue
-                abs_item = os.path.join(tango_icons_dir, tango_icon_item)
-                if not os.path.isdir(abs_item):
-                    continue
-                data.append('tango-icons/%s/*' % tango_icon_item)
-        return data
-
-    sub_commands = [('build_resources', has_resources)] + \
-                   dftbuild.sub_commands + \
-                   [('build_doc', has_doc)]
-
-
-class install_man(Command):
-
-    user_options = [
-        ('install-dir=', 'd', 'base directory for installing man page files')]
-
-    def initialize_options(self):
-        self.install_dir = None
-
-    def finalize_options(self):
-        self.set_undefined_options('install',
-                                   ('install_man', 'install_dir'))
-
-    def run(self):
-        src_man_dir = abspath('doc', 'man')
-        man_elems = os.listdir(src_man_dir)
-        man_pages = []
-        for f in man_elems:
-            f = os.path.join(src_man_dir, f)
-            if not os.path.isfile(f): continue
-            if not f.endswith(".1"): continue
-            man_pages.append(f)
-
-        install_dir = os.path.join(self.install_dir, 'man1')
-
-        if not os.path.isdir(install_dir):
-            os.makedirs(install_dir)
-
-        for man_page in man_pages:
-            self.copy_file(man_page, install_dir)
-
-
-class install_html(Command):
-
-    user_options = [
-        ('install-dir=', 'd', 'base directory for installing HTML documentation files')]
-
-    def initialize_options(self):
-        self.install_dir = None
-
-    def finalize_options(self):
-        self.set_undefined_options('install',
-                                   ('install_html', 'install_dir'))
-
-    def run(self):
-        build_doc = self.get_finalized_command('build_doc')
-        src_html_dir = abspath(build_doc.build_dir, 'html')
-        self.copy_tree(src_html_dir, self.install_dir)
-
-
-class install_scripts(dftinstall_scripts):
-    '''Customization to create .bat wrappers for the scripts 
-    when installing on windows.
-    Adapted from a recipe by Matthew Brett (who licensed it under CC0):
-    https://github.com/matthew-brett/myscripter/blob/master/setup.py
-    See rationale in: 
-    http://matthew-brett.github.io/pydagogue/installing_scripts.html
-    '''
-
-    user_options = list(dftinstall_scripts.user_options)
-    user_options.extend(
-            [
-             ('wrappers', None, 'Install .bat wrappers for windows (enabled by default on windows)'),
-             ('ignore-shebang', None, 'Use "python" as the interpreter in .bat wrappers (instead of using the interpreter found in the shebang line of the scripts). Note: this only affects to windows .bat wrappers!'),
-             ])
-
-
-    BAT_TEMPLATE_SHEBANG = \
-r"""@echo off
-REM wrapper to use shebang first line of {FNAME}
-set mypath=%~dp0
-set pyscript="%mypath%{FNAME}"
-set /p line1=<%pyscript%
-if "%line1:~0,2%" == "#!" (goto :goodstart)
-echo First line of %pyscript% does not start with "#!"
-exit /b 1
-:goodstart
-set py_exe=%line1:~2%
-call %py_exe% %pyscript% %*
-"""
-    BAT_TEMPLATE_PATH = \
-r"""@echo off
-REM wrapper to launch {FNAME}
-set mypath=%~dp0
-set pyscript="%mypath%{FNAME}"
-set py_exe="python"
-call %py_exe% %pyscript% %*
-"""
-
-    def initialize_options(self):
-        self.ignore_shebang = None
-        self.wrappers = (os.name == "nt")
-        dftinstall_scripts.initialize_options(self)
-
-    def run(self):
-        dftinstall_scripts.run(self)
-        if self.wrappers:
-            for filepath in self.get_outputs():
-                # If we can find an executable name in the #! top line of the script
-                # file, make .bat wrapper for script.
-                with open(filepath, 'rt') as fobj:
-                    first_line = fobj.readline()
-                if not (first_line.startswith('#!') and
-                        'python' in first_line.lower()):
-                    print("No #!python executable found, skipping .bat wrapper")
-                    continue
-                pth, fname = os.path.split(filepath)
-                froot, ext = os.path.splitext(fname)
-                bat_file = os.path.join(pth, froot + '.bat')
-                if self.ignore_shebang:
-                    template = self.BAT_TEMPLATE_PATH
-                else:
-                    template = self.BAT_TEMPLATE_SHEBANG
-                bat_contents = template.replace('{FNAME}', fname)
-                print("Making %s wrapper for %s" % (bat_file, filepath))
-                if self.dry_run:
-                    continue
-                with open(bat_file, 'wt') as fobj:
-                    fobj.write(bat_contents)
-
-
-class install_lib(dftinstall_lib):  
-    def run(self):
-        dftinstall_lib.run(self)
-        # Set the executable bits (owner, group, and world) on
-        # all executable_data
-        exe_ouput = [os.path.join(self.install_dir,f) for f in executable_data]
-        if os.name == 'posix':
-            for fn in self.get_outputs():
-                if fn in exe_ouput:
-                    if self.dry_run:
-                        log.info("changing mode of %s", fn)
-                    else:
-                        mode = ((os.stat(fn).st_mode) | 0555) & 07777
-                        log.info("changing mode of %s to %o", fn, mode)
-                        os.chmod(fn, mode)
-
-
-class install(dftinstall):
-
-    user_options = list(dftinstall.user_options)
-    user_options.extend([
-            ('install-man=', None, 'installation directory for Unix man pages'),
-            ('install-html=', None, "installation directory for HTML documentation"),
-            ('no-doc', None, "do not install HTML documentation")])
-
-    def initialize_options(self):
-        self.install_man = None
-        self.install_html = None
-        self.no_doc = None
-        dftinstall.initialize_options(self)
-
-    def finalize_options(self):
-
-        # We do a hack here. We cannot trust the 'install_base' value because it
-        # is not always the final target. For example, in unix, the install_base
-        # is '/usr' and all other install_* are directly relative to it. However,
-        # in unix-local (like ubuntu) install_base is still '/usr' but, for
-        # example, install_data, is '$install_base/local' which breaks everything.
-        #
-        # The hack consists in using install_data instead of install_base since
-        # install_data seems to be, in practice, the proper install_base on all
-        # different systems.
-
-        dftinstall.finalize_options(self)
-        if os.name != "posix":
-            if self.install_man is not None:
-                self.warn("install-man option ignored on this platform")
-                self.install_man = None
-        else:
-            if self.install_man is None:
-                self.install_man = os.path.join(self.install_data, 'share', 'man')
-        if self.install_html is None:
-            self.install_html = os.path.join(self.install_data, 'share', 'doc', 'taurus', 'html')
-        if self.no_doc is None:
-            self.no_doc = False
-        self.dump_dirs("Installation directories")
-
-    def expand_dirs(self):
-        dftinstall.expand_dirs(self)
-        self._expand_attrs(['install_man'])
-
-    def has_man(self):
-        return os.name == "posix"
-
-    def has_html(self):
-        if self.no_doc:
-            return False
-        return sphinx is not None
-
-    sub_commands = list(dftinstall.sub_commands)
-    sub_commands.append(('install_man', has_man))
-    sub_commands.append(('install_html', has_html))
-
-
-class clean(dftclean):
-    def run(self):
-        dftclean.run(self)
-
-        # This is a very crude approach to clean the garbage created by taurus
-        # outside of the build dir when running the build command
-        # see: https://sourceforge.net/p/sardana/tickets/324/
-        import glob
-        from distutils.dir_util import remove_tree
-
-        # collect the garbage *files* to be deleted
-        garbage = []
-
-        resource = abspath('lib', 'taurus', 'qt', 'qtgui', 'resource')
-        garbage.extend(glob.glob(os.path.join(resource, '*.rcc')))
-        garbage.extend(glob.glob(os.path.join(resource, '*.qrc')))
-        garbage.append(os.path.join(resource, 'catalog.html'))
-
-        doc_devel = abspath('doc', 'source', 'devel')
-        garbage.append(os.path.join(doc_devel, 'catalog.html'))
-
-        doc = abspath('doc')
-        garbage.append(os.path.join(doc, '~thumbnails.zip'))
-
-        # delete the garbage files
-        for fn in garbage:
-            if os.path.exists(fn):
-                log.info("removing '%s'", fn)
-                if self.dry_run:
-                    continue
-                os.remove(fn)
-            else:
-                log.debug("'%s' does not exist -- can't clean it", fn)
-
-        # now delete the api dir
-        api_dir = os.path.join(doc_devel, 'api')
-        if os.path.exists(api_dir):
-            remove_tree(api_dir, dry_run=self.dry_run)
-        else:
-            log.debug("'%s' does not exist -- can't clean it", api_dir)
-
-
-cmdclass = { 'build' : build,
-             'build_resources' : build_resources,
-             'install' : install,
-             'install_lib': install_lib,
-             'install_man' : install_man,
-             'install_html' : install_html,
-             'install_scripts' : install_scripts,
-             'clean' : clean }
-
-if sphinx:
-    from sphinx.setup_command import BuildDoc
-
-    class build_catalog(object):
-        '''builds an html catalog of icons. It links to png thumbnails that are 
-        created in the _static dir
-        '''
-
-        AllowedExt = build_resources.AllowedExt
-
-        HTML_IL = '<tr height="30">' \
-                  '<td width="30" align="center">' \
-                     '<img width="24" src="{thumbnail}"' \
-                                    ' alt="{res_relpath}"/></td>' \
-                  '<td width="400">{qres_prefix}{icon_name}</td>' \
-                  '<td width="400">{res_relpath}</td>' \
-                  '<td width="200">{theme}</td></tr>\n'
-        HTML_T = '<table border="1" cellspacing="0" cellpadding="2">\n' \
-                 '<th colspan="4">Resource: "%s" Directory: "%s"</th>\n' \
-                 '<tr><th>Preview</th><th>Resouce</th><th>File name</th>' \
-                 '<th>Theme</th></tr>\n'
-
-        def run(self):
-            self.resource_dir = abspath('lib', 'taurus', 'qt', 'qtgui', 
-                                        'resource')
-            pngs_dir = os.path.abspath(os.path.join(self.builder_target_dir,
-                                                    '_static', 
-                                                    'icon_thumbnails') )
-            devel_dir = os.path.abspath(os.path.join(self.builder_target_dir,
-                                                     'devel') )
-            self.thumbnails_relpath = os.path.relpath(pngs_dir, devel_dir)
-            
-            orig_dir = os.path.abspath(os.curdir)
-            os.chdir(self.resource_dir)
-            
-            # create temporary catalog file (to be removed at end of build_doc)
-            catalog = file(self.fname, 'w')
-            catalog.write("<html><head>\n<title>taurus Icon Catalog</title>\n" \
-            "<style>table { border-collapse: collapse; }</style>\n</head>\n<body>\n")
-
-            try:
-                cur_dir = os.path.abspath(os.curdir)
-
-                result = self._build_general_res()
-                result2 = self._build_res(cur_dir)
-
-                result[0].extend(result2[0])
-                result[1].extend(result2[1])
-
-                catalog.write("<h1>Index</h1>\n<ul>")
-                for anchor in result[1]:
-                    catalog.write("<li>%s</li>\n" % anchor)
-                catalog.write("</ul>\n")
-                catalog.writelines(result[0])
-            finally:
-                catalog.write("""</body></html>""")
-                catalog.close()
-                os.chdir(orig_dir)
-            
-            #make thumbnails 
-            try:
-                if self.thumbnails_source == 'wand':
-                    from wand.image import Image
-                    def transform(ifname, ofname):
-                        with Image(filename=ifname) as img:
-                            img.transform(resize='24x')
-                            img.save(filename=ofname)
-                            return True
-                        return False
-                elif self.thumbnails_source == 'qt':
-                    import PyQt4.Qt
-                    if PyQt4.Qt.qApp.instance() is None:
-                        self.app = PyQt4.Qt.QApplication([])
-                    from PyQt4 import Qt
-                    def transform(ifname, ofname):
-                        pixmap = Qt.QPixmap(ifname)
-                        p = pixmap.scaledToWidth(24, Qt.Qt.SmoothTransformation)
-                        return p.save(ofname)
-                else:
-                    if not os.path.isabs(self.thumbnails_source):
-                        m = 'Absolute path required for Thumbnails dir or zip'
-                        raise ValueError(m)
-                    shutil.rmtree(pngs_dir, ignore_errors=True)
-                    if self.thumbnails_source.lower().endswith('.zip'):
-                        from zipfile import ZipFile
-                        zfile = ZipFile(self.thumbnails_source)
-                        zfile.extractall(pngs_dir)
-                    else:
-                        shutil.copytree(self.thumbnails_source, pngs_dir)
-                    def transform(ifname, ofname):
-                        #just check if the required thumbnail exists
-                        return os.path.isfile(ofname) 
-
-                print("\tCreating PNG thumbnails for icon catalog")
-                os.path.walk(self.resource_dir, self._make_thumbnails, 
-                             (self.resource_dir, pngs_dir, transform) )
-                # create a zipped file for the thumbnails
-                fname = abspath('doc', '~thumbnails.zip')
-                if os.path.isfile(fname):
-                    os.remove(fname)
-                self._zipdir(pngs_dir, fname) 
-                
-            except ImportError, e:
-                print("\tCannot create PNG thumbnails for icon catalog: %s" %
-                       repr(e))
-                
-        @staticmethod
-        def _make_thumbnails(arg, dirname, fnames):
-            '''create thumbnails. To be called by a walker'''
-            resource, target, transform = arg
-            relpath = os.path.relpath(dirname, start=resource)
-            path = os.path.join(target, relpath)
-            if not os.path.isdir(path):
-                os.makedirs(path)
-            for fname in fnames:
-                fbase, f_ext = os.path.splitext(fname)
-                if f_ext[1:] in build_catalog.AllowedExt:
-                    full_source_fname = os.path.join(dirname, fname)
-                    target_fname = fbase + ".png"
-                    full_target_fname = os.path.join(path, target_fname)
-                    if not os.path.isfile(full_target_fname):
-                        ok = transform(full_source_fname, full_target_fname)
-                        print(ok and "[OK]" or "[FAIL]", full_source_fname, 
-                              '->', full_target_fname)
-        
-        @staticmethod                
-        def _zipdir(basedir, archivename):
-            '''function to zip the contents of basedir into archivename. 
-            Adapted from: http://stackoverflow.com/questions/296499
-            '''
-            from zipfile import ZipFile, ZIP_DEFLATED
-            from contextlib import closing
-            assert os.path.isdir(basedir)
-            with closing(ZipFile(archivename, "w", ZIP_DEFLATED)) as z:
-                for root, dirs, files in os.walk(basedir):
-                    #NOTE: ignore empty directories
-                    for fn in files:
-                        absfn = os.path.join(root, fn)
-                        zfn = absfn[len(basedir)+len(os.sep):] 
-                        z.write(absfn, zfn)
-                        
-        def getThemeIcon(self, resource):
-            try:
-                import PyQt4.Qt
-                if not hasattr(PyQt4.Qt.QIcon, "hasThemeIcon"):
-                    return "Unknown"
-                i = resource.rfind("/")
-                if i >= 0: resource = resource[i + 1:]
-                i = resource.rfind(".")
-                if i >= 0: resource = resource[:i]
-                if PyQt4.Qt.QIcon.hasThemeIcon(resource):
-                    return resource
-                return "No"
-            except:
-                return "Unknown"
-
-        def _build_general_res(self):
-            out = self.out
-            html = '<h2><a name="_base">Base icons</a></h2>\n'
-            html += self.HTML_T % (':/', '')
-            anchor = '<a href="#_base">Base icons</a>'
-            try:
-                taurus_relpath = 'taurus.png'
-                png_relpath = os.path.join(self.thumbnails_relpath, 
-                                           taurus_relpath)
-                html += self.HTML_IL.format(thumbnail=png_relpath,
-                                            res_relpath=taurus_relpath,
-                                            qres_prefix=":/",
-                                            icon_name=taurus_relpath,
-                                            theme=self.getThemeIcon("taurus.png")
-                                            )
-            except Exception, e:
-                print("[FAILED]\nDescription:\n%s" % str(e), file=out)
-                import traceback
-                traceback.print_exc()
-                raise e
-            finally:
-                html += '</table>\n'
-
-            return [ [html], [anchor] ]
-
-        def _build_res(self, abs_dir, bases=list()):
-            """Builds the resources in the abs_dir recursively.
-            The result is a list of 5 items:
-                - a list of HTML strings
-                - a list of HTML anchors
-            """
-            result = [[], []]
-            res_name = os.path.basename(abs_dir)
-            local_elems, local_bases = [], copy.copy(bases)
-            local_bases.append(res_name)
-            out = self.out
-            for elem in os.listdir(abs_dir):
-                if elem.startswith('.'): continue
-                abs_elem = os.path.abspath(os.path.join(abs_dir, elem))
-                if os.path.isdir(abs_elem):
-                    ret = self._build_res(abs_elem, local_bases)
-                    result[0].extend(ret[0])
-                    result[1].extend(ret[1])
-                elif os.path.splitext(abs_elem)[1][1:].lower() in build_resources.AllowedExt:
-                    local_elems.append(elem)
-
-            if local_elems and local_bases[1:]:
-                base_dir = os.path.join(*local_bases[1:])
-                base_filename = "_".join(local_bases[1:])
-                base_filename = base_filename.replace('-', '_')
-
-                html = ''
-                anchor = ''
-                try:
-                    qres_prefix = ""
-                    if len(local_bases) > 2:
-                        qres_prefix = "/" + "/".join(local_bases[2:])
-                    qres_prefix = ":" + qres_prefix
-                    qres_prefix += "/"
-
-                    html += '<h2><a name="%s">%s (%s)</a></h2>\n' % (base_dir, qres_prefix, base_dir)
-                    html += self.HTML_T % (qres_prefix , base_dir)
-                    anchor = '<a href="#%s">%s (%s)</a>' % (base_dir, base_dir, qres_prefix)
-                    for elem in local_elems:
-                        rel_elem = os.path.join(base_dir, elem)
-                        base_elem, _ = os.path.splitext(rel_elem)
-                        png_relpath = os.path.join(self.thumbnails_relpath,
-                                                   base_elem + ".png")
-                        html += self.HTML_IL.format(thumbnail=png_relpath,
-                                                    res_relpath=rel_elem,
-                                                    qres_prefix=qres_prefix,
-                                                    icon_name=rel_elem,
-                                                    theme=self.getThemeIcon(elem)
-                                                    )
-                except Exception, e:
-                    print("[FAILED]\nDescription:\n%s" % str(e), file=out)
-                    raise e
-                finally:
-                    html += '</table>\n'
-                result[0].append(html)
-                result[1].append(anchor)
-            return result
-        
-
-    class build_doc(BuildDoc):
-        user_options = BuildDoc.user_options + \
-                     [('thumbnails-source=', None, 
-                       ('Source for catalog thumbnails. Use "qt" for ' +
-                        'transforming the icons in the resource dir using ' +
-                        'QPixmap  (this is the default). Use "wand" to ' +
-                        'transform using the wand module. Or provide an ' +
-                        'absolute path to either a dir or a zipfile ' +
-                        'containing a tree of pre-transformed thumbnails') ),
-                      ('skip-api', None, 'skip api doc creation'),
-                      ('skip-catalog', None, 'skip icon catalog creation')
-                      ]
-        boolean_options = BuildDoc.boolean_options + ['skip-api',
-                                                      'skip-catalog'
-                                                      ]
-
-        def initialize_options (self):
-            BuildDoc.initialize_options(self)
-            self.thumbnails_source = 'qt'
-            self.skip_api = False
-            self.skip_catalog = False
-
-        def run(self):
-            try:
-                return self.doit()
-            except Exception, e:
-                self.warn("Failed to build doc. Reason: %s" % str(e))
-
-        def _build_doc_api(self, api_dir, doc_dir):
-            if self.skip_api:
-                return
-
-            #import auto_rst4api from the doc dir
-            name = 'auto_rst4api'
-            data = imp.find_module(name, [doc_dir])
-            auto_rst4api = imp.load_module(name, *data)
-            API_Creator = auto_rst4api.Auto_rst4API_Creator
-            
-            # prepare api creator
-            excl = ['_[^\.]*[^_]', '.*.extra_sardana', '.*.extra_pool', 
-                    '.*.extra_macroexecutor', 'taurus.external']
-            rstCreator = API_Creator(exclude_patterns=excl,
-                                     templatespath=doc_dir,
-                                     overwrite_old=True,
-                                     verbose=self.distribution.verbose)
-            # clean previously existing rst files
-            rstCreator.cleanAutogenerated(api_dir)
-            
-            # generate api
-            # IMPORTANT: 'taurus' here is already the one from source, since we went 
-            #            through doc/conf.py already and inserted the lib dir in the
-            #            path
-            import taurus
-            r = rstCreator.documentModule('taurus', api_dir)
-            
-            # report
-            print("Auto Creation of API docs Finished with %i warnings:" % len(r))
-            for i in r:
-                print(i)
-                
-        def _build_catalog(self, fname):
-            if self.skip_catalog:
-                return            
-            catalog = build_catalog()
-            catalog.fname = fname
-            catalog.builder_target_dir = self.builder_target_dir
-            catalog.thumbnails_source = self.thumbnails_source
-            catalog.verbose = self.distribution.verbose
-            catalog.out = self.out
-            catalog.run()
-        
-        def doit(self):
-            if self.distribution.verbose:
-                self.out = sys.stdout
-            else:
-                self.out = StringIO.StringIO()
-            
-            _catalog_file = abspath('doc', 'source', 'devel', 'catalog.html')
-            _api_dir = abspath('doc', 'source', 'devel', 'api')
-            _lib_dir = abspath('lib')
-            _doc_dir = abspath('doc')
-            _mock_path = os.path.join(_doc_dir, 'mock.zip') 
-            # append mock dir to the sys path (mocks will be used if needed)
-            sys.path.append(_mock_path)
-            # Import taurus from src distribution
-            sys.path.insert(0, os.path.abspath(_lib_dir))
-                
-            try:
-                for cmd_name in self.get_sub_commands():
-                    self.run_command(cmd_name)
-                self._build_doc_api(_api_dir, _doc_dir)
-                self._build_catalog(_catalog_file)
-                BuildDoc.run(self)
-            finally:
-                sys.path.pop(0)
-                print('Removing temporary api dir: ', _api_dir)
-                shutil.rmtree(_api_dir, ignore_errors=True)
-                print('Removing temporary catalog file', _catalog_file)
-                try:
-                    os.remove(_catalog_file)
-                except:
-                    pass
-
-    cmdclass['build_doc'] = build_doc
-
-
-
-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))
+setup(name='taurus',
+      version=release.version,
+      description=release.description,
+      long_description=release.long_description,
+      author=release.authors['Tiago_et_al'][0],
+      maintainer=release.authors['Community'][0],
+      maintainer_email=release.authors['Community'][1],
+      url=release.url,
+      download_url=release.download_url,
+      platforms=release.platforms,
+      license=release.license,
+      keywords=release.keywords,
+      packages=packages,
+      package_dir=package_dir,
+      classifiers=classifiers,
+      include_package_data=True,
+      entry_points=entry_points,
+      provides=provides,
+      requires=requires,
+      extras_require=extras_require,
+      test_suite='taurus.test.testsuite.get_suite',
+      )

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/taurus.git



More information about the debian-science-commits mailing list