[sardana] 01/08: Imported Upstream version 1.3.0

Frédéric-Emmanuel Picca picca at moszumanska.debian.org
Sun Feb 16 09:37:03 UTC 2014


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

picca pushed a commit to annotated tag debian/1.3.0-1
in repository sardana.

commit cee149dd8d98d6bbe8ab1632fea9d60625b06024
Author: Picca Frédéric-Emmanuel <picca at debian.org>
Date:   Sun Feb 16 07:10:03 2014 +0100

    Imported Upstream version 1.3.0
---
 PKG-INFO                                           |  17 +-
 doc/man/MacroServer.1                              |  18 +-
 doc/man/Pool.1                                     |  18 +-
 doc/man/Sardana.1                                  |  18 +-
 doc/man/spock.1                                    | 356 +++++++++++++++++++++
 doc/source/_templates/index.html                   |   2 +
 doc/source/_templates/indexsidebar.html            |   4 +-
 doc/source/devel/api/api_motor.rst                 |   4 +-
 doc/source/devel/guide_coding.rst                  |  52 +--
 .../howto_controllers/howto_motorcontroller.rst    |   6 +-
 doc/source/devel/howto_macros/index.rst            |   2 +-
 doc/source/devel/howto_macros/macros_general.rst   |  39 +--
 doc/source/devel/overview/overview_macroserver.rst |   2 +-
 doc/source/users/getting_started/installing.rst    |  25 +-
 setup.py                                           | 299 +++++++++--------
 src/sardana/macroserver/macro.py                   |   7 +-
 src/sardana/macroserver/macros/examples/scans.py   |  14 +-
 .../macroserver/macros/examples/submacros.py       |  15 +-
 src/sardana/macroserver/macros/ioregister.py       |   2 +-
 src/sardana/macroserver/macroserver.py             |   8 +-
 src/sardana/macroserver/msmacromanager.py          |   3 +-
 src/sardana/macroserver/scan/gscan.py              |   3 +-
 .../macroserver/scan/recorder/datarecorder.py      |  96 +++---
 src/sardana/macroserver/scan/recorder/output.py    | 128 ++++----
 src/sardana/pool/controller.py                     |  14 +-
 src/sardana/release.py                             |  19 +-
 src/sardana/sardanamanager.py                      |   4 +-
 src/sardana/sardanathreadpool.py                   |   4 +-
 src/sardana/spock/genutils.py                      |   4 +-
 src/sardana/spock/inputhandler.py                  |   2 +-
 src/sardana/spock/ipython_00_10/genutils.py        |  20 +-
 src/sardana/spock/ipython_00_11/genutils.py        |  18 +-
 .../ipython_01_00/__init__.py}                     |  31 +-
 .../{ipython_00_11 => ipython_01_00}/genutils.py   |  35 +-
 src/sardana/spock/magic.py                         |   7 +-
 src/sardana/spock/release.py                       |   1 +
 src/sardana/tango/core/SardanaDevice.py            |   2 +-
 src/sardana/tango/macroserver/Door.py              |   3 +-
 src/sardana/tango/macroserver/MacroServer.py       |   2 +-
 src/sardana/tango/pool/Controller.py               |   2 +-
 src/sardana/tango/pool/MeasurementGroup.py         |   2 +-
 src/sardana/tango/pool/Pool.py                     |   3 +-
 src/sardana/tango/pool/PoolDevice.py               |   2 +-
 43 files changed, 862 insertions(+), 451 deletions(-)

diff --git a/PKG-INFO b/PKG-INFO
index 2eaff69..2cf95bc 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,16 +1,17 @@
 Metadata-Version: 1.1
 Name: sardana
-Version: 1.2.0
-Summary: Sardana is a generic program for control applications in large and small installations
+Version: 1.3.0
+Summary: instrument control and data acquisition system
 Home-page: http://packages.python.org/sardana
-Author: Carlos Pascual-Izarra
-Author-email: cpascual at cells.es
+Author: Zbigniew Reszela
+Author-email: zreszela at cells.es
 License: LGPL
 Download-URL: http://pypi.python.org/packages/source/s/sardana
-Description: Produce a modular, high performance, robust and generic user environment 
-        for control applications in large and small installations. 
-        Make Sardana the generic user environment distributed in the TANGO project 
-        and the standard basis of collaborations in control.
+Description: Sardana is a Supervision, Control And Data Acquisition (SCADA) system for
+         scientific installations. It is written in Python and based on the TANGO
+         library. The hardware control and data acquisition routines can be
+         accessed via an IPython console and a generic graphical user interface
+         (both of which are easily extensible by the user).
 Keywords: Sardana,Tango,Python,Control System
 Platform: Linux
 Platform: Windows XP/2000/NT
diff --git a/doc/man/MacroServer.1 b/doc/man/MacroServer.1
index f9f1277..bc6c484 100644
--- a/doc/man/MacroServer.1
+++ b/doc/man/MacroServer.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.38.4.
-.TH MACROSERVER "1" "January 2012" "MacroServer 1.0.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.40.10.
+.TH MACROSERVER "1" "February 2014" "MacroServer 1.3.0" "User Commands"
 .SH NAME
-MacroServer \- manual page for MacroServer 1.0.0
+MacroServer \- manual page for MacroServer 1.3.0
 .SH SYNOPSIS
 .B usage:
 \fIMacroServer instance_name \fR[\fIoptions\fR]
@@ -36,15 +36,3 @@ When set to True disables logging into a file
 \fB\-\-rconsole\-port\fR=\fIRCONSOLE_PORT\fR
 rconsole port number. [default: 0 meaning rconsole NOT
 active]
-.SH "SEE ALSO"
-The full documentation for
-.B MacroServer
-is maintained as a Texinfo manual.  If the
-.B info
-and
-.B MacroServer
-programs are properly installed at your site, the command
-.IP
-.B info MacroServer
-.PP
-should give you access to the complete manual.
diff --git a/doc/man/Pool.1 b/doc/man/Pool.1
index a5452f5..9ca38d2 100644
--- a/doc/man/Pool.1
+++ b/doc/man/Pool.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.38.4.
-.TH POOL "1" "January 2012" "Pool 1.0.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.40.10.
+.TH POOL "1" "February 2014" "Pool 1.3.0" "User Commands"
 .SH NAME
-Pool \- manual page for Pool 1.0.0
+Pool \- manual page for Pool 1.3.0
 .SH SYNOPSIS
 .B usage:
 \fIPool instance_name \fR[\fIoptions\fR]
@@ -36,15 +36,3 @@ When set to True disables logging into a file
 \fB\-\-rconsole\-port\fR=\fIRCONSOLE_PORT\fR
 rconsole port number. [default: 0 meaning rconsole NOT
 active]
-.SH "SEE ALSO"
-The full documentation for
-.B Pool
-is maintained as a Texinfo manual.  If the
-.B info
-and
-.B Pool
-programs are properly installed at your site, the command
-.IP
-.B info Pool
-.PP
-should give you access to the complete manual.
diff --git a/doc/man/Sardana.1 b/doc/man/Sardana.1
index 89bc375..ed2febc 100644
--- a/doc/man/Sardana.1
+++ b/doc/man/Sardana.1
@@ -1,7 +1,7 @@
-.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.38.4.
-.TH SARDANA "1" "January 2012" "Sardana 1.0.0" "User Commands"
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.40.10.
+.TH SARDANA "1" "February 2014" "Sardana 1.3.0" "User Commands"
 .SH NAME
-Sardana \- manual page for Sardana 1.0.0
+Sardana \- manual page for Sardana 1.3.0
 .SH SYNOPSIS
 .B usage:
 \fISardana instance_name \fR[\fIoptions\fR]
@@ -36,15 +36,3 @@ When set to True disables logging into a file
 \fB\-\-rconsole\-port\fR=\fIRCONSOLE_PORT\fR
 rconsole port number. [default: 0 meaning rconsole NOT
 active]
