diff --git a/lib/src/minio_helpers.dart b/lib/src/minio_helpers.dart
index 4cd2fdc13e97ece4aabecf0e65aacda27eae296d..57bd14573a95bab4634f51b8ff29f60dd0f864e7 100644
--- a/lib/src/minio_helpers.dart
+++ b/lib/src/minio_helpers.dart
@@ -130,7 +130,7 @@ Map<String, String> prependXAMZMeta(Map<String, String> metadata) {
     if (!isAmzHeader(key) &&
         !isSupportedHeader(key) &&
         !isStorageclassHeader(key)) {
-      newMetadata['X-Amz-Meta-' + key] = newMetadata[key];
+      newMetadata['x-amz-meta-' + key] = newMetadata[key];
       newMetadata.remove(key);
     }
   }
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 7fbf68be067626204f269cef1a893df175eb2560..b37b32fcfcdd767c26f43f424ecdba4375af88dd 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -82,9 +82,7 @@ class BlockStream extends StreamTransformerBase<List<int>, List<int>> {
       }
     }
 
-    if (buffer.length != 0) {
-      yield buffer.toBytes();
-    }
+    yield buffer.toBytes();
   }
 }
 
diff --git a/test/minio_dart_test.dart b/test/minio_dart_test.dart
index 2a11653315172bcef61b8b4652ef49cca788d669..cec078472299b67ff4bc0bcdc6718ade8f4db37f 100644
--- a/test/minio_dart_test.dart
+++ b/test/minio_dart_test.dart
@@ -63,7 +63,8 @@ void main() {
 
     test('bucketExists() returns false for a non-existent bucket', () async {
       final minio = _getClient();
-      expect(await minio.bucketExists('non-existing-bucket-name'), equals(false));
+      expect(
+          await minio.bucketExists('non-existing-bucket-name'), equals(false));
     });
 
     test('bucketExists() fails due to wrong access key', () async {
@@ -98,29 +99,73 @@ void main() {
   group('fPutObject', () {
     final bucketName = DateTime.now().millisecondsSinceEpoch.toString();
     Directory tempDir;
+    File testFile;
+    final objectName = 'a.jpg';
 
     setUpAll(() async {
       tempDir = await Directory.systemTemp.createTemp();
+      testFile = await File('${tempDir.path}/$objectName').create();
+      await testFile.writeAsString('random bytes');
 
       final minio = _getClient();
       await minio.makeBucket(bucketName);
     });
 
-    tearDown(() async {
+    tearDownAll(() async {
       await tempDir.delete(recursive: true);
     });
 
     test('fPutObject() inserts content-type to metadata', () async {
-      final objectName = 'a.jpg';
+      final minio = _getClient();
+      await minio.fPutObject(bucketName, objectName, testFile.path);
 
-      final testFile = await File('${tempDir.path}/$objectName').create();
-      await testFile.writeAsString('random bytes');
+      final stat = await minio.statObject(bucketName, objectName);
+      expect(stat.metaData['content-type'], equals('image/jpeg'));
+    });
+
+    test('fPutObject() adds user-defined object metadata w/ prefix', () async {
+      final prefix = 'x-amz-meta-';
+      final userDefinedMetadataKey = '${prefix}user-defined-metadata-key-1';
+      final userDefinedMetadataValue = 'custom value 1';
+      final metadata = {
+        userDefinedMetadataKey: userDefinedMetadataValue,
+      };
 
       final minio = _getClient();
-      await minio.fPutObject(bucketName, 'a.jpg', testFile.path);
-      
+      await minio.fPutObject(bucketName, objectName, testFile.path, metadata);
+
       final stat = await minio.statObject(bucketName, objectName);
-      expect(stat.metaData['content-type'], equals('image/jpeg'));
+      expect(
+        stat.metaData[userDefinedMetadataKey.substring(prefix.length)],
+        equals(userDefinedMetadataValue),
+      );
+    });
+
+    test('fPutObject() adds user-defined object metadata w/o prefix', () async {
+      final userDefinedMetadataKey = 'user-defined-metadata-key-2';
+      final userDefinedMetadataValue = 'custom value 2';
+      final metadata = {
+        userDefinedMetadataKey: userDefinedMetadataValue,
+      };
+
+      final minio = _getClient();
+      await minio.fPutObject(bucketName, objectName, testFile.path, metadata);
+
+      final stat = await minio.statObject(bucketName, objectName);
+      expect(stat.metaData[userDefinedMetadataKey],
+          equals(userDefinedMetadataValue));
+    });
+
+    test('fPutObject() with empty file', () async {
+      final objectName = 'empty.txt';
+      final emptyFile = await File('${tempDir.path}/$objectName').create();
+      await emptyFile.writeAsString('');
+
+      final minio = _getClient();
+      await minio.fPutObject(bucketName, objectName, emptyFile.path);
+
+      final stat = await minio.statObject(bucketName, objectName);
+      expect(stat.size, equals(0));
     });
   });
 }