Merge "Error handling added for basyx::object::object_map_t"
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h
index cbf47e6..b68fac7 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h
@@ -26,6 +26,8 @@
 
 inline ILangStringSet::~ILangStringSet() = default;
 
+bool operator==(const api::ILangStringSet & left, const api::ILangStringSet & right);
+
 }
 }
 }
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h
index 61bf48d..c84c7c3 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h
@@ -10,6 +10,11 @@
 namespace submodel {	
 namespace api {
 
+
+/**
+ * Mandatory members:
+ *    DataSpecificationContent
+ */
 class IDataSpecification : public virtual IIdentifiable
 {
 public:
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h
index 118d074..a7fbed1 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h
@@ -26,9 +26,14 @@
 	virtual std::string * const getUnit() = 0;
 	virtual IReference * const getUnitId() = 0;
 	virtual std::string * const getSourceOfDefinition() = 0;
+	virtual std::string * const getSymbol() = 0;
 	virtual DataTypeIEC61360 getDataType() const = 0;
 	virtual std::string * const getValueFormat() = 0;
-	virtual IReference * const getValueId() = 0;
+/* TODO
+	virtual MISSINGTYPE const getValueList() = 0;
+  virtual MISSINGTYPE const getValueDataType() = 0;
+	*/
+  virtual IReference * const getValueId() = 0;
 	virtual LevelType getLevelType() const = 0;
 
 	virtual void setUnit(const std::string & unit) = 0;
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/qualifier/IReferable.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/qualifier/IReferable.h
index a2de91a..41b9f3b 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/qualifier/IReferable.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/qualifier/IReferable.h
@@ -11,6 +11,11 @@
 namespace submodel {
 namespace api {
 
+/**
+ * Mandatory members:
+ *    idShort
+ *
+ */
 class IReferable
 {
 public:
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/common/LangStringSet.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/common/LangStringSet.h
index 7f81841..ce3b07b 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/common/LangStringSet.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/common/LangStringSet.h
@@ -30,12 +30,15 @@
 	using vab::ElementMap::ElementMap;
 
 	LangStringSet();
+  LangStringSet(const ILangStringSet & other);
 
 	virtual langCodeSet_t getLanguageCodes() const override;
 
 	virtual const std::string & get(const std::string & languageCode) const override;
 	virtual void add(const std::string & languageCode, const std::string & langString) override;
 	virtual bool empty() const noexcept override;
+
+  friend bool api::operator==(const api::ILangStringSet & left, const api::ILangStringSet & right);
 };
 
 }
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecification.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecification.h
new file mode 100644
index 0000000..60d32ca
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecification.h
@@ -0,0 +1,34 @@
+#ifndef BASYX_MAP_V2_SDK_DATASPECIFICATION
+#define BASYX_MAP_V2_SDK_DATASPECIFICATION
+
+#include <BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h>
+#include <BaSyx/submodel/map_v2/qualifier/Identifiable.h>
+#include <BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h>
+#include <BaSyx/submodel/simple/dataspecification/DataSpecification.h>
+
+#include <BaSyx/vab/ElementMap.h>
+
+namespace basyx {
+namespace submodel {
+namespace map {
+
+class DataSpecification :
+    public api::IDataSpecification,
+    public virtual Identifiable,
+    public virtual vab::ElementMap
+{
+private:
+  DataSpecificationContent * content;
+
+public:
+  DataSpecification(const std::string & idShort, const simple::Identifier & identifier, std::unique_ptr<api::IDataSpecificationContent> content);
+
+  api::IDataSpecificationContent & getContent() override;
+
+  void setContent(std::unique_ptr<api::IDataSpecificationContent> content);
+};
+
+}
+}
+}
+#endif //BASYX_MAP_V2_SDK_DATASPECIFICATION_H
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h
new file mode 100644
index 0000000..cd64864
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h
@@ -0,0 +1,20 @@
+#ifndef BASYX_MAP_V2_SDK_DATASPECIFICATIONCONTENT_H
+#define BASYX_MAP_V2_SDK_DATASPECIFICATIONCONTENT_H
+
+#include <BaSyx/submodel/api_v2/dataspecification/IDataSpecificationContent.h>
+
+#include <BaSyx/vab/ElementMap.h>
+
+namespace basyx {
+namespace submodel {
+namespace map {
+
+class DataSpecificationContent
+    : public api::IDataSpecificationContent
+    , public virtual vab::ElementMap
+{};
+
+}
+}
+}
+#endif //BASYX_MAP_V2_SDK_DATASPECIFICATIONCONTENT_H
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h
new file mode 100644
index 0000000..8143509
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h
@@ -0,0 +1,81 @@
+#ifndef BASYX_MAP_V2_SDK_DATASPECIFICATIONIEC61360_H
+#define BASYX_MAP_V2_SDK_DATASPECIFICATIONIEC61360_H
+
+#include <BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h>
+
+#include <BaSyx/submodel/map_v2/common/LangStringSet.h>
+#include <BaSyx/submodel/map_v2/reference/Reference.h>
+#include <BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h>
+#include <BaSyx/vab/ElementMap.h>
+
+namespace basyx {
+namespace submodel {
+namespace map {
+class DataSpecificationIEC61360
+    : public api::IDataSpecificationIEC61360
+    , public virtual DataSpecificationContent
+    , public virtual vab::ElementMap
+{
+public:
+  struct Path
+  {
+    static constexpr char PreferredName[] = "preferredName";
+    static constexpr char ShortName[] = "shortName";
+    static constexpr char Unit[] = "unit";
+    static constexpr char UnitId[] = "unitId";
+    static constexpr char SourceOfDefinition[] = "sourceOfDefinition";
+    static constexpr char Symbol[] = "symbol";
+    static constexpr char DataType[] = "dataType";
+    static constexpr char Definition[] = "definition";
+    static constexpr char ValueFormat[] = "valueFormat";
+    static constexpr char ValueList[] = "valueList";
+    static constexpr char ValueId[] = "valueId";
+    static constexpr char LevelType[] = "levelType";
+  };
+
+  DataSpecificationIEC61360() = delete;
+  DataSpecificationIEC61360(map::LangStringSet & preferred_name);
+
+  api::ILangStringSet & PreferredName() override;
+  api::ILangStringSet & ShortName() override;
+  api::ILangStringSet & Definition() override;
+
+  std::string * const getUnit() override;
+  api::IReference * const getUnitId() override;
+  std::string * const getSourceOfDefinition() override;
+  std::string * const getSymbol() override;
+  DataTypeIEC61360 getDataType() const override;
+  std::string * const getValueFormat() override;
+  /* TODO
+	MISSINGTYPE const getValueList() override;
+  MISSINGTYPE const getValueDataType() override;
+	*/
+  api::IReference * const getValueId() override;
+  LevelType getLevelType() const override;
+
+
+  void setPreferredName(const api::ILangStringSet & preferredName);
+  void setShortName(const api::ILangStringSet & shortName);
+  void setDefinition(const api::ILangStringSet & definition);
+  void setUnit(const std::string & unit) override;
+  void setUnitId(std::unique_ptr<api::IReference> unitId);
+  void setSourceOfDefinition(const std::string & sourceOfDefinition) override;
+  void setSymbol(const std::string & symbol);
+  void setDataType(DataTypeIEC61360 dataType) override;
+  void setValueFormat(const std::string & valueFormat) override;
+  /* TODO
+  void setValueList(const MISSINGTYPE);
+  void setValueDataType(const MISSINGTYPE);
+  */
+  void setValueId(std::unique_ptr<api::IReference> valueId);
+  void setLevelType(LevelType levelType) override;
+
+private:
+  map::LangStringSet preferred_name, short_name, definition;
+  std::unique_ptr<api::IReference> unitId, valueId;
+};
+
+}
+}
+}
+#endif //BASYX_MAP_V2_SDK_DATASPECIFICATIONIEC61360_H
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/LangStringSet.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/LangStringSet.h
index fa606e8..4003031 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/LangStringSet.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/LangStringSet.h
@@ -29,6 +29,8 @@
     const std::string & get(const std::string & languageCode) const override;
     void add(const std::string & languageCode, const std::string & langString) override;
 	bool empty() const noexcept override;
+
+  friend bool api::operator==(const api::ILangStringSet & left, const api::ILangStringSet & right);
 };
 
 }
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/identifier/Identifier.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/identifier/Identifier.h
index d342902..bd8fc78 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/identifier/Identifier.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/identifier/Identifier.h
@@ -12,7 +12,7 @@
 class Identifier
 {
 public:
-	Identifier() = default;
+	Identifier();
 	Identifier(IdentifierType idType, const std::string & id);
 	~Identifier() = default;
 private:
@@ -25,6 +25,9 @@
 public:
 	IdentifierType getIdType() const;
 	const std::string & getId() const;
+
+
+  friend bool operator==(const Identifier & left, const Identifier & right);
 };
 
 }
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/CMakeLists.txt b/sdks/c++/basys.sdk.cc/src/submodel/CMakeLists.txt
index eeef50e..091d19b 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/CMakeLists.txt
+++ b/sdks/c++/basys.sdk.cc/src/submodel/CMakeLists.txt
@@ -47,6 +47,8 @@
         ${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/submodelelement/SubmodelElement.cpp
 		${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/submodelelement/SubmodelElementFactory.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/submodelelement/SubmodelElementCollection.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/dataspecification/DataSpecification.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp
 
         ${CMAKE_CURRENT_SOURCE_DIR}/submodel/simple/aas/AssetAdministrationShell.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/submodel/simple/aas/Asset.cpp
@@ -146,7 +148,6 @@
 		${BASYX_SUBMODEL_INCLUDE_DIR}/map_v2/submodelelement/SubmodelElementFactory.h
 		${BASYX_SUBMODEL_INCLUDE_DIR}/map_v2/submodelelement/SubmodelElement.h
 		${BASYX_SUBMODEL_INCLUDE_DIR}/map_v2/SubModel.h
-		
         ${BASYX_SUBMODEL_INCLUDE_DIR}/simple/aas/AssetAdministrationShell.h
         ${BASYX_SUBMODEL_INCLUDE_DIR}/simple/aas/Asset.h
         ${BASYX_SUBMODEL_INCLUDE_DIR}/simple/common/ElementContainer.h
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp
index 11dd27f..c43bc89 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp
@@ -1,6 +1,10 @@
+#include <algorithm>
+
 #include <BaSyx/submodel/map_v2/common/LangStringSet.h>
 
-using namespace basyx::submodel::map;
+namespace basyx {
+namespace submodel {
+namespace map {
 
 constexpr char LangStringSet::Path::Text[];
 constexpr char LangStringSet::Path::Language[];
@@ -8,40 +12,71 @@
 std::string empty_string;
 
 LangStringSet::LangStringSet()
-	: vab::ElementMap(basyx::object::make_object_list())
+    : vab::ElementMap(basyx::object::make_object_list())
+{};
+
+LangStringSet::LangStringSet(const ILangStringSet & other)
+    : vab::ElementMap(basyx::object::make_object_list())
 {
-};
+  auto langCodes = other.getLanguageCodes();
+  for (auto langCode : langCodes)
+    this->add(langCode, other.get(langCode));
+}
 
 LangStringSet::langCodeSet_t LangStringSet::getLanguageCodes() const
 {
-	return LangStringSet::langCodeSet_t();
-};
+  auto &langStrings = this->map.Get<basyx::object::object_list_t &>();
+  std::vector<std::string> langCodes;
+  std::transform(langStrings.begin(), langStrings.end(), std::back_inserter(langCodes),
+                 [](basyx::object langSet) { return langSet.getProperty(Path::Language).GetStringContent(); });
+  return LangStringSet::langCodeSet_t(langCodes.begin(), langCodes.end());
+}
 
-const std::string & LangStringSet::get(const std::string & languageCode) const
+const std::string &LangStringSet::get(const std::string &languageCode) const
 {
-	auto & langStrings = this->map.Get<basyx::object::object_list_t&>();
-	auto langString = std::find_if(
-		langStrings.begin(), langStrings.end(),
-		[&languageCode](basyx::object & obj) { 
-			const auto & langCode = obj.getProperty(Path::Language).Get<std::string&>();
-			return langCode == languageCode;
-	});
+  auto &langStrings = this->map.Get<basyx::object::object_list_t &>();
+  auto langString = std::find_if(
+      langStrings.begin(), langStrings.end(),
+      [&languageCode](basyx::object &obj) {
+        const auto &langCode = obj.getProperty(Path::Language).Get<std::string &>();
+        return langCode == languageCode;
+      });
 
-	if (langString != langStrings.end())
-		return langString->getProperty(Path::Text).Get<std::string&>();
+  if (langString != langStrings.end())
+    return langString->getProperty(Path::Text).Get<std::string &>();
 
-	return empty_string;
-};
+  return empty_string;
+}
 
-void LangStringSet::add(const std::string & languageCode, const std::string & langString)
+void LangStringSet::add(const std::string &languageCode, const std::string &langString)
 {
-	auto langStringMap = basyx::object::make_map();
-	langStringMap.insertKey(Path::Text, langString);
-	langStringMap.insertKey(Path::Language, languageCode);
-	this->map.insert(langStringMap);
+  auto langStringMap = basyx::object::make_map();
+  langStringMap.insertKey(Path::Text, langString);
+  langStringMap.insertKey(Path::Language, languageCode);
+  this->map.insert(langStringMap);
 };
 
 bool LangStringSet::empty() const noexcept
 {
-	return this->map.empty();
-};
\ No newline at end of file
+  return this->map.empty();
+};
+}
+
+namespace api {
+bool operator==(const basyx::submodel::api::ILangStringSet &left, const basyx::submodel::api::ILangStringSet &right)
+{
+  auto langCodes = left.getLanguageCodes();
+  if (langCodes.size() != right.getLanguageCodes().size())
+    return false;
+  for (auto langCode : langCodes)
+  {
+    auto leftString = left.get(langCode);
+    if (leftString.compare(right.get(langCode)) != 0)
+      return false;
+  }
+  return true;
+}
+
+}
+}
+}
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecification.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecification.cpp
new file mode 100644
index 0000000..fcfe30d
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecification.cpp
@@ -0,0 +1,39 @@
+#include <BaSyx/submodel/map_v2/dataspecification/DataSpecification.h>
+#include <BaSyx/vab/ElementMap.h>
+
+namespace basyx {
+namespace submodel {
+namespace map{
+
+using namespace basyx::submodel::api;
+
+DataSpecification::DataSpecification(const std::string & idShort, const simple::Identifier & identifier, std::unique_ptr<api::IDataSpecificationContent> content)
+  : Identifiable(idShort, identifier)
+  , vab::ElementMap()
+{
+  this->setContent(std::move(content));
+}
+
+void DataSpecification::setContent(std::unique_ptr<api::IDataSpecificationContent> content)
+{
+  DataSpecificationContent* dataSpecificationContent;
+  if (content == nullptr)
+    dataSpecificationContent = new DataSpecificationContent();
+  else
+  {
+    dataSpecificationContent = dynamic_cast<DataSpecificationContent*>(content.release());
+    if (!dataSpecificationContent)
+      std::__throw_bad_cast();
+  }
+  this->content = dataSpecificationContent;
+  this->map.insertKey("dataSpecificationContent", dataSpecificationContent->getMap());
+}
+
+api::IDataSpecificationContent& DataSpecification::getContent()
+{
+  return *this->content;
+}
+
+}
+}
+}
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationContent.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationContent.cpp
new file mode 100644
index 0000000..13cf75b
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationContent.cpp
@@ -0,0 +1,16 @@
+#include <BaSyx/submodel/map_v2/  /DataSpecificationContent.h>
+
+
+namespace basyx {
+namespace submodel {
+namespace map {
+
+using namespace basyx::submodel::api;
+
+DataSpecificationContent::DataSpecificationContent()
+  : vab::ElementMap()
+{}
+
+}
+}
+}
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp
new file mode 100644
index 0000000..6408d06
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp
@@ -0,0 +1,170 @@
+#include <BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h>
+
+
+namespace basyx {
+namespace submodel {
+namespace map {
+using namespace basyx::submodel::api;
+
+constexpr char DataSpecificationIEC61360::Path::PreferredName[];
+constexpr char DataSpecificationIEC61360::Path::ShortName[];
+constexpr char DataSpecificationIEC61360::Path::Unit[];
+constexpr char DataSpecificationIEC61360::Path::UnitId[];
+constexpr char DataSpecificationIEC61360::Path::SourceOfDefinition[];
+constexpr char DataSpecificationIEC61360::Path::Symbol[];
+constexpr char DataSpecificationIEC61360::Path::DataType[];
+constexpr char DataSpecificationIEC61360::Path::Definition[];
+constexpr char DataSpecificationIEC61360::Path::ValueFormat[];
+constexpr char DataSpecificationIEC61360::Path::ValueList[];
+constexpr char DataSpecificationIEC61360::Path::ValueId[];
+constexpr char DataSpecificationIEC61360::Path::LevelType[];
+
+DataSpecificationIEC61360::DataSpecificationIEC61360(map::LangStringSet & preferred_name)
+  : vab::ElementMap{}
+  , preferred_name(preferred_name)
+{
+  this->map.insertKey(Path::PreferredName, this->preferred_name.getMap());
+}
+
+api::ILangStringSet & DataSpecificationIEC61360::PreferredName()
+{
+  return this->preferred_name;
+}
+
+api::ILangStringSet & DataSpecificationIEC61360::ShortName()
+{
+  return this->short_name;
+}
+
+api::ILangStringSet & DataSpecificationIEC61360::Definition()
+{
+  return this->definition;
+}
+
+std::string * const DataSpecificationIEC61360::getUnit()
+{
+  auto unit = this->map.getProperty(Path::Unit);
+  if (unit.IsNull())
+    return nullptr;
+
+  return &unit.Get<std::string&>();
+}
+
+api::IReference * const DataSpecificationIEC61360::getUnitId()
+{
+  return this->unitId.get();
+}
+
+std::string * const DataSpecificationIEC61360::getSourceOfDefinition()
+{
+  auto source_of_definition = this->map.getProperty(Path::SourceOfDefinition);
+  if (source_of_definition.IsNull())
+    return nullptr;
+
+  return &source_of_definition.Get<std::string&>();
+}
+
+std::string *const DataSpecificationIEC61360::getSymbol()
+{
+  auto symbol = this->map.getProperty(Path::Symbol);
+  if (symbol.IsNull())
+    return nullptr;
+
+  return &symbol.Get<std::string&>();
+}
+
+DataTypeIEC61360 DataSpecificationIEC61360::getDataType() const
+{}
+
+std::string * const DataSpecificationIEC61360::getValueFormat()
+{
+  auto value_format = this->map.getProperty(Path::ValueFormat);
+  if (value_format.IsNull())
+    return nullptr;
+
+  return &value_format.Get<std::string&>();
+}
+
+api::IReference * const DataSpecificationIEC61360::getValueId()
+{
+  return this->valueId.get();
+}
+
+LevelType DataSpecificationIEC61360::getLevelType() const
+{
+  throw std::logic_error{"Function not yet implemented."};
+  //return from_string(this->map.getProperty(Path::LevelType));
+}
+
+void DataSpecificationIEC61360::setPreferredName(const api::ILangStringSet & preferredName)
+{
+  this->preferred_name = LangStringSet(preferredName);
+}
+
+void DataSpecificationIEC61360::setShortName(const api::ILangStringSet &shortName)
+{
+  this->short_name = LangStringSet(shortName);
+}
+
+void DataSpecificationIEC61360::setDefinition(const api::ILangStringSet &definition)
+{
+  this->definition = LangStringSet(definition);
+}
+
+void DataSpecificationIEC61360::setUnit(const std::string & unit)
+{
+  this->map.insertKey(Path::Unit, unit);
+}
+
+void DataSpecificationIEC61360::setSourceOfDefinition(const std::string & sourceOfDefinition)
+{
+  this->map.insertKey(Path::SourceOfDefinition, sourceOfDefinition);
+}
+
+void DataSpecificationIEC61360::setDataType(DataTypeIEC61360 dataType)
+{
+  throw std::logic_error{"Function not yet implemented."};
+  //this->map.insertKey(Path::DataType, to_string(dataType));
+}
+
+void DataSpecificationIEC61360::setValueFormat(const std::string & valueFormat)
+{
+  this->map.insertKey(Path::ValueFormat, valueFormat);
+}
+
+void DataSpecificationIEC61360::setUnitId(std::unique_ptr<api::IReference> unit_id)
+{
+  //Assume that map version of DataSpecification only uses map version of Reference
+  this->unitId.reset(unit_id.release());
+  auto unit_id_ptr = dynamic_cast<map::Reference*>(this->unitId.get());
+  if (!unit_id_ptr)
+    std::__throw_bad_cast();
+
+  this->map.insertKey(Path::UnitId, unit_id_ptr->getMap());
+}
+
+void DataSpecificationIEC61360::setSymbol(const std::string &symbol)
+{
+  this->map.insertKey(Path::Symbol, symbol);
+}
+
+void DataSpecificationIEC61360::setValueId(std::unique_ptr<api::IReference> valueId)
+{
+  //Assume that map version of DataSpecification only uses map version of Reference
+  this->valueId = std::move(valueId);
+  auto value_id_ptr = dynamic_cast<map::Reference*>(this->valueId.get());
+  if (!value_id_ptr)
+    std::__throw_bad_cast();
+
+  this->map.insertKey(Path::ValueId, value_id_ptr->getMap());
+}
+
+void DataSpecificationIEC61360::setLevelType(LevelType levelType)
+{
+  throw std::logic_error{"Function not yet implemented."};
+  //this->map.insertKey(Path::LevelType, to_string(levelType));
+}
+
+}
+}
+}
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp
index 53a857e..6e4fe02 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp
@@ -1,5 +1,7 @@
 #include <BaSyx/submodel/simple/common/LangStringSet.h>
 
