--- a
+++ b/src/DAF/DA/DA.cc
@@ -0,0 +1,192 @@
+//
+// 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 "DA.h"
+
+//Constants
+const char* MOD_DIRECTORY       = "directory";
+const char* MOD_NAMINFO         = "namingInformation";
+const char* MOD_NEIGHBORTAB     = "neighborTable";
+const char* MOD_SEARCHTAB       = "searchTable";
+
+Define_Module(DA);
+
+void DA::initPointers() {
+    //Retrieve pointers to submodules
+    Dir = ModuleAccess<Directory>(MOD_DIRECTORY).get();
+    NamInfo = ModuleAccess<NamingInformation>(MOD_NAMINFO).get();
+    NeighborTab = ModuleAccess<NeighborTable>(MOD_NEIGHBORTAB).get();
+    SearchTab = ModuleAccess<SearchTable>(MOD_SEARCHTAB).get();
+}
+
+void DA::initialize()
+{
+    //Retrieve pointers to submodules
+    initPointers();
+}
+
+/** Check whether any IPC within given DIF name is available on computation system with source IPC
+  *
+  * @param difName Given DIF name
+  * @param ipc Source IPC Process
+  * @return True if yes, otherwise false
+  */
+bool DA::isDifLocalToIpc(const std::string difName, cModule* ipc) {
+    cModule* top = ipc->getParentModule();
+    for (cModule::SubmoduleIterator j(top); !j.end(); j++) {
+        cModule *submodp = j();
+        if (isIpcXLocalToIpcY(submodp, ipc)
+                && !opp_strcmp(submodp->par(PAR_DIFNAME), difName.c_str())                    //...has a given DIF name
+           )
+            return true;
+    }
+    return false;
+}
+
+/**
+ * Check whether given IPC X is on the same computation system as IPC Y
+ * @param ipcX target
+ * @param ipcY source
+ * @return True if yes, otherwise false.
+ */
+bool DA::isIpcXLocalToIpcY(cModule* ipcX, cModule* ipcY) {
+    //Both of them have same parent module
+    //...AND both of them are IPC (has IPCAddress parameter)
+    return ipcX->getParentModule() == ipcY->getParentModule()
+            && ipcX->hasPar(PAR_IPCADDR) && ipcX->hasPar(PAR_DIFNAME)
+            && ipcY->hasPar(PAR_IPCADDR) && ipcY->hasPar(PAR_DIFNAME);
+}
+
+bool DA::isAppLocal(const APN& apn) {
+    cModule* top = this->getParentModule()->getParentModule();
+    for (cModule::SubmoduleIterator j(top); !j.end(); j++) {
+        cModule* submodp = j();
+        if (submodp->hasPar(PAR_APNAME)
+            && !opp_strcmp(submodp->par(PAR_APNAME), apn.getName().c_str())
+           )
+            return true;
+    }
+    return false;
+}
+
+bool DA::isDifLocal(const DAP& difName) {
+    cModule* top = this->getParentModule()->getParentModule();
+    for (cModule::SubmoduleIterator j(top); !j.end(); j++) {
+        cModule* submodp = j();
+        if (submodp->hasPar(PAR_DIFNAME)
+            && !opp_strcmp(submodp->par(PAR_DIFNAME), difName.getName().c_str())
+           )
+            return true;
+    }
+    return false;
+}
+
+bool DA::isIpcLocal(cModule* ipc) {
+    cModule* top = this->getParentModule()->getParentModule();
+    for (cModule::SubmoduleIterator j(top); !j.end(); j++) {
+        cModule* submodp = j();
+        if (submodp == ipc)
+            return true;
+    }
+    return false;
+}
+
+cModule* DA::getDifMember(const DAP& difName) {
+    cModule* top = this->getParentModule()->getParentModule();
+    for (cModule::SubmoduleIterator j(top); !j.end(); j++) {
+        cModule* submodp = j();
+        if (submodp->hasPar(PAR_DIFNAME)
+            && !opp_strcmp(submodp->par(PAR_DIFNAME), difName.getName().c_str())
+           )
+            return submodp;
+    }
+    return NULL;
+}
+
+cModule* DA::findIpc(const Address& addr) {
+    cModule* top = this->getParentModule()->getParentModule();
+    for (cModule::SubmoduleIterator j(top); !j.end(); j++) {
+        cModule *submodp = j();
+        if (submodp->hasPar(PAR_IPCADDR) && submodp->hasPar(PAR_DIFNAME)) {
+            Address adr = Address(submodp->par(PAR_IPCADDR), submodp->par(PAR_DIFNAME));
+            if (adr == addr)
+                return submodp;
+        }
+    }
+    return NULL;
+}
+
+FABase* DA::findFaInsideIpc(cModule* ipc) {
+    return dynamic_cast<FABase*>(ipc->getSubmodule(MOD_FLOWALLOC)->getSubmodule(MOD_FA));
+}
+
+DirectoryEntry* DA::resolveApn(const APN& apn) {
+    Enter_Method("resolveApn()");
+    APNList apns = NamInfo->findAllApnNames(apn);
+    //Return first Directory mapping from APN and all its synonyms
+    for (ApnCItem it = apns.begin(); it != apns.end(); ++it) {
+        DirectoryEntry* dre = Dir->findDirEntryByApn(*it);
+        if (dre)
+            return dre;
+    }
+    return NULL;
+}
+
+void DA::handleMessage(cMessage *msg)
+{
+
+}
+
+/*
+cModule* DA::resolveApnToIpc(const APN& apn) {
+    Enter_Method("resolveApnToDif()");
+    DirectoryEntry* dre = Dir->findDirEntryByApn(apn);
+    return  dre ? dre->getIpc() : NULL;
+}
+
+FABase* DA::resolveApnToFa(const APN& apn) {
+    Enter_Method("resolveApnToDifFa()");
+    DirectoryEntry* dre = Dir->findDirEntryByApn(apn);
+    return dre ? dre->getFlowAlloc() : NULL;
+}
+
+std::string DA::resolveApnToIpcPath(const APN& apn) {
+    Enter_Method("resolveApnToDifName()");
+    DirectoryEntry* dre = Dir->findDirEntryByApn(apn);
+    return  dre ? dre->getIpcPath() : NULL;
+}
+
+std::string DA::resolveApniToIpcPath(const APNamingInfo& apni) {
+    Enter_Method("resolveApniToDifName()");
+    //TODO: Vesely - Complete APNI search
+    return resolveApnToIpcPath(apni.getApn());
+}
+
+cModule* DA::resolveApniToIpc(const APNamingInfo& apni) {
+    Enter_Method("resolveApniToDif()");
+    //TODO: Vesely - Complete APNI search
+    return resolveApnToIpc(apni.getApn());
+}
+
+FABase* DA::resolveApniToFa(const APNamingInfo& apni) {
+    Enter_Method("resolveApniToDifFa()");
+    //TODO: Vesely - Complete APNI search
+    return resolveApnToFa(apni.getApn());
+}
+
+DirectoryEntry* DA::resolveApni(const APNamingInfo& apni) {
+    return Dir->findEntryByApni(apni);
+}
+*/