diff --git a/data/RobotAPI/VariantInfo-RobotAPI.xml b/data/RobotAPI/VariantInfo-RobotAPI.xml
index 3e903dcb48c65673c518d3582b106d5efc5554b2..75e57d387b8e4541ef29f439942728538d3feca7 100644
--- a/data/RobotAPI/VariantInfo-RobotAPI.xml
+++ b/data/RobotAPI/VariantInfo-RobotAPI.xml
@@ -138,6 +138,14 @@
             propertyName="RobotUnitObserverName"
             propertyIsOptional="true"
             propertyDefaultValue="RobotUnitObserver" />
+        <Proxy include="ArmarXCore/interface/observers/ObserverInterface.h"
+            humanName="Speech Observer"
+            typeName="ObserverInterfacePrx"
+            memberName="speechObserver"
+            getterName="getSpeechObserver"
+            propertyName="SpeechObserverName"
+            propertyIsOptional="true"
+            propertyDefaultValue="SpeechObserver" />
         <Proxy include="RobotAPI/interface/components/TrajectoryPlayerInterface.h"
             humanName="TrajectoryPlayer Component"
             typeName="TrajectoryPlayerInterfacePrx"
diff --git a/scenarios/SpeechObserver/SpeechObserver.scx b/scenarios/SpeechObserver/SpeechObserver.scx
new file mode 100644
index 0000000000000000000000000000000000000000..367b1f68d6adef579c1cf8725d272a7bfcb58f10
--- /dev/null
+++ b/scenarios/SpeechObserver/SpeechObserver.scx
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<scenario name="SpeechObserver" creation="2018-05-24.11:20:15" globalConfigName="./config/global.cfg" package="RobotAPI">
+	<application name="SpeechObserverApp" instance="" package="RobotAPI" enabled="true"/>
+	<application name="DummyTextToSpeechApp" instance="" package="RobotAPI" enabled="true"/>
+</scenario>
+
diff --git a/scenarios/SpeechObserver/config/ConditionHandler.cfg b/scenarios/SpeechObserver/config/ConditionHandler.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..95dcb5035640ba6ebe7b380f2168213557aa2f50
--- /dev/null
+++ b/scenarios/SpeechObserver/config/ConditionHandler.cfg
@@ -0,0 +1,172 @@
+# ==================================================================
+# ConditionHandler properties
+# ==================================================================
+
+# ArmarX.AdditionalPackages:  List of additional ArmarX packages which should be in the list of default packages. If you have custom packages, which should be found by the gui or other apps, specify them here. Comma separated List.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.AdditionalPackages = Default value not mapped.
+
+
+# ArmarX.ApplicationName:  Application name
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ApplicationName = ""
+
+
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+#  Attributes:
+#  - Default:            mongo/.cache
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.CachePath = mongo/.cache
+
+
+# ArmarX.ConditionHandler.EnableProfiling:  enable profiler which is used for logging performance events
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ConditionHandler.EnableProfiling = 0
+
+
+# ArmarX.ConditionHandler.HistoryLength:  Length of condition history kept by the conditionhandler
+#  Attributes:
+#  - Default:            1000
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ConditionHandler.HistoryLength = 1000
+
+
+# ArmarX.ConditionHandler.MinimumLoggingLevel:  Local logging level only for this component
+#  Attributes:
+#  - Default:            Undefined
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ConditionHandler.MinimumLoggingLevel = Undefined
+
+
+# ArmarX.ConditionHandler.ObjectName:  Name of IceGrid well-known object
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ConditionHandler.ObjectName = ""
+
+
+# ArmarX.ConditionHandler.Observers:  Comma seperated observer list
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ConditionHandler.Observers = ""
+
+
+# ArmarX.Config:  Comma-separated list of configuration files 
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Config = ""
+
+
+# ArmarX.DataPath:  Semicolon-separated search list for data files
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DataPath = ""
+
+
+# ArmarX.DefaultPackages:  List of ArmarX packages which are accessible by default. Comma separated List. If you want to add your own packages and use all default ArmarX packages, use the property 'AdditionalPackages'.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DefaultPackages = Default value not mapped.
+
+
+# ArmarX.DependenciesConfig:  Path to the (usually generated) config file containing all data paths of all dependent projects. This property usually does not need to be edited.
+#  Attributes:
+#  - Default:            ./config/dependencies.cfg
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DependenciesConfig = ./config/dependencies.cfg
+
+
+# ArmarX.DisableLogging:  Turn logging off in whole application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DisableLogging = 0
+
+
+# ArmarX.EnableProfiling:  Enable profiling of CPU load produced by this application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.EnableProfiling = 0
+
+
+# ArmarX.RedirectStdout:  Redirect std::cout and std::cerr to ArmarXLog
+#  Attributes:
+#  - Default:            1
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RedirectStdout = 1
+
+
+# ArmarX.RemoteHandlesDeletionTimeout:  The timeout (in ms) before a remote handle deletes the managed object after the use count reached 0. This time can be used by a client to increment the count again (may be required when transmitting remote handles)
+#  Attributes:
+#  - Default:            3000
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RemoteHandlesDeletionTimeout = 3000
+
+
+# ArmarX.StartDebuggerOnCrash:  If this application crashes (segmentation fault) qtcreator will attach to this process and start the debugger.
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.StartDebuggerOnCrash = 0
+
+
+# ArmarX.TopicSuffix:  Suffix appended to all topic names for outgoing topics. This is mainly used to direct all topics to another name for TopicReplaying purposes.
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.TopicSuffix = ""
+
+
+# ArmarX.UseTimeServer:  Enable using a global Timeserver (e.g. from ArmarXSimulator)
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.UseTimeServer = 0
+
+
+# ArmarX.Verbosity:  Global logging level for whole application
+#  Attributes:
+#  - Default:            Info
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Verbosity = Info
+
+
+# Ice.Config:  Custom Property
+#  Attributes:
+#  - Default:            ::NOT_DEFINED::
+#  - Case sensitivity:   no
+#  - Required:           no
+# Ice.Config = ::NOT_DEFINED::
+
+
diff --git a/scenarios/SpeechObserver/config/DummyTextToSpeechApp.cfg b/scenarios/SpeechObserver/config/DummyTextToSpeechApp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..4b7302497882ef33de9eba5411327ed574f9e787
--- /dev/null
+++ b/scenarios/SpeechObserver/config/DummyTextToSpeechApp.cfg
@@ -0,0 +1,172 @@
+# ==================================================================
+# DummyTextToSpeechApp properties
+# ==================================================================
+
+# ArmarX.AdditionalPackages:  List of additional ArmarX packages which should be in the list of default packages. If you have custom packages, which should be found by the gui or other apps, specify them here. Comma separated List.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.AdditionalPackages = Default value not mapped.
+
+
+# ArmarX.ApplicationName:  Application name
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ApplicationName = ""
+
+
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+#  Attributes:
+#  - Default:            mongo/.cache
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.CachePath = mongo/.cache
+
+
+# ArmarX.Config:  Comma-separated list of configuration files 
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Config = ""
+
+
+# ArmarX.DataPath:  Semicolon-separated search list for data files
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DataPath = ""
+
+
+# ArmarX.DefaultPackages:  List of ArmarX packages which are accessible by default. Comma separated List. If you want to add your own packages and use all default ArmarX packages, use the property 'AdditionalPackages'.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DefaultPackages = Default value not mapped.
+
+
+# ArmarX.DependenciesConfig:  Path to the (usually generated) config file containing all data paths of all dependent projects. This property usually does not need to be edited.
+#  Attributes:
+#  - Default:            ./config/dependencies.cfg
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DependenciesConfig = ./config/dependencies.cfg
+
+
+# ArmarX.DisableLogging:  Turn logging off in whole application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DisableLogging = 0
+
+
+# ArmarX.DummyTextToSpeech.EnableProfiling:  enable profiler which is used for logging performance events
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DummyTextToSpeech.EnableProfiling = 0
+
+
+# ArmarX.DummyTextToSpeech.MinimumLoggingLevel:  Local logging level only for this component
+#  Attributes:
+#  - Default:            Undefined
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DummyTextToSpeech.MinimumLoggingLevel = Undefined
+
+
+# ArmarX.DummyTextToSpeech.ObjectName:  Name of IceGrid well-known object
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DummyTextToSpeech.ObjectName = ""
+
+
+# ArmarX.DummyTextToSpeech.TextToSpeechStateTopicName:  Name of the TextToSpeechStateTopic
+#  Attributes:
+#  - Default:            TextToSpeechState
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DummyTextToSpeech.TextToSpeechStateTopicName = TextToSpeechState
+
+
+# ArmarX.DummyTextToSpeech.TextToSpeechTopicName:  Name of the TextToSpeechTopic
+#  Attributes:
+#  - Default:            TextToSpeech
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DummyTextToSpeech.TextToSpeechTopicName = TextToSpeech
+
+
+# ArmarX.EnableProfiling:  Enable profiling of CPU load produced by this application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.EnableProfiling = 0
+
+
+# ArmarX.RedirectStdout:  Redirect std::cout and std::cerr to ArmarXLog
+#  Attributes:
+#  - Default:            1
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RedirectStdout = 1
+
+
+# ArmarX.RemoteHandlesDeletionTimeout:  The timeout (in ms) before a remote handle deletes the managed object after the use count reached 0. This time can be used by a client to increment the count again (may be required when transmitting remote handles)
+#  Attributes:
+#  - Default:            3000
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RemoteHandlesDeletionTimeout = 3000
+
+
+# ArmarX.StartDebuggerOnCrash:  If this application crashes (segmentation fault) qtcreator will attach to this process and start the debugger.
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.StartDebuggerOnCrash = 0
+
+
+# ArmarX.TopicSuffix:  Suffix appended to all topic names for outgoing topics. This is mainly used to direct all topics to another name for TopicReplaying purposes.
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.TopicSuffix = ""
+
+
+# ArmarX.UseTimeServer:  Enable using a global Timeserver (e.g. from ArmarXSimulator)
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.UseTimeServer = 0
+
+
+# ArmarX.Verbosity:  Global logging level for whole application
+#  Attributes:
+#  - Default:            Info
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Verbosity = Info
+
+
+# Ice.Config:  Custom Property
+#  Attributes:
+#  - Default:            ::NOT_DEFINED::
+#  - Case sensitivity:   no
+#  - Required:           no
+# Ice.Config = ::NOT_DEFINED::
+
+
diff --git a/scenarios/SpeechObserver/config/SpeechObserverApp.cfg b/scenarios/SpeechObserver/config/SpeechObserverApp.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..50707e2925a493f4738f89185082ef340a3f5f43
--- /dev/null
+++ b/scenarios/SpeechObserver/config/SpeechObserverApp.cfg
@@ -0,0 +1,191 @@
+# ==================================================================
+# SpeechObserverApp properties
+# ==================================================================
+
+# ArmarX.AdditionalPackages:  List of additional ArmarX packages which should be in the list of default packages. If you have custom packages, which should be found by the gui or other apps, specify them here. Comma separated List.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.AdditionalPackages = Default value not mapped.
+
+
+# ArmarX.ApplicationName:  Application name
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ApplicationName = ""
+
+
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+#  Attributes:
+#  - Default:            mongo/.cache
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.CachePath = mongo/.cache
+
+
+# ArmarX.Config:  Comma-separated list of configuration files 
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Config = ""
+
+
+# ArmarX.DataPath:  Semicolon-separated search list for data files
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DataPath = ""
+
+
+# ArmarX.DefaultPackages:  List of ArmarX packages which are accessible by default. Comma separated List. If you want to add your own packages and use all default ArmarX packages, use the property 'AdditionalPackages'.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DefaultPackages = Default value not mapped.
+
+
+# ArmarX.DependenciesConfig:  Path to the (usually generated) config file containing all data paths of all dependent projects. This property usually does not need to be edited.
+#  Attributes:
+#  - Default:            ./config/dependencies.cfg
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DependenciesConfig = ./config/dependencies.cfg
+
+
+# ArmarX.DisableLogging:  Turn logging off in whole application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DisableLogging = 0
+
+
+# ArmarX.EnableProfiling:  Enable profiling of CPU load produced by this application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.EnableProfiling = 0
+
+
+# ArmarX.RedirectStdout:  Redirect std::cout and std::cerr to ArmarXLog
+#  Attributes:
+#  - Default:            1
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RedirectStdout = 1
+
+
+# ArmarX.RemoteHandlesDeletionTimeout:  The timeout (in ms) before a remote handle deletes the managed object after the use count reached 0. This time can be used by a client to increment the count again (may be required when transmitting remote handles)
+#  Attributes:
+#  - Default:            3000
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RemoteHandlesDeletionTimeout = 3000
+
+
+# ArmarX.SpeechObserver.CreateUpdateFrequenciesChannel:  If true, an additional channel is created that shows the update frequency of every other channel in that observer.
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SpeechObserver.CreateUpdateFrequenciesChannel = 0
+
+
+# ArmarX.SpeechObserver.EnableProfiling:  enable profiler which is used for logging performance events
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SpeechObserver.EnableProfiling = 0
+
+
+# ArmarX.SpeechObserver.MaxHistoryRecordFrequency:  The Observer history is written with this maximum frequency. Everything faster is being skipped.
+#  Attributes:
+#  - Default:            50
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SpeechObserver.MaxHistoryRecordFrequency = 50
+
+
+# ArmarX.SpeechObserver.MaxHistorySize:  Maximum number of entries in the Observer history
+#  Attributes:
+#  - Default:            5000
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SpeechObserver.MaxHistorySize = 5000
+
+
+# ArmarX.SpeechObserver.MinimumLoggingLevel:  Local logging level only for this component
+#  Attributes:
+#  - Default:            Undefined
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SpeechObserver.MinimumLoggingLevel = Undefined
+
+
+# ArmarX.SpeechObserver.ObjectName:  Name of IceGrid well-known object
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SpeechObserver.ObjectName = ""
+
+
+# ArmarX.SpeechObserver.TextToSpeechStateTopicName:  Name of the TextToSpeechStateTopic
+#  Attributes:
+#  - Default:            TextToSpeechState
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SpeechObserver.TextToSpeechStateTopicName = TextToSpeechState
+
+
+# ArmarX.SpeechObserver.TextToSpeechTopicName:  Name of the TextToSpeechTopic
+#  Attributes:
+#  - Default:            TextToSpeech
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SpeechObserver.TextToSpeechTopicName = TextToSpeech
+
+
+# ArmarX.StartDebuggerOnCrash:  If this application crashes (segmentation fault) qtcreator will attach to this process and start the debugger.
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.StartDebuggerOnCrash = 0
+
+
+# ArmarX.TopicSuffix:  Suffix appended to all topic names for outgoing topics. This is mainly used to direct all topics to another name for TopicReplaying purposes.
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.TopicSuffix = ""
+
+
+# ArmarX.UseTimeServer:  Enable using a global Timeserver (e.g. from ArmarXSimulator)
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.UseTimeServer = 0
+
+
+# ArmarX.Verbosity:  Global logging level for whole application
+#  Attributes:
+#  - Default:            Info
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Verbosity = Info
+
+
+
+
+
diff --git a/scenarios/SpeechObserver/config/SystemObserver.cfg b/scenarios/SpeechObserver/config/SystemObserver.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..346a013defe419e8c28d15aeadd96c9a89b3d7c5
--- /dev/null
+++ b/scenarios/SpeechObserver/config/SystemObserver.cfg
@@ -0,0 +1,175 @@
+# ==================================================================
+# SystemObserver properties
+# ==================================================================
+
+# ArmarX.AdditionalPackages:  List of additional ArmarX packages which should be in the list of default packages. If you have custom packages, which should be found by the gui or other apps, specify them here. Comma separated List.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.AdditionalPackages = Default value not mapped.
+
+
+# ArmarX.ApplicationName:  Application name
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ApplicationName = ""
+
+
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+#  Attributes:
+#  - Default:            mongo/.cache
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.CachePath = mongo/.cache
+
+
+# ArmarX.Config:  Comma-separated list of configuration files 
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Config = ""
+
+
+# ArmarX.DataPath:  Semicolon-separated search list for data files
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DataPath = ""
+
+
+# ArmarX.DefaultPackages:  List of ArmarX packages which are accessible by default. Comma separated List. If you want to add your own packages and use all default ArmarX packages, use the property 'AdditionalPackages'.
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DefaultPackages = Default value not mapped.
+
+
+# ArmarX.DependenciesConfig:  Path to the (usually generated) config file containing all data paths of all dependent projects. This property usually does not need to be edited.
+#  Attributes:
+#  - Default:            ./config/dependencies.cfg
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DependenciesConfig = ./config/dependencies.cfg
+
+
+# ArmarX.DisableLogging:  Turn logging off in whole application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DisableLogging = 0
+
+
+# ArmarX.EnableProfiling:  Enable profiling of CPU load produced by this application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.EnableProfiling = 0
+
+
+# ArmarX.RedirectStdout:  Redirect std::cout and std::cerr to ArmarXLog
+#  Attributes:
+#  - Default:            1
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RedirectStdout = 1
+
+
+# ArmarX.RemoteHandlesDeletionTimeout:  The timeout (in ms) before a remote handle deletes the managed object after the use count reached 0. This time can be used by a client to increment the count again (may be required when transmitting remote handles)
+#  Attributes:
+#  - Default:            3000
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RemoteHandlesDeletionTimeout = 3000
+
+
+# ArmarX.StartDebuggerOnCrash:  If this application crashes (segmentation fault) qtcreator will attach to this process and start the debugger.
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.StartDebuggerOnCrash = 0
+
+
+# ArmarX.SystemObserver.CreateUpdateFrequenciesChannel:  If true, an additional channel is created that shows the update frequency of every other channel in that observer.
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SystemObserver.CreateUpdateFrequenciesChannel = 0
+
+
+# ArmarX.SystemObserver.EnableProfiling:  enable profiler which is used for logging performance events
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SystemObserver.EnableProfiling = 0
+
+
+# ArmarX.SystemObserver.MaxHistoryRecordFrequency:  The Observer history is written with this maximum frequency. Everything faster is being skipped.
+#  Attributes:
+#  - Default:            50
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SystemObserver.MaxHistoryRecordFrequency = 50
+
+
+# ArmarX.SystemObserver.MaxHistorySize:  Maximum number of entries in the Observer history
+#  Attributes:
+#  - Default:            5000
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SystemObserver.MaxHistorySize = 5000
+
+
+# ArmarX.SystemObserver.MinimumLoggingLevel:  Local logging level only for this component
+#  Attributes:
+#  - Default:            Undefined
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SystemObserver.MinimumLoggingLevel = Undefined
+
+
+# ArmarX.SystemObserver.ObjectName:  Name of IceGrid well-known object
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SystemObserver.ObjectName = ""
+
+
+# ArmarX.TopicSuffix:  Suffix appended to all topic names for outgoing topics. This is mainly used to direct all topics to another name for TopicReplaying purposes.
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.TopicSuffix = ""
+
+
+# ArmarX.UseTimeServer:  Enable using a global Timeserver (e.g. from ArmarXSimulator)
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.UseTimeServer = 0
+
+
+# ArmarX.Verbosity:  Global logging level for whole application
+#  Attributes:
+#  - Default:            Info
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Verbosity = Info
+
+
+
+
+
diff --git a/scenarios/SpeechObserver/config/global.cfg b/scenarios/SpeechObserver/config/global.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d3d011a25603e96e555ff8368d49118c2f4fedac
--- /dev/null
+++ b/scenarios/SpeechObserver/config/global.cfg
@@ -0,0 +1,7 @@
+# ==================================================================
+# Global Config from Scenario SpeechObserver
+# ==================================================================
+
+
+
+
diff --git a/source/RobotAPI/applications/CMakeLists.txt b/source/RobotAPI/applications/CMakeLists.txt
index 18ba159a04064aed566f41e66c86835a979d2912..9f666824e46f21a784156ef11e34784535f21023 100644
--- a/source/RobotAPI/applications/CMakeLists.txt
+++ b/source/RobotAPI/applications/CMakeLists.txt
@@ -36,4 +36,6 @@ add_subdirectory(GamepadControlUnit)
 
 add_subdirectory(MetaWearIMU)
 add_subdirectory(MetaWearIMUObserver)
