Index: code/branches/objecthierarchy/src/core/BaseObject.cc
===================================================================
--- code/branches/objecthierarchy/src/core/BaseObject.cc	(revision 2062)
+++ code/branches/objecthierarchy/src/core/BaseObject.cc	(revision 2063)
@@ -94,4 +94,39 @@
 
         XMLPortObjectTemplate(BaseObject, Template, "templates", addTemplate, getTemplate, xmlelement, mode, Template*);
+
+        Element* events = xmlelement.FirstChildElement("events", false);
+
+        if (events)
+        {
+            std::list<std::string> eventnames;
+
+            if (mode == XMLPort::LoadObject)
+            {
+                for (ticpp::Iterator<ticpp::Element> child = events->FirstChildElement(false); child != child.end(); child++)
+                    eventnames.push_back(child->Value());
+            }
+            else if (mode == XMLPort::SaveObject)
+            {
+                for (std::map<std::string, XMLPortObjectContainer*>::const_iterator it = this->getIdentifier()->getXMLPortEventMapBegin(); it != this->getIdentifier()->getXMLPortEventMapEnd(); ++it)
+                    eventnames.push_back(it->first);
+            }
+
+            for (std::list<std::string>::iterator it = eventnames.begin(); it != eventnames.end(); ++it)
+            {
+                std::string sectionname = (*it);
+                ExecutorMember<BaseObject>* loadexecutor = createExecutor(createFunctor(&BaseObject::addEvent), std::string( "BaseObject" ) + "::" + "addEvent");
+                ExecutorMember<BaseObject>* saveexecutor = createExecutor(createFunctor(&BaseObject::getEvent), std::string( "BaseObject" ) + "::" + "getEvent");
+                loadexecutor->setDefaultValue(1, sectionname);
+
+                XMLPortClassObjectContainer<BaseObject, BaseObject>* container = 0;
+                container = (XMLPortClassObjectContainer<BaseObject, BaseObject>*)(this->getIdentifier()->getXMLPortEventContainer(sectionname));
+                if (!container)
+                {
+                    container = new XMLPortClassObjectContainer<BaseObject, BaseObject>(sectionname, this->getIdentifier(), loadexecutor, saveexecutor, false, true);
+                    this->getIdentifier()->addXMLPortEventContainer(sectionname, container);
+                }
+                container->port(this, *events, mode);
+            }
+        }
     }
 
@@ -146,3 +181,64 @@
         return 0;
     }
