--- a
+++ b/src/DAF/AE/AEStream.cc
@@ -0,0 +1,149 @@
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public License
+// along with this program.  If not, see http://www.gnu.org/licenses/.
+// 
+
+#include "AEStream.h"
+
+Define_Module(AEStream);
+
+AEStream::AEStream(){
+  //Consts
+      TIM_START           = "StartCommunication";
+      TIM_STOP            = "StopCommunication";
+      MSG_STDATA          = "DATA-";
+      PAR_START           = "startAt";
+      PAR_STOP            = "stopAt";
+      PAR_BEGIN           = "beginStreamAt";
+      PAR_END             = "endStreamAt";
+      PAR_INTERVAL        = "interval";
+      PAR_SIZE            = "size";
+      PAR_DSTAPNAME       = "dstApName";
+      PAR_DSTAPINSTANCE   = "dstApInstance";
+      PAR_DSTAENAME       = "dstAeName";
+      PAR_DSTAEINSTANCE   = "dstAeInstance";
+}
+
+
+void AEStream::initialize()
+{
+    //Init pointers
+    initPointers();
+    //Source info
+    initNamingInfo();
+    //Setup signals
+    initSignalsAndListeners();
+    //Init QoSRequirements
+    initQoSRequiremets();
+
+    //Destination for flow
+    dstApName     = this->par(PAR_DSTAPNAME).stringValue();
+    dstApInstance = this->par(PAR_DSTAPINSTANCE).stringValue();
+    dstAeName     = this->par(PAR_DSTAENAME).stringValue();
+    dstAeInstance = this->par(PAR_DSTAEINSTANCE).stringValue();
+
+    //Timers
+    startAt         = simTime() + par(PAR_START);
+    stopAt          = simTime() + par(PAR_STOP);
+    beginStreamAt   = simTime() + par(PAR_BEGIN);
+    endStreamAt     = simTime() + par(PAR_END);
+    interval        = par(PAR_INTERVAL).doubleValue();
+    size            = par(PAR_SIZE);
+
+    //Schedule AllocateRequest
+    if (startAt > 0)
+        prepareAllocateRequest();
+    //Schedule Data transfer
+    if (beginStreamAt > 0 && beginStreamAt < endStreamAt)
+        prepareStreamData();
+    //Schedule DeallocateRequest
+    if (stopAt > 0)
+        prepareDeallocateRequest();
+
+
+}
+
+void AEStream::handleMessage(cMessage *msg)
+{
+    if ( msg->isSelfMessage() )
+        this->handleSelfMessage(msg);
+}
+
+void AEStream::handleSelfMessage(cMessage* msg) {
+    if ( !strcmp(msg->getName(), TIM_START) ) {
+        //Flow
+        APNamingInfo src = this->getApni();
+        APNamingInfo dst = APNamingInfo( APN(this->dstApName), this->dstApInstance,
+                                         this->dstAeName, this->dstAeInstance);
+
+        Flow fl = Flow(src, dst);
+        fl.setQosParameters(this->getQoSRequirements());
+
+        //Insert it to the Flows ADT
+        insertFlow(fl);
+
+        sendAllocationRequest(&flows.back());
+    }
+    else if ( !strcmp(msg->getName(), TIM_STOP) ) {
+        sendDeallocationRequest(&flows.back());
+    }
+    else if ( strstr(msg->getName(), MSG_STDATA) ) {
+        //Create data stream chunk messsage
+        CDAP_M_Read* data = new CDAP_M_Read(msg->getName());
+        object_t obj;
+        obj.objectName = msg->getName();
+        obj.objectClass = "string";
+        obj.objectInstance = -1;
+        obj.objectVal = (cObject*)("0123456789abcdef");
+        data->setObject(obj);
+        data->setByteLength(size);
+
+        //Send message
+        sendData(&flows.back(), data);
+    }
+    else
+        EV << this->getFullPath() << " received unknown self-message " << msg->getName();
+    delete(msg);
+}
+
+void AEStream::prepareAllocateRequest() {
+    //Schedule AllocateRequest
+    cMessage* m1 = new cMessage(TIM_START);
+    scheduleAt(startAt, m1);
+}
+
+void AEStream::prepareStreamData() {
+    //Schedule stream data chunk
+    int j = 0;
+    for (simtime_t i = beginStreamAt; i < endStreamAt; i += interval) {
+        std::ostringstream ss;
+        ss << MSG_STDATA << j++;
+        cMessage* m2 = new cMessage(ss.str().c_str());
+        scheduleAt(i, m2);
+    }
+}
+
+void AEStream::prepareDeallocateRequest() {
+    //Schedule DeallocateRequest
+    cMessage* m3 = new cMessage(TIM_STOP);
+    scheduleAt(stopAt, m3);
+}
+
+void AEStream::processMRead(CDAPMessage* msg) {
+    CDAP_M_Read* msg1 = check_and_cast<CDAP_M_Read*>(msg);
+
+    EV << "Received data M_DATA";
+    object_t object = msg1->getObject();
+    EV << " with object '" << object.objectClass << "' and value '" << object.objectVal << "'" << endl;
+
+}