-.SH "SEE ALSO"
-The full documentation for
-.B Sardana
-is maintained as a Texinfo manual.  If the
-.B info
-and
-.B Sardana
-programs are properly installed at your site, the command
-.IP
-.B info Sardana
-.PP
-should give you access to the complete manual.
diff --git a/doc/man/spock.1 b/doc/man/spock.1
new file mode 100644
index 0000000..b9010d1
--- /dev/null
+++ b/doc/man/spock.1
@@ -0,0 +1,356 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.40.10.
+.TH SPOCK "1" "February 2014" "spock 1.0.0" "User Commands"
+.SH NAME
+spock \- manual page for spock 1.0.0
+.SH DESCRIPTION
+=========
+.IP
+IPython
+.PP
+=========
+.PP
+Tools for Interactive Computing in Python
+=========================================
+.IP
+A Python shell with automatic history (input and output), dynamic object
+introspection, easier configuration, command completion, access to the
+system shell and more.  IPython can also be embedded in running programs.
+.PP
+Usage
+.IP
+ipython [subcommand] [options] [files]
+.IP
+If invoked with no options, it executes all the files listed in sequence
+and exits, use \fB\-i\fR to enter interactive mode after running the files.  Files
+ending in .py will be treated as normal Python, but files ending in .ipy
+can contain special IPython syntax (magic commands, shell expansions, etc.)
+.IP
+Almost all configuration in IPython is available via the command\-line. Do
+`ipython \fB\-\-help\-all\fR` to see all available options.  For persistent
+configuration, look into your `ipython_config.py` configuration file for
+details.
+.IP
+This file is typically installed in the `IPYTHONDIR` directory, and there
+is a separate configuration directory for each profile. The default profile
+directory will be located in $IPYTHONDIR/profile_default. For Linux users,
+IPYTHONDIR defaults to `$HOME/.config/ipython`, and for other Unix systems
+to `$HOME/.ipython`.  For Windows users, $HOME resolves to C:\eDocuments
+and Settings\eYourUserName in most instances.
+.IP
+To initialize a profile with the default configuration file, do::
+.IP
+$> ipython profile create
+.IP
+and start editing `IPYTHONDIR/profile_default/ipython_config.py`
+.IP
+In IPython's documentation, we will refer to this directory as
+`IPYTHONDIR`, you can change its default location by creating an
+environment variable with this name and setting it to the desired path.
+.IP
+For more information, see the manual available in HTML and PDF in your
+installation, or online at http://ipython.org/documentation.html.
+.PP
+Subcommands
+\fB\-\-\-\-\-\-\-\-\-\-\-\fR
+.PP
+Subcommands are launched as `spock cmd [args]`. For information on using
+subcommand 'cmd', do: `spock cmd \fB\-h\fR`.
+.PP
+locate
+.IP
+print the path to the IPython dir
+.PP
+kernel
+.IP
+Start a kernel without an attached frontend.
+.PP
+notebook
+.IP
+Launch the IPython HTML Notebook Server.
+.PP
+console
+.IP
+Launch the IPython terminal\-based Console.
+.PP
+qtconsole
+.IP
+Launch the IPython Qt Console.
+.PP
+profile
+.IP
+Create and manage IPython profiles.
+.PP
+Options
+\fB\-\-\-\-\-\-\-\fR
+.PP
+Arguments that take values are actually convenience aliases to full
+Configurables, whose aliases are listed on the help line. For more information
+on full configurables, see '\-\-help\-all'.
+.PP
+\fB\-\-no\-autoindent\fR
+.IP
+Turn off autoindenting.
+.PP
+\fB\-\-autoedit\-syntax\fR
+.IP
+Turn on auto editing of files with syntax errors.
+.PP
+\fB\-\-deep\-reload\fR
+.IP
+Enable deep (recursive) reloading by default. IPython can use the
+deep_reload module which reloads changes in modules recursively (it
+replaces the reload() function, so you don't need to change anything to
+use it). deep_reload() forces a full reload of modules whose code may
+have changed, which the default reload() function does not.  When
+deep_reload is off, IPython will use the normal reload(), but
+deep_reload will still be available as dreload(). This feature is off
+by default [which means that you have both normal reload() and
+dreload()].
+.PP
+\fB\-\-confirm\-exit\fR
+.IP
+Set to confirm when you try to exit IPython with an EOF (Control\-D
+in Unix, Control\-Z/Enter in Windows). By typing 'exit' or 'quit',
+you can force a direct exit without any confirmation.
+.PP
+\fB\-\-pylab\fR
+.IP
+Pre\-load matplotlib and numpy for interactive use with
+the default matplotlib backend.
+.PP
+\fB\-\-term\-title\fR
+.IP
+Enable auto setting the terminal title.
+.PP
+\fB\-\-classic\fR
+.IP
+Gives IPython a similar feel to the classic Python prompt.
+.PP
+\fB\-\-autoindent\fR
+.IP
+Turn on autoindenting.
+.PP
+\fB\-\-no\-automagic\fR
+.IP
+Turn off the auto calling of magic commands.
+.PP
+\fB\-\-banner\fR
+.IP
+Display a banner upon starting IPython.
+.PP
+\fB\-\-automagic\fR
+.IP
+Turn on the auto calling of magic commands. Type %%magic at the
+IPython  prompt  for  more information.
+.PP
+\fB\-\-no\-deep\-reload\fR
+.IP
+Disable deep (recursive) reloading by default.
+.PP
+\fB\-\-no\-term\-title\fR
+.IP
+Disable auto setting the terminal title.
+.PP
+\fB\-\-nosep\fR
+.IP
+Eliminate all spacing between prompts.
+.PP
+\fB\-i\fR
+.IP
+If running code from the command line, become interactive afterwards.
+Note: can also be given simply as '\-i.'
+.PP
+\fB\-\-debug\fR
+.IP
+set log level to logging.DEBUG (maximize logging output)
+.PP
+\fB\-\-pprint\fR
+.IP
+Enable auto pretty printing of results.
+.PP
+\fB\-\-no\-autoedit\-syntax\fR
+.IP
+Turn off auto editing of files with syntax errors.
+.PP
+\fB\-\-quiet\fR
+.IP
+set log level to logging.CRITICAL (minimize logging output)
+.PP
+\fB\-\-no\-color\-info\fR
+.IP
+Disable using colors for info related things.
+.PP
+\fB\-\-color\-info\fR
+.IP
+IPython can display information about objects via a set of functions, and optionally can use colors for this, syntax highlighting
+source code and various other elements.  However, because this
+information is passed through a pager (like 'less') and many pagers get
+confused with color codes, this option is off by default.  You can test
+it and turn it on permanently in your ipython_config.py file if it
+works for you.  Test it and turn it on permanently if it works with
+your system.  The magic function %%color_info allows you to toggle this
+interactively for testing.
+.PP
+\fB\-\-init\fR
+.TP
+Initialize profile with default config files.
+This is equivalent
+.IP
+to running `ipython profile create <profile>` prior to startup.
+.PP
+\fB\-\-no\-pdb\fR
+.IP
+Disable auto calling the pdb debugger after every exception.
+.PP
+\fB\-\-quick\fR
+.IP
+Enable quick startup with no config files.
+.PP
+\fB\-\-no\-confirm\-exit\fR
+.IP
+Don't prompt the user when exiting.
+.PP
+\fB\-\-pydb\fR
+.IP
+Use the third party 'pydb' package as debugger, instead of pdb.
+Requires that pydb is installed.
+.PP
+\fB\-\-pdb\fR
+.IP
+Enable auto calling the pdb debugger after every exception.
+.PP
+\fB\-\-no\-pprint\fR
+.IP
+Disable auto auto pretty printing of results.
+.PP
+\fB\-\-no\-banner\fR
+.IP
+Don't display a banner upon starting IPython.
+.PP
+\fB\-\-profile=\fR<Unicode> (BaseIPythonApplication.profile)
+.IP
+Default: u'default'
+The IPython profile to use.
+.PP
+\fB\-c\fR <Unicode> (InteractiveShellApp.code_to_run)
+.IP
+Default: ''
+Execute the given command string.
+.PP
+\fB\-\-pylab=\fR<CaselessStrEnum> (InteractiveShellApp.pylab)
+.IP
+Default: None
+Choices: ['tk', 'qt', 'wx', 'gtk', 'osx', 'inline', 'auto']
+Pre\-load matplotlib and numpy for interactive use, selecting a particular
+matplotlib backend and loop integration.
+.PP
+\fB\-\-autocall=\fR<Enum> (InteractiveShell.autocall)
+.IP
+Default: 0
+Choices: (0, 1, 2)
+Make IPython automatically call any callable object even if you didn't type
+explicit parentheses. For example, 'str 43' becomes 'str(43)' automatically.
+The value can be '0' to disable the feature, '1' for 'smart' autocall, where
+it is not applied if there are no more arguments on the line, and '2' for
+\&'full' autocall, where all callable objects are automatically called (even
+if no arguments are present).
+.PP
+\fB\-\-ipython\-dir=\fR<Unicode> (BaseIPythonApplication.ipython_dir)
+.IP
+Default: u'/home/zreszela/.config/ipython'
+The name of the IPython directory. This directory is used for logging
+configuration (through profiles), history storage, etc. The default is
+usually $HOME/.ipython. This options can also be specified through the
+environment variable IPYTHONDIR.
+.PP
+\fB\-\-gui=\fR<CaselessStrEnum> (InteractiveShellApp.gui)
+.IP
+Default: None
+Choices: ('qt', 'wx', 'gtk', 'glut', 'pyglet', 'osx')
+Enable GUI event loop integration ('qt', 'wx', 'gtk', 'glut', 'pyglet',
+\&'osx').
+.PP
+\fB\-\-logappend=\fR<Unicode> (InteractiveShell.logappend)
+.IP
+Default: ''
+Start logging to the given file in append mode.
+.PP
+\fB\-m\fR <Unicode> (InteractiveShellApp.module_to_run)
+.IP
+Default: ''
+Run the module as a script.
+.PP
+\fB\-\-ext=\fR<Unicode> (InteractiveShellApp.extra_extension)
+.IP
+Default: ''
+dotted module name of an IPython extension to load.
+.PP
+\fB\-\-log\-level=\fR<Enum> (Application.log_level)
+.IP
+Default: 30
+Choices: (0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL')
+Set the log level by value or name.
+.PP
+\fB\-\-colors=\fR<CaselessStrEnum> (InteractiveShell.colors)
+.IP
+Default: 'LightBG'
+Choices: ('NoColor', 'LightBG', 'Linux')
+Set the color scheme (NoColor, Linux, or LightBG).
+.PP
+\fB\-\-cache\-size=\fR<Integer> (InteractiveShell.cache_size)
+.IP
+Default: 1000
+Set the size of the output cache.  The default is 1000, you can change it
+permanently in your config file.  Setting it to 0 completely disables the
+caching system, and the minimum value accepted is 20 (if you provide a value
+less than 20, it is reset to 0 and a warning is issued).  This limit is
+defined because otherwise you'll spend more time re\-flushing a too small
+cache than working
+.PP
+\fB\-\-logfile=\fR<Unicode> (InteractiveShell.logfile)
+.IP
+Default: ''
+The name of the logfile to use.
+.PP
+To see all available configurables, use `\-\-help\-all`
+.PP
+Examples
+\fB\-\-\-\-\-\-\-\-\fR
+.TP
+ipython \fB\-\-pylab\fR
+# start in pylab mode
+.TP
+ipython \fB\-\-pylab\fR=\fIqt\fR
+# start in pylab mode with the qt4 backend
+.TP
+ipython \fB\-\-log\-level\fR=\fIDEBUG\fR
+# set logging to DEBUG
+.TP
+ipython \fB\-\-profile\fR=\fIfoo\fR
+# start with profile foo
+.TP
+ipython qtconsole
+# start the qtconsole GUI application
+.TP
+ipython help qtconsole
+# show the help for the qtconsole subcmd
+.TP
+ipython console
+# start the terminal\-based console application
+.TP
+ipython help console
+# show the help for the console subcmd
+.TP
+ipython notebook
+# start the IPython notebook
+.TP
+ipython help notebook
+# show the help for the notebook subcmd
+.IP
+ipython profile create foo # create profile foo w/ default config files
+ipython help profile       # show the help for the profile subcmd
+.TP
+ipython locate
+# print the path to the IPython directory
+.IP
+ipython locate profile foo # print the path to the directory for profile `foo`
diff --git a/doc/source/_templates/index.html b/doc/source/_templates/index.html
index 193ca06..bc1fdbc 100644
--- a/doc/source/_templates/index.html
+++ b/doc/source/_templates/index.html
@@ -42,9 +42,11 @@ Our mission statement:
   chapters.
 </p>
 
+<!--
 <p>
     A PDF version can be downloaded from <a href="sardana.pdf">here</a>.
 </p>
+-->
 
 <p>
     For convenience here are the links to other versions:<br/>
diff --git a/doc/source/_templates/indexsidebar.html b/doc/source/_templates/indexsidebar.html
index c23e678..f382a46 100644
--- a/doc/source/_templates/indexsidebar.html
+++ b/doc/source/_templates/indexsidebar.html
@@ -1,11 +1,13 @@
 <h3>Download</h3>
-<p>Current version: <b>{{ version }}</b></p>
+<p>Current version: <b>{{ release }}</b></p>
 <p>Get sardana from the <a href="http://pypi.python.org/pypi/sardana">PyPi</a>,
 or install it with:</p>
 <pre>easy_install -U sardana</pre>
 
+<!--
 <h3>PDF</h3>
 <p>A PDF version <a href="sardana.pdf">here</a>.
+-->
 
 <h3>Development</h3>
 <p>Latest <a href="http://www.sardana-controls.org/development/">development version docs</a>
diff --git a/doc/source/devel/api/api_motor.rst b/doc/source/devel/api/api_motor.rst
index d95bbf0..25dbdc8 100644
--- a/doc/source/devel/api/api_motor.rst
+++ b/doc/source/devel/api/api_motor.rst
@@ -21,8 +21,8 @@ device server:
 Every motor in sardana is represented in the sardana kernel as a
 :class:`PoolMotor`. The :class:`PoolMotor` :term:`API` is not directly
 accessible from outside the sardana server. This is a low level :term:`API`
-that is only accessbile to someone writting a server extension to sardana. At
-the time of writting, the only available sardana server extension is Tango.
+that is only accessbile to someone writing a server extension to sardana. At
+the time of writing, the only available sardana server extension is Tango.
 
 The second motor interface consists on the one provided by the server extension,
 which is in this case the one provided by the Tango motor device interface:
diff --git a/doc/source/devel/guide_coding.rst b/doc/source/devel/guide_coding.rst
index 7b56ef6..68e169c 100644
--- a/doc/source/devel/guide_coding.rst
+++ b/doc/source/devel/guide_coding.rst
@@ -8,38 +8,50 @@ Overview
 ---------
 
 This document describes sardana from the perspective of developers. Most 
-importantly, it gives information for people who want to contribute to the 
+importantly, it gives information for people who want to contribute code to the 
 development of sardana. So if you want to help out, read on!
 
 How to contribute to sardana
 ----------------------------
 
 Sardana development is managed with the `Sardana sourceforge project
-<https://sourceforge.net/projects/sardana/>`_. Until release 1.2, a svn
-repository has been used to host the source code. From then on, the version
-control will be moved to a git repository.
+<https://sourceforge.net/projects/sardana/>`_. 
 
-How to checkout sardana from SVN
---------------------------------
+Apart from directly contributing code, you can contribute to sardana in many
+ways, such as reporting bugs or proposing new features. In all cases you will
+probably need a sourceforge account and you are strongly encouragedto subscribe to the
+`sardana-devel and sardana-users mailing lists <https://sourceforge.net/p/sardana/mailman/>_`.
 
-.. warning:: These instructions will become obsolete as soon as Sardana 1.2 
-             is released because the code development will be moved from SVN to
-             Git. Updated instructions for using Git will be posted ASAP.
+The rest of this document will focus on how to contribute code.
 
-**For read-only**::
+Cloning and forking sardana from Git
+------------------------------------
 
-    svn co https://svn.code.sf.net/p/sardana/code/trunk Sardana
+You are welcome to clone the Sardana code from our main Git repository::
 
-**To being able to commit**::
+    git clone git://git.code.sf.net/p/sardana/sardana.git sardana
 
-    svn co https://<user name>@svn.code.sf.net/p/sardana/code/trunk Sardana
+Code contributions (bug patches, new features) are welcome,
+but the review process/workflow for accepting new code is yet to be discussed. For the
+moment, use the sardana-devel mailing list for proposing patches.
 
-.. note::
-    
-    You must have a sourceforge user account and have SVN write
-    access to the tango-cs project. You can ask write access to any of the 
-    tango-cs project administrators.
+Note that you can also `fork the git repository in sourceforge
+<https://sourceforge.net/p/sardana/sardana.git/fork>`_ to get your own
+sourceforge-hosted clone of the sardana repository to which you will have full
+access. This will create a new git repository associated to your personal account in
+sourceforge, so that your changes can be easily shared and eventually merged
+into the official repository.
+ 
+The old SVN code repository
+---------------------------
+
+After the release of Sardana 1.2 the Sardana code was migrated from its previous
+host in a SVN server to its current Git repository
 
+The old SVN repository is still `accessible for reference
+<https://sourceforge.net/p/sardana/code/>`_, but writing has been disabled and
+its contents are frozen as of 2013-07-31. For development, see the instructions
+above on cloning from Git
 
 Documentation
 -------------
@@ -74,7 +86,7 @@ Coding conventions
   like statement (see template below)
 * document all code 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
 sardana::
 
     #!/usr/bin/env python
@@ -113,7 +125,7 @@ sardana::
         """This class is written for template purposes only"""
         
     def main():
-        print "SardanaDemo"
+        print "SardanaDemo"s
     
     if __name__ == "__main__":
         main()
diff --git a/doc/source/devel/howto_controllers/howto_motorcontroller.rst b/doc/source/devel/howto_controllers/howto_motorcontroller.rst
index e9e0d75..bb2aa27 100644
--- a/doc/source/devel/howto_controllers/howto_motorcontroller.rst
+++ b/doc/source/devel/howto_controllers/howto_motorcontroller.rst
@@ -312,7 +312,7 @@ Define a position
 ~~~~~~~~~~~~~~~~~
 
 Sometimes it is useful to reset the current position to a certain value.
-Imagine you are writting a controller for a hardware controller which handles
+Imagine you are writing a controller for a hardware controller which handles
 stepper motors. When the hardware is asked for a motor position it will
 probably answer some value from an internal register which is
 incremented/decremented each time the motor goes up/down a step. Probably this
@@ -320,7 +320,7 @@ value as physical meaning so the usual procedure is to move the motor to a known
 position (home switch, for example) and once there, set a meaningful position to
 the current position. Some motor controllers support reseting the internal
 register to the desired value. If your motor controller can do this the
-implementation is as easy as writting the 
+implementation is as easy as writing the 
 :meth:`~sardana.pool.controller.MotorController.DefinePosition` and call the
 proper code of your hardware library to do it:
 
@@ -343,7 +343,7 @@ proper code of your hardware library to do it:
 What to do when...
 ~~~~~~~~~~~~~~~~~~
 
-This chapter describes common difficult situations you may face when writting
+This chapter describes common difficult situations you may face when writing
 a motor controller in sardana, and possible solutions to solve them. 
 
 *my controller doesn't support steps per unit*
diff --git a/doc/source/devel/howto_macros/index.rst b/doc/source/devel/howto_macros/index.rst
index e0bc28b..fb2ff06 100644
--- a/doc/source/devel/howto_macros/index.rst
+++ b/doc/source/devel/howto_macros/index.rst
@@ -3,7 +3,7 @@
 .. _sardana-macro-howto:
 
 ================
-Writting macros
+Writing macros
 ================
 
 
diff --git a/doc/source/devel/howto_macros/macros_general.rst b/doc/source/devel/howto_macros/macros_general.rst
index d6ed864..90bdbb7 100644
--- a/doc/source/devel/howto_macros/macros_general.rst
+++ b/doc/source/devel/howto_macros/macros_general.rst
@@ -7,7 +7,7 @@
 .. _sardana-macros-howto:
 
 ===============
-Writting macros
+Writing macros
 ===============
 
 This chapter provides the necessary information to write macros in sardana. The
@@ -38,9 +38,9 @@ If you are a scientist, and you have a programming background on a functional
 language (like fortran, matlab, SPEC_), then you might prefer to write macro
 functions. Computer scientists (young ones, specially), on the other hand,
 often have a background on object oriented languages (Java, C++, C#) and feel
-more confortable writting macro classes.
+more confortable writing macro classes.
 
-Classes tend to scale better with the size of a program or library. By writting
+Classes tend to scale better with the size of a program or library. By writing
 a macro class you can benefit from all advantages of object-oriented
 programming. This means that, in theory:
 
@@ -52,18 +52,18 @@ programming. This means that, in theory:
       software components
 
 In practice, however, and specially if you don't come from a programming
-background, writting classes requires a different way of thinking. It will also
+background, writing classes requires a different way of thinking. It will also
 require you to extend your knowledge in terms of syntax of a programming
 language.
 
 Furthermore, most tasks you will probably need to execute as macros, often don't
 fit the class paradigm that object-oriented languages offer. If you are
-writting a sequencial procedure to run an experiment then you are probably
-better of writting a python function which does the job plain and simple.
+writing a sequencial procedure to run an experiment then you are probably
+better of writing a python function which does the job plain and simple.
 
 One reason to write a macro as a class is if, for example, you want to extend
 the behaviour of the :class:`~sardana.macroserver.macros.standard.mv` macro. In
-this case, probably you would want to *extend* the existing macro by writting
+this case, probably you would want to *extend* the existing macro by writing
 your own macro class which *inherits* from the original macro and this way
 benefit from most of the functionallity already existing in the original macro.
 
@@ -89,13 +89,13 @@ convert the functions/classes of the original library into macros because:
     alphabetical order)
 
 
-How to start writting a macro
+How to start writing a macro
 -----------------------------
 
 Since macros are essencially Python_ code, they reside inside a Python_ file. In
 sardana, we call a Python_ file which contains macros a *macro library*.
 
-At the time of writting, the easiest way to create a new macro is from spock (we
+At the time of writing, the easiest way to create a new macro is from spock (we
 are currently working on a macro editor :term:`GUI`). 
 
 Preparing your text editor
@@ -135,7 +135,7 @@ code:
     
     .. image:: ../../_static/kwrite_config.png
 
-Now you are ready to start writting your macro! Type *spock* on the command
+Now you are ready to start writing your macro! Type *spock* on the command
 line. Once you are in spock, you can use the
 :class:`~sardana.macroserver.macros.expert.edmac` to create/edit macros. Let's
 say you want to create a new macro called *hello_world* in a new macro library
@@ -164,7 +164,7 @@ answer 'y'.
     Editing...
     Do you want to apply the new code on the server? [y] y
     
-.. _macro_function_writting:
+.. _macro_function_writing:
 
 
 Writing a macro function
@@ -544,10 +544,11 @@ For these cases, the Macro :term:`API` provides a pair of low level methods
 
 Let's say that you need access to the data generated by an ascan. First you call
 :meth:`~Macro.createMacro` with the same parameter you would give to
-:meth:`~Macro.execMacro`. This will return a macro object. Afterward you call
-:meth:`~Macro.runMacro` giving as parameter the macro object returned by
-:meth:`~Macro.createMacro`. In the end, you can access the data generated by
-the macro using :meth:`~Macro.data`:
+:meth:`~Macro.execMacro`. This will return a tuple composed from a macro object 
+and the result of the :meth:`~Macro.prepare` method. Afterward you call :meth:`~Macro.runMacro` giving 
+as parameter the macro object returned by :meth:`~Macro.createMacro`. 
+In the end, you can access the data generated by the macro 
+using :meth:`~Macro.data`:
 
 .. code-block:: python
     :emphasize-lines: 6,7,8
@@ -564,16 +565,16 @@ the macro using :meth:`~Macro.data`:
 A set of macro call examples can be found
 :ref:`here <sardana-devel-macro-call-examples>`.
 
-.. _sardana-macro-class-writting:
+.. _sardana-macro-class-writing:
 
-Writting a macro class
+Writing a macro class
 ----------------------
 
-This chapter describes an advanced alternative to writting macros as Python_
+This chapter describes an advanced alternative to writing macros as Python_
 classes. If words like *inheritance*, *polimorphism* sound like a lawyer's
 horror movie then you probably should only read this if someone expert in
 sardana already told you that the task you intend to do cannot be accomplished
-by writting macro functions.
+by writing macro functions.
 
 The simplest macro class that you can write **MUST** obey the following rules:
 
diff --git a/doc/source/devel/overview/overview_macroserver.rst b/doc/source/devel/overview/overview_macroserver.rst
index 7d95979..5a3dc80 100644
--- a/doc/source/devel/overview/overview_macroserver.rst
+++ b/doc/source/devel/overview/overview_macroserver.rst
@@ -29,7 +29,7 @@ Doors at the same time but a Door can only run one macro at a time.
 Each Door is exposed on the sardana server as a Tango_ device.
 
 You are not in any way restricted to the standard macros provided by the sardana
-system. You can write as many macros as you need. Writting your own macros is
+system. You can write as many macros as you need. Writing your own macros is
 easy. The macro equivalent of Python_\'s *Hello, World!* example::
 
     from sardana.macroserver.macro import macro
diff --git a/doc/source/users/getting_started/installing.rst b/doc/source/users/getting_started/installing.rst
index 282a361..a903caf 100644
--- a/doc/source/users/getting_started/installing.rst
+++ b/doc/source/users/getting_started/installing.rst
@@ -55,22 +55,23 @@ necessary to run sardana on your windows machine
 
 .. _sardana-working-from-svn:
 
-Working from SVN
-----------------
+Working directly from Git
+-------------------------
 
-.. warning:: These instructions will become obsolete as soon as Sardana 1.2 
-             is released because the code development will be moved from SVN to
-             Git. Updated instructions for using Git will be posted ASAP.
+Sometimes it is convenient to work directly from the git source without installing. To do so,
+you can clone sardana from our main git repository::
 
-You can checkout sardana from SVN from the following location::
-
-    svn co http://svn.code.sf.net/p/sardana/code/trunk Sardana
-
-You can directly execute sardana binaries (Pool, MacroServer, Sardana or spock
+    git clone git://git.code.sf.net/p/sardana/sardana.git sardana
+    
+And then you can directly execute sardana binaries (Pool, MacroServer, Sardana or spock
 from the command line)::
 
-    homer at pc001:~/workspace$ cd Sardana
-    homer at pc001:~/workspace/Sardana$ scripts/Sardana
+    homer at pc001:~/workspace$ cd sardana
+    homer at pc001:~/workspace/sardana$ scripts/Sardana
+    
+.. tip:: If you plan to work normally from git without installing, you may want
+         to add the `sardana/scripts` directory to your `PATH` variable and 
+         `sardana/src` to your `PYTHONPATH` variable.
 
 
 .. rubric:: Footnotes
diff --git a/setup.py b/setup.py
index 915461c..83ef466 100644
--- a/setup.py
+++ b/setup.py
@@ -3,21 +3,21 @@
 ##############################################################################
 ##
 ## This file is part of Sardana
-## 
+##
 ## http://www.tango-controls.org/static/sardana/latest/doc/html/index.html
 ##
 ## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-## 
+##
 ## Sardana is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU Lesser General Public License as published by
 ## the Free Software Foundation, either version 3 of the License, or
 ## (at your option) any later version.
-## 
+##
 ## Sardana is distributed in the hope that it will be useful,
 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ## GNU Lesser General Public License for more details.
-## 
+##
 ## You should have received a copy of the GNU Lesser General Public License
 ## along with Sardana.  If not, see <http://www.gnu.org/licenses/>.
 ##
@@ -26,34 +26,34 @@
 from __future__ import print_function
 
 import os
-import sys
-import copy
-import shutil
 import imp
-import StringIO
 
-from distutils.core import setup, Extension, Command
-from distutils.dist import Distribution
+from distutils.core import setup, Command
 from distutils.command.build import build as dftbuild
 from distutils.command.install import install as dftinstall
+from distutils.command.install_scripts import install_scripts as dftinstall_scripts
 from distutils.version import StrictVersion as V
-import distutils.sysconfig
 
 try:
     import sphinx
     import sphinx.util.console
-    sphinx.util.console.color_terminal = lambda : False
-    if V(sphinx.__version__) < V("1.0.0"):
+    sphinx.util.console.color_terminal = lambda: False
+    if V(sphinx.__version__) < V("1.0.0") \
+       or V(sphinx.__version__) == V("1.2.0"):
+        print("Sphinx documentation can not be compiled"
+              " with sphinx < 1.0.0 or the 1.2.0 version")
         sphinx = None
-except:
+except ImportError:
     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('src', 'sardana')
@@ -62,39 +62,14 @@ def get_release_info():
     return release
 
 
-def get_script_files():
-    scripts_dir = abspath('scripts')
-    scripts = []
-    items = os.listdir(scripts_dir)
-    for item in items:
-        # 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
-        # avoid compiled version of script
-        if item.endswith('c') and item[:-1] in items:
-            continue
-        # avoid any core dump... of course there isn't any :-) but just in case
-        if item.startswith('core'):
-            continue
-        scripts.append('scripts/' + item)
-    return scripts
-
-
 class build(dftbuild):
 
     user_options = dftbuild.user_options + \
-        [ ('no-doc', None, "do not build documentation") ]
+        [('no-doc', None, "do not build documentation")]
 
     boolean_options = dftbuild.boolean_options + ['no-doc']
 
-    def initialize_options (self):
+    def initialize_options(self):
         dftbuild.initialize_options(self)
         self.no_doc = None
 
@@ -103,7 +78,7 @@ class build(dftbuild):
 
     def run(self):
         dftbuild.run(self)
-            
+
     def has_doc(self):
         if self.no_doc:
             return False
@@ -116,32 +91,32 @@ class build(dftbuild):
 
 
 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)
+            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)
 
@@ -149,55 +124,130 @@ class install_man(Command):
 class install_html(Command):
 
     user_options = [
-        ('install-dir=', 'd', 'base directory for installing HTML documentation files')]
-    
+        ('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(dftinstall):
+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(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")])
+        ('install-man=', None, 'install directory for Unix man pages'),
+        ('install-html=', None, "install directory for HTML documentation")])
 
     def initialize_options(self):
         self.install_man = None
         self.install_html = 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.
+
+        # 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.
-        
+        # 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')
+        elif 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', 'sardana', 'html')
+            self.install_html = os.path.join(self.install_data,
+                                             'share', 'doc', 'sardana', 'html')
 
     def expand_dirs(self):
         dftinstall.expand_dirs(self)
@@ -205,82 +255,74 @@ class install(dftinstall):
 
     def has_man(self):
         return os.name == "posix"
-    
+
     def has_html(self):
         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))
 
 
