diff --git a/examples/hello/bpAttributeWriter/helloBPAttributeWriter.cpp b/examples/hello/bpAttributeWriter/helloBPAttributeWriter.cpp
index c208a9d656df3d126c03ae3f4044c003aa001316..cd22988919dbf5a15151409e056978236ac8253a 100644
--- a/examples/hello/bpAttributeWriter/helloBPAttributeWriter.cpp
+++ b/examples/hello/bpAttributeWriter/helloBPAttributeWriter.cpp
@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
 
         /** Engine derived class, spawned to start IO operations */
         adios2::Engine &bpWriter =
-            bpIO.Open("myVector.bp", adios2::Mode::Write);
+            bpIO.Open("fileAttributes.bp", adios2::Mode::Write);
 
         /** Write variable for buffering */
         bpWriter.PutSync<float>(bpFloats, myFloats.data());
diff --git a/source/adios2/engine/bp/BPFileReader.cpp b/source/adios2/engine/bp/BPFileReader.cpp
index 4c806ea839bed6687ee5e7ddb582245e090ff1a5..938e268c9e9d41a130763a697e07519ad90ea2e9 100644
--- a/source/adios2/engine/bp/BPFileReader.cpp
+++ b/source/adios2/engine/bp/BPFileReader.cpp
@@ -130,7 +130,6 @@ void BPFileReader::ReadVariables(
             const std::string subFile(
                 m_BP3Deserializer.GetBPSubFileName(m_Name, subFileIndex));
 
-            // TODO: fix this part
             if (m_SubFileManager.m_Transports.count(subFileIndex) == 0)
             {
                 m_SubFileManager.OpenFiles({subFile}, adios2::Mode::Read,
diff --git a/source/adios2/toolkit/format/bp3/BP3Base.tcc b/source/adios2/toolkit/format/bp3/BP3Base.tcc
index b600f13e19d99340ced6a0069c71d54981fa6b0b..8e613100e5ade1113e611eafc53fff40d4757362 100644
--- a/source/adios2/toolkit/format/bp3/BP3Base.tcc
+++ b/source/adios2/toolkit/format/bp3/BP3Base.tcc
@@ -300,7 +300,8 @@ BP3Base::ParseCharacteristics(const std::vector<char> &buffer, size_t &position,
 
     while (localPosition < characteristics.EntryLength)
     {
-        const uint8_t id = ReadValue<uint8_t>(buffer, position);
+        const CharacteristicID id =
+            static_cast<CharacteristicID>(ReadValue<uint8_t>(buffer, position));
 
         switch (id)
         {
@@ -321,9 +322,21 @@ BP3Base::ParseCharacteristics(const std::vector<char> &buffer, size_t &position,
 
         case (characteristic_value):
         {
-            characteristics.Statistics.Value =
-                ReadValue<typename TypeInfo<T>::ValueType>(buffer, position);
-            characteristics.Statistics.IsValue = true;
+            // we are relying that count contains the dimensions
+            if (characteristics.Count.empty() || characteristics.Count[0] == 1)
+            {
+                characteristics.Statistics.Value =
+                    ReadValue<typename TypeInfo<T>::ValueType>(buffer,
+                                                               position);
+                characteristics.Statistics.IsValue = true;
+            }
+            else // used for attributes
+            {
+                const size_t size = characteristics.Count[0];
+                characteristics.Statistics.Values.resize(size);
+                CopyFromBuffer(buffer, position,
+                               characteristics.Statistics.Values.data(), size);
+            }
             break;
         }
 
diff --git a/source/adios2/toolkit/format/bp3/BP3Serializer.cpp b/source/adios2/toolkit/format/bp3/BP3Serializer.cpp
index e9bea1dd02525a168133aa94d2100b31ff2c42c6..e9e7a3bedcfba82b479693c1ff3f326b6ad0134d 100644
--- a/source/adios2/toolkit/format/bp3/BP3Serializer.cpp
+++ b/source/adios2/toolkit/format/bp3/BP3Serializer.cpp
@@ -297,6 +297,8 @@ void BP3Serializer::PutAttributes(IO &io)
         Stats<T> stats;                                                        \
         stats.Offset = absolutePosition;                                       \
         stats.MemberID = memberID;                                             \
+        stats.Step = m_MetadataSet.TimeStep;                                   \
+        stats.FileIndex = static_cast<uint32_t>(m_RankMPI);                    \
         Attribute<T> &attribute = *io.InquireAttribute<T>(name);               \
         PutAttributeInData(attribute, stats);                                  \
         PutAttributeInIndex(attribute, stats);                                 \
@@ -789,7 +791,9 @@ void BP3Serializer::MergeSerializeIndices(
                                      uint32_t &timeStep)
 
     {
-        switch (dataType)
+        const DataTypes dataTypeEnum = static_cast<DataTypes>(dataType);
+
+        switch (dataTypeEnum)
         {
 
         case (type_string):
@@ -803,6 +807,17 @@ void BP3Serializer::MergeSerializeIndices(
             break;
         }
 
+        case (type_string_array):
+        {
+            const auto characteristics =
+                ReadElementIndexCharacteristics<std::string>(
+                    buffer, position, type_string_array, true);
+            count = characteristics.EntryCount;
+            length = characteristics.EntryLength;
+            timeStep = characteristics.Statistics.Step;
+            break;
+        }
+
         case (type_byte):
         {
             const auto characteristics = ReadElementIndexCharacteristics<char>(
@@ -907,7 +922,13 @@ void BP3Serializer::MergeSerializeIndices(
             timeStep = characteristics.Statistics.Step;
             break;
         }
+
+        default:
             // TODO: complex, string array, long double
+            throw std::invalid_argument("ERROR: type " +
+                                        std::to_string(dataType) +
+                                        " not supported in Merge\n");
+
         } // end switch
 
     };
diff --git a/source/adios2/toolkit/format/bp3/BP3Serializer.tcc b/source/adios2/toolkit/format/bp3/BP3Serializer.tcc
index 439bc3cd7b7ed83ef4ae088a5608c8a39a2a26fc..d6bbf840cf0c7ac613aa03ed55f067ac715f3a9f 100644
--- a/source/adios2/toolkit/format/bp3/BP3Serializer.tcc
+++ b/source/adios2/toolkit/format/bp3/BP3Serializer.tcc
@@ -272,6 +272,12 @@ void BP3Serializer::PutAttributeInIndex(const Attribute<T> &attribute,
     uint8_t characteristicsCounter = 0;
 
     // DIMENSIONS
+    PutCharacteristicRecord(characteristic_time_index, characteristicsCounter,
+                            stats.Step, buffer);
+
+    PutCharacteristicRecord(characteristic_file_index, characteristicsCounter,
+                            stats.FileIndex, buffer);
+
     uint8_t characteristicID = characteristic_dimensions;
     InsertToBuffer(buffer, &characteristicID);
     constexpr uint8_t dimensions = 1;
@@ -285,13 +291,6 @@ void BP3Serializer::PutAttributeInIndex(const Attribute<T> &attribute,
     PutAttributeCharacteristicValueInIndex(characteristicsCounter, attribute,
                                            buffer);
 
-    // TIME Index
-    PutCharacteristicRecord(characteristic_time_index, characteristicsCounter,
-                            stats.Step, buffer);
-
-    PutCharacteristicRecord(characteristic_file_index, characteristicsCounter,
-                            stats.FileIndex, buffer);
-
     PutCharacteristicRecord(characteristic_offset, characteristicsCounter,
                             stats.Offset, buffer);