+#include <BaSyx/shared/types.h>
+
 namespace basyx {
 namespace submodel {
 namespace simple {
@@ -17,7 +19,10 @@
 
 LangStringSet::langCodeSet_t LangStringSet::getLanguageCodes() const
 {
-	return langCodeSet_t();
+  std::vector<std::string> langCodes;
+  for (auto langCode : this->langStrings)
+    langCodes.push_back(langCode.first);
+  return LangStringSet::langCodeSet_t(langCodes.begin(), langCodes.end());
 };
 
 
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/identifier/Identifier.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/identifier/Identifier.cpp
index 1398703..398348f 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/identifier/Identifier.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/identifier/Identifier.cpp
@@ -1,36 +1,54 @@
 #include <BaSyx/submodel/simple/identifier/Identifier.h>
 #include <BaSyx/submodel/api_v2/identifier/IdentifierType.h>
 
-using namespace basyx::submodel;
-using namespace basyx::submodel::simple;
+namespace basyx {
+namespace submodel {
+namespace simple {
 
-Identifier::Identifier(IdentifierType idType, const std::string & id)
-	: idType(idType)
-	, id(id)
+Identifier::Identifier()
+  : idType(IdentifierType::Unknown)
+{}
+
+Identifier::Identifier(IdentifierType idType, const std::string &id)
+    : idType(idType)
+    , id(id)
 {
 };
 
-Identifier Identifier::Custom(const std::string & id)
+Identifier Identifier::Custom(const std::string &id)
 {
-	return Identifier(IdentifierType::Custom, id);
+  return Identifier(IdentifierType::Custom, id);
 };
 
-Identifier Identifier::URI(const std::string & uri)
+Identifier Identifier::URI(const std::string &uri)
 {
-	return Identifier(IdentifierType::URI, uri);
+  return Identifier(IdentifierType::URI, uri);
 };
 
-Identifier Identifier::IRDI(const std::string & irdi)
+Identifier Identifier::IRDI(const std::string &irdi)
 {
-	return Identifier(IdentifierType::IRDI, irdi);
+  return Identifier(IdentifierType::IRDI, irdi);
 };
 
 IdentifierType Identifier::getIdType() const
 {
-	return this->idType;
+  return this->idType;
 };
 
-const std::string & Identifier::getId() const
+const std::string &Identifier::getId() const
 {
-	return this->id;
-};
\ No newline at end of file
+  return this->id;
+};
+
+bool operator==(const Identifier &left, const Identifier &right)
+{
+  if (left.getIdType() == right.getIdType())
+  {
+    return left.getId().compare(right.getId()) == 0;
+  }
+  return false;
+}
+
+}
+}
+}
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/CMakeLists.txt b/sdks/c++/basys.sdk.cc/tests/regression/submodel/CMakeLists.txt
index 6fdda7c..4637453 100644
--- a/sdks/c++/basys.sdk.cc/tests/regression/submodel/CMakeLists.txt
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/CMakeLists.txt
@@ -18,7 +18,10 @@
 	api/qualifier/test_Referable.cpp
 	api/reference/test_Reference.cpp
 	map/common/test_ElementContainer.cpp
-	map/submodelelement/test_LangStringSet.cpp
+	api/common/test_LangStringSet.cpp
+	map_v2/dataspecification/test_DataSpecification.cpp
+	map_v2/dataspecification/test_DataSpecificationIEC61360.cpp
+	map_v2/identifier/test_Identifier.cpp
 )
 
 target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR})
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/api/common/test_LangStringSet.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/api/common/test_LangStringSet.cpp
new file mode 100644
index 0000000..5354444
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/api/common/test_LangStringSet.cpp
@@ -0,0 +1,101 @@
+#include <gtest/gtest.h>
+
+#include <BaSyx/submodel/api_v2/common/ILangStringSet.h>
+#include <BaSyx/submodel/map_v2/common/LangStringSet.h>
+#include <BaSyx/submodel/simple/common/LangStringSet.h>
+
+#include <BaSyx/util/util.h>
+
+using namespace basyx::submodel;
+
+using ImplTypes = ::testing::Types<map::LangStringSet, simple::LangStringSet>;
+
+template<class Impl>
+class LangStringTest :public ::testing::Test {
+protected:
+	using impl_t = Impl;
+
+  std::unique_ptr<api::ILangStringSet> langStringSet;
+  std::unique_ptr<api::ILangStringSet> ref_langStringSet;
+protected:
+	void SetUp() override
+	{
+    langStringSet = util::make_unique<Impl>();
+    ref_langStringSet = util::make_unique<Impl>();
+	}
+
+	void TearDown() override
+	{	}
+};
+
+TYPED_TEST_CASE(LangStringTest, ImplTypes);
+
+TYPED_TEST(LangStringTest, TestUnknownLangCode)
+{
+  const auto string = this->langStringSet->get("UN");
+
+  ASSERT_TRUE(string.empty());
+}
+
+TYPED_TEST(LangStringTest, Test)
+{
+  constexpr char stringValDe[] = "Das ist ein Test!";
+  constexpr char stringValEn[] = "This is a test!";
+
+  this->langStringSet->add("DE", stringValDe);
+  this->langStringSet->add("EN", stringValEn);
+
+  const auto & deString = this->langStringSet->get("DE");
+  const auto & enString = this->langStringSet->get("EN");
+
+  ASSERT_EQ(deString, stringValDe);
+  ASSERT_EQ(enString, stringValEn);
+};
+
+TYPED_TEST(LangStringTest, TestGetLangCodes)
+{
+  constexpr char stringValDe[] = "Das ist ein Test!";
+  constexpr char stringValEn[] = "This is a test!";
+  constexpr char stringValFr[] = "C'est un test!";
+
+  this->langStringSet->add("DE", stringValDe);
+  this->langStringSet->add("EN", stringValEn);
+  this->langStringSet->add("FR", stringValFr);
+
+  auto lang_codes = this->langStringSet->getLanguageCodes();
+  auto reference_codes = api::ILangStringSet::langCodeSet_t{"DE", "EN", "FR"};
+
+  ASSERT_EQ(lang_codes, reference_codes);
+}
+
+TYPED_TEST(LangStringTest, TestEqualityOperatorEmpty)
+{
+  ASSERT_TRUE(*this->langStringSet == *this->ref_langStringSet);
+}
+
+TYPED_TEST(LangStringTest, TestEqualityOperatorEqual)
+{
+  constexpr char stringValDe[] = "Das ist ein Test!";
+  constexpr char stringValEn[] = "This is a test!";
+
+  this->langStringSet->add("DE", stringValDe);
+  this->langStringSet->add("EN", stringValEn);
+
+  this->ref_langStringSet->add("DE", stringValDe);
+  this->ref_langStringSet->add("EN", stringValEn);
+
+  ASSERT_TRUE(*this->langStringSet == *this->ref_langStringSet);
+}
+
+TYPED_TEST(LangStringTest, TestEqualityOperatorNotEqual)
+{
+  constexpr char stringValDe[] = "Das ist ein Test!";
+  constexpr char stringValEn[] = "This is a test!";
+
+  this->langStringSet->add("DE", stringValDe);
+  this->langStringSet->add("EN", stringValEn);
+
+  this->ref_langStringSet->add("DE", stringValDe);
+
+  ASSERT_FALSE(*this->langStringSet == *this->ref_langStringSet);
+}
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/test_LangStringSet.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/test_LangStringSet.cpp
deleted file mode 100644
index 56d0a76..0000000
--- a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/test_LangStringSet.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <gtest/gtest.h>
-
-#include <BaSyx/submodel/api_v2/common/ILangStringSet.h>
-#include <BaSyx/submodel/map_v2/common/LangStringSet.h>
-#include <BaSyx/submodel/simple/common/LangStringSet.h>
-
-#include <BaSyx/util/util.h>
-
-using namespace basyx::submodel;
-
-using ImplTypes = ::testing::Types<map::LangStringSet, simple::LangStringSet>;
-
-template<class Impl>
-class LangStringTest :public ::testing::Test {
-protected:
-	std::unique_ptr<api::ILangStringSet> langStringSet;
-protected:
-	void SetUp() override
-	{
-		this->langStringSet = util::make_unique<Impl>();
-	}
-
-	void TearDown() override
-	{
-	}
-};
-
-TYPED_TEST_CASE(LangStringTest, ImplTypes);
-
-TYPED_TEST(LangStringTest, TestUnknownLangCode)
-{
-	const auto string = this->langStringSet->get("UN");
-	
-	ASSERT_TRUE(string.empty());
-}
-
-TYPED_TEST(LangStringTest, Test)
-{
-	constexpr char stringValDe[] = "Das ist ein Test!";
-	constexpr char stringValEn[] = "This is a test!";
-
-	this->langStringSet->add("DE", stringValDe);
-	this->langStringSet->add("EN", stringValEn);
-
-	const auto & deString = this->langStringSet->get("DE");
-	const auto & enString = this->langStringSet->get("EN");
-
-	ASSERT_EQ(deString, stringValDe);
-	ASSERT_EQ(enString, stringValEn);
-};
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecification.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecification.cpp
new file mode 100644
index 0000000..09114dd
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecification.cpp
@@ -0,0 +1,56 @@
+#include <gtest/gtest.h>
+#include <BaSyx/submodel/api_v2/dataspecification/IDataSpecificationContent.h>
+
+#include "BaSyx/submodel/map_v2/dataspecification/DataSpecification.h"
+
+using namespace basyx::submodel::map;
+using namespace basyx::submodel;
+
+class DataSpecificationTest : public ::testing::Test
+{
+protected:
+  void SetUp() override
+  {}
+
+  class DataSpecificationContentMock : public virtual DataSpecificationContent
+  {
+  public:
+    bool isMock()
+    {
+      return true;
+    }
+  };
+
+  class DataSpecificationContentMock2 : public virtual DataSpecificationContent
+  {
+  public:
+    bool isMock2()
+    {
+      return true;
+    }
+  };
+};
+
+TEST_F(DataSpecificationTest, TestConstructor)
+{
+  simple::Identifier id;
+  std::unique_ptr<api::IDataSpecificationContent> content = util::make_unique<DataSpecificationContentMock>();
+  DataSpecification dataSpecification("id", id, std::move(content));
+
+  ASSERT_EQ(dataSpecification.getIdShort(), "id");
+  ASSERT_TRUE(dataSpecification.getIdentification() == id);
+  ASSERT_TRUE((dynamic_cast<DataSpecificationContentMock&>(dataSpecification.getContent())).isMock());
+}
+
+TEST_F(DataSpecificationTest, TestContent)
+{
+  simple::Identifier id;
+  std::unique_ptr<api::IDataSpecificationContent> content = util::make_unique<DataSpecificationContentMock>();
+  DataSpecification dataSpecification("id", id, std::move(content));
+
+  ASSERT_TRUE((dynamic_cast<DataSpecificationContentMock&>(dataSpecification.getContent())).isMock());
+
+  std::unique_ptr<api::IDataSpecificationContent> content2 = util::make_unique<DataSpecificationContentMock2>();
+  dataSpecification.setContent(std::move(content2));
+  ASSERT_TRUE((dynamic_cast<DataSpecificationContentMock2&>(dataSpecification.getContent())).isMock2());
+}
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp
new file mode 100644
index 0000000..cfffea7
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp
@@ -0,0 +1,119 @@
+#include <gtest/gtest.h>
+
+#include "BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h"
+
+using namespace basyx::submodel::map;
+using namespace basyx::submodel;
+
+class DataSpecificationIEC61360Test : public ::testing::Test
+{
+protected:
+  std::unique_ptr<DataSpecificationIEC61360> data_spec;
+  map::LangStringSet preferred_name;
+  void SetUp() override
+  {
+    preferred_name.add("EN", "TestDataSpecification");
+    this->data_spec = util::make_unique<DataSpecificationIEC61360>(preferred_name);
+  }
+};
+
+TEST_F(DataSpecificationIEC61360Test, TestPreferredName)
+{
+  ASSERT_TRUE(this->data_spec->PreferredName() == this->preferred_name);
+
+  map::LangStringSet new_preferred_name;
+  new_preferred_name.add("EN", "NewTestDataSpecification");
+
+  this->data_spec->setPreferredName(new_preferred_name);
+
+  ASSERT_TRUE(data_spec->PreferredName() == new_preferred_name);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestShortName)
+{
+  ASSERT_TRUE(this->data_spec->ShortName().empty());
+
+  map::LangStringSet shortName;
+  shortName.add("EN", "TestDataSpec");
+  this->data_spec->setShortName(shortName);
+
+  ASSERT_TRUE(this->data_spec->ShortName() == shortName);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestDefinition)
+{
+  ASSERT_TRUE(this->data_spec->Definition().empty());
+
+  map::LangStringSet definition;
+  definition.add("EN", "Definition");
+  definition.add("DE", "Definition");
+
+  this->data_spec->setDefinition(definition);
+  ASSERT_TRUE(this->data_spec->Definition() == definition);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestUnit)
+ {
+  ASSERT_EQ(this->data_spec->getUnit(), nullptr);
+
+  this->data_spec->setUnit("testUnit");
+  ASSERT_EQ(*this->data_spec->getUnit(), std::string("testUnit"));
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestSourceOfDefinition)
+ {
+  ASSERT_EQ(this->data_spec->getSourceOfDefinition(), nullptr);
+
+  this->data_spec->setSourceOfDefinition("testSourceOfDefinition");
+  ASSERT_EQ(*this->data_spec->getSourceOfDefinition(), std::string("testSourceOfDefinition"));
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestSymbol)
+ {
+  ASSERT_EQ(this->data_spec->getSymbol(), nullptr);
+
+  this->data_spec->setSymbol("testSymbol");
+  ASSERT_EQ(*this->data_spec->getSymbol(), std::string("testSymbol"));
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestValueFormat)
+ {
+  ASSERT_EQ(this->data_spec->getValueFormat(), nullptr);
+
+  this->data_spec->setValueFormat("testValueFormat");
+  ASSERT_EQ(*this->data_spec->getValueFormat(), std::string("testValueFormat"));
+}
+/* TODO
+TEST_F(DataSpecificationIEC61360Test, TestDataType)
+{
+  ASSERT_EQ(this->data_spec->getDataType(), DataTypeIEC61360::Unknown);
+
+  this->data_spec->setDataType(DataTypeIEC61360::Rational);
+  ASSERT_EQ(this->data_spec->getDataType(), DataTypeIEC61360::Rational);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestLevelType)
+{
+  ASSERT_EQ(this->data_spec->getLevelType(), LevelType::Unknown);
+
+  this->data_spec->setLevelType(LevelType::Min);
+  ASSERT_EQ(this->data_spec->getLevelType(), LevelType::Min);
+}*/
+
+TEST_F(DataSpecificationIEC61360Test, TestUnitId)
+{
+  ASSERT_EQ(this->data_spec->getUnitId(), nullptr);
+
+  std::unique_ptr<api::IReference> reference = util::make_unique<map::Reference>();
+  this->data_spec->setUnitId(std::move(reference));
+  ASSERT_NE(this->data_spec->getUnitId(), nullptr);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestValueId)
+{
+  ASSERT_EQ(this->data_spec->getValueId(), nullptr);
+
+  std::unique_ptr<api::IReference> valueId = util::make_unique<map::Reference>();
+  this->data_spec->setValueId(std::move(valueId));
+  ASSERT_NE(this->data_spec->getValueId(), nullptr);
+}
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/identifier/test_Identifier.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/identifier/test_Identifier.cpp
new file mode 100644
index 0000000..c51cc95
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/identifier/test_Identifier.cpp
@@ -0,0 +1,23 @@
+#include <gtest/gtest.h>
+
+#include "BaSyx/submodel/map_v2/dataspecification/DataSpecification.h"
+
+using namespace basyx::submodel::map;
+using namespace basyx::submodel;
+
+class IdentifierTest : public ::testing::Test
+{
+protected:
+  void SetUp() override
+  {}
+};
+
+TEST_F(IdentifierTest, TestEqualityOperator_same)
+{
+  simple::Identifier id1(IdentifierType::IRDI, "id");
+  simple::Identifier id2(IdentifierType::IRDI, "id");
+
+  ASSERT_TRUE(id1 == id2);
+}
+
+
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/memory/InMemoryDirectory.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/memory/InMemoryDirectory.java
index fc091ab..a3ee350 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/memory/InMemoryDirectory.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/memory/InMemoryDirectory.java
@@ -4,6 +4,7 @@
 import java.util.Map;
 
 import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
