diff --git a/src/UnitTests/Meshes/CMakeLists.txt b/src/UnitTests/Meshes/CMakeLists.txt
index cdebbf56bb30fb36a969516029cda37fd06e2da8..2a0469dca03d5598f873ee399b3b8bd7cb795c17 100755
--- a/src/UnitTests/Meshes/CMakeLists.txt
+++ b/src/UnitTests/Meshes/CMakeLists.txt
@@ -8,6 +8,12 @@ SET_TARGET_PROPERTIES( MeshEntityTest${mpiExt}${debugExt} PROPERTIES COMPILE_FLA
 TARGET_LINK_LIBRARIES( MeshEntityTest${mpiExt}${debugExt} ${GTEST_BOTH_LIBRARIES}
                                                            tnl${mpiExt}${debugExt}-${tnlVersion} )
 
+ADD_EXECUTABLE( MultimapTest${mpiExt}${debugExt} ${headers} MultimapTest.cpp )
+SET_TARGET_PROPERTIES( MultimapTest${mpiExt}${debugExt} PROPERTIES COMPILE_FLAGS "${CXX_TESTS_FLAGS}" )
+TARGET_LINK_LIBRARIES( MultimapTest${mpiExt}${debugExt} ${GTEST_BOTH_LIBRARIES}
+                                                           tnl${mpiExt}${debugExt}-${tnlVersion} )
+
 
 ADD_TEST( MeshTest${mpiExt}${debugExt} ${EXECUTABLE_OUTPUT_PATH}/MeshTest${mpiExt}${debugExt} )
 ADD_TEST( MeshEntityTest${mpiExt}${debugExt} ${EXECUTABLE_OUTPUT_PATH}/MeshEntityTest${mpiExt}${debugExt} )
+ADD_TEST( MultimapTest${mpiExt}${debugExt} ${EXECUTABLE_OUTPUT_PATH}/MultimapTest${mpiExt}${debugExt} )
diff --git a/src/UnitTests/Meshes/MultimapTest.cpp b/src/UnitTests/Meshes/MultimapTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d6c4e38c9342c7b0f7c564c49e5ab6cae2925706
--- /dev/null
+++ b/src/UnitTests/Meshes/MultimapTest.cpp
@@ -0,0 +1,76 @@
+#include <TNL/Experimental/Multimaps/EllpackIndexMultimap.h>
+
+using namespace TNL;
+
+using IndexType = int;
+using Device = Devices::Host;
+using LocalIndexType = short;
+
+#ifdef HAVE_GTEST 
+#include "gtest/gtest.h"
+
+TEST( MultimapTest, TestTypedefs )
+{
+   using MultimapType = TNL::EllpackIndexMultimap< IndexType, Device, LocalIndexType >;
+   const bool same_index = std::is_same< typename MultimapType::IndexType, IndexType >::value;
+   ASSERT_TRUE( same_index );
+   const bool same_device = std::is_same< typename MultimapType::DeviceType, Device >::value;
+   ASSERT_TRUE( same_device );
+   const bool same_localindex = std::is_same< typename MultimapType::LocalIndexType, LocalIndexType >::value;
+   ASSERT_TRUE( same_localindex );
+}
+
+TEST( MultimapTest, TestSettingValues )
+{
+   using MultimapType = TNL::EllpackIndexMultimap< IndexType, Device, LocalIndexType >;
+
+   IndexType inputs = 10;
+   LocalIndexType values = 4;
+   LocalIndexType allocatedValues = 2;
+
+   MultimapType map;
+   map.setRanges( inputs, values );
+   ASSERT_EQ( map.getKeysRange(), inputs );
+   ASSERT_EQ( map.getValuesRange(), values );
+
+   typename MultimapType::ValuesAllocationVectorType allocationRanges;
+   ASSERT_TRUE( allocationRanges.setSize( inputs ) );
+   allocationRanges.setValue( allocatedValues );
+   ASSERT_TRUE( map.allocate( allocationRanges ) );
+
+   for( IndexType i = 0; i < inputs; i++ ) {
+      auto values = map.getValues( i );
+      const auto constValues = ( (const MultimapType) map ).getValues( i );
+
+      for( LocalIndexType o = 0; o < allocatedValues; o++ )
+         values.setOutput( o, i + o );
+
+      for( LocalIndexType o = 0; o < allocatedValues; o++ ) {
+         ASSERT_EQ( values.getOutput( o ), i + o );
+         ASSERT_EQ( values[ o ], i + o );
+         ASSERT_EQ( constValues.getOutput( o ), i + o );
+         ASSERT_EQ( constValues[ o ], i + o );
+      }
+
+      for( LocalIndexType o = 0; o < allocatedValues; o++ )
+         values[ o ] = i * o;
+
+      for( LocalIndexType o = 0; o < allocatedValues; o++ ) {
+         ASSERT_EQ( values.getOutput( o ), i * o );
+         ASSERT_EQ( values[ o ], i * o );
+         ASSERT_EQ( constValues.getOutput( o ), i * o );
+         ASSERT_EQ( constValues[ o ], i * o );
+      }
+   }
+}
+#endif
+
+int main( int argc, char* argv[] )
+{
+#ifdef HAVE_GTEST
+   ::testing::InitGoogleTest( &argc, argv );
+   return RUN_ALL_TESTS();
+#else
+   return EXIT_FAILURE;
+#endif
+}