+
+    void BaseObject::addEvent(BaseObject* event, const std::string& sectionname)
+    {
+        this->eventListeners_.insert(std::pair<std::string, BaseObject*>(sectionname, event));
+    }
+
+    BaseObject* BaseObject::getEvent(unsigned int index) const
+    {
+        unsigned int i = 0;
+        for (std::set<std::pair<std::string, BaseObject*> >::const_iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
+        {
+            if (i == index)
+                return (*it).second;
+            ++i;
+        }
+        return 0;
+    }
+
+    void BaseObject::addEventContainer(const std::string& sectionname, EventContainer* container)
+    {
+        std::map<std::string, EventContainer*>::const_iterator it = this->eventContainers_.find(sectionname);
+        if (it != this->eventContainers_.end())
+        {
+            COUT(2) << "Warning: Overwriting EventContainer in class " << this->getIdentifier()->getName() << "." << std::endl;
+            delete (it->second);
+        }
+
+        this->eventContainers_[sectionname] = container;
+    }
+
+    EventContainer* BaseObject::getEventContainer(const std::string& sectionname) const
+    {
+        std::map<std::string, EventContainer*>::const_iterator it = this->eventContainers_.begin();
+        if (it != this->eventContainers_.end())
+            return ((*it).second);
+        else
+            return 0;
+    }
+
+    void BaseObject::fireEvent()
+    {
+        this->fireEvent(true);
+        this->fireEvent(false);
+    }
+
+    void BaseObject::fireEvent(bool activate)
+    {
+        Event event(activate, this);
+
+        for (std::set<std::pair<std::string, BaseObject*> >::iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
+        {
+            event.sectionname_ = (*it).first;
+            (*it).second->processEvent(event);
+        }
+    }
+
+    void BaseObject::processEvent(Event& event)
+    {
+        SetEvent(BaseObject, "activity", setActive, event);
+        SetEvent(BaseObject, "visibility", setVisible, event);
+    }
 }
Index: code/branches/objecthierarchy/src/core/BaseObject.h
===================================================================
--- code/branches/objecthierarchy/src/core/BaseObject.h	(revision 2062)
+++ code/branches/objecthierarchy/src/core/BaseObject.h	(revision 2063)
@@ -42,4 +42,5 @@
 #include "OrxonoxClass.h"
 #include "XMLIncludes.h"
+#include "Event.h"
 
 namespace orxonox
@@ -110,4 +111,15 @@
             virtual inline void changedGametype() {}
 
+            void fireEvent();
+            void fireEvent(bool activate);
+
+            virtual void processEvent(Event& event);
+
+            void addEvent(BaseObject* event, const std::string& sectionname);
+            BaseObject* getEvent(unsigned int index) const;
+
+            void addEventContainer(const std::string& sectionname, EventContainer* container);
+            EventContainer* getEventContainer(const std::string& sectionname) const;
+
             /** @brief Sets the indentation of the debug output in the Loader. @param indentation The indentation */
             inline void setLoaderIndentation(const std::string& indentation) { this->loaderIndentation_ = indentation; }
@@ -124,13 +136,15 @@
             Template* getTemplate(unsigned int index) const;
 
-            bool                bInitialized_;         //!< True if the object was initialized (passed the object registration)
-            const XMLFile*      file_;                 //!< The XMLFile that loaded this object
-            std::string         loaderIndentation_;    //!< Indentation of the debug output in the Loader
-            Namespace*          namespace_;
-            BaseObject*         creator_;
-            Scene*              scene_;
-            Gametype*           gametype_;
-            Gametype*           oldGametype_;
-            std::set<Template*> templates_;
+            bool                  bInitialized_;         //!< True if the object was initialized (passed the object registration)
+            const XMLFile*        file_;                 //!< The XMLFile that loaded this object
+            std::string           loaderIndentation_;    //!< Indentation of the debug output in the Loader
+            Namespace*            namespace_;
+            BaseObject*           creator_;
+            Scene*                scene_;
+            Gametype*             gametype_;
+            Gametype*             oldGametype_;
+            std::set<Template*>   templates_;
+            std::set<std::pair<std::string, BaseObject*> > eventListeners_;
+            std::map<std::string, EventContainer*> eventContainers_;
     };
 
@@ -138,4 +152,5 @@
     SUPER_FUNCTION(2, BaseObject, changedActivity, false);
     SUPER_FUNCTION(3, BaseObject, changedVisibility, false);
+    SUPER_FUNCTION(4, BaseObject, processEvent, false);
 }
 
Index: code/branches/objecthierarchy/src/core/CMakeLists.txt
===================================================================
--- code/branches/objecthierarchy/src/core/CMakeLists.txt	(revision 2062)
+++ code/branches/objecthierarchy/src/core/CMakeLists.txt	(revision 2063)
@@ -4,4 +4,5 @@
   ConfigValueContainer.cc
   Core.cc
+  Event.cc
   GameState.cc
   Language.cc
Index: code/branches/objecthierarchy/src/core/CorePrereqs.h
===================================================================
--- code/branches/objecthierarchy/src/core/CorePrereqs.h	(revision 2062)
+++ code/branches/objecthierarchy/src/core/CorePrereqs.h	(revision 2063)
@@ -113,4 +113,6 @@
   class ConsoleCommand;
   class Core;
+  struct Event;
+  class EventContainer;
   class Executor;
   template <class T>