-add_subdirectory(RobotNameService)
\ No newline at end of file
+add_subdirectory(RobotNameService)
+add_subdirectory(SpeechObserver)
+add_subdirectory(DummyTextToSpeech)
\ No newline at end of file
diff --git a/source/RobotAPI/applications/DummyTextToSpeech/CMakeLists.txt b/source/RobotAPI/applications/DummyTextToSpeech/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c33714015b06803fb2527f59bae877e45dd024dd
--- /dev/null
+++ b/source/RobotAPI/applications/DummyTextToSpeech/CMakeLists.txt
@@ -0,0 +1,20 @@
+armarx_component_set_name("DummyTextToSpeechApp")
+
+#find_package(MyLib QUIET)
+#armarx_build_if(MyLib_FOUND "MyLib not available")
+#
+# all include_directories must be guarded by if(Xyz_FOUND)
+# for multiple libraries write: if(X_FOUND AND Y_FOUND)....
+#if(MyLib_FOUND)
+#    include_directories(${MyLib_INCLUDE_DIRS})
+#endif()
+
+set(COMPONENT_LIBS
+    ArmarXCoreInterfaces
+    ArmarXCore
+    DummyTextToSpeech
+)
+
+set(EXE_SOURCE main.cpp)
+
+armarx_add_component_executable("${EXE_SOURCE}")
diff --git a/source/RobotAPI/applications/DummyTextToSpeech/main.cpp b/source/RobotAPI/applications/DummyTextToSpeech/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2d852287b667c19549edac56d8e3c2ae2c39d947
--- /dev/null
+++ b/source/RobotAPI/applications/DummyTextToSpeech/main.cpp
@@ -0,0 +1,32 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::application::DummyTextToSpeech
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2018
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include <RobotAPI/components/DummyTextToSpeech/DummyTextToSpeech.h>
+
+#include <ArmarXCore/core/application/Application.h>
+#include <ArmarXCore/core/Component.h>
+#include <ArmarXCore/core/logging/Logging.h>
+
+int main(int argc, char* argv[])
+{
+    return armarx::runSimpleComponentApp < armarx::DummyTextToSpeech > (argc, argv, "DummyTextToSpeech");
+}
diff --git a/source/RobotAPI/applications/SpeechObserver/CMakeLists.txt b/source/RobotAPI/applications/SpeechObserver/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..513924b4d11e928fca183e52fc3596f99370a3c9
--- /dev/null
+++ b/source/RobotAPI/applications/SpeechObserver/CMakeLists.txt
@@ -0,0 +1,12 @@
+armarx_component_set_name("SpeechObserverApp")
+
+
+set(COMPONENT_LIBS
+    ArmarXCoreInterfaces
+    ArmarXCore
+    RobotAPIUnits
+)
+
+set(EXE_SOURCE main.cpp)
+
+armarx_add_component_executable("${EXE_SOURCE}")
diff --git a/source/RobotAPI/applications/SpeechObserver/main.cpp b/source/RobotAPI/applications/SpeechObserver/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2ea82bf4082f388586e0d61d206954f1e7a81547
--- /dev/null
+++ b/source/RobotAPI/applications/SpeechObserver/main.cpp
@@ -0,0 +1,32 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::application::SpeechObserver
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2018
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include <RobotAPI/components/units/SpeechObserver.h>
+
+#include <ArmarXCore/core/application/Application.h>
+#include <ArmarXCore/core/Component.h>
+#include <ArmarXCore/core/logging/Logging.h>
+
+int main(int argc, char* argv[])
+{
+    return armarx::runSimpleComponentApp < armarx::SpeechObserver > (argc, argv, "SpeechObserver");
+}
diff --git a/source/RobotAPI/components/CMakeLists.txt b/source/RobotAPI/components/CMakeLists.txt
index 3a83bab00d31ca1c6eecd25b6bc52e0a01750c42..45f4e6012c0833bc89746cca1198cd17951697c8 100644
--- a/source/RobotAPI/components/CMakeLists.txt
+++ b/source/RobotAPI/components/CMakeLists.txt
@@ -6,4 +6,5 @@ add_subdirectory(ViewSelection)
 
 
 add_subdirectory(GamepadControlUnit)
