--- a
+++ b/src/policies/DIF/RMT/PDUForwarding/DomainTable/DomainTable.cc
@@ -0,0 +1,99 @@
+#include <DomainTable/DomainTable.h>
+
+
+
+#include <Utils.h>
+#include <sstream>
+
+namespace DomainTable {
+
+Register_Class(DomainTable);
+
+using namespace std;
+
+
+// Lookup function, return a list of RMTPorts to forward a PDU/Address+qos.
+vector<RMTPort * > DomainTable::lookup(const PDU * pdu){
+    return lookup(pdu->getDstAddr(), pdu->getConnId().getQoSId());
+}
+
+vector<RMTPort * > DomainTable::lookup(const Address &dst, const unsigned short &qos){
+    vector<RMTPort* > ret;
+
+    pAddr pa = parseAddr(dst.getIpcAddress().getName());
+    if(table[pa.domain].entries.find(pa.addr) != table[pa.domain].entries.end()){
+        ret.push_back(table[pa.domain].entries[pa.addr]);
+        return ret;
+    }
+
+    return ret;
+}
+
+// Returns a representation of the Forwarding Knowledge
+string DomainTable::toString(){
+    std::ostringstream os;
+
+    os << this->getName()<<endl;
+    for(FWDTableIt tIt = table.begin(); tIt != table.end(); tIt++){
+        os << "\t Domain : \"" <<tIt->first<<"\""<<endl;
+        for(s2PortIt qIt = tIt->second.entries.begin();
+                qIt != tIt->second.entries.end();
+                qIt++){
+            os << "\t\t->(" << qIt->first << " , "<<qIt->second->getFullPath()<<")" <<endl;
+        }
+    }
+
+    return os.str();
+}
+
+//Insert/Remove a domain
+void DomainTable::addDomain(const string &domain){
+    domains.push_back(domain);
+    if(domain == ""){
+        table[""].len = 0;
+    } else {
+        table[domain].len = split(domain, '.').size();
+    }
+}
+void DomainTable::removeDomain(const string &domain){
+    for(sListIt it = domains.begin(); it!= domains.end(); it++){
+        if(*it == domain){
+            domains.erase(it);
+            break;
+        }
+    }
+    domains.push_back(domain);
+    table.erase(domain);
+}
+
+//Insert/Remove an entry
+void DomainTable::insert(const string &domain, const string &addr, RMTPort * port){
+    table[domain].entries[addr] = port;
+}
+void DomainTable::remove(const string &domain, const string &addr){
+    table[domain].entries.erase(addr);
+}
+
+pAddr DomainTable::parseAddr(const string &addr){
+    for(sListIt it = domains.begin(); it!= domains.end(); it++){
+        if(isPrefix(*it, addr)){
+            unsigned short len = table[*it].len;
+            vector<string> sep = split(addr, '.');
+            if(sep.size() <= len) {
+                return pAddr(*it, "");
+            } else {
+                return pAddr(*it, sep[len]);
+            }
+        }
+    }
+    return pAddr("", addr);
+}
+
+// Called after initialize
+void DomainTable::onPolicyInit(){}
+
+void DomainTable::finish(){
+    EV << toString() <<endl;
+}
+
+}