Index: code/branches/objecthierarchy/src/core/Event.cc
===================================================================
--- code/branches/objecthierarchy/src/core/Event.cc	(revision 2063)
+++ code/branches/objecthierarchy/src/core/Event.cc	(revision 2063)
@@ -0,0 +1,57 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that 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, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "Event.h"
+#include "BaseObject.h"
+
+namespace orxonox
+{
+    void EventContainer::process(BaseObject* object, const Event& event)
+    {
+        if (this->eventname_ == event.sectionname_)
+        {
+            if (event.originator_->isA(this->subclass_))
+            {
+                if (event.activate_)
+                    ++this->activeEvents_;
+                else
+                    --this->activeEvents_;
+
+                if (this->eventfunction_->getParamCount() == 0 && event.activate_)
+                    (*this->eventfunction_)(object);
+                else if ((this->activeEvents_ == 1 && event.activate_) || (this->activeEvents_ == 0 && !event.activate_))
+                {
+                    if (this->eventfunction_->getParamCount() == 1)
+                        (*this->eventfunction_)(object, this->activeEvents_);
+                    else if (this->eventfunction_->getParamCount() >= 2 && event.castedOriginator_)
+                        (*this->eventfunction_)(object, this->activeEvents_, event.castedOriginator_);
+                }
+            }
+        }
+    }
+}
Index: code/branches/objecthierarchy/src/core/Event.h
===================================================================
--- code/branches/objecthierarchy/src/core/Event.h	(revision 2063)
+++ code/branches/objecthierarchy/src/core/Event.h	(revision 2063)
@@ -0,0 +1,88 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that 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, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _Event_H__
+#define _Event_H__
+
+#include "CorePrereqs.h"
+#include "Executor.h"
+
+#define SetEvent(classname, eventname, functionname, event) \
+    SetEventGeneric(eventcontainer##classname##functionname, classname, eventname, orxonox::createExecutor(orxonox::createFunctor(&classname::functionname), std::string( #classname ) + "::" + #functionname), event, BaseObject)
+
+#define SetEventTemplate(classname, eventname, functionname, event, ...) \
+    SetEventGeneric(eventcontainer##classname##functionname, classname, eventname, orxonox::createExecutor(orxonox::createFunctor<classname, __VA_ARGS__ >(&classname::functionname), std::string( #classname ) + "::" + #functionname), event, BaseObject)
+
+#define SetSubclassEvent(classname, eventname, functionname, event, subclassname) \
+    SetEventGeneric(eventcontainer##classname##functionname, classname, eventname, orxonox::createExecutor(orxonox::createFunctor(&classname::functionname), std::string( #classname ) + "::" + #functionname), event, subclassname)
+
+#define SetSubclassEventTemplate(classname, eventname, functionname, event, subclassname, ...) \
+    SetEventGeneric(eventcontainer##classname##functionname, classname, eventname, orxonox::createExecutor(orxonox::createFunctor<classname, __VA_ARGS__ >(&classname::functionname), std::string( #classname ) + "::" + #functionname), event, subclassname)
+
+#define SetEventGeneric(containername, classname, eventname, executor, event, subclassname) \
+    orxonox::EventContainer* containername = this->getEventContainer(eventname); \
+    if (!containername) \
+    { \
+        containername = new orxonox::EventContainer(std::string(eventname), executor, orxonox::ClassIdentifier<subclassname>::getIdentifier()); \
+        this->addEventContainer(eventname, containername); \
+    } \
+    event.castedOriginator_ = dynamic_cast<subclassname*>(event.originator_); \
+    containername->process(this, event)
+
+
+namespace orxonox
+{
+    struct _CoreExport Event
+    {
+            Event(bool activate, BaseObject* originator) : activate_(activate), originator_(originator), castedOriginator_(0) {}
+
+            bool        activate_;
+            BaseObject* originator_;
+            void*       castedOriginator_;
+            std::string sectionname_;
+    };
+
+    class _CoreExport EventContainer
+    {
+        public:
+            EventContainer(const std::string& eventname, Executor* eventfunction, Identifier* subclass) : eventname_(eventname), eventfunction_(eventfunction), subclass_(subclass), activeEvents_(0) {}
+            ~EventContainer()
+                { delete this->eventfunction_; }
+
+            void process(BaseObject* object, const Event& event);
+
+        private:
+            std::string eventname_;
+            Executor* eventfunction_;
+            Identifier* subclass_;
+
+            int activeEvents_;
+    };
+}
+
+#endif /* _Event_H__ */
Index: code/branches/objecthierarchy/src/core/Identifier.cc
===================================================================
--- code/branches/objecthierarchy/src/core/Identifier.cc	(revision 2062)
+++ code/branches/objecthierarchy/src/core/Identifier.cc	(revision 2063)
@@ -421,6 +421,6 @@
     XMLPortParamContainer* Identifier::getXMLPortParamContainer(const std::string& paramname)
     {
-        std::map<std::string, XMLPortParamContainer*>::const_iterator it = xmlportParamContainers_.find(paramname);
-        if (it != xmlportParamContainers_.end())
+        std::map<std::string, XMLPortParamContainer*>::const_iterator it = this->xmlportParamContainers_.find(paramname);
+        if (it != this->xmlportParamContainers_.end())
             return ((*it).second);
         else
@@ -435,4 +435,11 @@
     void Identifier::addXMLPortParamContainer(const std::string& paramname, XMLPortParamContainer* container)
     {
+        std::map<std::string, XMLPortParamContainer*>::const_iterator it = this->xmlportParamContainers_.find(paramname);
+        if (it != this->xmlportParamContainers_.end())
+        {
+            COUT(2) << "Warning: Overwriting XMLPortParamContainer in class " << this->getName() << "." << std::endl;
+            delete (it->second);
+        }
+
         this->xmlportParamContainers_[paramname] = container;
     }
@@ -445,6 +452,6 @@
     XMLPortObjectContainer* Identifier::getXMLPortObjectContainer(const std::string& sectionname)
     {
-        std::map<std::string, XMLPortObjectContainer*>::const_iterator it = xmlportObjectContainers_.find(sectionname);
-        if (it != xmlportObjectContainers_.end())
+        std::map<std::string, XMLPortObjectContainer*>::const_iterator it = this->xmlportObjectContainers_.find(sectionname);
+        if (it != this->xmlportObjectContainers_.end())
             return ((*it).second);
         else
@@ -459,5 +466,43 @@
     void Identifier::addXMLPortObjectContainer(const std::string& sectionname, XMLPortObjectContainer* container)
     {
+        std::map<std::string, XMLPortObjectContainer*>::const_iterator it = this->xmlportObjectContainers_.find(sectionname);
+        if (it != this->xmlportObjectContainers_.end())
+        {
+            COUT(2) << "Warning: Overwriting XMLPortObjectContainer in class " << this->getName() << "." << std::endl;
+            delete (it->second);
+        }
+
         this->xmlportObjectContainers_[sectionname] = container;
+    }
+
+    /**
+        @brief Returns a XMLPortEventContainer that attaches an event to this class.
+        @param sectionname The name of the section that contains the event
+        @return The container
+    */
+    XMLPortObjectContainer* Identifier::getXMLPortEventContainer(const std::string& eventname)
+    {
+        std::map<std::string, XMLPortObjectContainer*>::const_iterator it = this->xmlportEventContainers_.find(eventname);
+        if (it != this->xmlportEventContainers_.end())
+            return ((*it).second);
+        else
+            return 0;
+    }
+
+    /**
+        @brief Adds a new XMLPortEventContainer that attaches an event to this class.
+        @param sectionname The name of the section that contains the event
+        @param container The container
+    */
+    void Identifier::addXMLPortEventContainer(const std::string& eventname, XMLPortObjectContainer* container)
+    {
+        std::map<std::string, XMLPortObjectContainer*>::const_iterator it = this->xmlportEventContainers_.find(eventname);
+        if (it != this->xmlportEventContainers_.end())
+        {
+            COUT(2) << "Warning: Overwriting XMLPortEventContainer in class " << this->getName() << "." << std::endl;
+            delete (it->second);
+        }
+
+        this->xmlportEventContainers_[eventname] = container;
     }
 
Index: code/branches/objecthierarchy/src/core/Identifier.h
===================================================================
--- code/branches/objecthierarchy/src/core/Identifier.h	(revision 2062)
+++ code/branches/objecthierarchy/src/core/Identifier.h	(revision 2063)
@@ -210,4 +210,11 @@
             inline std::map<std::string, XMLPortObjectContainer*>::const_iterator getXMLPortObjectMapEnd() const { return this->xmlportObjectContainers_.end(); }
 
+            /** @brief Returns the map that stores all XMLPort events. @return The const_iterator */
+            inline const std::map<std::string, XMLPortObjectContainer*>& getXMLPortEventMap() const { return this->xmlportEventContainers_; }
+            /** @brief Returns a const_iterator to the beginning of the map that stores all XMLPort events. @return The const_iterator */
+            inline std::map<std::string, XMLPortObjectContainer*>::const_iterator getXMLPortEventMapBegin() const { return this->xmlportEventContainers_.begin(); }
+            /** @brief Returns a const_iterator to the end of the map that stores all XMLPort events. @return The const_iterator */
+            inline std::map<std::string, XMLPortObjectContainer*>::const_iterator getXMLPortEventMapEnd() const { return this->xmlportEventContainers_.end(); }
+
             /** @brief Returns true if this class has at least one config value. @return True if this class has at least one config value */
             inline bool hasConfigValues() const { return this->bHasConfigValues_; }
@@ -233,4 +240,7 @@
             void addXMLPortObjectContainer(const std::string& sectionname, XMLPortObjectContainer* container);
             XMLPortObjectContainer* getXMLPortObjectContainer(const std::string& sectionname);
+
+            void addXMLPortEventContainer(const std::string& eventname, XMLPortObjectContainer* container);
+            XMLPortObjectContainer* getXMLPortEventContainer(const std::string& eventname);
 
             ConsoleCommand& addConsoleCommand(ConsoleCommand* command, bool bCreateShortcut);
@@ -307,4 +317,5 @@
             std::map<std::string, XMLPortParamContainer*> xmlportParamContainers_;     //!< All loadable parameters
             std::map<std::string, XMLPortObjectContainer*> xmlportObjectContainers_;   //!< All attachable objects
+            std::map<std::string, XMLPortObjectContainer*> xmlportEventContainers_;    //!< All events
     };
 
Index: code/branches/objecthierarchy/src/core/Super.h
===================================================================
--- code/branches/objecthierarchy/src/core/Super.h	(revision 2062)
+++ code/branches/objecthierarchy/src/core/Super.h	(revision 2063)
@@ -73,4 +73,5 @@
 #include "util/Debug.h"
 #include "XMLIncludes.h"
+#include "Event.h"
 
 ///////////////////////
@@ -229,4 +230,7 @@
     #define SUPER_changedVisibility(classname, functionname, ...) \
         SUPER_NOARGS(classname, functionname)
+
+    #define SUPER_processEvent(classname, functionname, ...) \
+        SUPER_ARGS(classname, functionname, __VA_ARGS__)
     // (1/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
 
@@ -433,4 +437,8 @@
             ()
         SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
+
+        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(4, processEvent, true, Event& event)
+            (event)
+        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
         // (2/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
 
@@ -479,4 +487,5 @@
     SUPER_INTRUSIVE_DECLARATION(changedActivity);
     SUPER_INTRUSIVE_DECLARATION(changedVisibility);
+    SUPER_INTRUSIVE_DECLARATION(processEvent);
     // (3/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
 
Index: code/branches/objecthierarchy/src/network/GamestateClient.cc
===================================================================
--- code/branches/objecthierarchy/src/network/GamestateClient.cc	(revision 2062)
+++ code/branches/objecthierarchy/src/network/GamestateClient.cc	(revision 2063)
@@ -139,5 +139,5 @@
     }
     else{
-      COUT(3) << "acked a gamestate: " << gamestateID << std::endl;
+      COUT(5) << "acked a gamestate: " << gamestateID << std::endl;
       return true;
     }
@@ -160,5 +160,5 @@
       delete gs;
       gs=undiffed;
-      COUT(3) << "successfully undiffed gamestate id: " << undiffed->getID() << std::endl;
+      COUT(5) << "successfully undiffed gamestate id: " << undiffed->getID() << std::endl;
     }
     if(gs->spreadData())
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/BlinkingBillboard.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/BlinkingBillboard.cc	(revision 2062)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/BlinkingBillboard.cc	(revision 2063)
@@ -43,5 +43,5 @@
         this->amplitude_ = 1.0f;
         this->frequency_ = 1.0f;
-        this->phase_ = 0.0f;
+        this->phase_ = 0;
         this->time_ = 0;
 
@@ -59,5 +59,5 @@
         XMLPortParam(BlinkingBillboard, "amplitude", setAmplitude, getAmplitude, xmlelement, mode).defaultValues(1.0f);
         XMLPortParam(BlinkingBillboard, "frequency", setFrequency, getFrequency, xmlelement, mode).defaultValues(1.0f);
-        XMLPortParam(BlinkingBillboard, "phase",     setPhase,     getPhase,     xmlelement, mode).defaultValues(0.0f);
+        XMLPortParam(BlinkingBillboard, "phase",     setPhase,     getPhase,     xmlelement, mode).defaultValues(Degree(0));
     }
 
@@ -72,5 +72,5 @@
     {
         this->time_ += dt;
-        this->setScale(this->amplitude_ * sin((6.2831853 + this->phase_) * this->frequency_ * this->time_));
+        this->setScale(this->amplitude_ * sin((6.2831853 * this->time_ + this->phase_.valueRadians()) * this->frequency_));
     }
 }
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/BlinkingBillboard.h
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/BlinkingBillboard.h	(revision 2062)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/BlinkingBillboard.h	(revision 2063)
@@ -57,7 +57,7 @@
                 { return this->frequency_; }
 
-            inline void setPhase(float phase)
+            inline void setPhase(const Degree& phase)
                 { this->phase_ = phase; }
-            inline float getPhase() const
+            inline const Degree& getPhase() const
                 { return this->phase_; }
 
@@ -65,5 +65,5 @@
             float amplitude_;
             float frequency_;
-            float phase_;
+            Degree phase_;
             long double time_;
     };