-add_subdirectory(RobotNameService)
\ No newline at end of file
+add_subdirectory(RobotNameService)
+add_subdirectory(DummyTextToSpeech)
\ No newline at end of file
diff --git a/source/RobotAPI/components/DummyTextToSpeech/CMakeLists.txt b/source/RobotAPI/components/DummyTextToSpeech/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0916bea6b385a3a10647ed919c602106e249fe1c
--- /dev/null
+++ b/source/RobotAPI/components/DummyTextToSpeech/CMakeLists.txt
@@ -0,0 +1,26 @@
+armarx_component_set_name("DummyTextToSpeech")
+
+#find_package(MyLib QUIET)
+#armarx_build_if(MyLib_FOUND "MyLib not available")
+#
+# all include_directories must be guarded by if(Xyz_FOUND)
+# for multiple libraries write: if(X_FOUND AND Y_FOUND)....
+#if(MyLib_FOUND)
+#    include_directories(${MyLib_INCLUDE_DIRS})
+#endif()
+
+set(COMPONENT_LIBS ArmarXCoreInterfaces ArmarXCore RobotAPIInterfaces)
+
+set(SOURCES
+./DummyTextToSpeech.cpp
+#@TEMPLATE_LINE@@COMPONENT_PATH@/@COMPONENT_NAME@.cpp
+)
+set(HEADERS
+./DummyTextToSpeech.h
+#@TEMPLATE_LINE@@COMPONENT_PATH@/@COMPONENT_NAME@.h
+)
+
+armarx_add_component("${SOURCES}" "${HEADERS}")
+
+# add unit tests
+add_subdirectory(test)
diff --git a/source/RobotAPI/components/DummyTextToSpeech/DummyTextToSpeech.cpp b/source/RobotAPI/components/DummyTextToSpeech/DummyTextToSpeech.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..76406efc20632032ff41568f8d36088c0c180483
--- /dev/null
+++ b/source/RobotAPI/components/DummyTextToSpeech/DummyTextToSpeech.cpp
@@ -0,0 +1,78 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::ArmarXObjects::DummyTextToSpeech
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2018
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include "DummyTextToSpeech.h"
+
+#include <ArmarXCore/core/time/TimeUtil.h>
+
+using namespace armarx;
+
+
+void DummyTextToSpeech::onInitComponent()
+{
+    usingTopic(getProperty<std::string>("TextToSpeechTopicName").getValue());
+    offeringTopic(getProperty<std::string>("TextToSpeechStateTopicName").getValue());
+}
+
+
+void DummyTextToSpeech::onConnectComponent()
+{
+    textToSpeechStateTopicPrx = getTopic<TextToSpeechStateInterfacePrx>(getProperty<std::string>("TextToSpeechStateTopicName").getValue());
+    textToSpeechStateTopicPrx->reportState(eIdle);
+}
+
+
+void DummyTextToSpeech::onDisconnectComponent()
+{
+
+}
+
+
+void DummyTextToSpeech::onExitComponent()
+{
+
+}
+
+armarx::PropertyDefinitionsPtr DummyTextToSpeech::createPropertyDefinitions()
+{
+    return armarx::PropertyDefinitionsPtr(new DummyTextToSpeechPropertyDefinitions(
+                                      getConfigIdentifier()));
+}
+
+
+
+void armarx::DummyTextToSpeech::reportText(const std::string&text, const Ice::Current&)
+{
+    ARMARX_IMPORTANT << "reportState";
+    textToSpeechStateTopicPrx->reportState(eStartedSpeaking);
+
+    ARMARX_IMPORTANT << "sleep";
+    sleep(1);
+    TimeUtil::SleepMS(text.length() * 10);
+    ARMARX_IMPORTANT << "reportState";
+    textToSpeechStateTopicPrx->reportState(eFinishedSpeaking);
+}
+
+void armarx::DummyTextToSpeech::reportTextWithParams(const std::string&text, const Ice::StringSeq&params, const Ice::Current&)
+{
+    ARMARX_WARNING << "reportTextWithParams is not implemented";
+}
diff --git a/source/RobotAPI/components/DummyTextToSpeech/DummyTextToSpeech.h b/source/RobotAPI/components/DummyTextToSpeech/DummyTextToSpeech.h
new file mode 100644
index 0000000000000000000000000000000000000000..20c7f5e5e994e9c937dfb85103c8fcfec4dfdb62
--- /dev/null
+++ b/source/RobotAPI/components/DummyTextToSpeech/DummyTextToSpeech.h
@@ -0,0 +1,107 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::ArmarXObjects::DummyTextToSpeech
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2018
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+
+#include <ArmarXCore/core/Component.h>
+
+#include <RobotAPI/interface/speech/SpeechInterface.h>
+
+namespace armarx
+{
+    /**
+     * @class DummyTextToSpeechPropertyDefinitions
+     * @brief
+     */
+    class DummyTextToSpeechPropertyDefinitions:
+        public armarx::ComponentPropertyDefinitions
+    {
+    public:
+        DummyTextToSpeechPropertyDefinitions(std::string prefix):
+            armarx::ComponentPropertyDefinitions(prefix)
+        {
+            //defineRequiredProperty<std::string>("PropertyName", "Description");
+            defineOptionalProperty<std::string>("TextToSpeechTopicName", "TextToSpeech", "Name of the TextToSpeechTopic");
+            defineOptionalProperty<std::string>("TextToSpeechStateTopicName", "TextToSpeechState", "Name of the TextToSpeechStateTopic");
+        }
+    };
+
+    /**
+     * @defgroup Component-DummyTextToSpeech DummyTextToSpeech
+     * @ingroup RobotAPI-Components
+     * A description of the component DummyTextToSpeech.
+     *
+     * @class DummyTextToSpeech
+     * @ingroup Component-DummyTextToSpeech
+     * @brief Brief description of class DummyTextToSpeech.
+     *
+     * Detailed description of class DummyTextToSpeech.
+     */
+    class DummyTextToSpeech :
+        virtual public armarx::Component,
+        virtual public TextListenerInterface
+    {
+    public:
+        /**
+         * @see armarx::ManagedIceObject::getDefaultName()
+         */
+        std::string getDefaultName() const override
+        {
+            return "DummyTextToSpeech";
+        }
+
+    protected:
+        /**
+         * @see armarx::ManagedIceObject::onInitComponent()
+         */
+        void onInitComponent() override;
+
+        /**
+         * @see armarx::ManagedIceObject::onConnectComponent()
+         */
+        void onConnectComponent() override;
+
+        /**
+         * @see armarx::ManagedIceObject::onDisconnectComponent()
+         */
+        void onDisconnectComponent() override;
+
+        /**
+         * @see armarx::ManagedIceObject::onExitComponent()
+         */
+        void onExitComponent() override;
+
+        /**
+         * @see PropertyUser::createPropertyDefinitions()
+         */
+        armarx::PropertyDefinitionsPtr createPropertyDefinitions() override;
+
+        // TextListenerInterface interface
+    public:
+        void reportText(const std::string& text, const Ice::Current&) override;
+        void reportTextWithParams(const std::string& text, const Ice::StringSeq& params, const Ice::Current&) override;
+
+    private:
+        TextToSpeechStateInterfacePrx textToSpeechStateTopicPrx;
+    };
+}
diff --git a/source/RobotAPI/components/DummyTextToSpeech/test/CMakeLists.txt b/source/RobotAPI/components/DummyTextToSpeech/test/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1af51cc9bf20a0a10e44a0c7e4c88fcb2666564c
--- /dev/null
+++ b/source/RobotAPI/components/DummyTextToSpeech/test/CMakeLists.txt
@@ -0,0 +1,5 @@
+
+# Libs required for the tests
+SET(LIBS ${LIBS} ArmarXCore DummyTextToSpeech)
+ 
+armarx_add_test(DummyTextToSpeechTest DummyTextToSpeechTest.cpp "${LIBS}")
\ No newline at end of file
diff --git a/source/RobotAPI/components/DummyTextToSpeech/test/DummyTextToSpeechTest.cpp b/source/RobotAPI/components/DummyTextToSpeech/test/DummyTextToSpeechTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e5f4d8f434570fcc61c9f7dc2e660418a460f9aa
--- /dev/null
+++ b/source/RobotAPI/components/DummyTextToSpeech/test/DummyTextToSpeechTest.cpp
@@ -0,0 +1,37 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::ArmarXObjects::DummyTextToSpeech
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2018
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#define BOOST_TEST_MODULE RobotAPI::ArmarXObjects::DummyTextToSpeech
+
+#define ARMARX_BOOST_TEST
+
+#include <RobotAPI/Test.h>
+#include <RobotAPI/components/DummyTextToSpeech/DummyTextToSpeech.h>
+
+#include <iostream>
+
+BOOST_AUTO_TEST_CASE(testExample)
+{
+    armarx::DummyTextToSpeech instance;
+
+    BOOST_CHECK_EQUAL(true, true);
+}
diff --git a/source/RobotAPI/components/units/CMakeLists.txt b/source/RobotAPI/components/units/CMakeLists.txt
index 6652dae03bf37aed49342cea8160df75976f7ab5..ea60cffcbd7cb92d698030caa3a8ce86887bc983 100644
--- a/source/RobotAPI/components/units/CMakeLists.txt
+++ b/source/RobotAPI/components/units/CMakeLists.txt
@@ -48,6 +48,7 @@ set(LIB_HEADERS
     PlatformUnitObserver.h
     SensorActorUnit.h
     ATINetFTUnit.h
+    SpeechObserver.h
 )
 
 set(LIB_FILES
@@ -78,6 +79,7 @@ set(LIB_FILES
     PlatformUnitObserver.cpp
     SensorActorUnit.cpp
     ATINetFTUnit.cpp
+    SpeechObserver.cpp
 )
 
 armarx_add_library("${LIB_NAME}"  "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}")
diff --git a/source/RobotAPI/components/units/SpeechObserver.cpp b/source/RobotAPI/components/units/SpeechObserver.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..15b2766b4f07989833590f8a3e2a0aa3bbdd134a
--- /dev/null
+++ b/source/RobotAPI/components/units/SpeechObserver.cpp
@@ -0,0 +1,86 @@
+/*
+ * This file is part of ArmarX.
+ * 
+ * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T),
+ * Karlsruhe Institute of Technology (KIT), all rights reserved.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Simon Ottenhaus (simon dot ottenhaus at kit dot edu)
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include "SpeechObserver.h"
+
+using namespace armarx;
+
+SpeechObserver::SpeechObserver()
+{
+}
+
+void SpeechObserver::onInitObserver()
+{
+    usingTopic(getProperty<std::string>("TextToSpeechTopicName").getValue());
+    usingTopic(getProperty<std::string>("TextToSpeechStateTopicName").getValue());
+}
+
+void SpeechObserver::onConnectObserver()
+{
+    offerChannel("TextToSpeech", "TextToSpeech channel");
+    offerDataFieldWithDefault("TextToSpeech", "Text", Variant(""), "Current text");
+    offerDataFieldWithDefault("TextToSpeech", "TextChangeCounter", Variant(reportTextCounter), "Counter for text updates");
+
+    offerDataFieldWithDefault("TextToSpeech", "State", Variant(""), "Current TTS state");
+    offerDataFieldWithDefault("TextToSpeech", "StateChangeCounter", Variant(reportStateCounter), "Counter for text updates");
+}
+
+std::string SpeechObserver::SpeechStateToString(TextToSpeechStateType state)
+{
+    switch(state)
+    {
+        case eIdle:
+            return "Idle";
+        case eStartedSpeaking:
+            return "StartedSpeaking";
+        case eFinishedSpeaking:
+            return "FinishedSpeaking";
+
+        default:
+            throw LocalException("Unsupported TextToSpeechStateType: ") << state;
+    }
+}
+
+void SpeechObserver::reportState(TextToSpeechStateType state, const Ice::Current&)
+{
+    ScopedLock lock(dataMutex);
+    reportStateCounter++;
+    setDataField("TextToSpeech", "State", Variant(SpeechStateToString(state)));
+    setDataField("TextToSpeech", "StateChangeCounter", Variant(reportStateCounter));
+    updateChannel("TextToSpeech");
+}
+
+void SpeechObserver::reportText(const std::string& text, const Ice::Current&)
+{
+    ScopedLock lock(dataMutex);
+    reportTextCounter++;
+    setDataField("TextToSpeech", "Text", Variant(text));
+    setDataField("TextToSpeech", "TextChangeCounter", Variant(reportTextCounter));
+    updateChannel("TextToSpeech");
+}
+
+void SpeechObserver::reportTextWithParams(const std::string& text, const Ice::StringSeq& params, const Ice::Current&)
+{
+    ScopedLock lock(dataMutex);
+    ARMARX_WARNING << "reportTextWithParams is not implemented";
+}
diff --git a/source/RobotAPI/components/units/SpeechObserver.h b/source/RobotAPI/components/units/SpeechObserver.h
new file mode 100644
index 0000000000000000000000000000000000000000..ef6e6580d23f0ec7a04f93daa2bddc38a7342565
--- /dev/null
+++ b/source/RobotAPI/components/units/SpeechObserver.h
@@ -0,0 +1,71 @@
+/*
+ * This file is part of ArmarX.
+ * 
+ * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T),
+ * Karlsruhe Institute of Technology (KIT), all rights reserved.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author     Simon Ottenhaus (simon dot ottenhaus at kit dot edu)
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+#include <ArmarXCore/observers/Observer.h>
+#include <RobotAPI/interface/observers/SpeechObserverInterface.h>
+
+namespace armarx
+{
+    class SpeechObserverPropertyDefinitions:
+        public ObserverPropertyDefinitions
+    {
+    public:
+        SpeechObserverPropertyDefinitions(std::string prefix):
+            ObserverPropertyDefinitions(prefix)
+        {
+            defineOptionalProperty<std::string>("TextToSpeechTopicName", "TextToSpeech", "Name of the TextToSpeechTopic");
+            defineOptionalProperty<std::string>("TextToSpeechStateTopicName", "TextToSpeechState", "Name of the TextToSpeechStateTopic");
+        }
+    };
+
+    class SpeechObserver :
+            virtual public Observer,
+            virtual public SpeechObserverInterface
+    {
+    public:
+        SpeechObserver();
+
+        std::string getDefaultName() const override
+        {
+            return "SpeechObserver";
+        }
+        PropertyDefinitionsPtr createPropertyDefinitions() override
+        {
+            return PropertyDefinitionsPtr(new SpeechObserverPropertyDefinitions(getConfigIdentifier()));
+        }
+
+        void onInitObserver() override;
+        void onConnectObserver() override;
+        virtual void reportState(armarx::TextToSpeechStateType state, const Ice::Current& = Ice::Current());
+        virtual void reportText(const std::string& text, const Ice::Current& = Ice::Current());
+        virtual void reportTextWithParams(const std::string& text, const Ice::StringSeq& params, const Ice::Current& = Ice::Current());
+
+        static std::string SpeechStateToString(TextToSpeechStateType state);
+    private:
+        Mutex dataMutex;
+        int reportTextCounter = 0;
+        int reportStateCounter = 0;
+    };
+}
diff --git a/source/RobotAPI/interface/CMakeLists.txt b/source/RobotAPI/interface/CMakeLists.txt
index f291a755554ae599ae14a0b484ee4a99335d066e..6b32bcb8a4a0302482b3014f5c213abf9a9d3ca4 100644
--- a/source/RobotAPI/interface/CMakeLists.txt
+++ b/source/RobotAPI/interface/CMakeLists.txt
@@ -21,6 +21,7 @@ set(SLICE_FILES
     selflocalisation/SelfLocalisationProcess.ice
 
     speech/SpeechInterface.ice
+    observers/SpeechObserverInterface.ice
 
     units/ForceTorqueUnit.ice
     units/InertialMeasurementUnit.ice
diff --git a/source/RobotAPI/interface/observers/SpeechObserverInterface.ice b/source/RobotAPI/interface/observers/SpeechObserverInterface.ice
new file mode 100644
index 0000000000000000000000000000000000000000..33d6c1758ac04b0235812e8bbf5e6537eda9e830
--- /dev/null
+++ b/source/RobotAPI/interface/observers/SpeechObserverInterface.ice
@@ -0,0 +1,37 @@
+/*
+* This file is part of ArmarX.
+*
+* ArmarX is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License version 2 as
+* published by the Free Software Foundation.
+*
+* ArmarX is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* @package    ArmarX::Core
+* @author     Christian Mandery (mandery at kit dot edu)
+* @copyright  2014 Humanoids Group, HIS, KIT
+* @license    http://www.gnu.org/licenses/gpl-2.0.txt
+*             GNU General Public License
+*/
+
+#pragma once
+
+
+#include <ArmarXCore/interface/observers/ObserverInterface.ice>
+#include <RobotAPI/interface/speech/SpeechInterface.ice>
+
+module armarx
+{
+
+    interface SpeechObserverInterface extends ObserverInterface, TextToSpeechStateInterface, TextListenerInterface
+    {
+    };
+
+};
+
diff --git a/source/RobotAPI/interface/speech/SpeechInterface.ice b/source/RobotAPI/interface/speech/SpeechInterface.ice
index 754e18a77ae64a38e2feb0bf5b57f6dd86742cb6..8356ea1652d93a496cc0f811bdf4c9bb22496f0f 100644
--- a/source/RobotAPI/interface/speech/SpeechInterface.ice
+++ b/source/RobotAPI/interface/speech/SpeechInterface.ice
@@ -87,6 +87,7 @@ module armarx
 
     enum TextToSpeechStateType
     {
+        eIdle,
         eStartedSpeaking,
         eFinishedSpeaking
     };
diff --git a/source/RobotAPI/statecharts/CMakeLists.txt b/source/RobotAPI/statecharts/CMakeLists.txt
index f5cca8f5cc140392d667d39ec877698c93482735..bec92a7fbfc5c74145d2cd1615376f161047f059 100644
--- a/source/RobotAPI/statecharts/CMakeLists.txt
+++ b/source/RobotAPI/statecharts/CMakeLists.txt
@@ -5,3 +5,5 @@ add_subdirectory(WeissHapticGroup)
 add_subdirectory(StatechartProfilesTestGroup)
 add_subdirectory(OrientedTactileSensorGroup)
 add_subdirectory(TrajectoryExecutionCode)
+
+add_subdirectory(SpeechObserverTestGroup)
\ No newline at end of file
diff --git a/source/RobotAPI/statecharts/SpeechObserverTestGroup/CMakeLists.txt b/source/RobotAPI/statecharts/SpeechObserverTestGroup/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..32052c4eb43e2cc8fa23c099623edd6cecbc6757
--- /dev/null
+++ b/source/RobotAPI/statecharts/SpeechObserverTestGroup/CMakeLists.txt
@@ -0,0 +1,45 @@
+armarx_component_set_name("SpeechObserverTestGroup")
+
+#find_package(MyLib QUIET)
+#armarx_build_if(MyLib_FOUND "MyLib not available")
+#
+# all include_directories must be guarded by if(Xyz_FOUND)
+# for multiple libraries write: if(X_FOUND AND Y_FOUND)....
+#if(MyLib_FOUND)
+#    include_directories(${MyLib_INCLUDE_DIRS})
+#endif()
+
+#find_package(Eigen3 QUIET)
+#find_package(Simox QUIET)
+
+#
+#armarx_build_if(Eigen3_FOUND "Eigen3 not available")
+#armarx_build_if(Simox_FOUND "Simox-VirtualRobot not available")
+
+#
+#if (Eigen3_FOUND AND Simox_FOUND)
+#    include_directories(
+#        ${Eigen3_INCLUDE_DIR}
+#        ${Simox_INCLUDE_DIRS}
+#    )
+#endif()
+
+set(COMPONENT_LIBS
+#   ArmarXCoreInterfaces RobotAPIInterfaces RobotAPICore ${Simox_LIBRARIES}
+    ArmarXCore ArmarXCoreStatechart ArmarXCoreObservers)
+
+# Sources
+
+set(SOURCES
+SpeechObserverTestGroupRemoteStateOfferer.cpp
+)
+
+set(HEADERS
+SpeechObserverTestGroupRemoteStateOfferer.h
+SpeechObserverTestGroup.scgxml
+)
+
+# adds all existing state headers and sources to CMake
+armarx_generate_statechart_cmake_lists()
+
+armarx_add_component("${SOURCES}" "${HEADERS}")
diff --git a/source/RobotAPI/statecharts/SpeechObserverTestGroup/SpeechObserverTestGroup.scgxml b/source/RobotAPI/statecharts/SpeechObserverTestGroup/SpeechObserverTestGroup.scgxml
new file mode 100644
index 0000000000000000000000000000000000000000..5c3cbe960bda92ae7bcd80a0ba9fa96f2631e19e
--- /dev/null
+++ b/source/RobotAPI/statecharts/SpeechObserverTestGroup/SpeechObserverTestGroup.scgxml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<StatechartGroup name="SpeechObserverTestGroup" package="RobotAPI" generateContext="true">
+	<Proxies>
+		<Proxy value="RobotAPIInterfaces.speechObserver"/>
+		<Proxy value="RobotAPIInterfaces.textToSpeech"/>
+	</Proxies>
+	<Configurations/>
+	<State filename="TestTextToSpeech.xml" visibility="public"/>
+</StatechartGroup>
+
diff --git a/source/RobotAPI/statecharts/SpeechObserverTestGroup/SpeechObserverTestGroupRemoteStateOfferer.cpp b/source/RobotAPI/statecharts/SpeechObserverTestGroup/SpeechObserverTestGroupRemoteStateOfferer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cfb969f49829d31e16e451f510c4e6c54a94820f
--- /dev/null
+++ b/source/RobotAPI/statecharts/SpeechObserverTestGroup/SpeechObserverTestGroupRemoteStateOfferer.cpp
@@ -0,0 +1,66 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::SpeechObserverTestGroup::SpeechObserverTestGroupRemoteStateOfferer
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2018
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include "SpeechObserverTestGroupRemoteStateOfferer.h"
+
+using namespace armarx;
+using namespace SpeechObserverTestGroup;
+
+// DO NOT EDIT NEXT LINE
+SpeechObserverTestGroupRemoteStateOfferer::SubClassRegistry SpeechObserverTestGroupRemoteStateOfferer::Registry(SpeechObserverTestGroupRemoteStateOfferer::GetName(), &SpeechObserverTestGroupRemoteStateOfferer::CreateInstance);
+
+
+
+SpeechObserverTestGroupRemoteStateOfferer::SpeechObserverTestGroupRemoteStateOfferer(StatechartGroupXmlReaderPtr reader) :
+    XMLRemoteStateOfferer < SpeechObserverTestGroupStatechartContext > (reader)
+{
+}
+
+void SpeechObserverTestGroupRemoteStateOfferer::onInitXMLRemoteStateOfferer()
+{
+
+}
+
+void SpeechObserverTestGroupRemoteStateOfferer::onConnectXMLRemoteStateOfferer()
+{
+
+}
+
+void SpeechObserverTestGroupRemoteStateOfferer::onExitXMLRemoteStateOfferer()
+{
+
+}
+
+// DO NOT EDIT NEXT FUNCTION
+std::string SpeechObserverTestGroupRemoteStateOfferer::GetName()
+{
+    return "SpeechObserverTestGroupRemoteStateOfferer";
+}
+
+// DO NOT EDIT NEXT FUNCTION
+XMLStateOffererFactoryBasePtr SpeechObserverTestGroupRemoteStateOfferer::CreateInstance(StatechartGroupXmlReaderPtr reader)
+{
+    return XMLStateOffererFactoryBasePtr(new SpeechObserverTestGroupRemoteStateOfferer(reader));
+}
+
+
+
diff --git a/source/RobotAPI/statecharts/SpeechObserverTestGroup/SpeechObserverTestGroupRemoteStateOfferer.h b/source/RobotAPI/statecharts/SpeechObserverTestGroup/SpeechObserverTestGroupRemoteStateOfferer.h
new file mode 100644
index 0000000000000000000000000000000000000000..d3891271cae6e07c43ea5dbce2b88badea86ffb1
--- /dev/null
+++ b/source/RobotAPI/statecharts/SpeechObserverTestGroup/SpeechObserverTestGroupRemoteStateOfferer.h
@@ -0,0 +1,52 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::SpeechObserverTestGroup
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2018
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#pragma once
+
+#include <ArmarXCore/statechart/xmlstates/XMLRemoteStateOfferer.h>
+#include "SpeechObserverTestGroupStatechartContext.generated.h"
+
+namespace armarx
+{
+    namespace SpeechObserverTestGroup
+    {
+        class SpeechObserverTestGroupRemoteStateOfferer :
+            virtual public XMLRemoteStateOfferer < SpeechObserverTestGroupStatechartContext > // Change this statechart context if you need another context (dont forget to change in the constructor as well)
+        {
+        public:
+            SpeechObserverTestGroupRemoteStateOfferer(StatechartGroupXmlReaderPtr reader);
+
+            // inherited from RemoteStateOfferer
+            void onInitXMLRemoteStateOfferer() override;
+            void onConnectXMLRemoteStateOfferer() override;
+            void onExitXMLRemoteStateOfferer() override;
+
+            // static functions for AbstractFactory Method
+            static std::string GetName();
+            static XMLStateOffererFactoryBasePtr CreateInstance(StatechartGroupXmlReaderPtr reader);
+            static SubClassRegistry Registry;
+
+
+        };
+    }
+}
+
diff --git a/source/RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.cpp b/source/RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..56dcb329b28f688d48241ef3675d6458ebf2f42b
--- /dev/null
+++ b/source/RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.cpp
@@ -0,0 +1,88 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::SpeechObserverTestGroup
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2018
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+
+#include "TestTextToSpeech.h"
+
+#include <ArmarXCore/core/time/TimeUtil.h>
+//#include <ArmarXCore/observers/variant/DatafieldRef.h>
+
+using namespace armarx;
+using namespace SpeechObserverTestGroup;
+
+// DO NOT EDIT NEXT LINE
+TestTextToSpeech::SubClassRegistry TestTextToSpeech::Registry(TestTextToSpeech::GetName(), &TestTextToSpeech::CreateInstance);
+
+
+
+void TestTextToSpeech::onEnter()
+{
+    // put your user code for the enter-point here
+    // execution time should be short (<100ms)
+}
+
+void TestTextToSpeech::waitForSpeechFinished()
+{
+    TimeUtil::SleepMS(20);
+    while(true)
+    {
+        if(getSpeechObserver()->getDatafieldByName("TextToSpeech", "State")->getString() == "FinishedSpeaking")
+        {
+            break;
+        }
+        TimeUtil::SleepMS(10);
+    }
+}
+
+void TestTextToSpeech::run()
+{
+
+    getTextToSpeech()->reportText("Hello!");
+    waitForSpeechFinished();
+    getTextToSpeech()->reportText("Goodbye!");
+
+
+// uncomment this if you need a continous run function. Make sure to use sleep or use blocking wait to reduce cpu load.
+    while (!isRunningTaskStopped()) // stop run function if returning true
+    {
+        // do your calculations
+    }
+}
+
+//void TestTextToSpeech::onBreak()
+//{
+//    // put your user code for the breaking point here
+//    // execution time should be short (<100ms)
+//}
+
+void TestTextToSpeech::onExit()
+{
+    // put your user code for the exit point here
+    // execution time should be short (<100ms)
+}
+
+
+// DO NOT EDIT NEXT FUNCTION
+XMLStateFactoryBasePtr TestTextToSpeech::CreateInstance(XMLStateConstructorParams stateData)
+{
+    return XMLStateFactoryBasePtr(new TestTextToSpeech(stateData));
+}
+
diff --git a/source/RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.h b/source/RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.h
new file mode 100644
index 0000000000000000000000000000000000000000..5911942a02c8176acc851a062286b97d583c63b6
--- /dev/null
+++ b/source/RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.h
@@ -0,0 +1,57 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::SpeechObserverTestGroup
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2018
+ * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
+ *             GNU General Public License
+ */
+#pragma once
+
+#include <RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.generated.h>
+
+namespace armarx
+{
+    namespace SpeechObserverTestGroup
+    {
+        class TestTextToSpeech :
+            public TestTextToSpeechGeneratedBase < TestTextToSpeech >
+        {
+        public:
+            TestTextToSpeech(const XMLStateConstructorParams& stateData):
+                XMLStateTemplate < TestTextToSpeech > (stateData), TestTextToSpeechGeneratedBase < TestTextToSpeech > (stateData)
+            {
+            }
+
+            // inherited from StateBase
+            void onEnter() override;
+            void run() override;
+            // void onBreak() override;
+            void onExit() override;
+
+            // static functions for AbstractFactory Method
+            static XMLStateFactoryBasePtr CreateInstance(XMLStateConstructorParams stateData);
+            static SubClassRegistry Registry;
+
+            // DO NOT INSERT ANY CLASS MEMBERS,
+            // use stateparameters instead,
+            // if classmember are neccessary nonetheless, reset them in onEnter
+            void waitForSpeechFinished();
+        };
+    }
+}
+
+
diff --git a/source/RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.xml b/source/RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a9465e716ed6e201cdd6ca3502b4d1dee9f828c6
--- /dev/null
+++ b/source/RobotAPI/statecharts/SpeechObserverTestGroup/TestTextToSpeech.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<State version="1.2" name="TestTextToSpeech" uuid="5378A4C1-55C9-4D56-A582-058796B709BC" width="800" height="600" type="Normal State">
+	<InputParameters/>
+	<OutputParameters/>
+	<LocalParameters/>
+	<Substates/>
+	<Events>
+		<Event name="Failure">
+			<Description>Event for statechart-internal failures or optionally user-code failures</Description>
+		</Event>
+	</Events>
+	<Transitions/>
+</State>
+