+import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
 
 
 
@@ -52,14 +53,12 @@
 		return this;
 	}
 
-	
 	/**
 	 * Add several mappings to directory
 	 */
-	public void addMappings(Map<String,String> mappings) {
+	public void addMappings(Map<String, String> mappings) {
 		keyToValue.putAll(mappings);
 	}
-
 	
 	/**
 	 * Remove a mapping from directory
@@ -74,6 +73,10 @@
 	 */
 	@Override
 	public String lookup(String id) {
-		return (String) keyToValue.get(id);
+		if(keyToValue.containsKey(id)) {
+			return (String) keyToValue.get(id);
+		} else {
+			throw new ResourceNotFoundException("No entry exists for key " + id);
+		}
 	}
 }
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/restapi/DirectoryModelProvider.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/restapi/DirectoryModelProvider.java
index 9a76d14..0d06c5c 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/restapi/DirectoryModelProvider.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/restapi/DirectoryModelProvider.java
@@ -3,7 +3,6 @@
 import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
 import org.eclipse.basyx.vab.directory.memory.InMemoryDirectory;
 import org.eclipse.basyx.vab.exception.provider.ProviderException;
-import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
 import org.eclipse.basyx.vab.modelprovider.VABPathTools;
 import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
 
@@ -37,12 +36,7 @@
 	@Override
 	public Object getModelPropertyValue(String path) throws ProviderException {
 		path = VABPathTools.stripSlashes(path);
-		Object obj = directory.lookup(path);
-		if (obj == null) {
-			throw new ResourceNotFoundException("Path " + path + " does not exist in the Registry");
-		} else {
-			return obj;
-		}
+		return directory.lookup(path);
 	}
 
 	@Override
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/memory/TestInMemoryDirectory.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/memory/TestInMemoryDirectory.java
new file mode 100644
index 0000000..d918554
--- /dev/null
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/memory/TestInMemoryDirectory.java
@@ -0,0 +1,58 @@
+package org.eclipse.basyx.testsuite.regression.vab.directory.memory;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.basyx.testsuite.regression.vab.directory.proxy.TestDirectory;
+import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
+import org.eclipse.basyx.vab.directory.memory.InMemoryDirectory;
+import org.junit.Test;
+
+/**
+ * Tests the InMemory directory using the TestDirectory Suite
+ * 
+ * @author schnicke, haque
+ *
+ */
+public class TestInMemoryDirectory extends TestDirectory {
+
+	@Override
+	protected IVABDirectoryService getRegistry() {
+		return new InMemoryDirectory();
+	}
+
+	@Test
+	public void testConstructor() {
+		IVABDirectoryService registry = new InMemoryDirectory(getAddedValues());
+		testElementsInMap(registry, getAddedValues());
+	}
+
+	@Test
+	public void testAddMappingMultipleKey() {
+		InMemoryDirectory registry = new InMemoryDirectory();
+		String key3 = "key3";
+		String value3 = "value3";
+		String key4 = "key4";
+		String value4 = "value4";
+		Map<String, String> map = new HashMap<String, String>();
+		map.put(key3, value3);
+		map.put(key4, value4);
+		registry.addMappings(map);
+		testElementsInMap(registry, map);
+	}
+
+	private void testElementsInMap(IVABDirectoryService registry, Map<String, String> map) {
+		for (Map.Entry<String, String> entry : map.entrySet()) {
+			assertEquals(entry.getValue(), registry.lookup(entry.getKey()));
+		}
+	}
+
+	private Map<String, String> getAddedValues() {
+		Map<String, String> map = new HashMap<String, String>();
+		map.put("key1", "value1");
+		map.put("key2", "value2");
+		return map;
+	}
+}
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/proxy/TestDirectory.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/proxy/TestDirectory.java
index 2f53d1c..5f4fabd 100644
--- a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/proxy/TestDirectory.java
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/proxy/TestDirectory.java
@@ -5,9 +5,7 @@
 import static org.junit.Assert.fail;
 
 import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