-cmdclass = { 'build' : build,
-             'install' : install,
-             'install_man' : install_man,
-             'install_html' : install_html }
+cmdclass = {'build': build,
+            'install': install,
+            'install_man': install_man,
+            'install_html': install_html,
+            'install_scripts' : install_scripts}
 
 if sphinx:
     from sphinx.setup_command import BuildDoc
 
     class build_doc(BuildDoc):
-        
+
         def has_doc_api(self):
             return True
 
-        #sub_commands = BuildDoc.sub_commands + [(('build_doc_api', has_doc_api))]
-        
         def run(self):
             try:
                 return self.doit()
-            except Exception,e:
+            except Exception, e:
                 self.warn("Failed to build doc. Reason: %s" % str(e))
-        
+
         def doit(self):
             BuildDoc.run(self)
-    
+
     cmdclass['build_doc'] = build_doc
 
+
 def main():
     Release = get_release_info()
 
     author = Release.authors['Tiago']
-    maintainer = Release.authors['Pascual-Izarra']
-    
-    package_name = Release.name
-
-    package_dir = { 'sardana' : abspath('src', 'sardana') }
+    maintainer = Release.authors['Reszela']
 
-    pool_packages = [
+    package_dir = {'sardana': abspath('src', 'sardana')}
 
-    ]
     packages = [
         'sardana',
-        
+
         'sardana.util',
         'sardana.util.motion',
-        
+
         'sardana.pool',
         'sardana.pool.poolcontrollers',
-        
+
         'sardana.macroserver',
         'sardana.macroserver.macros',
         'sardana.macroserver.macros.examples',
         'sardana.macroserver.scan',
         'sardana.macroserver.scan.recorder',
-        
+
         'sardana.tango',
         'sardana.tango.core',
         'sardana.tango.pool',
         'sardana.tango.macroserver',
-        
+
         'sardana.spock',
         'sardana.spock.ipython_00_10',
         'sardana.spock.ipython_00_11',
     ]
 
