diff --git a/source/adios2/toolkit/format/bp1/BP1Writer.cpp b/source/adios2/toolkit/format/bp1/BP1Writer.cpp
index 34639d7fb59eff38671c7d433feec5d72c24d2ef..daaf29b8c04df085c56195d531544d4d7afb338a 100644
--- a/source/adios2/toolkit/format/bp1/BP1Writer.cpp
+++ b/source/adios2/toolkit/format/bp1/BP1Writer.cpp
@@ -248,14 +248,19 @@ void BP1Writer::WriteDimensionsRecord(const Dims localDimensions,
 void BP1Writer::WriteDimensionsRecord(const Dims localDimensions,
                                       const Dims globalDimensions,
                                       const Dims offsets,
-                                      const unsigned int skip,
                                       std::vector<char> &buffer,
-                                      size_t &position) noexcept
+                                      size_t &position,
+                                      const bool isCharacteristic) noexcept
 {
-    auto lf_WriteFlaggedDim = [](std::vector<char> &buffer, size_t &position,
-                                 const size_t dimension) {
-        constexpr char no = 'n';
-        CopyToBuffer(buffer, position, &no);
+    auto lf_CopyDimension = [](std::vector<char> &buffer, size_t &position,
+                               const size_t dimension,
+                               const bool isCharacteristic) {
+        if (!isCharacteristic)
+        {
+            constexpr char no = 'n';
+            CopyToBuffer(buffer, position, &no);
+        }
+
         CopyToBuffer(buffer, position,
                      reinterpret_cast<const uint64_t *>(&dimension));
     };
@@ -263,19 +268,28 @@ void BP1Writer::WriteDimensionsRecord(const Dims localDimensions,
     // BODY Starts here
     if (offsets.empty())
     {
+        unsigned int globalBoundsSkip = 18;
+        if (isCharacteristic)
+        {
+            globalBoundsSkip = 16;
+        }
+
         for (const auto &localDimension : localDimensions)
         {
-            lf_WriteFlaggedDim(buffer, position, localDimension);
-            position += skip;
+            lf_CopyDimension(buffer, position, localDimension,
+                             isCharacteristic);
+            position += globalBoundsSkip;
         }
     }
     else
     {
         for (unsigned int d = 0; d < localDimensions.size(); ++d)
         {
-            lf_WriteFlaggedDim(buffer, position, localDimensions[d]);
-            lf_WriteFlaggedDim(buffer, position, globalDimensions[d]);
-            lf_WriteFlaggedDim(buffer, position, offsets[d]);
+            lf_CopyDimension(buffer, position, localDimensions[d],
+                             isCharacteristic);
+            lf_CopyDimension(buffer, position, globalDimensions[d],
+                             isCharacteristic);
+            lf_CopyDimension(buffer, position, offsets[d], isCharacteristic);
         }
     }
 }
diff --git a/source/adios2/toolkit/format/bp1/BP1Writer.h b/source/adios2/toolkit/format/bp1/BP1Writer.h
index d3caf67f36b9970e38c7221f3e5df7451aa21d5c..d193753c1bc6c3e1ff8388a19ca8397a204073fe 100644
--- a/source/adios2/toolkit/format/bp1/BP1Writer.h
+++ b/source/adios2/toolkit/format/bp1/BP1Writer.h
@@ -186,9 +186,8 @@ private:
     /** Overloaded version for data buffer */
     void WriteDimensionsRecord(const Dims localDimensions,
                                const Dims globalDimensions, const Dims offsets,
-                               const unsigned int skip,
-                               std::vector<char> &buffer,
-                               size_t &position) noexcept;
+                               std::vector<char> &buffer, size_t &position,
+                               const bool isCharacteristic = false) noexcept;
 
     /** Writes min max */
     template <class T>
diff --git a/source/adios2/toolkit/format/bp1/BP1Writer.tcc b/source/adios2/toolkit/format/bp1/BP1Writer.tcc
index 31eac673a05c903ac5b71193d846aafad31cadac..eef815c26204cd9a0a8ccc112ffcfebec8fd660c 100644
--- a/source/adios2/toolkit/format/bp1/BP1Writer.tcc
+++ b/source/adios2/toolkit/format/bp1/BP1Writer.tcc
@@ -175,16 +175,15 @@ void BP1Writer::WriteVariableMetadataInData(
     CopyToBuffer(buffer, position, &dimensionsLength); // length
 
     WriteDimensionsRecord(variable.m_Count, variable.m_Shape, variable.m_Start,
-                          18, buffer, position);
+                          buffer, position);
 
     // CHARACTERISTICS
-    // FIX
     WriteVariableCharacteristics(variable, stats, buffer, position);
 
     // Back to varLength including payload size
-    // remove its own size (8) from length
+    // not need to remove its own size (8) from length from bpdump
     const uint64_t varLength =
-        position - varLengthPosition + variable.PayLoadSize() - 8;
+        position - varLengthPosition + variable.PayLoadSize();
 
     size_t backPosition = varLengthPosition;
     CopyToBuffer(buffer, backPosition, &varLength);
@@ -301,10 +300,6 @@ void BP1Writer::WriteCharacteristicRecord(const uint8_t characteristicID,
 {
     const std::uint8_t id = characteristicID;
     CopyToBuffer(buffer, position, &id);
-
-    const std::uint16_t lengthOfCharacteristic = sizeof(T);
-    CopyToBuffer(buffer, position, &lengthOfCharacteristic);
-
     CopyToBuffer(buffer, position, &value);
     ++characteristicsCounter;
 }
@@ -372,25 +367,18 @@ void BP1Writer::WriteVariableCharacteristics(
     // DIMENSIONS
     uint8_t characteristicID = characteristic_dimensions;
     CopyToBuffer(buffer, position, &characteristicID);
-    const uint8_t dimensions = variable.m_Count.size();
-
-    // 24 = 3 local, global, offset x 8 bytes/each
-    const int16_t lengthOfDimensionsCharacteristic = 24 * dimensions + 3;
-    CopyToBuffer(buffer, position, &lengthOfDimensionsCharacteristic);
 
+    const uint8_t dimensions = variable.m_Count.size();
     CopyToBuffer(buffer, position, &dimensions); // count
     const uint16_t dimensionsLength = 24 * dimensions;
     CopyToBuffer(buffer, position, &dimensionsLength); // length
     WriteDimensionsRecord(variable.m_Count, variable.m_Shape, variable.m_Start,
-                          16, buffer, position);
+                          buffer, position, true); // isCharacteristic = true
     ++characteristicsCounter;
 
     // VALUE for SCALAR or STAT min, max for ARRAY
     WriteBoundsRecord(variable.m_SingleValue, stats, characteristicsCounter,
                       buffer, position);
-    // TIME INDEX
-    WriteCharacteristicRecord(characteristic_time_index, characteristicsCounter,
-                              stats.TimeIndex, buffer, position);
     // END OF CHARACTERISTICS
 
     // Back to characteristics count and length