diff --git a/include/openPMD/binding/python/Container.hpp b/include/openPMD/binding/python/Container.hpp
new file mode 100644
index 0000000000..2eae75281a
--- /dev/null
+++ b/include/openPMD/binding/python/Container.hpp
@@ -0,0 +1,136 @@
+/* Copyright 2018-2022 Axel Huebl and Franz Poeschel
+ *
+ * This file is part of openPMD-api.
+ *
+ * openPMD-api is free software: you can redistribute it and/or modify
+ * it under the terms of of either the GNU General Public License or
+ * the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * openPMD-api is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with openPMD-api.
+ * If not, see .
+ *
+ * The function `bind_container` is based on std_bind.h in pybind11
+ * Copyright (c) 2016 Sergey Lyskov and Wenzel Jakob
+ *
+ * BSD-style license, see pybind11 LICENSE file.
+ */
+
+#pragma once
+
+#include "openPMD/backend/Attributable.hpp"
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+namespace py = pybind11;
+
+namespace openPMD::detail
+{
+/* based on std_bind.h in pybind11
+ *
+ * Copyright (c) 2016 Sergey Lyskov and Wenzel Jakob
+ *
+ * BSD-style license, see pybind11 LICENSE file.
+ */
+template
+Class_ bind_container(Class_ &cl, std::string const &name)
+{
+ using KeyType = typename Map::key_type;
+ using MappedType = typename Map::mapped_type;
+
+ // Register stream insertion operator (if possible)
+ py::detail::map_if_insertion_operator