diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e23ece2c852415800ac224b74ede6c5849f6f88d
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,277 @@
+Eclipse Public License - v 2.0
+
+    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+    PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
+    OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+  a) in the case of the initial Contributor, the initial content
+     Distributed under this Agreement, and
+
+  b) in the case of each subsequent Contributor:
+     i) changes to the Program, and
+     ii) additions to the Program;
+  where such changes and/or additions to the Program originate from
+  and are Distributed by that particular Contributor. A Contribution
+  "originates" from a Contributor if it was added to the Program by
+  such Contributor itself or anyone acting on such Contributor's behalf.
+  Contributions do not include changes or additions to the Program that
+  are not Modified Works.
+
+"Contributor" means any person or entity that Distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions Distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement
+or any Secondary License (as applicable), including Contributors.
+
+"Derivative Works" shall mean any work, whether in Source Code or other
+form, that is based on (or derived from) the Program and for which the
+editorial revisions, annotations, elaborations, or other modifications
+represent, as a whole, an original work of authorship.
+
+"Modified Works" shall mean any work in Source Code or other form that
+results from an addition to, deletion from, or modification of the
+contents of the Program, including, for purposes of clarity any new file
+in Source Code form that contains any contents of the Program. Modified
+Works shall not include works that contain only declarations,
+interfaces, types, classes, structures, or files of the Program solely
+in each case in order to link to, bind by name, or subclass the Program
+or Modified Works thereof.
+
+"Distribute" means the acts of a) distributing or b) making available
+in any manner that enables the transfer of a copy.
+
+"Source Code" means the form of a Program preferred for making
+modifications, including but not limited to software source code,
+documentation source, and configuration files.
+
+"Secondary License" means either the GNU General Public License,
+Version 2.0, or any later versions of that license, including any
+exceptions or additional permissions as identified by the initial
+Contributor.
+
+2. GRANT OF RIGHTS
+
+  a) Subject to the terms of this Agreement, each Contributor hereby
+  grants Recipient a non-exclusive, worldwide, royalty-free copyright
+  license to reproduce, prepare Derivative Works of, publicly display,
+  publicly perform, Distribute and sublicense the Contribution of such
+  Contributor, if any, and such Derivative Works.
+
+  b) Subject to the terms of this Agreement, each Contributor hereby
+  grants Recipient a non-exclusive, worldwide, royalty-free patent
+  license under Licensed Patents to make, use, sell, offer to sell,
+  import and otherwise transfer the Contribution of such Contributor,
+  if any, in Source Code or other form. This patent license shall
+  apply to the combination of the Contribution and the Program if, at
+  the time the Contribution is added by the Contributor, such addition
+  of the Contribution causes such combination to be covered by the
+  Licensed Patents. The patent license shall not apply to any other
+  combinations which include the Contribution. No hardware per se is
+  licensed hereunder.
+
+  c) Recipient understands that although each Contributor grants the
+  licenses to its Contributions set forth herein, no assurances are
+  provided by any Contributor that the Program does not infringe the
+  patent or other intellectual property rights of any other entity.
+  Each Contributor disclaims any liability to Recipient for claims
+  brought by any other entity based on infringement of intellectual
+  property rights or otherwise. As a condition to exercising the
+  rights and licenses granted hereunder, each Recipient hereby
+  assumes sole responsibility to secure any other intellectual
+  property rights needed, if any. For example, if a third party
+  patent license is required to allow Recipient to Distribute the
+  Program, it is Recipient's responsibility to acquire that license
+  before distributing the Program.
+
+  d) Each Contributor represents that to its knowledge it has
+  sufficient copyright rights in its Contribution, if any, to grant
+  the copyright license set forth in this Agreement.
+
+  e) Notwithstanding the terms of any Secondary License, no
+  Contributor makes additional grants to any Recipient (other than
+  those set forth in this Agreement) as a result of such Recipient's
+  receipt of the Program under the terms of a Secondary License
+  (if permitted under the terms of Section 3).
+
+3. REQUIREMENTS
+
+3.1 If a Contributor Distributes the Program in any form, then:
+
+  a) the Program must also be made available as Source Code, in
+  accordance with section 3.2, and the Contributor must accompany
+  the Program with a statement that the Source Code for the Program
+  is available under this Agreement, and informs Recipients how to
+  obtain it in a reasonable manner on or through a medium customarily
+  used for software exchange; and
+
+  b) the Contributor may Distribute the Program under a license
+  different than this Agreement, provided that such license:
+     i) effectively disclaims on behalf of all other Contributors all
+     warranties and conditions, express and implied, including
+     warranties or conditions of title and non-infringement, and
+     implied warranties or conditions of merchantability and fitness
+     for a particular purpose;
+
+     ii) effectively excludes on behalf of all other Contributors all
+     liability for damages, including direct, indirect, special,
+     incidental and consequential damages, such as lost profits;
+
+     iii) does not attempt to limit or alter the recipients' rights
+     in the Source Code under section 3.2; and
+
+     iv) requires any subsequent distribution of the Program by any
+     party to be under a license that satisfies the requirements
+     of this section 3.
+
+3.2 When the Program is Distributed as Source Code:
+
+  a) it must be made available under this Agreement, or if the
+  Program (i) is combined with other material in a separate file or
+  files made available under a Secondary License, and (ii) the initial
+  Contributor attached to the Source Code the notice described in
+  Exhibit A of this Agreement, then the Program may be made available
+  under the terms of such Secondary Licenses, and
+
+  b) a copy of this Agreement must be included with each copy of
+  the Program.
+
+3.3 Contributors may not remove or alter any copyright, patent,
+trademark, attribution notices, disclaimers of warranty, or limitations
+of liability ("notices") contained within the Program from any copy of
+the Program which they Distribute, provided that Contributors may add
+their own appropriate notices.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program,
+the Contributor who includes the Program in a commercial product
+offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes
+the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and indemnify every
+other Contributor ("Indemnified Contributor") against any losses,
+damages and costs (collectively "Losses") arising from claims, lawsuits
+and other legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the Program
+in a commercial product offering. The obligations in this section do not
+apply to any claims or Losses relating to any actual or alleged
+intellectual property infringement. In order to qualify, an Indemnified
+Contributor must: a) promptly notify the Commercial Contributor in
+writing of such claim, and b) allow the Commercial Contributor to control,
+and cooperate with the Commercial Contributor in, the defense and any
+related settlement negotiations. The Indemnified Contributor may
+participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those performance
+claims and warranties, and if a court requires any other Contributor to
+pay any damages as a result, the Commercial Contributor must pay
+those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
+BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
+TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+PURPOSE. Each Recipient is solely responsible for determining the
+appropriateness of using and distributing the Program and assumes all
+risks associated with its exercise of rights under this Agreement,
+including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs
+or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
+SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
+EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further
+action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other software
+or hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of
+time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use
+and distribution of the Program as soon as reasonably practicable.
+However, Recipient's obligations under this Agreement and any licenses
+granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and
+may only be modified in the following manner. The Agreement Steward
+reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement
+Steward has the right to modify this Agreement. The Eclipse Foundation
+is the initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+Distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is published,
+Contributor may elect to Distribute the Program (including its
+Contributions) under the new version.
+
+Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
+receives no rights or licenses to the intellectual property of any
+Contributor under this Agreement, whether expressly, by implication,
+estoppel or otherwise. All rights in the Program not expressly granted
+under this Agreement are reserved. Nothing in this Agreement is intended
+to be enforceable by any entity that is not a Contributor or Recipient.
+No third-party beneficiary rights are created under this Agreement.
+
+Exhibit A - Form of Secondary Licenses Notice
+
+"This Source Code may also be made available under the following 
+Secondary Licenses when the conditions for such availability set forth 
+in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
+version(s), and exceptions or additional permissions here}."
+
+  Simply including a copy of this Agreement, including this Exhibit A
+  is not sufficient to license the Source Code under Secondary Licenses.
+
+  If it is not possible or desirable to put the notice in a particular
+  file, then You may include the notice in a location (such as a LICENSE
+  file in a relevant directory) where a recipient would be likely to
+  look for such a notice.
+
+  You may add additional accurate notices of copyright ownership.
\ No newline at end of file
diff --git a/MantleAPI/BUILD.bazel b/MantleAPI/BUILD.bazel
new file mode 100644
index 0000000000000000000000000000000000000000..02f78c62627606308879cc0ee81d5e438d6c0434
--- /dev/null
+++ b/MantleAPI/BUILD.bazel
@@ -0,0 +1,52 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+cc_library(
+    name = "mantle_api",
+    hdrs = glob([
+        "include/**/*.h",
+    ]),
+    includes = [
+        "include",
+    ],
+    visibility = [
+        "//visibility:public",
+    ],
+)
+
+cc_library(
+    name = "mantle_api_test_utils",
+    hdrs = glob([
+        "test/**/*.h",
+    ]),
+    includes = [
+        "test",
+    ],
+    visibility = [
+        "//visibility:public",
+    ],
+    deps = [
+        ":mantle_api",
+        "@googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "mantle_api_test",
+    timeout = "short",
+    srcs = ["test/interface_test.cpp"],
+    data = [
+        "//Core/Service/Testing:sanitizer-suppressions",
+    ],
+    tags = ["test"],
+    deps = [
+        ":mantle_api_test_utils",
+    ],
+)
diff --git a/MantleAPI/include/MantleAPI/Common/bounding_box.h b/MantleAPI/include/MantleAPI/Common/bounding_box.h
new file mode 100644
index 0000000000000000000000000000000000000000..3c611b8fd01f33e176786ba90d78aabbde9d2fcd
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/bounding_box.h
@@ -0,0 +1,34 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  bounding_box.h */
+//-----------------------------------------------------------------------------
+
+#ifndef MANTLEAPI_COMMON_BOUNDINGBOX_H
+#define MANTLEAPI_COMMON_BOUNDINGBOX_H
+
+#include <MantleAPI/Common/i_position.h>
+#include <MantleAPI/Common/vector.h>
+
+namespace mantle_api
+{
+/// Bounding box is defined in local object coordinate system.
+/// The origin of the object coordinate system is defined in relation to the geometric center.
+struct BoundingBox
+{
+    Vec3d geometric_center{0.0, 0.0, 0.0};
+    double width{0.0};
+    double length{0.0};
+    double height{0.0};
+};
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_COMMON_BOUNDINGBOX_H
diff --git a/MantleAPI/include/MantleAPI/Common/dimension.h b/MantleAPI/include/MantleAPI/Common/dimension.h
new file mode 100644
index 0000000000000000000000000000000000000000..f7650230ae3f51d87628ba79a5bd734c2cb91106
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/dimension.h
@@ -0,0 +1,46 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  dimension.h */
+//-----------------------------------------------------------------------------
+
+#ifndef MANTLEAPI_COMMON_DIMENSION_H
+#define MANTLEAPI_COMMON_DIMENSION_H
+
+#include <MantleAPI/Common/floating_point_helper.h>
+#include <MantleAPI/Common/vector.h>
+
+namespace mantle_api
+{
+
+template <typename T>
+struct Dimension3
+{
+    T length{};
+    T width{};
+    T height{};
+};
+
+using Dimension3d = Dimension3<double>;
+
+inline bool operator==(const Dimension3d& lhs, const Dimension3d& rhs) noexcept
+{
+    return IsEqual(lhs.length, rhs.length) && IsEqual(lhs.width, rhs.width) && IsEqual(lhs.height, rhs.height);
+}
+
+inline bool operator!=(const Dimension3d& lhs, const Dimension3d& rhs) noexcept
+{
+    return !(lhs == rhs);
+}
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_COMMON_DIMENSION_H
diff --git a/MantleAPI/include/MantleAPI/Common/floating_point_helper.h b/MantleAPI/include/MantleAPI/Common/floating_point_helper.h
new file mode 100644
index 0000000000000000000000000000000000000000..218c26ae1c07c9c56b0f5788372b561e0d7fc278
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/floating_point_helper.h
@@ -0,0 +1,93 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  floating_point_helper.h */
+//-----------------------------------------------------------------------------
+
+#ifndef THIRDPARTY_MANTLEAPI_INCLUDE_MANTLEAPI_COMMON_FLOATING_POINT_HELPER_H
+#define THIRDPARTY_MANTLEAPI_INCLUDE_MANTLEAPI_COMMON_FLOATING_POINT_HELPER_H
+
+#include <cmath>
+#include <limits>
+#include <type_traits>
+namespace mantle_api
+{
+
+/// @brief Compares two floating point numbers for equality.
+///
+/// **Attention** No approximation of the correct precision for the actual value is done!
+///
+/// This function uses a default precision of `std::numeric_limts<T>::epsilon()`, which means that without providing the
+/// precision yourself, it is only suited for
+/// * bit-wise equal numbers
+/// * numbers around 1 or smaller
+///
+/// @tparam T Floating point type, ensured by SFINAE
+/// @param lhs Left-hand operand
+/// @param rhs Right-hand operand
+/// @param precision Given precision, defaults to `std::numeric_limits<T>::epsilon()`.
+/// @return True if both numbers are equal within the given precision.
+template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>>* = nullptr>
+bool IsEqual(T lhs, T rhs, T precision = std::numeric_limits<T>::epsilon())
+{
+    return std::abs(lhs - rhs) < precision;
+}
+
+/// @brief Compares two floating point numbers for equality.
+///
+/// **Attention** No approximation of the correct precision for the actual value is done!
+///
+/// This function uses a default precision of `std::numeric_limts<T>::epsilon()`, which means that without providing the
+/// precision yourself, it is only suited for
+/// * bit-wise equal numbers
+/// * numbers around 1 or smaller
+///
+/// @tparam T Floating point type, ensured by SFINAE
+/// @param lhs Left-hand operand
+/// @param rhs Right-hand operand
+/// @param precision Given precision, defaults to `std::numeric_limits<T>::epsilon()`.
+/// @return True if lhs is greater than rhs or both numbers are equal within the given precision.
+template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>>* = nullptr>
+bool GreaterOrEqual(T lhs, T rhs, T precision = std::numeric_limits<T>::epsilon())
+{
+    if (lhs > rhs)
+    {
+        return true;
+    }
+    return IsEqual(lhs, rhs, precision);
+}
+
+/// @brief Compares two floating point numbers for equality.
+///
+/// **Attention** No approximation of the correct precision for the actual value is done!
+///
+/// This function uses a default precision of `std::numeric_limts<T>::epsilon()`, which means that without providing the
+/// precision yourself, it is only suited for
+/// * bit-wise equal numbers
+/// * numbers around 1 or smaller
+///
+/// @tparam T Floating point type, ensured by SFINAE
+/// @param lhs Left-hand operand
+/// @param rhs Right-hand operand
+/// @param precision Given precision, defaults to `std::numeric_limits<T>::epsilon()`.
+/// @return True if lhs is less than rhs or both numbers are equal within the given precision.
+template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>>* = nullptr>
+bool LessOrEqual(T lhs, T rhs, T precision = std::numeric_limits<T>::epsilon())
+{
+    if (lhs < rhs)
+    {
+        return true;
+    }
+    return IsEqual(lhs, rhs, precision);
+}
+}  // namespace mantle_api
+
+#endif  // THIRDPARTY_MANTLEAPI_INCLUDE_MANTLEAPI_COMMON_FLOATING_POINT_HELPER_H
diff --git a/MantleAPI/include/MantleAPI/Common/i_identifiable.h b/MantleAPI/include/MantleAPI/Common/i_identifiable.h
new file mode 100644
index 0000000000000000000000000000000000000000..71ea8d6eef94ef94ae915f3e5411d220647049eb
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/i_identifiable.h
@@ -0,0 +1,43 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  i_identifiable.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_COMMON_IIDENTIFIABLE_H
+#define MANTLEAPI_COMMON_IIDENTIFIABLE_H
+
+#include <cstdint>
+#include <string>
+
+namespace mantle_api
+{
+using UniqueId = std::uint64_t;
+
+/// Common interface for all classes that can be referenced by an ID or name.
+class IIdentifiable
+{
+  public:
+    virtual ~IIdentifiable() = default;
+
+    /// The unique id is provided and maintained by the scenario simulator.
+    virtual UniqueId GetUniqueId() const = 0;
+    /// Scenario specific name of an object.
+    ///
+    /// The scenario description is responsible for keeping the name unique.
+    virtual void SetName(const std::string& name) = 0;
+    virtual const std::string& GetName() const = 0;
+};
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_COMMON_IIDENTIFIABLE_H
diff --git a/MantleAPI/include/MantleAPI/Common/orientation.h b/MantleAPI/include/MantleAPI/Common/orientation.h
new file mode 100644
index 0000000000000000000000000000000000000000..d9651e5ad1840022b13c6bc41e471d66735355b2
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/orientation.h
@@ -0,0 +1,46 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  orientation.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef SIMULATOR_ORIENTATION_H
+#define SIMULATOR_ORIENTATION_H
+
+#include <MantleAPI/Common/floating_point_helper.h>
+
+namespace mantle_api
+{
+
+template <typename T>
+struct Orientation3
+{
+    T yaw{};
+    T pitch{};
+    T roll{};
+};
+
+using Orientation3d = Orientation3<double>;
+
+inline bool operator==(const Orientation3d& lhs, const Orientation3d& rhs) noexcept
+{
+    return IsEqual(lhs.yaw, rhs.yaw) && IsEqual(lhs.pitch, rhs.pitch) && IsEqual(lhs.roll, rhs.roll);
+}
+
+inline bool operator!=(const Orientation3d& lhs, const Orientation3d& rhs) noexcept
+{
+    return !(lhs == rhs);
+}
+
+}  // namespace mantle_api
+
+#endif  // SIMULATOR_ORIENTATION_H
diff --git a/MantleAPI/include/MantleAPI/Common/pose.h b/MantleAPI/include/MantleAPI/Common/pose.h
new file mode 100644
index 0000000000000000000000000000000000000000..57b41c93ae02d60f1698d1be04802ce9db193a47
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/pose.h
@@ -0,0 +1,31 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  pose.h */
+//-----------------------------------------------------------------------------
+
+#ifndef MANTLEAPI_COMMON_POSE_H
+#define MANTLEAPI_COMMON_POSE_H
+
+#include <MantleAPI/Common/orientation.h>
+#include <MantleAPI/Common/vector.h>
+
+namespace mantle_api
+{
+struct Pose
+{
+    Vec3d position{};
+    Orientation3d orientation{};
+};
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_COMMON_POSE_H
diff --git a/MantleAPI/include/MantleAPI/Common/position.h b/MantleAPI/include/MantleAPI/Common/position.h
new file mode 100644
index 0000000000000000000000000000000000000000..d8d0131405d76ecd6d2703e9eaa88e1da788e435
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/position.h
@@ -0,0 +1,82 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  position.h */
+//-----------------------------------------------------------------------------
+
+#ifndef SCENARIOABSTRACT_COMMON_IPOSITION_H
+#define SCENARIOABSTRACT_COMMON_IPOSITION_H
+
+#include <MantleAPI/Common/floating_point_helper.h>
+#include <MantleAPI/Common/vector.h>
+
+#include <cmath>
+#include <cstdint>
+#include <variant>
+
+namespace mantle_api
+{
+struct ReferencedObject
+{
+    std::int32_t road{0};
+    std::int32_t lane{0};
+};
+
+struct OpenDrivePosition
+{
+    ReferencedObject referenced_object{};
+
+    /// @brief Offset in s direction, unit: [m]
+    double s_offset{0.0};
+    /// @brief Offset in t direction, unit: [m]
+    double t_offset{0.0};
+};
+
+struct LatLonPosition
+{
+    /// @brief GPS latitude, unit: [rad]
+    double latitude{0.0};
+    /// @brief GPS longitude, unit: [rad]
+    double longitude{0.0};
+};
+
+using Position = std::variant<OpenDrivePosition, LatLonPosition, Vec3d>;
+
+/// @brief Equality comparison for OpenDrivePosition.
+///
+/// **Attention** Floating-point comparision may require tweaks in precision.
+inline bool operator==(const OpenDrivePosition& lhs, const OpenDrivePosition& rhs) noexcept
+{
+    return lhs.referenced_object.road == rhs.referenced_object.road &&
+           lhs.referenced_object.lane == rhs.referenced_object.lane && IsEqual(lhs.s_offset, rhs.s_offset) &&
+           IsEqual(lhs.t_offset, rhs.t_offset);
+}
+
+inline bool operator!=(const OpenDrivePosition& lhs, const OpenDrivePosition& rhs) noexcept
+{
+    return !(lhs == rhs);
+}
+
+/// @brief Equality comparison for LatLonPosition.
+///
+/// **Attention** Floating-point comparision may require tweaks in precision.
+inline bool operator==(const LatLonPosition& lhs, const LatLonPosition& rhs) noexcept
+{
+    return IsEqual(lhs.latitude, rhs.latitude) && IsEqual(lhs.longitude, rhs.longitude);
+}
+
+inline bool operator!=(const LatLonPosition& lhs, const LatLonPosition& rhs) noexcept
+{
+    return !(lhs == rhs);
+}
+
+}  // namespace mantle_api
+#endif  // SCENARIOABSTRACT_COMMON_IPOSITION_H
diff --git a/MantleAPI/include/MantleAPI/Common/simulation_time.h b/MantleAPI/include/MantleAPI/Common/simulation_time.h
new file mode 100644
index 0000000000000000000000000000000000000000..4e94030aeab93a12ead91e2a2481753d9b19e029
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/simulation_time.h
@@ -0,0 +1,25 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  simulation_time.h */
+//-----------------------------------------------------------------------------
+
+#ifndef SCENARIOABSTRACT_COMMON_SIMULATION_TIME_H
+#define SCENARIOABSTRACT_COMMON_SIMULATION_TIME_H
+
+#include <chrono>
+
+namespace mantle_api
+{
+using SimulationTime = std::chrono::duration<std::int64_t, std::milli>;
+}
+
+#endif  // SCENARIOABSTRACT_COMMON_SIMULATION_TIME_H
\ No newline at end of file
diff --git a/MantleAPI/include/MantleAPI/Common/spline.h b/MantleAPI/include/MantleAPI/Common/spline.h
new file mode 100644
index 0000000000000000000000000000000000000000..9c399447aedb3c57b5ac8fc15da7fad7200e3f8f
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/spline.h
@@ -0,0 +1,50 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  spline.h */
+//-----------------------------------------------------------------------------
+
+#ifndef SCENARIOABSTRACT_COMMON_SPLINE_H
+#define SCENARIOABSTRACT_COMMON_SPLINE_H
+
+#include <MantleAPI/Common/floating_point_helper.h>
+#include <MantleAPI/Common/simulation_time.h>
+
+#include <array>
+
+namespace mantle_api
+{
+struct SplineSection
+{
+    mantle_api::SimulationTime start_time{0};
+    mantle_api::SimulationTime end_time{0};
+    /// @brief Represents the polynomial.
+    ///
+    /// The array stores in format \f$[a_3, a_2, a_1, a_0]\f$ for a polynomial in form
+    /// \f[
+    ///   P(x) = \sum_{i=0}^{3} a_{i} x^{i} = a_3 x^3 + a_2 x^2 + a_1 x + a_0
+    /// \f]
+    std::array<double, 4> polynomial;
+};
+
+/// @brief Equality comparison for SplineSection.
+inline bool operator==(const SplineSection& lhs, const SplineSection& rhs) noexcept
+{
+    return lhs.start_time == rhs.start_time && lhs.end_time == rhs.end_time &&
+           std::equal(lhs.polynomial.begin(),
+                      lhs.polynomial.end(),
+                      rhs.polynomial.begin(),
+                      [](const double a, const double b) { return IsEqual(a, b); });
+}
+
+}  // namespace mantle_api
+
+#endif  // SCENARIOABSTRACT_COMMON_SPLINE_H
\ No newline at end of file
diff --git a/MantleAPI/include/MantleAPI/Common/vector.h b/MantleAPI/include/MantleAPI/Common/vector.h
new file mode 100644
index 0000000000000000000000000000000000000000..2405e5a49bfec554660c5b8dc4dc51b4a4369533
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Common/vector.h
@@ -0,0 +1,60 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  vector.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_COMMON_VECTOR_H
+#define MANTLEAPI_COMMON_VECTOR_H
+
+#include <MantleAPI/Common/floating_point_helper.h>
+
+#include <cstdint>
+
+namespace mantle_api
+{
+
+template <typename T>
+struct Vec3
+{
+    Vec3() = default;
+    Vec3(T x, T y, T z) : x{x}, y{y}, z{z} {}
+
+    T x{};
+    T y{};
+    T z{};
+};
+using Vec3d = Vec3<double>;
+
+inline bool operator==(const Vec3d& lhs, const Vec3d& rhs) noexcept
+{
+    return IsEqual(lhs.x, rhs.x) && IsEqual(lhs.y, rhs.y) && IsEqual(lhs.z, rhs.z);
+}
+
+inline bool operator!=(const Vec3d& lhs, const Vec3d& rhs) noexcept
+{
+    return !(lhs == rhs);
+}
+
+inline Vec3d operator-(const Vec3d& lhs, const Vec3d& rhs) noexcept
+{
+    return {lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z};
+}
+
+inline Vec3d operator+(const Vec3d& lhs, const Vec3d& rhs) noexcept
+{
+    return {lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z};
+}
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_COMMON_VECTOR_H
diff --git a/MantleAPI/include/MantleAPI/EnvironmentalConditions/road_condition.h b/MantleAPI/include/MantleAPI/EnvironmentalConditions/road_condition.h
new file mode 100644
index 0000000000000000000000000000000000000000..fdabdd08e7e9700e1854166b4efc6ee78d7d7116
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/EnvironmentalConditions/road_condition.h
@@ -0,0 +1,34 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  road_condition.h */
+//-----------------------------------------------------------------------------
+
+#ifndef MANTLEAPI_ENVIRONMENTALCONDITIONS_ROADCONDITION_H
+#define MANTLEAPI_ENVIRONMENTALCONDITIONS_ROADCONDITION_H
+
+#include <MantleAPI/Common/position.h>
+namespace mantle_api
+{
+
+struct Rectangle
+{
+    Position bottom_left;
+    Position top_right;
+};
+
+struct FrictionPatch
+{
+    Rectangle bounding_box;
+    double friction;
+};
+}  // namespace mantle_api
+#endif  // MANTLEAPI_ENVIRONMENTALCONDITIONS_ROADCONDITION_H
diff --git a/MantleAPI/include/MantleAPI/EnvironmentalConditions/weather.h b/MantleAPI/include/MantleAPI/EnvironmentalConditions/weather.h
new file mode 100644
index 0000000000000000000000000000000000000000..955b720c74ef22c45a06d8a6b0473ae68910e06c
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/EnvironmentalConditions/weather.h
@@ -0,0 +1,79 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  weather.h */
+//-----------------------------------------------------------------------------
+
+#ifndef MANTLEAPI_ENVIRONMENTALCONDITIONS_WEATHER_H
+#define MANTLEAPI_ENVIRONMENTALCONDITIONS_WEATHER_H
+
+#include <chrono>
+
+using Milliseconds = std::chrono::duration<int64_t, std::ratio<1, 1000>>;
+
+namespace mantle_api
+{
+enum class Precipitation
+{
+    kUnknown,
+    kOther,
+    kNone,
+    kVeryLight,
+    kLight,
+    kModerate,
+    kHeavy,
+    kVeryHeavy,
+    kExtreme
+};
+
+enum class Fog
+{
+    kUnknown,
+    kOther,
+    kExcellentVisibility,
+    kGoodVisibility,
+    kModerateVisibility,
+    kPoorVisibility,
+    kMist,
+    kLight,
+    kThick,
+    kDense
+};
+
+enum class Illumination
+{
+    kUnknown,
+    kOther,
+    kLevel1,
+    kLevel2,
+    kLevel3,
+    kLevel4,
+    kLevel5,
+    kLevel6,
+    kLevel7,
+    kLevel8,
+    kLevel9
+};
+
+struct Weather
+{
+    Fog fog{Fog::kUnknown};
+    Precipitation precipitation{Precipitation::kUnknown};
+    Illumination illumination{Illumination::kUnknown};
+    double humidity_percent{0.0};
+    double temperature_kelvin{0.0};
+    double atmospheric_pressure_pascal{0.0};
+
+    Milliseconds date_time_ms{0};  // TODO: we should move this out of the weather...?!
+};
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_ENVIRONMENTALCONDITIONS_WEATHER_H
diff --git a/MantleAPI/include/MantleAPI/Execution/i_environment.h b/MantleAPI/include/MantleAPI/Execution/i_environment.h
new file mode 100644
index 0000000000000000000000000000000000000000..1983b4dc57a7aed50b1e3feb6e41e6cf3591df74
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Execution/i_environment.h
@@ -0,0 +1,71 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  i_environment.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_EXECUTION_IENVIRONMENT_H
+#define MANTLEAPI_EXECUTION_IENVIRONMENT_H
+
+#include <MantleAPI/EnvironmentalConditions/road_condition.h>
+#include <MantleAPI/EnvironmentalConditions/weather.h>
+#include <MantleAPI/Map/i_coord_converter.h>
+#include <MantleAPI/Map/i_lane_location_query_service.h>
+#include <MantleAPI/Traffic/i_entity_repository.h>
+
+#include <string>
+
+namespace mantle_api
+{
+
+class IEnvironment
+{
+  public:
+    virtual ~IEnvironment() = default;
+
+    virtual void Init() = 0;
+    virtual void Step() = 0;
+
+    /// Load a map file and parse it into the memory.
+    ///
+    /// @param file_path raw map file path from the scenario file. Resolving to a valid file path is done in the
+    ///                  environment.
+    virtual void CreateMap(const std::string& file_path, const std::vector<Position>& map_region) = 0;
+
+    /// Creates a controller from the given config. A created controller can be assigned to multiple entities.
+    ///
+    /// @param config Specifies what kind of controller shall be created. The config needs to contain an ID to
+    ///               in order to be able to assign this controller to an entity.
+    virtual void CreateController(std::unique_ptr<IControllerConfig> config) = 0;
+
+    /// Assigns an entity to a copy of the specified controller. This controller needs to be created beforehand.
+    ///
+    /// @param entity The entity to be manipulated by the specified controller.
+    /// @param controller_id Identifies the controller to manipulate the entity.
+    virtual void AddEntityToController(IEntity& entity, std::uint64_t controller_id) = 0;
+
+    virtual const ILaneLocationQueryService& GetQueryService() const = 0;
+    virtual const ICoordConverter* GetConverter() const = 0;
+
+    virtual IEntityRepository& GetEntityRepository() = 0;
+    virtual const IEntityRepository& GetEntityRepository() const = 0;
+
+    /// @brief DateTime in UTC (converted from RFC 3339 standard)
+    virtual void SetDateTime(std::chrono::duration<std::int64_t, std::milli> date_time) = 0;
+    virtual std::chrono::duration<std::int64_t, std::milli> GetDateTime() = 0;
+
+    virtual void SetWeather(Weather weather) = 0;
+    virtual void SetRoadCondition(std::vector<FrictionPatch> friction_patches) = 0;
+};
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_EXECUTION_IENVIRONMENT_H
diff --git a/MantleAPI/include/MantleAPI/Execution/i_scenario_engine.h b/MantleAPI/include/MantleAPI/Execution/i_scenario_engine.h
new file mode 100644
index 0000000000000000000000000000000000000000..ee08f52cda8a7615d1bf8508f6a06aec0c6fc888
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Execution/i_scenario_engine.h
@@ -0,0 +1,48 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  i_scenario_engine.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_EXECUTION_ISCENARIOENGINE_H
+#define MANTLEAPI_EXECUTION_ISCENARIOENGINE_H
+
+#include <MantleAPI/Execution/scenario_info.h>
+
+#include <string>
+
+namespace mantle_api
+{
+class IScenarioEngine
+{
+  public:
+    virtual ~IScenarioEngine() = default;
+
+    /// Initialization of the scenario state, e.g. loading the scenario file, map file, etc.
+    virtual void Init() = 0;
+
+    /// Provide information about the scenario loaded in `Init()`
+    virtual ScenarioInfo GetScenarioInfo() const = 0;
+
+    /// Calculate the new state of the scenario implementation.
+    ///
+    /// Calling this function after `IsFinished()` should be a no-op.
+    /// @see IsFinished()
+    virtual void Step() = 0;
+
+    /// Indicates whether the scenario implementation has finished processing the scenario (end of scenario is reached).
+    /// @return `true` if processing the scenario is complete, `false` otherwise.
+    virtual bool IsFinished() const = 0;
+};
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_EXECUTION_ISCENARIOENGINE_H
diff --git a/MantleAPI/include/MantleAPI/Execution/scenario_info.h b/MantleAPI/include/MantleAPI/Execution/scenario_info.h
new file mode 100644
index 0000000000000000000000000000000000000000..3bf2b708d792bd7dae5a42abaa45f6a490e1faab
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Execution/scenario_info.h
@@ -0,0 +1,36 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  scenario_info.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_EXECUTION_SCENARIOINFO_H
+#define MANTLEAPI_EXECUTION_SCENARIOINFO_H
+
+#include <MantleAPI/Execution/simulation_time.h>
+
+#include <map>
+#include <string>
+
+namespace mantle_api
+{
+
+struct ScenarioInfo
+{
+    SimulationTime scenario_timeout_duration;
+    std::string description;
+    std::map<std::string, std::string> additional_information;
+};
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_EXECUTION_SCENARIOINFO_H
diff --git a/MantleAPI/include/MantleAPI/Execution/simulation_time.h b/MantleAPI/include/MantleAPI/Execution/simulation_time.h
new file mode 100644
index 0000000000000000000000000000000000000000..ab2974898d2b3e0819441396a953918c49d9d612
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Execution/simulation_time.h
@@ -0,0 +1,30 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  simulation_time.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_EXECUTION_SIMULATIONTIME_H
+#define MANTLEAPI_EXECUTION_SIMULATIONTIME_H
+
+#include <chrono>
+#include <cstdint>
+
+namespace mantle_api
+{
+
+/// @brief Use milliseconds with std::int64_t representation as simulation time
+using SimulationTime = std::chrono::duration<std::int64_t, std::milli>;
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_EXECUTION_SIMULATIONTIME_H
diff --git a/MantleAPI/include/MantleAPI/Map/i_coord_converter.h b/MantleAPI/include/MantleAPI/Map/i_coord_converter.h
new file mode 100644
index 0000000000000000000000000000000000000000..ed3cdb33deb0453c832a0607aa375a857b38ae2d
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Map/i_coord_converter.h
@@ -0,0 +1,39 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  i_coord_converter.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_MAP_ICOORDCONVERTER_H
+#define MANTLEAPI_MAP_ICOORDCONVERTER_H
+
+#include <MantleAPI/Common/position.h>
+#include <MantleAPI/Common/vector.h>
+
+namespace mantle_api
+{
+
+/// Interface that provides functionality to query the underlying map with regard to transformation of different
+/// position types, curvature, elevation etc.
+class ICoordConverter
+{
+  public:
+    virtual ~ICoordConverter() = default;
+    /// Converts a track position to its corresponding inertial position.
+    virtual Vec3d Convert(Position position) const = 0;
+
+    /// Converts alane position to its corresponding inertial position.
+    virtual Position Convert(Vec3d) const = 0;
+};
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_MAP_ICOORDCONVERTER_H
diff --git a/MantleAPI/include/MantleAPI/Map/i_lane_location_query_service.h b/MantleAPI/include/MantleAPI/Map/i_lane_location_query_service.h
new file mode 100644
index 0000000000000000000000000000000000000000..c5703824efa4b489e04f99f67e569eeca6814e3a
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Map/i_lane_location_query_service.h
@@ -0,0 +1,38 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  i_lane_location_query_service.h */
+//-----------------------------------------------------------------------------
+
+#ifndef MANTLEAPI_MAP_IQUERYSERVICE_H
+#define MANTLEAPI_MAP_IQUERYSERVICE_H
+
+#include <MantleAPI/Common/i_identifiable.h>
+
+namespace mantle_api
+{
+
+/// Abstraction layer for all map related functions.
+class ILaneLocationQueryService
+{
+  public:
+    virtual ~ILaneLocationQueryService() = default;
+
+    /// TODO: Currently LaneLocationProvider just inherits from this for the sake of easily passing it to the
+    /// controllers
+    /// Therefore the GetMapObjectById function has been removed from the interface - for now.
+    /// We need to think about proper interface functions we want to define here (GetLaneLocation? GetLanes? But this
+    /// would add a rat-tail of more interfaces we need to define (ILaneLocation, ILane, ...?)
+    // virtual const IIdentifiable& GetMapObjectById(UniqueId id) = 0;
+};
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_MAP_IQUERYSERVICE_H
diff --git a/MantleAPI/include/MantleAPI/Map/i_route.h b/MantleAPI/include/MantleAPI/Map/i_route.h
new file mode 100644
index 0000000000000000000000000000000000000000..e13adac7a575dfeb49870713db6453321b352d6e
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Map/i_route.h
@@ -0,0 +1,60 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  i_route.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_MAP_IROUTE_H
+#define MANTLEAPI_MAP_IROUTE_H
+
+#include <MantleAPI/Common/i_identifiable.h>
+#include <MantleAPI/Common/vector.h>
+
+namespace mantle_api
+{
+enum class LaneId
+{
+    kLeft9,
+    kLeft8,
+    kLeft7,
+    kLeft6,
+    kLeft5,
+    kLeft4,
+    kLeft3,
+    kLeft2,
+    kLeft1,
+    kRef,
+    kRight1,
+    kRight2,
+    kRight3,
+    kRight4,
+    kRight5,
+    kRight6,
+    kRight7,
+    kRight8,
+    kRight9
+};
+
+class IRoute : public virtual IIdentifiable
+{
+  public:
+    virtual IRoute& AddWaypoint(const Vec3d& inert_pos) = 0;
+    virtual IRoute& AddWaypoint(Vec3d&& inert_pos) = 0;
+    virtual Vec3d GetInertPos(double route_pos, LaneId lane_id, double lane_offset = 0) const = 0;
+    virtual double GetLaneWidth(double route_pos, LaneId lane_id) const = 0;
+    virtual LaneId GetLaneId(const Vec3d& inert_pos) const = 0;
+    virtual double GetDistanceFromStartTo(const Vec3d& inert_pos) const = 0;
+    virtual double GetLength() const = 0;
+};
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_MAP_IROUTE_H
diff --git a/MantleAPI/include/MantleAPI/Traffic/entity_properties.h b/MantleAPI/include/MantleAPI/Traffic/entity_properties.h
new file mode 100644
index 0000000000000000000000000000000000000000..5800b3d4945cb78fdcfa13ac146d8d71a31a9750
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Traffic/entity_properties.h
@@ -0,0 +1,139 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  entity_properties.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_TRAFFIC_ENTITYPROPERTIES_H
+#define MANTLEAPI_TRAFFIC_ENTITYPROPERTIES_H
+
+#include <MantleAPI/Common/dimension.h>
+#include <MantleAPI/Common/floating_point_helper.h>
+#include <MantleAPI/Common/vector.h>
+
+#include <string>
+
+namespace mantle_api
+{
+enum class EntityType
+{
+    // Other (unspecified but known) type of moving object.
+    kOther = 1,
+    // Object is a vehicle.
+    kVehicle = 2,
+    // Object is a pedestrian.
+    kPedestrian = 3,
+    // Object is an animal.
+    kAnimal = 4
+};
+
+/// Basic properties that describe scenario entities.
+struct EntityProperties
+{
+    virtual ~EntityProperties() = default;
+
+    Dimension3d dimension{0.0, 0.0, 0.0};
+    EntityType type{EntityType::kOther};
+    std::string model{};
+};
+
+inline bool operator==(const EntityProperties& lhs, const EntityProperties& rhs) noexcept
+{
+    return lhs.dimension == rhs.dimension && lhs.type == rhs.type && lhs.model == rhs.model;
+}
+
+enum class VehicleClass
+{
+    kOther = 1,  // Other (unspecified but known) type of vehicle.
+    // Vehicle is a small car.
+    // Definition: Hatchback car with maximum length 4 m.
+    kSmall_car = 2,
+    // Vehicle is a compact car.
+    // Definition: Hatchback car with length between 4 and 4.5 m.
+    kCompact_car = 3,
+    // Vehicle is a medium car.
+    // Definition: Hatchback or sedan with length between 4.5 and 5 m.
+    kMedium_car = 4,
+    // Vehicle is a luxury car.
+    // Definition: Sedan or coupe that is longer then 5 m.
+    kLuxury_car = 5,
+    // Vehicle is a delivery van.
+    // Definition: A delivery van.
+    kDelivery_van = 6,
+    // Vehicle is a heavy truck.
+    kHeavy_truck = 7,
+    // Vehicle is a truck with semitrailer.
+    kSemitrailer = 8,
+    // Vehicle is a trailer (possibly attached to another vehicle).
+    kTrailer = 9,
+    // Vehicle is a motorbike or moped.
+    kMotorbike = 10,
+    // Vehicle is a bicycle (without motor and specific lights).
+    kBicycle = 11,
+    // Vehicle is a bus.
+    kBus = 12,
+    // Vehicle is a tram.
+    kTram = 13,
+    // Vehicle is a train.
+    kTrain = 14,
+    // Vehicle is a wheelchair.
+    kWheelchair = 15,
+    // Vehicle type not specified properly.
+    kInvalid = -1
+};
+
+enum class IndicatorState
+{
+    // Indicator state is unknown (must not be used in ground truth).
+    kUnknown = 0,
+    // Other (unspecified but known) state of indicator.
+    kOther = 1,
+    // Indicators are off.
+    kOff = 2,
+    // Left indicator is on.
+    kLeft = 3,
+    // Right indicator is on.
+    kRight = 4,
+    // Hazard/warning light, i.e. both indicators, are on.
+    kWarning = 5
+};
+
+struct VehicleProperties : public EntityProperties
+{
+    VehicleClass classification{VehicleClass::kOther};
+    Vec3d bb_center_to_front{};
+    Vec3d bb_center_to_rear{};
+    double front_wheel_diameter{0.0};
+    double rear_wheel_diameter{0.0};
+    bool is_host{false};
+};
+
+inline bool operator==(const VehicleProperties& lhs, const VehicleProperties& rhs) noexcept
+{
+    return lhs.dimension == rhs.dimension && lhs.type == rhs.type && lhs.model == rhs.model &&
+           lhs.classification == rhs.classification && lhs.bb_center_to_front == rhs.bb_center_to_front &&
+           lhs.bb_center_to_rear == rhs.bb_center_to_rear &&
+           IsEqual(lhs.front_wheel_diameter, rhs.front_wheel_diameter) &&
+           IsEqual(lhs.rear_wheel_diameter, rhs.rear_wheel_diameter) && lhs.is_host == rhs.is_host;
+}
+
+struct PedestrianProperties : public EntityProperties
+{
+};
+
+struct StaticObjectProperties : public EntityProperties
+{
+};
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_TRAFFIC_ENTITYPROPERTIES_H
diff --git a/MantleAPI/include/MantleAPI/Traffic/i_controller_config.h b/MantleAPI/include/MantleAPI/Traffic/i_controller_config.h
new file mode 100644
index 0000000000000000000000000000000000000000..6e4ca6d23c8ec4084c05d4c5fc74d4a2c2d30fcf
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Traffic/i_controller_config.h
@@ -0,0 +1,52 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  i_controller_config.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_TRAFFIC_ICONTROLLERCONFIG_H
+#define MANTLEAPI_TRAFFIC_ICONTROLLERCONFIG_H
+
+#include <MantleAPI/Common/spline.h>
+#include <MantleAPI/Map/i_lane_location_query_service.h>
+
+#include <vector>
+
+namespace mantle_api
+{
+
+struct IControllerConfig
+{
+    virtual ~IControllerConfig() = default;
+
+    ILaneLocationQueryService* map_query_service{nullptr};
+    std::uint64_t id{0};
+};
+
+struct NoOpControllerConfig : public IControllerConfig
+{
+};
+
+struct PathControllerConfig : public IControllerConfig
+{
+    std::vector<mantle_api::Vec3d> waypoints{};
+};
+
+struct TrajectoryControllerConfig : public IControllerConfig
+{
+    std::vector<mantle_api::SplineSection> heading_splines;
+    std::vector<mantle_api::SplineSection> velocity_splines;
+};
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_TRAFFIC_ICONTROLLERCONFIG_H
diff --git a/MantleAPI/include/MantleAPI/Traffic/i_entity.h b/MantleAPI/include/MantleAPI/Traffic/i_entity.h
new file mode 100644
index 0000000000000000000000000000000000000000..ba688c174f90bb14c3c4ac66433aa6d0e99ee349
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Traffic/i_entity.h
@@ -0,0 +1,83 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  i_entity.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_TRAFFIC_IENTITY_H
+#define MANTLEAPI_TRAFFIC_IENTITY_H
+
+#include <MantleAPI/Common/bounding_box.h>
+#include <MantleAPI/Common/i_identifiable.h>
+#include <MantleAPI/Common/pose.h>
+#include <MantleAPI/Traffic/entity_properties.h>
+#include <MantleAPI/Traffic/i_controller_config.h>
+
+#include <memory>
+#include <vector>
+
+namespace mantle_api
+{
+/// Base interface for all static and dynamic scenario entities.
+class IEntity : public IIdentifiable
+{
+  public:
+    virtual void SetPosition(const Vec3d& inert_pos) = 0;
+    virtual Vec3d GetPosition() const = 0;
+
+    virtual void SetOrientation(const Orientation3d& orientation) = 0;
+    virtual Orientation3d GetOrientation() const = 0;
+
+    virtual void SetBoundingBox(const BoundingBox& bounding_box) = 0;
+    virtual BoundingBox GetBoundingBox() const = 0;
+
+    virtual void SetVelocity(const Vec3d& velocity) = 0;
+    virtual Vec3d GetVelocity() const = 0;
+
+    virtual void SetAcceleration(const Vec3d& acceleration) = 0;
+    virtual Vec3d GetAcceleration() const = 0;
+
+    virtual void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) = 0;
+    virtual EntityProperties* GetProperties() const = 0;
+
+    // TODO: evaluate if this will be part of the final interface or if this for simulator only (= defined in Vehicle entity)
+    virtual void SetAssignedLaneIds(const std::vector<std::uint64_t>& assigned_lane_ids) = 0;
+    virtual std::vector<std::uint64_t> GetAssignedLaneIds() const = 0;
+};
+
+class IVehicle : public virtual IEntity
+{
+  public:
+    virtual VehicleProperties* GetProperties() const = 0;
+
+    virtual void SetIndicatorState(IndicatorState state) = 0;
+    virtual IndicatorState GetIndicatorState() const = 0;
+
+    //    virtual bool IsHost() const = 0;
+    //    virtual void SetHost() = 0;
+};
+
+class IPedestrian : public virtual IEntity
+{
+  public:
+    virtual PedestrianProperties* GetProperties() const = 0;
+};
+
+class IStaticObject : public virtual IEntity
+{
+  public:
+    virtual StaticObjectProperties* GetProperties() const = 0;
+};
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_TRAFFIC_IENTITY_H
diff --git a/MantleAPI/include/MantleAPI/Traffic/i_entity_repository.h b/MantleAPI/include/MantleAPI/Traffic/i_entity_repository.h
new file mode 100644
index 0000000000000000000000000000000000000000..c547f80ecf8140d5659ef7ec7d0776f77ee1fc14
--- /dev/null
+++ b/MantleAPI/include/MantleAPI/Traffic/i_entity_repository.h
@@ -0,0 +1,51 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  i_entity_repository.h */
+//-----------------------------------------------------------------------------
+
+
+#ifndef MANTLEAPI_TRAFFIC_IENTITYREPOSITORY_H
+#define MANTLEAPI_TRAFFIC_IENTITYREPOSITORY_H
+
+#include <MantleAPI/Traffic/entity_properties.h>
+#include <MantleAPI/Traffic/i_entity.h>
+
+#include <string>
+#include <vector>
+
+namespace mantle_api
+{
+/// This interface provides CRUD functionality for scenario entities.
+class IEntityRepository
+{
+  public:
+    virtual IVehicle& Create(const std::string& name, const VehicleProperties& properties) = 0;
+    virtual IVehicle& Create(UniqueId id, const std::string& name, const VehicleProperties& properties) = 0;
+    virtual IPedestrian& Create(const std::string& name, const PedestrianProperties& properties) = 0;
+    virtual IPedestrian& Create(UniqueId id, const std::string& name, const PedestrianProperties& properties) = 0;
+    virtual IStaticObject& Create(const std::string& name, const StaticObjectProperties& properties) = 0;
+    virtual IStaticObject& Create(UniqueId id, const std::string& name, const StaticObjectProperties& properties) = 0;
+
+    virtual IVehicle& GetHost() = 0;
+    virtual IEntity& Get(const std::string& name) = 0;
+    virtual IEntity& Get(UniqueId id) = 0;
+    virtual bool Contains(UniqueId id) const = 0;
+
+    virtual void Delete(const std::string& name) = 0;
+    virtual void Delete(UniqueId id) = 0;
+
+    virtual const std::vector<std::unique_ptr<mantle_api::IEntity>>& GetEntities() const = 0;
+};
+
+}  // namespace mantle_api
+
+#endif  // MANTLEAPI_TRAFFIC_IENTITYREPOSITORY_H
diff --git a/MantleAPI/test/MantleAPI/Test/test_utils.h b/MantleAPI/test/MantleAPI/Test/test_utils.h
new file mode 100644
index 0000000000000000000000000000000000000000..36eb1d81762289894337aab48c28fcb97b6b40d5
--- /dev/null
+++ b/MantleAPI/test/MantleAPI/Test/test_utils.h
@@ -0,0 +1,306 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  test_utils.h */
+//-----------------------------------------------------------------------------
+
+#pragma once
+
+#include <MantleAPI/Common/i_identifiable.h>
+#include <MantleAPI/Common/position.h>
+#include <MantleAPI/EnvironmentalConditions/road_condition.h>
+#include <MantleAPI/EnvironmentalConditions/weather.h>
+#include <MantleAPI/Execution/i_environment.h>
+#include <MantleAPI/Map/i_coord_converter.h>
+#include <MantleAPI/Map/i_lane_location_query_service.h>
+#include <MantleAPI/Traffic/entity_properties.h>
+#include <MantleAPI/Traffic/i_controller_config.h>
+#include <MantleAPI/Traffic/i_entity.h>
+#include <MantleAPI/Traffic/i_entity_repository.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+namespace mantle_api
+{
+
+class MockConverter : public mantle_api::ICoordConverter
+{
+  public:
+    mantle_api::Vec3d Convert(mantle_api::Position position) const override
+    {
+        std::ignore = position;
+        return mantle_api::Vec3d();
+    }
+
+    mantle_api::Position Convert(mantle_api::Vec3d vec) const override
+    {
+        std::ignore = vec;
+        return mantle_api::Position{};
+    }
+};
+
+class MockVehicle : public mantle_api::IVehicle
+{
+  public:
+    mantle_api::UniqueId GetUniqueId() const override { return 0; }
+
+    void SetName(const std::string& name) override { name_ = name; }
+    const std::string& GetName() const override { return name_; }
+
+    void SetPosition(const mantle_api::Vec3d& inert_pos) override { std::ignore = inert_pos; }
+    mantle_api::Vec3d GetPosition() const override { return mantle_api::Vec3d(); }
+
+    void SetOrientation(const mantle_api::Orientation3d& orientation) override { std::ignore = orientation; }
+    mantle_api::Orientation3d GetOrientation() const override { return mantle_api::Orientation3d(); }
+
+    void SetBoundingBox(const mantle_api::BoundingBox& bounding_box) override { std::ignore = bounding_box; }
+    mantle_api::BoundingBox GetBoundingBox() const override { return mantle_api::BoundingBox(); }
+
+    void SetVelocity(const mantle_api::Vec3d& velocity) override { std::ignore = velocity; }
+    mantle_api::Vec3d GetVelocity() const override { return {}; }
+
+    void SetAcceleration(const mantle_api::Vec3d& acceleration) override { std::ignore = acceleration; }
+    mantle_api::Vec3d GetAcceleration() const override { return {}; }
+
+    void SetAssignedLaneIds(const std::vector<std::uint64_t>& ids) override { std::ignore = ids; }
+    std::vector<std::uint64_t> GetAssignedLaneIds() const override { return {}; }
+
+    void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override { std::ignore = properties; }
+    mantle_api::VehicleProperties* GetProperties() const override
+    {
+        return static_cast<mantle_api::VehicleProperties*>(properties_.get());
+    }
+
+    void SetIndicatorState(mantle_api::IndicatorState state) override { std::ignore = state; }
+    mantle_api::IndicatorState GetIndicatorState() const override { return mantle_api::IndicatorState::kUnknown; }
+
+  private:
+    std::string name_{};
+    std::unique_ptr<mantle_api::EntityProperties> properties_{nullptr};
+};
+
+class MockQueryService : public mantle_api::ILaneLocationQueryService
+{
+  public:
+    /// TODO: cleanup once the IQueryService interface is properly defined
+    const mantle_api::IIdentifiable& GetMapObjectById(mantle_api::UniqueId id)
+    {
+        std::ignore = id;
+        return test_vehicle_;
+    }
+
+  private:
+    MockVehicle test_vehicle_{};
+};
+
+class MockPedestrian : public mantle_api::IPedestrian
+{
+  public:
+    mantle_api::UniqueId GetUniqueId() const override { return 0; }
+
+    void SetName(const std::string& name) override { name_ = name; }
+    const std::string& GetName() const override { return name_; }
+
+    void SetPosition(const mantle_api::Vec3d& inert_pos) override { std::ignore = inert_pos; }
+    mantle_api::Vec3d GetPosition() const override { return mantle_api::Vec3d(); }
+
+    void SetOrientation(const mantle_api::Orientation3d& orientation) override { std::ignore = orientation; }
+    mantle_api::Orientation3d GetOrientation() const override { return mantle_api::Orientation3d(); }
+
+    void SetBoundingBox(const mantle_api::BoundingBox& bounding_box) override { std::ignore = bounding_box; }
+    mantle_api::BoundingBox GetBoundingBox() const override { return mantle_api::BoundingBox(); }
+
+    void SetVelocity(const mantle_api::Vec3d& velocity) override { std::ignore = velocity; }
+    mantle_api::Vec3d GetVelocity() const override { return {}; }
+
+    void SetAcceleration(const mantle_api::Vec3d& acceleration) override { std::ignore = acceleration; }
+    mantle_api::Vec3d GetAcceleration() const override { return {}; }
+
+    void SetAssignedLaneIds(const std::vector<std::uint64_t>& ids) override { std::ignore = ids; }
+    std::vector<std::uint64_t> GetAssignedLaneIds() const override { return {}; }
+
+    void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override { std::ignore = properties; }
+    mantle_api::PedestrianProperties* GetProperties() const override
+    {
+        return static_cast<mantle_api::PedestrianProperties*>(properties_.get());
+    }
+
+  private:
+    std::string name_{};
+    std::unique_ptr<mantle_api::EntityProperties> properties_{nullptr};
+};
+
+class MockStaticObject : public mantle_api::IStaticObject
+{
+  public:
+    mantle_api::UniqueId GetUniqueId() const override { return 0; }
+
+    void SetName(const std::string& name) override { name_ = name; }
+    const std::string& GetName() const override { return name_; }
+
+    void SetPosition(const mantle_api::Vec3d& inert_pos) override { std::ignore = inert_pos; }
+    mantle_api::Vec3d GetPosition() const override { return mantle_api::Vec3d(); }
+
+    void SetOrientation(const mantle_api::Orientation3d& orientation) override { std::ignore = orientation; }
+    mantle_api::Orientation3d GetOrientation() const override { return mantle_api::Orientation3d(); }
+
+    void SetBoundingBox(const mantle_api::BoundingBox& bounding_box) override { std::ignore = bounding_box; }
+    mantle_api::BoundingBox GetBoundingBox() const override { return mantle_api::BoundingBox(); }
+
+    void SetVelocity(const mantle_api::Vec3d& velocity) override { std::ignore = velocity; }
+    mantle_api::Vec3d GetVelocity() const override { return {}; }
+
+    void SetAcceleration(const mantle_api::Vec3d& acceleration) override { std::ignore = acceleration; }
+    mantle_api::Vec3d GetAcceleration() const override { return {}; }
+
+    void SetAssignedLaneIds(const std::vector<std::uint64_t>& ids) override { std::ignore = ids; }
+    std::vector<std::uint64_t> GetAssignedLaneIds() const override { return {}; }
+
+    void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override { std::ignore = properties; }
+    mantle_api::StaticObjectProperties* GetProperties() const override
+    {
+        return static_cast<mantle_api::StaticObjectProperties*>(properties_.get());
+    }
+
+  private:
+    std::string name_{};
+    std::unique_ptr<mantle_api::EntityProperties> properties_{nullptr};
+};
+
+class MockEntityRepository : public mantle_api::IEntityRepository
+{
+  public:
+    MOCK_METHOD(mantle_api::IVehicle&,
+                Create,
+                (const std::string& name, const mantle_api::VehicleProperties& properties),
+                (override));
+
+    mantle_api::IVehicle& Create(mantle_api::UniqueId id,
+                                 const std::string& name,
+                                 const mantle_api::VehicleProperties& properties) override
+    {
+        std::ignore = id;
+        std::ignore = name;
+        std::ignore = properties;
+        return test_vehicle_;
+    }
+
+    MOCK_METHOD(mantle_api::IPedestrian&,
+                Create,
+                (const std::string& name, const mantle_api::PedestrianProperties& properties),
+                (override));
+
+    mantle_api::IPedestrian& Create(mantle_api::UniqueId id,
+                                    const std::string& name,
+                                    const mantle_api::PedestrianProperties& properties) override
+    {
+        std::ignore = id;
+        std::ignore = name;
+        std::ignore = properties;
+        return test_pedestrian_;
+    }
+
+    MOCK_METHOD(mantle_api::IStaticObject&,
+                Create,
+                (const std::string& name, const mantle_api::StaticObjectProperties& properties),
+                (override));
+
+    mantle_api::IStaticObject& Create(mantle_api::UniqueId id,
+                                      const std::string& name,
+                                      const mantle_api::StaticObjectProperties& properties) override
+    {
+        std::ignore = id;
+        std::ignore = name;
+        std::ignore = properties;
+        return test_static_object_;
+    }
+
+    mantle_api::IEntity& Get(const std::string& name) override
+    {
+        std::ignore = name;
+        return test_vehicle_;
+    }
+
+    mantle_api::IEntity& Get(mantle_api::UniqueId id) override
+    {
+        std::ignore = id;
+        return test_vehicle_;
+    }
+
+    mantle_api::IVehicle& GetHost() override { return test_vehicle_; }
+
+    const std::vector<std::unique_ptr<mantle_api::IEntity>>& GetEntities() const override { return entities_; }
+
+    void Delete(const std::string& name) override { std::ignore = name; }
+    bool Contains(UniqueId id) const override { return false; }
+    void Delete(UniqueId id) override { std::ignore = id; }
+
+    //    const std::vector<mantle_api::IEntity>& GetEntities() const override { return <#initializer #>{}; }
+    //    std::vector<mantle_api::IEntity>& GetEntities() override { return <#initializer #>; }
+
+  private:
+    MockVehicle test_vehicle_{};
+    MockPedestrian test_pedestrian_{};
+    MockStaticObject test_static_object_{};
+    std::vector<std::unique_ptr<mantle_api::IEntity>> entities_{};
+};
+
+class MockEnvironment : public mantle_api::IEnvironment
+{
+  public:
+    virtual void Init() override {}
+
+    virtual void Step() override {}
+
+    MOCK_METHOD(void,
+                CreateMap,
+                (const std::string& file_path, const std::vector<mantle_api::Position>& map_region),
+                (override)
+
+    );
+
+    MOCK_METHOD(void, CreateController, (std::unique_ptr<IControllerConfig> config), (override)
+
+    );
+
+    MOCK_METHOD(void, AddEntityToController, (mantle_api::IEntity & entity, std::uint64_t controller_id), (override)
+
+    );
+
+    const mantle_api::ILaneLocationQueryService& GetQueryService() const override { return query_service_; }
+
+    const mantle_api::ICoordConverter* GetConverter() const override { return &converter_; }
+
+    mantle_api::IEntityRepository& GetEntityRepository() override { return entity_repository_; }
+
+    const mantle_api::IEntityRepository& GetEntityRepository() const override { return entity_repository_; }
+
+    void SetWeather(mantle_api::Weather weather) override { std::ignore = weather; }
+
+    void SetRoadCondition(std::vector<mantle_api::FrictionPatch> friction_patches) override
+    {
+        std::ignore = friction_patches;
+    }
+
+    void SetDateTime(std::chrono::duration<std::int64_t, std::milli> date_time) override { std::ignore = date_time; }
+
+    std::chrono::duration<std::int64_t, std::milli> GetDateTime() override
+    {
+        return std::chrono::duration<std::int64_t, std::milli>();
+    }
+
+  private:
+    MockQueryService query_service_{};
+    MockEntityRepository entity_repository_{};
+    MockConverter converter_{};
+};
+
+}  // namespace mantle_api
diff --git a/MantleAPI/test/interface_test.cpp b/MantleAPI/test/interface_test.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c98b70833f09e1234184c8973790dcd2b4ede4bb
--- /dev/null
+++ b/MantleAPI/test/interface_test.cpp
@@ -0,0 +1,34 @@
+/*******************************************************************************
+* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+
+//-----------------------------------------------------------------------------
+/** @file  interface_test.cpp */
+//-----------------------------------------------------------------------------
+
+
+#include <MantleAPI/Test/test_utils.h>
+
+TEST(InterfaceTest, GivenTeleportAction_When_ThenHostVehicleIsPlaced)
+{
+    mantle_api::Position inert_pos{};
+    inert_pos = mantle_api::OpenDrivePosition{{0, 0}, 0, 0};
+    mantle_api::MockEnvironment env{};
+    env.CreateMap("dummy_map_path", {});
+
+    mantle_api::VehicleProperties vehicle_properties;
+    vehicle_properties.is_host = true;
+    vehicle_properties.model = "G12";
+
+    auto& repo = env.GetEntityRepository();
+    auto& host_vehicle = repo.Create(0, "host", vehicle_properties);
+    const auto* const converter = env.GetConverter();
+    auto world_pos = converter->Convert(inert_pos);
+    host_vehicle.SetPosition(world_pos);
+}
diff --git a/README.md b/README.md
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e31998126c1aab953ecae282eaf7549f7ffb44a6 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,6 @@
+# Scenario API
+
+A collection of interfaces for abstraction between a scenario engine and an environment simulator. 
+It is intended to be usable with a wide variety of scenario description languages by implementing according scenario engines. 
+
+Remark: This is currently work in progress and no stable state is reached yet.