-import org.eclipse.basyx.vab.directory.proxy.VABDirectoryProxy;
 import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
-import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -21,7 +19,7 @@
  */
 public abstract class TestDirectory {
 	// The registry proxy that is used to access the backend
-	protected final IVABDirectoryService proxy = new VABDirectoryProxy(getProxyProvider());
+	protected final IVABDirectoryService registry = getRegistry();
 
 	// Ids and endpoints for registered elements
 	protected String elem1 = "elem1";
@@ -35,7 +33,7 @@
 	 * Getter for the tested registry provider. Tests for actual registry provider
 	 * have to realize this method.
 	 */
-	protected abstract IModelProvider getProxyProvider();
+	protected abstract IVABDirectoryService getRegistry();
 
 	/**
 	 * During setup of the tests, new entries are created in the registry using a
@@ -44,8 +42,8 @@
 	@Before
 	public void setUp() {
 		// Register Elements
-		proxy.addMapping(elem1, endpoint1);
-		proxy.addMapping(elem2, endpoint2);
+		registry.addMapping(elem1, endpoint1);
+		registry.addMapping(elem2, endpoint2);
 	}
 
 	/**
@@ -53,8 +51,8 @@
 	 */
 	@After
 	public void tearDown() {
-		proxy.removeMapping(elem1);
-		proxy.removeMapping(elem2);
+		registry.removeMapping(elem1);
+		registry.removeMapping(elem2);
 	}
 
 	/**
@@ -63,12 +61,12 @@
 	@Test
 	public void testGetSingleElement() {
 		// Retrieve and check the first Element
-		String result = proxy.lookup(elem1);
+		String result = registry.lookup(elem1);
 		assertEquals(endpoint1, result);
 
 
 		// Retrieve and check the second AAS
-		result = proxy.lookup(elem2);
+		result = registry.lookup(elem2);
 		assertEquals(endpoint2, result);
 	}
 
@@ -78,31 +76,31 @@
 	@Test
 	public void testDeleteCall() {
 		// After the setup, both Elements should have been inserted to the registry
-		assertNotNull(proxy.lookup(elem1));
-		assertNotNull(proxy.lookup(elem2));
+		assertNotNull(registry.lookup(elem1));
+		assertNotNull(registry.lookup(elem2));
 
-		proxy.removeMapping(elem2);
+		registry.removeMapping(elem2);
 
 		// After elem2 has been deleted, only elem1 should be registered
-		assertNotNull(proxy.lookup(elem1));
+		assertNotNull(registry.lookup(elem1));
 		try {
-			proxy.lookup(elem2);
+			registry.lookup(elem2);
 			fail();
 		} catch (ResourceNotFoundException e) {
 			// Expected
 		}
 
-		proxy.removeMapping(elem1);
+		registry.removeMapping(elem1);
 
 		// After elem2 has been deleted, no element should be registered
 		try {
-			proxy.lookup(elem1);
+			registry.lookup(elem1);
 			fail();
 		} catch (ResourceNotFoundException e) {
 			// Expected
 		}
 		try {
-			proxy.lookup(elem2);
+			registry.lookup(elem2);
 			fail();
 		} catch (ResourceNotFoundException e) {
 			// Expected
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/restapi/TestDirectoryProvider.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/restapi/TestDirectoryProvider.java
index 0a7f440..caaf81a 100644
--- a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/restapi/TestDirectoryProvider.java
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/restapi/TestDirectoryProvider.java
@@ -1,17 +1,22 @@
 package org.eclipse.basyx.testsuite.regression.vab.directory.restapi;
 
 import org.eclipse.basyx.testsuite.regression.vab.directory.proxy.TestDirectory;
+import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
+import org.eclipse.basyx.vab.directory.proxy.VABDirectoryProxy;
 import org.eclipse.basyx.vab.directory.restapi.DirectoryModelProvider;
-import org.eclipse.basyx.vab.modelprovider.VABElementProxy;
-import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
 
+/**
+ * Tests the directory provider using the TestDirectory Suite
+ * 
+ * @author schnicke
+ *
+ */
 public class TestDirectoryProvider extends TestDirectory {
 
 	@Override
-	protected IModelProvider getProxyProvider() {
+	protected IVABDirectoryService getRegistry() {
 		DirectoryModelProvider provider = new DirectoryModelProvider();
-		IModelProvider apiProxy = new VABElementProxy("", provider);
-		return apiProxy;
+		return new VABDirectoryProxy(provider);
 	}
 
 }