-    extra_packages = [
-    ]
-
     provides = [
         'sardana',
         'sardana.pool',
@@ -289,20 +331,21 @@ def main():
         'sardana.tango',
     ]
 
-    requires = [ 
+    requires = [
         'PyTango (>=7.2.3)',
         'taurus (>= 3.1)',
         'lxml (>=2.1)',
         'ipython (>=0.10, !=0.11)'
     ]
-     
-    package_data = { 
-
-    }
-
-    scripts = get_script_files()
 
-    data_files = [
+    scripts = [
+        "scripts/h5toascii",
+        "scripts/h5tospec",
+        "scripts/MacroServer",
+        "scripts/Pool",
+        "scripts/Sardana",
+        "scripts/spectoascii",
+        "scripts/spock"
     ]
 
     classifiers = [
@@ -323,28 +366,26 @@ def main():
         'Topic :: Software Development :: Libraries',
     ]
 
-    setup(name             = 'sardana',
-          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)
+    setup(name='sardana',
+          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,
+          scripts=scripts,
+          provides=provides,
+          keywords=Release.keywords,
+          requires=requires,
+          cmdclass=cmdclass)
 
 if __name__ == "__main__":
     main()
diff --git a/src/sardana/macroserver/macro.py b/src/sardana/macroserver/macro.py
index c730d3d..6df0348 100644
--- a/src/sardana/macroserver/macro.py
+++ b/src/sardana/macroserver/macro.py
@@ -46,7 +46,8 @@ import weakref
 import StringIO
 import ctypes
 
-from taurus.core.util import Logger, propertx
+from taurus.core.util.log import Logger
+from taurus.core.util.prop import propertx
 from taurus.console.table import Table
 from taurus.console.list import List
 
@@ -1060,8 +1061,8 @@ class Macro(Logger):
 
         :param pars: the command parameters as explained above
         :return:
-            a sequence of two elemetns: the macro class and a sequence of
-            parameters
+            a sequence of two elements: the macro object and the result of
+            preparing the macro
         :rtype: :obj:`tuple`\<:class:`~sardana.macroserver.macro.Macro`\, seq<obj>>
         """
         return self.prepareMacro(*pars)
diff --git a/src/sardana/macroserver/macros/examples/scans.py b/src/sardana/macroserver/macros/examples/scans.py
index 57fbcc0..420ba00 100644
--- a/src/sardana/macroserver/macros/examples/scans.py
+++ b/src/sardana/macroserver/macros/examples/scans.py
@@ -168,7 +168,7 @@ class ascanr(Macro, Hookable):
         return self._gScan.data
         
 
-class toothedtriangle(Macro):
+class toothedtriangle(Macro, Hookable):
     """toothedtriangle macro implemented with the gscan framework.
     It performs nr_cycles cycles, each consisting of two stages: the first half
     of the cycle it behaves like the ascan macro (from start_pos to stop_pos in
@@ -177,7 +177,10 @@ class toothedtriangle(Macro):
     At each step, nr_samples acquisitions are performed.
     The total number of points in the scan is nr_interv*2*nr_cycles*nr_samples+1"""
 
-    hints = { 'scan' : 'toothedtriangle', 'allowsHooks':('pre-move', 'post-move', 'pre-acq', 'post-acq') }
+    hints = { 'scan' : 'toothedtriangle',
+             'allowsHooks':('pre-scan', 'pre-move', 'post-move', 'pre-acq',
+                            'post-acq', 'post-step', 'post-scan')
+             }
     env = ('ActiveMntGrp',)
 
     param_def = [
@@ -224,8 +227,11 @@ class toothedtriangle(Macro):
     def _generator(self):
         step = {}
         step["integ_time"] =  self.integ_time
-        step["post-acq-hooks"] = []
-        step["post-step-hooks"] = []
+        step["pre-move-hooks"] = self.getHooks('pre-move')
+        step["post-move-hooks"] = self.getHooks('post-move')
+        step["pre-acq-hooks"] = self.getHooks('pre-acq')
+        step["post-acq-hooks"] = self.getHooks('post-acq') + self.getHooks('_NOHINT_')
+        step["post-step-hooks"] = self.getHooks('post-step')
         step["check_func"] = []
         extrainfo = {"cycle":None, "interval":None, "sample":None, } 
         step['extrainfo'] = extrainfo
diff --git a/src/sardana/macroserver/macros/examples/submacros.py b/src/sardana/macroserver/macros/examples/submacros.py
index 91af49f..24ec2bd 100644
--- a/src/sardana/macroserver/macros/examples/submacros.py
+++ b/src/sardana/macroserver/macros/examples/submacros.py
@@ -101,14 +101,14 @@ class runsubs(Macro):
     5 - params = 'ascan', motor, 0, 10, 4, 0.2
         self.execMacro(params)
     6 - self.execMacro("ascan %s 0 10 4 0.2" % motor.getName())
-    7 - macro = self.createMacro("ascan %s 0 10 4 0.2" % motor.getName())
+    7 - macro, prep = self.createMacro("ascan %s 0 10 4 0.2" % motor.getName())
         macro.hooks = [ self.hook ]
         self.runMacro(macro)
-    8 - macro = self.createMacro('ascan', motor, 0, 10, 4, 0.2)
+    8 - macro, prep = self.createMacro('ascan', motor, 0, 10, 4, 0.2)
         macro.hooks = [ self.hook ]
         self.runMacro(macro)
     9 - params = 'ascan', motor, 0, 10, 4, 0.2
-        macro = self.createMacro(params)
+        macro, prep = self.createMacro(params)
         macro.hooks = [ self.hook ]
         self.runMacro(macro)
         
@@ -139,17 +139,18 @@ class runsubs(Macro):
         elif call_type == 6:
             self.execMacro("ascan %s 0 10 4 0.2" % motor.getName())
         elif call_type == 7:
-            macro = self.createMacro("ascan %s 0 10 4 0.2" % motor.getName())
+            macro, prep = self.createMacro("ascan %s 0 10 4 0.2" % \
+                                                     motor.getName())
             macro.hooks = [ self.hook ]
             self.runMacro(macro)
         elif call_type == 8:
-            macro = self.createMacro('ascan', motor, 0, 10, 4, 0.2)
+            macro, prep = self.createMacro('ascan', motor, 0, 10, 4, 0.2)
             macro.hooks = [ self.hook ]
             self.runMacro(macro)
         elif call_type == 9:
             params = 'ascan', motor, 0, 10, 4, 0.2
-            macro = self.createMacro(params)
+            macro, prep = self.createMacro(params)
             macro.hooks = [ self.hook ]
             self.runMacro(macro)
         
-            
\ No newline at end of file
+            
diff --git a/src/sardana/macroserver/macros/ioregister.py b/src/sardana/macroserver/macros/ioregister.py
index 8fa349b..bb89ed9 100644
--- a/src/sardana/macroserver/macros/ioregister.py
+++ b/src/sardana/macroserver/macros/ioregister.py
@@ -57,7 +57,7 @@ class read_ioreg(Macro):
     
     def run(self, ioreg):
         name = ioreg.getName()
-        data = ioreg.readIORegister()
+        data = ioreg.readIORegister(force=True)
         o = "Reading " +  name + " register "
         self.output(o)
         self.output(data)
diff --git a/src/sardana/macroserver/macroserver.py b/src/sardana/macroserver/macroserver.py
index 38b3e70..f0148ea 100644
--- a/src/sardana/macroserver/macroserver.py
+++ b/src/sardana/macroserver/macroserver.py
@@ -31,9 +31,11 @@ import codecs
 import logging.handlers
 import time
 
-from taurus import Device, Factory
-from taurus.core import TaurusEventType
-from taurus.core.util import CaselessDict, ThreadPool, Logger
+from taurus.core.taurushelper import Device, Factory
+from taurus.core.taurusbasetypes import TaurusEventType
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.threadpool import ThreadPool
+from taurus.core.util.log import Logger
 from taurus.core.tango.sardana.motion import Motion, MotionGroup
 from taurus.core.tango.sardana.pool import registerExtensions
 
diff --git a/src/sardana/macroserver/msmacromanager.py b/src/sardana/macroserver/msmacromanager.py
index dd82dd9..faf64da 100644
--- a/src/sardana/macroserver/msmacromanager.py
+++ b/src/sardana/macroserver/msmacromanager.py
@@ -41,7 +41,8 @@ import traceback
 from lxml import etree
 
 from PyTango import DevFailed
-from taurus.core.util import Logger, CodecFactory
+from taurus.core.util.log import Logger
+from taurus.core.util.codecs import CodecFactory
 
 from sardana.sardanadefs import ElementType
 from sardana.sardanamodulemanager import ModuleManager
diff --git a/src/sardana/macroserver/scan/gscan.py b/src/sardana/macroserver/scan/gscan.py
index 30ef9ed..0965fd0 100644
--- a/src/sardana/macroserver/scan/gscan.py
+++ b/src/sardana/macroserver/scan/gscan.py
@@ -40,7 +40,8 @@ import numpy as np
 
 import PyTango
 import taurus
-from taurus.core.util import USER_NAME, Logger
+from taurus.core.util.user import USER_NAME
+from taurus.core.util.log import Logger
 from taurus.core.tango import FROM_TANGO_TO_STR_TYPE
 from taurus.core.tango.sardana.pool import Ready
 
diff --git a/src/sardana/macroserver/scan/recorder/datarecorder.py b/src/sardana/macroserver/scan/recorder/datarecorder.py
index 7f0a18a..fef4358 100644
--- a/src/sardana/macroserver/scan/recorder/datarecorder.py
+++ b/src/sardana/macroserver/scan/recorder/datarecorder.py
@@ -7,17 +7,17 @@
 ## http://www.tango-controls.org/static/sardana/latest/doc/html/index.html
 ##
 ## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-## 
+##
 ## Sardana is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU Lesser General Public License as published by
 ## the Free Software Foundation, either version 3 of the License, or
 ## (at your option) any later version.
-## 
+##
 ## Sardana is distributed in the hope that it will be useful,
 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ## GNU Lesser General Public License for more details.
-## 
+##
 ## You should have received a copy of the GNU Lesser General Public License
 ## along with Sardana.  If not, see <http://www.gnu.org/licenses/>.
 ##
@@ -34,58 +34,61 @@ import time
 
 from taurus.core.util import Enumeration, Logger
 
-DataFormats    = Enumeration('DataFormats', ('Spec', 'CSV', 'XLS', 'w5', 'w4', 'wx', 'fio'))
-SaveModes      = Enumeration('SaveModes', ('Record', 'Block'))
+DataFormats = Enumeration('DataFormats', ('Spec', 'CSV', 'XLS', 'w5', 'w4',
+                                          'wx', 'fio'))
+SaveModes = Enumeration('SaveModes', ('Record', 'Block'))
 RecorderStatus = Enumeration('RecorderStatus', ('Idle', 'Active', 'Disable'))
 
+
 class DataHandler:
     """ The data handler is the data recording center of a system. It contains
-    one or several recorders.  All data transit through the handler, then 
+    one or several recorders.  All data transit through the handler, then
     given to recorders for final saving """
 
     def __init__(self):
         self.recorders = []
-   
+
     def addRecorder(self, recorder):
         if recorder is not None:
-            self.recorders.append( recorder )
+            self.recorders.append(recorder)
 
-    def startRecordList(self, recordlist ):
+    def startRecordList(self, recordlist):
         for recorder in self.recorders:
             if recorder.savemode is SaveModes.Record:
-                recorder.startRecordList( recordlist )
+                recorder.startRecordList(recordlist)
 
     def endRecordList(self, recordlist):
         for recorder in self.recorders:
             if recorder.savemode is SaveModes.Record:
-                recorder.endRecordList( recordlist )
+                recorder.endRecordList(recordlist)
             else:
-                recorder.writeRecordList( recordlist )
+                recorder.writeRecordList(recordlist)
 
     def addRecord(self, recordlist, record):
         for recorder in self.recorders:
             if recorder.savemode is SaveModes.Record:
-                recorder.writeRecord( record )
-            else:    # blockSave
+                recorder.writeRecord(record)
+            else:  # blockSave
                 pass
-           
+
     def addCustomData(self, value, name, **kwargs):
-        '''Write data other than a record. 
-        
+        '''Write data other than a record.
+
         :param value: The value to be written
         :param name: An identification for this value
-        
+
         Optional keyword arguments can be passed with information that some
-        recorders may need in order to record this value. For example: the NeXus
-        recorder will make use of "nxpath" info if available to place the value
-        where it belongs in the nexus hierarchy. Check the `addCustomData`
-        method of each recorder to see what they use/require.
+        recorders may need in order to record this value.
+        For example: the NeXus recorder will make use of "nxpath" info if
+        available to place the value where it belongs in the nexus hierarchy.
+        Check the `addCustomData` method of each recorder to see
+        what they use/require.
         '''
         for recorder in self.recorders:
-            recorder.addCustomData(value, name, **kwargs )
-#
+            recorder.addCustomData(value, name, **kwargs)
+
 # Recorders
-#
+
 
 class DataRecorder(Logger):
     """ Generic class for data recorder. Does nothing"""
@@ -93,8 +96,8 @@ class DataRecorder(Logger):
         name = self.__class__.__name__
         self.call__init__(Logger, name)
         self.recordlist = None
-        self.status     = RecorderStatus.Idle
-        self.savemode   = SaveModes.Record
+        self.status = RecorderStatus.Idle
+        self.savemode = SaveModes.Record
 
     def getStatus(self):
         return self.status
@@ -109,9 +112,9 @@ class DataRecorder(Logger):
         is_idle = self.status is RecorderStatus.Idle
         if is_idle:
             self.recordlist = recordlist
-            
+
         self._startRecordList(recordlist)
-        
+
         if is_idle:
             return 0
         else:
@@ -123,7 +126,7 @@ class DataRecorder(Logger):
     def endRecordList(self, recordlist):
         self._endRecordList(recordlist)
 
-        self.status     = RecorderStatus.Idle
+        self.status = RecorderStatus.Idle
         self.recordlist = None
 
     def _endRecordList(self, recordlist):
@@ -131,26 +134,30 @@ class DataRecorder(Logger):
 
     def writeRecordList(self, recordlist):
         """ Only in BLOCK_MODE. Will write whole RecordList """
-        self._startRecordList( recordlist )
+        self._startRecordList(recordlist)
         for record in recordlist.records:
             self.writeRecord(record)
-        self._endRecordList( recordlist )
+        self._endRecordList(recordlist)
 
     def writeRecord(self, record):
-        self._writeRecord( record )
+        self._writeRecord(record)
 
-    def _writeRecord( self, record ):
+    def _writeRecord(self, record):
         pass
 
-    def setSaveMode( self, mode ):
+    def setSaveMode(self, mode):
         self.savemode = mode
-        
+
     def addCustomData(self, value, name, **kwargs):
-        self._addCustomData(value, name, **kwargs)
-        
+        try:
+            self._addCustomData(value, name, **kwargs)
+        except Exception, e:
+            raise RuntimeError('%s can not process custom data: %s' %
+                               (self.__class__.__name__, e))
+
     def _addCustomData(self, value, name, **kwargs):
         pass
-    
+
 
 class DumbRecorder(DataRecorder):
     def _startRecordList(self, recordlist):
@@ -159,10 +166,10 @@ class DumbRecorder(DataRecorder):
         env = recordlist.getEnviron()
         for envky in env.keys():
             if envky != 'title' and envky != 'labels':
-                print "# %8s :    %s " % (envky,str(env[envky]))
-        print "# Started:    ", time.ctime( env['starttime'] )
-        print "# L:  ",   
-        print "  ".join( env['labels'] )
+                print "# %8s :    %s " % (envky, str(env[envky]))
+        print "# Started:    ", time.ctime(env['starttime'])
+        print "# L:  ",
+        print "  ".join(env['labels'])
 
     def _writeRecord(self, record):
         print record.data
@@ -170,5 +177,4 @@ class DumbRecorder(DataRecorder):
     def _endRecordList(self, recordlist):
         print "Ending recording"
         env = recordlist.getEnviron()
-        print "Recording ended at: ", time.ctime( env['endtime'] )
-
+        print "Recording ended at: ", time.ctime(env['endtime'])
diff --git a/src/sardana/macroserver/scan/recorder/output.py b/src/sardana/macroserver/scan/recorder/output.py
index 61a2560..b031b53 100644
--- a/src/sardana/macroserver/scan/recorder/output.py
+++ b/src/sardana/macroserver/scan/recorder/output.py
@@ -7,17 +7,17 @@
 ## http://www.tango-controls.org/static/sardana/latest/doc/html/index.html
 ##
 ## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-## 
+##
 ## Sardana is free software: you can redistribute it and/or modify
 ## it under the terms of the GNU Lesser General Public License as published by
 ## the Free Software Foundation, either version 3 of the License, or
 ## (at your option) any later version.
-## 
+##
 ## Sardana is distributed in the hope that it will be useful,
 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ## GNU Lesser General Public License for more details.
-## 
+##
 ## You should have received a copy of the GNU Lesser General Public License
 ## along with Sardana.  If not, see <http://www.gnu.org/licenses/>.
 ##
@@ -34,7 +34,8 @@ import datetime
 import operator
 import string
 
-from taurus.core.util import CodecFactory, CaselessList
+from taurus.core.util.codecs import CodecFactory
+from taurus.core.util.containers import CaselessList
 
 from datarecorder import DataRecorder
 from storage import BaseFileRecorder
@@ -61,76 +62,85 @@ class JsonRecorder(DataRecorder):
         self.column_desc = []
         discarded = []
         for e in column_desc:
-            if len(e.shape)==0:
+            if len(e.shape) == 0:
                 self.column_desc.append(e)
             else:
                 discarded.append(e.label)
         if discarded:
-            self.info('The following data will not be json-serialized: %s', " ".join(discarded) )
-        column_desc = [ d.toDict() for d in self.column_desc ]
-        data = { 'column_desc' : column_desc,
-                 'ref_moveables' : ref_moveables,
-                 'estimatedtime' : estimatedtime,
-                 'total_scan_intervals' : total_scan_intervals,
-                 'starttime': start_time,
-                 'title': title,
-                 'counters': counters,
-                 'scanfile': scanfile,
-                 'scandir' : scandir,
-                 'serialno': serialno}
+            self.info('The following data will not be json-serialized: %s',
+                      " ".join(discarded))
+        column_desc = [d.toDict() for d in self.column_desc]
+        data = {'column_desc': column_desc,
+                'ref_moveables': ref_moveables,
+                'estimatedtime': estimatedtime,
+                'total_scan_intervals': total_scan_intervals,
+                'starttime': start_time,
+                'title': title,
+                'counters': counters,
+                'scanfile': scanfile,
+                'scandir': scandir,
+                'serialno': serialno}
         self._sendPacket(type="data_desc", data=data, macro_id=macro_id)
-    
+
     def _endRecordList(self, recordlist):
         macro_id = recordlist.getEnvironValue('macro_id')
-        data = { 'endtime'  : recordlist.getEnvironValue('endtime').ctime(),
-                 'deadtime' : recordlist.getEnvironValue('deadtime') }
+        data = {'endtime': recordlist.getEnvironValue('endtime').ctime(),
+                'deadtime': recordlist.getEnvironValue('deadtime')}
         self._sendPacket(type="record_end", data=data, macro_id=macro_id)
-    
+
     def _writeRecord(self, record):
         macro_id = self.recordlist.getEnvironValue('macro_id')
-        data = {} # dict(record.data)
+        data = {}  # dict(record.data)
         for k in self.column_desc:
             name = k.name
             data[name] = record.data[name]
         self._sendPacket(type="record_data", data=data, macro_id=macro_id)
-        
+
     def _sendPacket(self, **kwargs):
-        '''creates a JSON packet using the keyword arguments passed and then sends it'''
+        '''creates a JSON packet using the keyword arguments passed
+        and then sends it'''
         #data = self._codec.encode(('', kwargs))
         #self._stream.sendRecordData(*data)
         self._stream.sendRecordData(kwargs, codec='json')
-        
+
     def _addCustomData(self, value, name, **kwargs):
         '''
-        The custom data will be sent as a packet with type='custom_data' and its
-        data will be the dictionary of keyword arguments passed to this method
-        plus 'name' and 'value'
+        The custom data will be sent as a packet with type='custom_data'
+        and its data will be the dictionary of keyword arguments passed to this
+        method plus 'name' and 'value'
         '''
-        macro_id = self.recordlist.getEnvironValue('macro_id')
-        data = dict(kwargs) #shallow copy
+        #try to convert to list to avoid serialization problems
+        try:
+            value = value.tolist()
+        except:
+            pass
+        macro_id = self._stream.getID()
+        data = dict(kwargs)  # shallow copy
         data['name'] = name
         data['value'] = value
         self._sendPacket(type="custom_data", data=data, macro_id=macro_id)
 
 
 class OutputRecorder(DataRecorder):
-    
+
     def __init__(self, stream, cols=None, number_fmt='%8.4f', col_width=8,
                  col_sep='  ', **pars):
         DataRecorder.__init__(self, **pars)
         self._stream = stream
-        if not number_fmt.startswith('%'): number_fmt = '%%s' % number_fmt
+        if not number_fmt.startswith('%'):
+            number_fmt = '%%s' % number_fmt
         self._number_fmt = number_fmt
         self._col_sep = col_sep
         self._col_width = col_width
-        if operator.isSequenceType(cols) and not isinstance(cols, (str, unicode)):
+        if operator.isSequenceType(cols) and \
+                not isinstance(cols, (str, unicode)):
             cols = CaselessList(cols)
         elif operator.isNumberType(cols):
             cols = cols
         else:
             cols = None
         self._columns = cols
-        
+
     def _startRecordList(self, recordlist):
         starttime = recordlist.getEnvironValue('starttime').ctime()
         estimatedtime = recordlist.getEnvironValue('estimatedtime')
@@ -141,9 +151,9 @@ class OutputRecorder(DataRecorder):
         number_fmt = self._number_fmt
         col_width = self._col_width
         dh = recordlist.getDataHandler()
-        
+
         for fr in [r for r in dh.recorders if isinstance(r, BaseFileRecorder)]:
-            self._stream.info('Operation will be saved in %s (%s)', 
+            self._stream.info('Operation will be saved in %s (%s)',
                               fr.getFileName(), fr.getFormat())
 
         msg = "Scan #%d started at %s." % (serialno, starttime)
@@ -174,7 +184,7 @@ class OutputRecorder(DataRecorder):
             col_size = max(col_width, max(map(len, label)))
             header_len += col_size
             col_sizes.append(col_size)
-        
+
         nb_cols = len(col_names)
         header_len += (nb_cols - 1) * len(col_sep)
         self._labels = labels
@@ -191,21 +201,21 @@ class OutputRecorder(DataRecorder):
         head = []
         for header_row in header:
             head.append(col_sep.join(header_row))
-            
+
         header = "\n".join(head)
-            
+
         cell_t_number = '%%%%(%%s)%s' % number_fmt[1:]
-        
-        self._scan_line_t  = [(col_names[0], '%%(%s)8d' % col_names[0])]
+
+        self._scan_line_t = [(col_names[0], '%%(%s)8d' % col_names[0])]
         self._scan_line_t += [(name, cell_t_number % name) for name in col_names[1:]]
-        
+
         self._stream.output(header)
         self._stream.flushOutput()
-    
+
     def _endRecordList(self, recordlist):
         self._stream.flushOutput()
         starttime = recordlist.getEnvironValue('starttime')
-        endtime   = recordlist.getEnvironValue('endtime')
+        endtime = recordlist.getEnvironValue('endtime')
         deadtime = recordlist.getEnvironValue('deadtime')
         motiontime = recordlist.getEnvironValue('motiontime')
         totaltime = endtime - starttime
@@ -213,17 +223,21 @@ class OutputRecorder(DataRecorder):
         serialno = recordlist.getEnvironValue('serialno')
 
         dh = recordlist.getDataHandler()
-        
-        for fr in [ r for r in dh.recorders if isinstance(r, BaseFileRecorder) ]:
+
+        for fr in [r for r in dh.recorders if isinstance(r, BaseFileRecorder)]:
             self._stream.info('Operation saved in %s (%s)', fr.getFileName(),
                               fr.getFormat())
-        
-        totaltimets =  recordlist.getEnvironValue('endts') - recordlist.getEnvironValue('startts')
+
+        endts = recordlist.getEnvironValue('endts')
+        startts = recordlist.getEnvironValue('startts')
+        totaltimets = endts - startts
         deadtime_perc = deadtime * 100.0 / totaltimets
         motiontime_perc = motiontime * 100.0 / totaltimets
-        self._stream.info('Scan #%s ended at %s, taking %s. Dead time %.1f%% (motion dead time %.1f%%)'
-                          % (serialno, endtime, totaltime, deadtime_perc, motiontime_perc))
-    
+        info_string = 'Scan #%s ended at %s, taking %s.' + \
+                      'Dead time %.1f%% (motion dead time %.1f%%)'
+        self._stream.info(info_string % (serialno, endtime, totaltime,
+                                         deadtime_perc, motiontime_perc))
+
     def _writeRecord(self, record):
         cells = []
         for i, (name, cell) in enumerate(self._scan_line_t):
@@ -239,18 +253,18 @@ class OutputRecorder(DataRecorder):
             cell = string.center(cell.strip(), self._col_sizes[i])
             cells.append(cell)
         scan_line = self._col_sep.join(cells)
-            
+
         self._stream.output(scan_line)
         self._stream.flushOutput()
-        
+
     def _addCustomData(self, value, name, **kwargs):
         '''
-        The custom data will be added as an info line in the form:: 
+        The custom data will be added as an info line in the form:
         Custom data: name : value
         '''
-        if numpy.rank(value)>0: 
-            v = 'Array(%s)'%str(numpy.shape(value))
+        if numpy.rank(value) > 0:
+            v = 'Array(%s)' % str(numpy.shape(value))
         else:
             v = str(value)
-        self._stream.output('Custom data: %s : %s'%(name,v) )
+        self._stream.output('Custom data: %s : %s' % (name, v))
         self._stream.flushOutput()
diff --git a/src/sardana/pool/controller.py b/src/sardana/pool/controller.py
index d8008d6..8e1b5a6 100644
--- a/src/sardana/pool/controller.py
+++ b/src/sardana/pool/controller.py
@@ -37,8 +37,8 @@ __docformat__ = 'restructuredtext'
 
 import copy
 
-import taurus
-from taurus.core.util import Logger
+from taurus.core.taurushelper import getLogLevel
+from taurus.core.util.log import Logger
 
 from sardana import DataAccess
 from sardana.sardanavalue import SardanaValue
@@ -297,7 +297,7 @@ class Controller(object):
     def __init__(self, inst, props, *args, **kwargs):
         self._inst_name = inst
         self._log = Logger("Controller.%s" % inst)
-        self._log.log_obj.setLevel(taurus.getLogLevel())
+        self._log.log_obj.setLevel(getLogLevel())
         self._args = args
         self._kwargs = kwargs
         self._api_version = self._findAPIVersion()
@@ -1259,9 +1259,15 @@ class PseudoMotorController(PseudoController):
         :type index_or_role: int or str
         :return: PseudoMotor object for the given role/index
         :rtype: :class:`~sardana.pool.poolpseudomotor.PoolPseudoMotor`"""
+        dict_ids = self._getPoolController().get_element_ids()
+        dict_axis = self._getPoolController().get_element_axis()
+        pseudo_motor_ids = []
+        for akey, aname in dict_axis.items():
+            pseudo_motor_ids.append(dict_ids.keys()[dict_ids.values().index(aname)])
         return self._getElem(index_or_role, self.pseudo_motor_roles,
                              self.__pseudo_motor_role_elements,
-                             self._kwargs['pseudo_motor_roles'])
+                             pseudo_motor_ids)
+#                             self._kwargs['pseudo_motor_roles'])
 
 
 class PseudoCounterController(Controller):
diff --git a/src/sardana/release.py b/src/sardana/release.py
index 7c94185..ca7549d 100644
--- a/src/sardana/release.py
+++ b/src/sardana/release.py
@@ -49,21 +49,24 @@ name = 'sardana'
 #: the new substring. We have to avoid using either dashes or underscores,
 #: because bdist_rpm does not accept dashes (an RPM) convention, and
 #: bdist_deb does not accept underscores (a Debian convention).
-version_info = (1, 2, 0, 'rc', 0)
+version_info = (1, 3, 0, 'rc', 0)
 version = '.'.join(map(str, version_info[:3]))
 revision = str(version_info[4])
 
-description = "Sardana is a generic program for control applications in large and small installations"
-
-long_description = """Produce a modular, high performance, robust and generic user environment 
-for control applications in large and small installations. 
-Make Sardana the generic user environment distributed in the TANGO project 
-and the standard basis of collaborations in control."""
+description = "instrument control and data acquisition system"
 
+long_description = \
+'''Sardana is a Supervision, Control And Data Acquisition (SCADA) system for
+ scientific installations. It is written in Python and based on the TANGO
+ library. The hardware control and data acquisition routines can be
+ accessed via an IPython console and a generic graphical user interface
+ (both of which are easily extensible by the user).'''
+ 
 license = 'LGPL'
 
 authors = {'Tiago'          : ('Tiago Coutinho','tiago.coutinho at esrf.fr'),
-           'Pascual-Izarra' : ('Carlos Pascual-Izarra','cpascual at cells.es') }
+           'Pascual-Izarra' : ('Carlos Pascual-Izarra','cpascual at cells.es'),
+           'Reszela'        : ('Zbigniew Reszela','zreszela at cells.es') }
 
 url = 'http://packages.python.org/sardana'
 
diff --git a/src/sardana/sardanamanager.py b/src/sardana/sardanamanager.py
index 0609b8f..3426804 100644
--- a/src/sardana/sardanamanager.py
+++ b/src/sardana/sardanamanager.py
@@ -30,7 +30,7 @@ __all__ = ["SardanaElementManager", "SardanaIDManager"]
 
 __docformat__ = 'restructuredtext'
 
-from taurus.core.util import CodecFactory
+from taurus.core.util.codecs import CodecFactory
 
 from sardana import InvalidId
 
@@ -92,4 +92,4 @@ class SardanaIDManager(object):
         assert type(nid) == int
         if nid > self._last_id:
             self._last_id = nid
-    
\ No newline at end of file
+    
diff --git a/src/sardana/sardanathreadpool.py b/src/sardana/sardanathreadpool.py
index 7ceace4..20fa750 100644
--- a/src/sardana/sardanathreadpool.py
+++ b/src/sardana/sardanathreadpool.py
@@ -33,7 +33,7 @@ __docformat__ = 'restructuredtext'
 
 import threading
 
-from taurus.core.util import ThreadPool
+from taurus.core.util.threadpool import ThreadPool
 
 __thread_pool_lock = threading.Lock()
 __thread_pool = None
@@ -49,4 +49,4 @@ def get_thread_pool():
     with __thread_pool_lock:
         if __thread_pool is None:
             __thread_pool = ThreadPool(name="SardanaTP", Psize=10)
-        return __thread_pool
\ No newline at end of file
+        return __thread_pool
diff --git a/src/sardana/spock/genutils.py b/src/sardana/spock/genutils.py
index d46ce54..b7a30c4 100644
--- a/src/sardana/spock/genutils.py
+++ b/src/sardana/spock/genutils.py
@@ -64,7 +64,9 @@ def get_ipython_version_list():
 ipv = get_ipython_version_list()
 if ipv >= [0, 10] and ipv < [0, 11]:
     from ipython_00_10.genutils import *
-else:
+elif ipv >= [0, 11] and ipv < [1, 0]:
     from ipython_00_11.genutils import *
+else:
+    from ipython_01_00.genutils import *
 
 
diff --git a/src/sardana/spock/inputhandler.py b/src/sardana/spock/inputhandler.py
index 895de18..65d2c86 100644
--- a/src/sardana/spock/inputhandler.py
+++ b/src/sardana/spock/inputhandler.py
@@ -34,7 +34,7 @@ from multiprocessing import Process, Pipe
 
 import genutils
 
-from taurus.core import TaurusManager
+from taurus.core.taurusmanager import TaurusManager
 from taurus.core.util import Singleton
 from taurus.core.tango.sardana.macroserver import BaseInputHandler
 from taurus.qt import Qt
diff --git a/src/sardana/spock/ipython_00_10/genutils.py b/src/sardana/spock/ipython_00_10/genutils.py
index a2215d5..a105a21 100644
--- a/src/sardana/spock/ipython_00_10/genutils.py
+++ b/src/sardana/spock/ipython_00_10/genutils.py
@@ -60,7 +60,9 @@ import IPython
 import IPython.genutils
 import PyTango
 import PyTango.ipython
-import taurus.core.util
+
+from taurus.core.taurushelper import Factory
+from taurus.core.util.codecs import CodecFactory
 
 from sardana.spock import exception
 from sardana.spock import colors
@@ -453,7 +455,8 @@ def clean_up():
 
 def get_taurus_core_version():
     try:
-        return taurus.core.Release.version
+        import taurus
+        return taurus.core.release.version
     except:
         return '0.0.0'
         
@@ -548,7 +551,7 @@ def _get_dev(dev_type):
     
     dev_obj_name = '%s_NAME' % dev_type
     dev_name = ip.user_ns[dev_obj_name]
-    factory = taurus.Factory()
+    factory = Factory()
     dev_obj = factory.getDevice(dev_name)
     ip.user_ns[dev_type] = PyTango.DeviceProxy(dev_name) 
     ip.user_ns["_" + dev_type] = dev_obj
@@ -925,9 +928,9 @@ def init_pre_spock(ip, macro_server, door):
     # the CodecFactory is not thread safe. There are two attributes who will
     # request for it in the first event at startup in different threads
     # therefore this small hack: make sure CodecFactory is initialized.
-    taurus.core.util.CodecFactory()
+    CodecFactory()
     
-    factory = taurus.Factory()
+    factory = Factory()
 
     import sardana.spock.spockms
     macroserver = sardana.spock.spockms
@@ -962,10 +965,9 @@ def start(user_ns=None):
     if '-q4thread' not in sys.argv: sys.argv.insert(1, '-q4thread')
 
     # Make sure the log level is changed to warning
-    import taurus
-    import taurus.core.util
-    taurus.core.util.CodecFactory()
-    taurus.setLogLevel(taurus.Warning)
+    from taurus.core.taurushelper import setLogLevel, Warning
+    CodecFactory()
+    setLogLevel(Warning)
 
     try:
         check_requirements()
diff --git a/src/sardana/spock/ipython_00_11/genutils.py b/src/sardana/spock/ipython_00_11/genutils.py
index 10a1f97..e019201 100644
--- a/src/sardana/spock/ipython_00_11/genutils.py
+++ b/src/sardana/spock/ipython_00_11/genutils.py
@@ -69,9 +69,10 @@ from IPython.config.application import Application
 from IPython.frontend.terminal.ipapp import TerminalIPythonApp, \
     launch_new_instance
 
-import taurus
-from taurus.core import Release as TCRelease
-from taurus.core.util import CodecFactory
+from taurus.core.taurushelper import Factory, Manager, Warning
+from taurus.core.util.codecs import CodecFactory
+from taurus.core.taurushelper import setLogLevel
+
 
 # make sure Qt is properly initialized
 from taurus.qt import Qt
@@ -409,11 +410,12 @@ def from_name_to_tango(name):
 #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 
 def clean_up():
-    taurus.Manager().cleanUp()
+    Manager().cleanUp()
 
 def get_taurus_core_version():
     try:
-        return TCRelease.version
+        import taurus
+        return taurus.core.release.version
     except:
         import traceback
         traceback.print_exc()
@@ -518,7 +520,7 @@ def _get_dev(dev_type):
         taurus_dev = getattr(spock_config, taurus_dev_var)
     if taurus_dev is None:
         dev_name = getattr(spock_config, dev_type + '_name')
-        factory = taurus.Factory()
+        factory = Factory()
         taurus_dev = factory.getDevice(dev_name)
         import PyTango
         dev = PyTango.DeviceProxy(dev_name)
@@ -765,7 +767,7 @@ def init_taurus():
     # therefore this small hack: make sure CodecFactory is initialized.
     CodecFactory()
 
-    factory = taurus.Factory()
+    factory = Factory()
 
     import sardana.spock.spockms
     macroserver = sardana.spock.spockms
@@ -1030,7 +1032,7 @@ object?   -> Details about 'object'. ?object also works, ?? prints more.
 def start(user_ns=None):
     # Make sure the log level is changed to warning
     CodecFactory()
-    taurus.setLogLevel(taurus.Warning)
+    setLogLevel(Warning)
 
     try:
         check_requirements()
diff --git a/src/sardana/sardanathreadpool.py b/src/sardana/spock/ipython_01_00/__init__.py
similarity index 59%
copy from src/sardana/sardanathreadpool.py
copy to src/sardana/spock/ipython_01_00/__init__.py
index 7ceace4..462b8d0 100644
--- a/src/sardana/sardanathreadpool.py
+++ b/src/sardana/spock/ipython_01_00/__init__.py
@@ -1,9 +1,10 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
 ##############################################################################
 ##
 ## This file is part of Sardana
-##
+## 
 ## http://www.tango-controls.org/static/sardana/latest/doc/html/index.html
 ##
 ## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
@@ -23,30 +24,4 @@
 ##
 ##############################################################################
 
-"""This module contains the function to access sardana thread pool"""
-
-from __future__ import with_statement
-
-__all__ = ["get_thread_pool"]
-
-__docformat__ = 'restructuredtext'
-
-import threading
-
-from taurus.core.util import ThreadPool
-
-__thread_pool_lock = threading.Lock()
-__thread_pool = None
-
-def get_thread_pool():
-    """Returns the global pool of threads for Sardana
-    
-    :return: the global pool of threads object
-    :rtype: taurus.core.util.ThreadPool"""
-    
-    global __thread_pool
-    global __thread_pool_lock
-    with __thread_pool_lock:
-        if __thread_pool is None:
-            __thread_pool = ThreadPool(name="SardanaTP", Psize=10)
-        return __thread_pool
\ No newline at end of file
+"""This package provides the spock generic utilities for ipython > 0.10"""
diff --git a/src/sardana/spock/ipython_00_11/genutils.py b/src/sardana/spock/ipython_01_00/genutils.py
similarity index 97%
copy from src/sardana/spock/ipython_00_11/genutils.py
copy to src/sardana/spock/ipython_01_00/genutils.py
index 10a1f97..51b1fa9 100644
--- a/src/sardana/spock/ipython_00_11/genutils.py
+++ b/src/sardana/spock/ipython_01_00/genutils.py
@@ -61,17 +61,17 @@ from IPython.core.profiledir import ProfileDirError, ProfileDir
 from IPython.core.application import BaseIPythonApplication
 from IPython.core.interactiveshell import InteractiveShell
 from IPython.utils.io import ask_yes_no as _ask_yes_no
-from IPython.utils.io import raw_input_ext as _raw_input_ext
 from IPython.utils.path import get_ipython_dir
 from IPython.utils.process import arg_split
 from IPython.utils.coloransi import TermColors
 from IPython.config.application import Application
-from IPython.frontend.terminal.ipapp import TerminalIPythonApp, \
-    launch_new_instance
+from IPython.terminal.ipapp import TerminalIPythonApp, launch_new_instance
 
 import taurus
-from taurus.core import Release as TCRelease
-from taurus.core.util import CodecFactory
+#from taurus.core import Release as TCRelease
+
+from taurus.core.taurushelper import Factory
+from taurus.core.util.codecs import CodecFactory
 
 # make sure Qt is properly initialized
 from taurus.qt import Qt
@@ -139,7 +139,7 @@ def ask_yes_no(prompt,default=None):
     return _ask_yes_no(prompt, default)
 
 def spock_input(prompt='',  ps2='... '):
-    return _raw_input_ext(prompt=prompt, ps2=ps2)
+    return raw_input(prompt)
 
 def translate_version_str2int(version_str):
     """Translates a version string in format x[.y[.z[...]]] into a 000000 number"""
@@ -413,7 +413,8 @@ def clean_up():
 
 def get_taurus_core_version():
     try:
-        return TCRelease.version
+        import taurus
+        return taurus.core.release.version
     except:
         import traceback
         traceback.print_exc()
@@ -518,7 +519,7 @@ def _get_dev(dev_type):
         taurus_dev = getattr(spock_config, taurus_dev_var)
     if taurus_dev is None:
         dev_name = getattr(spock_config, dev_type + '_name')
-        factory = taurus.Factory()
+        factory = Factory()
         taurus_dev = factory.getDevice(dev_name)
         import PyTango
         dev = PyTango.DeviceProxy(dev_name)
@@ -596,7 +597,14 @@ def create_spock_profile(userdir, dft_profile, profile, door_name=None):
     if not os.path.isdir(userdir):
         ProfileDir.create_profile_dir(userdir)
     p_dir = ProfileDir.create_profile_dir_by_name(userdir, profile)
-    config_file_name = BaseIPythonApplication.config_file_name.default_value
+    ###########################################################################
+    # NOTE: BaseIPythonApplication.config_file_name.default_value should return
+    # the config file name, but it returns an empty string instead (at least 
+    # in some cases). For now, we give a hardcoded name if it is empty
+    # TODO: Check why this is the case
+    config_file_name = BaseIPythonApplication.config_file_name.default_value 
+    config_file_name = config_file_name or 'ipython_config.py' 
+    ###########################################################################
     abs_config_file_name = os.path.join(p_dir.location, config_file_name)
     create_config = True
     if os.path.isfile(abs_config_file_name):
@@ -651,7 +659,6 @@ config.IPKernelApp.pylab = 'inline'
     sys.stdout.write('Storing %s in %s... ' % (config_file_name, p_dir.location))
     sys.stdout.flush()
 
-
     with file(abs_config_file_name, "w") as f:
         f.write(dest_data)
         f.close()
@@ -765,7 +772,7 @@ def init_taurus():
     # therefore this small hack: make sure CodecFactory is initialized.
     CodecFactory()
 
-    factory = taurus.Factory()
+    factory = Factory()
 
     import sardana.spock.spockms
     macroserver = sardana.spock.spockms
@@ -1111,7 +1118,7 @@ def prepare_cmdline(argv=None):
 
 def run():
     from IPython.utils.traitlets import Unicode
-    from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget
+    from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
 
     class SpockConsole(RichIPythonWidget):
         
@@ -1121,8 +1128,8 @@ def run():
             config = get_config()
             return config.FrontendWidget.banner
 
-    import IPython.frontend.qt.console.qtconsoleapp
-    IPythonQtConsoleApp = IPython.frontend.qt.console.qtconsoleapp.IPythonQtConsoleApp
+    import IPython.qt.console.qtconsoleapp
+    IPythonQtConsoleApp = IPython.qt.console.qtconsoleapp.IPythonQtConsoleApp
     IPythonQtConsoleApp.widget_factory = SpockConsole
 
     try:
diff --git a/src/sardana/spock/magic.py b/src/sardana/spock/magic.py
index 5953ee2..ccfb190 100644
--- a/src/sardana/spock/magic.py
+++ b/src/sardana/spock/magic.py
@@ -165,8 +165,8 @@ def macrodata(self, parameter_s=''):
     door = get_door()
     macro_data = door.read_attribute("RecordData")
 
-    import taurus.core.util
-    factory = taurus.core.util.CodecFactory()
+    from taurus.core.util.codecs import CodecFactory
+    factory = CodecFactory()
     data = factory.decode(macro_data.value)    
     return data
     
@@ -181,7 +181,6 @@ def edmac(self, parameter_s=''):
     import os
     import tempfile
     import PyTango
-    import taurus.core.util
 
     ms = get_macro_server()
 
@@ -203,7 +202,7 @@ def edmac(self, parameter_s=''):
     try:
         remote_fname, code, line_nb = ms.GetMacroCode(macro_info)
     except PyTango.DevFailed, e:
-        taurus.core.util.print_DevFailed(e)
+        PyTango.Except.print_exception(e)
         return
 
     fd, local_fname = tempfile.mkstemp(prefix='spock_%s_' % pars[0],
diff --git a/src/sardana/spock/release.py b/src/sardana/spock/release.py
index 3a765da..c886fe3 100644
--- a/src/sardana/spock/release.py
+++ b/src/sardana/spock/release.py
@@ -53,6 +53,7 @@ replacement for the interactive Python interpreter with extra functionality.
 license = 'GNU'
 
 authors = {'Tiago'          : ('Tiago Coutinho','tiago.coutinho at esrf.fr'),
+           'Reszela'        : ('Zbigniew Reszela','zreszela at cells.es') ,
            'Pascual-Izarra' : ('Carlos Pascual-Izarra','cpascual at cells.es') }
 
 url = ''
diff --git a/src/sardana/tango/core/SardanaDevice.py b/src/sardana/tango/core/SardanaDevice.py
index 34ae587..3888531 100644
--- a/src/sardana/tango/core/SardanaDevice.py
+++ b/src/sardana/tango/core/SardanaDevice.py
@@ -38,7 +38,7 @@ import PyTango.constants
 from PyTango import Device_4Impl, DeviceClass, Util, DevState, \
     AttrQuality, TimeVal, ArgType, ApiUtil, DevFailed, WAttribute
 
-from taurus.core.util import ThreadPool
+from taurus.core.util.threadpool import ThreadPool
 from taurus.core.util.log import Logger
 
 from util import to_tango_state, NO_DB_MAP
diff --git a/src/sardana/tango/macroserver/Door.py b/src/sardana/tango/macroserver/Door.py
index 218eb1a..7c9b108 100644
--- a/src/sardana/tango/macroserver/Door.py
+++ b/src/sardana/tango/macroserver/Door.py
@@ -38,7 +38,8 @@ from PyTango import Util, DevFailed, Except, DevVoid, DevShort, DevLong, \
 import taurus
 import taurus.core.util
 from lxml import etree
-from taurus.core.util import CodecFactory, DebugIt
+from taurus.core.util.codecs import CodecFactory
+from taurus.core.util.log import DebugIt
 
 from sardana import State, InvalidId, SardanaServer
 from sardana.sardanaattribute import SardanaAttribute
diff --git a/src/sardana/tango/macroserver/MacroServer.py b/src/sardana/tango/macroserver/MacroServer.py
index d0db368..9dc3171 100644
--- a/src/sardana/tango/macroserver/MacroServer.py
+++ b/src/sardana/tango/macroserver/MacroServer.py
@@ -31,7 +31,7 @@ from PyTango import Util, Except, DevVoid, DevLong, DevString, DevState, \
     DevEncoded, DevVarStringArray, READ, READ_WRITE, SCALAR, SPECTRUM, DebugIt
 
 #from taurus.core.util import Logger
-from taurus.core.util import CodecFactory
+from taurus.core.util.codecs import CodecFactory
 
 from sardana import State, SardanaServer #, ElementType
 from sardana.tango.core.SardanaDevice import SardanaDevice, SardanaDeviceClass
diff --git a/src/sardana/tango/pool/Controller.py b/src/sardana/tango/pool/Controller.py
index 02789ef..d484073 100644
--- a/src/sardana/tango/pool/Controller.py
+++ b/src/sardana/tango/pool/Controller.py
@@ -85,7 +85,7 @@ class Controller(PoolDevice):
             name = self.alias or full_name
             args = dict(type=self.Type, name=name, full_name=full_name,
                         library=self.Library, klass=self.Klass,
-                        id=self.Id, role_ids=self.Role_ids,
+                        id=self.Id, role_ids=role_ids,
                         properties=self._get_ctrl_properties())
             ctrl = self.pool.create_controller(**args)
             ctrl.add_listener(self.on_controller_changed)
diff --git a/src/sardana/tango/pool/MeasurementGroup.py b/src/sardana/tango/pool/MeasurementGroup.py
index d10eddd..0861ce1 100644
--- a/src/sardana/tango/pool/MeasurementGroup.py
+++ b/src/sardana/tango/pool/MeasurementGroup.py
@@ -36,7 +36,7 @@ from PyTango import Except, DevVoid, DevLong, DevDouble, DevString, \
     DispLevel, DevState, AttrQuality, \
     READ_WRITE, SCALAR
 
-from taurus.core.util import CodecFactory
+from taurus.core.util.codecs import CodecFactory
 from taurus.core.util.log import DebugIt
 
 from sardana import State, SardanaServer
diff --git a/src/sardana/tango/pool/Pool.py b/src/sardana/tango/pool/Pool.py
index 07a5700..5e0e033 100755
--- a/src/sardana/tango/pool/Pool.py
+++ b/src/sardana/tango/pool/Pool.py
@@ -36,7 +36,8 @@ import os.path
 import PyTango
 
 from taurus import Factory
-from taurus.core.util import CaselessDict, CodecFactory
+from taurus.core.util.containers import CaselessDict
+from taurus.core.util.codecs import CodecFactory
 from taurus.core.util.log import Logger, DebugIt
 
 from sardana import State, SardanaServer, ElementType, Interface, \
diff --git a/src/sardana/tango/pool/PoolDevice.py b/src/sardana/tango/pool/PoolDevice.py
index 70d533e..fac0a1b 100644
--- a/src/sardana/tango/pool/PoolDevice.py
+++ b/src/sardana/tango/pool/PoolDevice.py
@@ -690,7 +690,7 @@ class PoolElementDevice(PoolDevice):
         :type attr: :class:`~PyTango.Attribute`"""
         name = attr.get_name()
         value = attr.get_write_value()
-        self.debug("writting dynamic attribute %s with value %s", name, value)
+        self.debug("writing dynamic attribute %s with value %s", name, value)
         ctrl = self.ctrl
         if ctrl is None:
             raise Exception("Cannot write %s. Controller not build!" % name)

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



More information about the debian-science-commits mailing list