diff --git a/aptos-move/framework/supra-framework/sources/container.move b/aptos-move/framework/supra-framework/sources/container.move
new file mode 100644
index 0000000000000..9745a0cd65fe8
--- /dev/null
+++ b/aptos-move/framework/supra-framework/sources/container.move
@@ -0,0 +1,82 @@
+module supra_framework::container {
+
+ use std::vector;
+ use aptos_std::simple_map;
+ use aptos_std::simple_map::SimpleMap;
+ use aptos_std::table::Table;
+ use supra_framework::system_addresses;
+
+ struct AddressToContainerMap has key, store {
+ address_container_map: SimpleMap
>,
+ id_containerMetaData_map: Table
+ }
+
+ //TODO: Add more fields for container metadata if needed
+ //TODO: Group discussion: charging metrics
+ struct ContainerMetadata has copy, drop, store {
+ container_owner: address,
+ //TODO enforce uniqueness of container_indentifier
+ /// The unique identifier of the supra container
+ container_indentifier: u64,
+ /// The addresses of modules in the container
+ Module_adresses: vector,
+ /// Pending proposal module address,
+ pending_proposal: SimpleMap>,
+ //TODO type information for the coin
+ /// The address of the customer asset reciver
+ customer_asset_receiver: address,
+ /// The address of the supra coin reciver
+ supra_coin_receiver: address
+ }
+
+ /// Initialize the container metadata storage
+ public fun initialize(supra_framework: &signer) {
+ system_addresses::assert_supra_framework(supra_framework);
+ if (!exists(@supra_framework)) {
+ move_to(
+ supra_framework,
+ AddressToContainerMap {
+ address_container_map: simple_map::new(),
+ }
+ );
+ }
+ }
+
+ /// Create a new container
+ public fun create_container(supra_framework: &signer, address: address, container_metadata: ContainerMetadata) acquires AddressToContainerMap {
+ system_addresses::assert_supra_framework(supra_framework);
+ let container = borrow_global_mut(@supra_framework);
+ simple_map::upsert(&mut container.address_container_map, address, container_metadata);
+ }
+
+ //TODO design choice: 1) Supraframework create container 2) every one can create container, there would be a charge
+ // the charge would go to some beneficiary address, the beneficiary address would be set and change by the supraframework
+
+ //TODO API to view and modify the metadata and requires the container owner's signer
+
+ //TODO Task for Aosen: how this will be published and how can we get the address back
+
+ /// Add one module address to the container
+ public fun add_module_to_container(supra_framework: &signer, address: address, module_address: address) acquires AddressToContainerMap {
+ system_addresses::assert_supra_framework(supra_framework);
+ assert(exists(@supra_framework), 1);
+ let container = borrow_global_mut(@supra_framework);
+ let container_metadata = simple_map::borrow_mut(&mut container.address_container_map, &address);
+ vector::insert(container_metadata.Module_adresses, module_address);
+ }
+
+ #[view]
+ public fun get_container_metadata(supra_framework: &signer, address: address): ContainerMetadata acquires AddressToContainerMap {
+ system_addresses::assert_supra_framework(supra_framework);
+ assert(exists(address), 1);
+ let container = borrow_global(@supra_framework);
+ *simple_map::borrow(&container.address_container_map, &address)
+ }
+
+ public fun UpdateContainerMetadata(supra_framework: &signer, address: address, container_metadata: ContainerMetadata) acquires ContainerMetadata {
+ system_addresses::assert_supra_framework(supra_framework);
+ let container_metadata = borrow_global_mut(address);
+ //DO IT in a nicer way
+ *container_metadata = container_metadata;
+ }
+}