diff --git a/cmd/fs-v1.go b/cmd/fs-v1.go
index dd7adde63..594113123 100644
--- a/cmd/fs-v1.go
+++ b/cmd/fs-v1.go
@@ -403,6 +403,7 @@ func (fs *FSObjects) CopyObject(srcBucket, srcObject, dstBucket, dstObject strin
 		}
 
 		fsMeta.Meta = srcInfo.UserDefined
+		fsMeta.Meta["etag"] = srcInfo.ETag
 		if _, err = fsMeta.WriteTo(wlk); err != nil {
 			return oi, toObjectErr(err, srcBucket, srcObject)
 		}
diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go
index 39286cf96..3936c771d 100644
--- a/cmd/object-handlers.go
+++ b/cmd/object-handlers.go
@@ -483,9 +483,6 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re
 		srcInfo.UserDefined[k] = v
 	}
 
-	// Make sure to remove saved etag if any, CopyObject calculates a new one.
-	delete(srcInfo.UserDefined, "etag")
-
 	// Check if x-amz-metadata-directive was not set to REPLACE and source,
 	// desination are same objects. Apply this restriction also when
 	// metadataOnly is true indicating that we are not overwriting the object.
diff --git a/cmd/xl-v1-object.go b/cmd/xl-v1-object.go
index c623efc42..fcb619116 100644
--- a/cmd/xl-v1-object.go
+++ b/cmd/xl-v1-object.go
@@ -114,6 +114,7 @@ func (xl xlObjects) CopyObject(srcBucket, srcObject, dstBucket, dstObject string
 		// Update `xl.json` content on each disks.
 		for index := range metaArr {
 			metaArr[index].Meta = srcInfo.UserDefined
+			metaArr[index].Meta["etag"] = srcInfo.ETag
 		}
 
 		var onlineDisks []StorageAPI