diff --git a/sdks/c++/basys.sdk.cc/src/vab/vab/backend/connector/native/frame/BaSyxNativeFrameBuilder.cpp b/sdks/c++/basys.sdk.cc/src/vab/vab/backend/connector/native/frame/BaSyxNativeFrameBuilder.cpp
deleted file mode 100644
index 34987eb..0000000
--- a/sdks/c++/basys.sdk.cc/src/vab/vab/backend/connector/native/frame/BaSyxNativeFrameBuilder.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * BaSyxNativeFrameBuilder.cpp
- *
- *  Created on: 14.08.2018
- *      Author: schnicke
- */
-
-#include <BaSyx/vab/backend/connector/native/frame/BaSyxNativeFrameBuilder.h>
-
-#include <BaSyx/shared/serialization/json.h>
-
-#include <BaSyx/util/tools/StringTools.h>
-
-namespace basyx {
-namespace vab {
-namespace connector {
-namespace native {
-namespace frame {
-
-	
-BaSyxNativeFrameBuilder::BaSyxNativeFrameBuilder() { };
-
-size_t BaSyxNativeFrameBuilder::buildGetFrame(std::string const& path, char * buffer)
-{
-	return encodeCommandAndPath(BaSyxCommand::Get, path, buffer);
-}
-
-size_t BaSyxNativeFrameBuilder::buildSetFrame(std::string const& path, const basyx::object & newVal, char * buffer)
-{
-	size_t size = encodeCommandAndPath(BaSyxCommand::Set, path, buffer);
-	size += encodeValue(newVal, buffer + size);
-	return size;
-}
-
-size_t BaSyxNativeFrameBuilder::buildCreateFrame(std::string const& path, const basyx::object & newVal, char * buffer)
-{
-	size_t size = encodeCommandAndPath(BaSyxCommand::Create, path, buffer);
-	size += encodeValue(newVal, buffer + size);
-	return size;
-}
-
-size_t BaSyxNativeFrameBuilder::buildDeleteFrame(std::string const& path, char * buffer)
-{
-	return encodeCommandAndPath(BaSyxCommand::Delete, path, buffer);
-}
-
-size_t BaSyxNativeFrameBuilder::buildDeleteFrame(std::string const& path, const basyx::object & deleteVal, char * buffer)
-{
-	size_t size = encodeCommandAndPath(BaSyxCommand::Delete, path, buffer);
-	size += encodeValue(deleteVal, buffer + size);
-	return size;
-}
-
-size_t BaSyxNativeFrameBuilder::buildInvokeFrame(std::string const& path, const basyx::object & param, char * buffer)
-{
-	size_t size = encodeCommandAndPath(BaSyxCommand::Invoke, path, buffer);
-	size += encodeValue(param, buffer + size);
-	return size;
-}
-
-size_t BaSyxNativeFrameBuilder::buildInvokeFrame(std::string const& path, const basyx::object::object_list_t & params, char * buffer)
-{
-	size_t size = encodeCommandAndPath(BaSyxCommand::Invoke, path, buffer);
-	size += encodeValue(params, buffer + size);
-	return size;
-}
-
-size_t BaSyxNativeFrameBuilder::encodeCommand(BaSyxCommand command, char* buffer)
-{
-	buffer[0] = static_cast<uint8_t>(command);
-	return 1;
-}
-
-std::size_t BaSyxNativeFrameBuilder::encodeValue(const basyx::object & value, char * buffer)
-{
-	std::string dumped = basyx::serialization::json::serialize(value).dump(4);
-	return StringTools::toArray(dumped, buffer);
-}
-
-size_t BaSyxNativeFrameBuilder::encodeCommandAndPath(BaSyxCommand command, std::string const& path, char* buffer)
-{
-	size_t size = encodeCommand(command, buffer);
-	size += StringTools::toArray(path, buffer + size);
-	return size;
-}
-
-}
-}
-}
-}
-}
diff --git a/sdks/c++/basys.sdk.cc/src/vab/vab/backend/connector/native/frame/EntityWrapper.cpp b/sdks/c++/basys.sdk.cc/src/vab/vab/backend/connector/native/frame/EntityWrapper.cpp
new file mode 100644
index 0000000..37c2989
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/src/vab/vab/backend/connector/native/frame/EntityWrapper.cpp
@@ -0,0 +1,112 @@
+#include <BaSyx/vab/backend/connector/native/frame/EntityWrapper.h>
+
+using basyx::vab::EntityWrapper;
+
+
+namespace {
+	std::string prepareErrorCode(basyx::object::error errorCode)
+	{
+		std::string error;
+		switch (errorCode)
+		{
+		case basyx::object::error::PropertyNotFound:
+			error = "ResourceNotFoundException";
+			break;
+		case basyx::object::error::ObjectAlreadyExists:
+			error = "ResourceAlreadyExistsException";
+			break;
+		case basyx::object::error::MalformedRequest:
+			error = "MalformedRequestException";
+			break;
+		default:
+			error = "ProviderException";
+			break;
+		};
+		return error;
+	};
+
+	std::string prepareErrorMessage(basyx::object::error errorCode, const std::string & message)
+	{
+		return prepareErrorCode(errorCode) + ": " + message;
+	};
+}
+
+basyx::object build_exception(const std::string & type, const std::string & message)
+{
+	basyx::object::error error = basyx::object::error::ProviderException;
+
+	if (type == "ResourceNotFoundException")
+	{
+		error = basyx::object::error::PropertyNotFound;
+	}
+	else if (type == "ResourceAlreadyExistsException")
+	{
+		error = basyx::object::error::ObjectAlreadyExists;
+	}
+	else if (type == "MalformedRequestException")
+	{
+		error = basyx::object::error::MalformedRequest;
+	}
+	else if (type == "ProviderException")
+	{
+		error = basyx::object::error::ProviderException;
+	};
+
+	return basyx::object::make_error(error, message);
+};
+
+basyx::json_t EntityWrapper::build_from_error(basyx::object::error error, const std::string & message)
+{
+	json_t msg;
+	msg["messageType"] = 6;
+	msg["text"] = prepareErrorMessage(error, message);
+	msg["code"] = nullptr;
+
+	basyx::json_t j_obj;
+	j_obj["success"] = false;
+	j_obj["isException"] = true;
+	j_obj["messages"] = json_t::array({ msg });
+	j_obj["entityType"] = prepareErrorCode(error);
+	return j_obj;
+};
+
+basyx::json_t EntityWrapper::build_from_object(const basyx::object & object)
+{
+	basyx::json_t j_obj;
+	if (object.IsError())
+	{
+		return build_from_error(object.getError(), object.getErrorMessage());
+	}
+	else
+	{
+		j_obj["success"] = true;
+//		j_obj["isException"] = false;
+		j_obj["entityType"] = "entity";
+		j_obj["entity"] = basyx::serialization::json::serialize(object);
+	}
+	return j_obj;
+};
+
+
+basyx::object EntityWrapper::from_json(const basyx::json_t & json)
+{
+	bool success = json["success"];
+	// everyhing okay, deserialize entity
+	if (success)
+	{
+		if (json.contains("entity"))
+			return basyx::serialization::json::deserialize(json["entity"]);
+		else
+			return basyx::object::make_null();
+	}
+	// something went wrong, check for exception
+	else if (json.contains("isException") && json.contains("messages"))
+	{
+		return build_exception(json["entityType"], json["messages"][0]["text"]);
+	}
+	// error and no exception; create one
+	else
+	{
+		return basyx::object::make_error(basyx::object::error::MalformedRequest);
+	};
+};
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/src/vab/vab/backend/connector/native/frame/Frame.cpp b/sdks/c++/basys.sdk.cc/src/vab/vab/backend/connector/native/frame/Frame.cpp
new file mode 100644
index 0000000..9d7a649
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/src/vab/vab/backend/connector/native/frame/Frame.cpp
@@ -0,0 +1,166 @@
+#include <BaSyx/vab/backend/connector/native/frame/Frame.h>
+
+#include <BaSyx/util/tools/StringTools.h>
+
+using namespace basyx::vab::connector::native;
+
+Frame::Frame()
+	: flag(0xFF)
+	, value_1()
+	, value_2()
+{
+};
+
+Frame::Frame(uint8_t flag, const std::string & value_1) 
+	: flag(flag)
+	, value_1(value_1)
+	, value_2()
+{
+};
+
+Frame::Frame(uint8_t flag, const std::string & value_1, const std::string & value_2)
+	: flag(flag)
+	, value_1(value_1)
+	, value_2(value_2)
+{
+};
+
+uint8_t Frame::getFlag() const
+{
+	return this->flag;
+};
+
+void Frame::setFlag(uint8_t flag)
+{
+	this->flag = flag;
+};
+
+void Frame::setFlag(BaSyxCommand flag)
+{
+	this->flag = static_cast<decltype(this->flag)>(flag);
+};
+
+const std::string & Frame::getFirstValue() const
+{
+	return this->value_1;
+};
+
+void Frame::setFirstValue(const std::string & value)
+{
+	this->value_1 = value;
+};
+
+const std::string & Frame::getSecondValue() const
+{
+	return this->value_2;
+};
+
+void Frame::setSecondValue(const std::string & value)
+{
+	this->value_2 = value;
+};
+
+bool Frame::write_to_buffer(const basyx::net::Buffer & buffer, const Frame & frame)
+{
+	// bail out if buffer to small
+	if (frame.size() > buffer.size())
+		return false;
+
+	std::size_t pos = 0;
+	char * data = reinterpret_cast<char*>(buffer.data());
+
+	// write command field
+	data[pos] = static_cast<uint8_t>(frame.getFlag());
+	pos += 1;
+	
+	// write first value field
+	pos += StringTools::toArray(frame.getFirstValue(), &data[pos]);
+
+	// write second value field
+	if (!frame.getSecondValue().empty())
+	{
+		pos += StringTools::toArray(frame.getSecondValue(), &data[pos]);
+	};
+
+	return true;
+};
+
+Frame Frame::read_from_buffer(const basyx::net::Buffer & buffer)
+{
+	Frame frame;
+
+	std::size_t pos = 0;
+	char * data = reinterpret_cast<char*>(buffer.data());
+	
+	uint8_t flag = static_cast<uint8_t>(data[pos]);
+	frame.setFlag(flag);
+	pos += 1;
+
+	frame.setFirstValue(StringTools::fromArray(&data[pos]));
+	pos += frame.getFirstValue().size() + sizeof(uint32_t);
+
+	if (pos < buffer.size())
+	{
+		frame.setSecondValue(StringTools::fromArray(&data[pos]));
+		pos += frame.getSecondValue().size() + sizeof(uint32_t);
+	};
+
+	return frame;
+};
+
+std::size_t Frame::size() const
+{
+	std::size_t size = 1; // size of flag field
+	size += sizeof(uint32_t) + this->getFirstValue().size(); // size of first value + length
+
+	if(!this->getSecondValue().empty())
+		size += sizeof(uint32_t) + this->getSecondValue().size(); // size of second value + length
+
+	return size;
+};
+
+Frame Frame::Builder::Get(const std::string & path)
+{
+	return Frame{ static_cast<uint8_t>(BaSyxCommand::Get), path };
+};
+
+Frame Frame::Builder::Set(const std::string & path, const basyx::object & value)
+{
+	return Frame{
+		static_cast<uint8_t>(BaSyxCommand::Set),
+		path,
+		basyx::serialization::json::serialize(value).dump(4)
+	};
+};
+
+Frame Frame::Builder::Create(const std::string & path, const basyx::object & value)
+{
+	return Frame{
+		static_cast<uint8_t>(BaSyxCommand::Create),
+		path,
+		basyx::serialization::json::serialize(value).dump(4)
+	};
+};
+
+Frame Frame::Builder::Delete(const std::string & path)
+{
+	return Frame{ static_cast<uint8_t>(BaSyxCommand::Delete), path };
+}; 
+
+Frame Frame::Builder::Delete(const std::string & path, const basyx::object & value)
+{
+	return Frame{
+		static_cast<uint8_t>(BaSyxCommand::Delete),
+		path,
+		basyx::serialization::json::serialize(value).dump(4)
+	};
+};
+
+Frame Frame::Builder::Invoke(const std::string & path, const basyx::object & value)
+{
+	return Frame{
+		static_cast<uint8_t>(BaSyxCommand::Invoke),
+		path,
+		basyx::serialization::json::serialize(value).dump(4)
+	};
+};
\ No newline at end of file
