diff --git a/src/binarystore.cpp b/src/binarystore.cpp
index 7c1bc42..c69a653 100644
--- a/src/binarystore.cpp
+++ b/src/binarystore.cpp
@@ -29,10 +29,9 @@
 
 using namespace phosphor::logging;
 
-std::unique_ptr<BinaryStoreInterface>
-    BinaryStore::createFromConfig(const std::string& baseBlobId,
-                                  std::unique_ptr<SysFile> file,
-                                  std::optional<uint32_t> maxSize)
+std::unique_ptr<BinaryStoreInterface> BinaryStore::createFromConfig(
+    const std::string& baseBlobId, std::unique_ptr<SysFile> file,
+    std::optional<uint32_t> maxSize, std::optional<std::string> aliasBlobBaseId)
 {
     if (baseBlobId.empty() || !file)
     {
@@ -44,7 +43,7 @@
     auto store =
         std::make_unique<BinaryStore>(baseBlobId, std::move(file), maxSize);
 
-    if (!store->loadSerializedData())
+    if (!store->loadSerializedData(aliasBlobBaseId))
     {
         return nullptr;
     }
@@ -73,7 +72,7 @@
     return store;
 }
 
-bool BinaryStore::loadSerializedData()
+bool BinaryStore::loadSerializedData(std::optional<std::string> aliasBlobBaseId)
 {
     /* Load blob from sysfile if we know it might not match what we have.
      * Note it will overwrite existing unsaved data per design. */
@@ -128,6 +127,16 @@
         return true;
     }
 
+    std::string alias = aliasBlobBaseId.value_or("");
+    if (blob_.blob_base_id() == alias)
+    {
+        log<level::WARNING>("Alias blob id, rename blob id...",
+                            entry("LOADED=%s", alias.c_str()),
+                            entry("RENAMED=%s", baseBlobId_.c_str()));
+        std::string tmpBlobId = baseBlobId_;
+        baseBlobId_ = alias;
+        return setBaseBlobId(tmpBlobId);
+    }
     if (blob_.blob_base_id() != baseBlobId_ && !readOnly_)
     {
         /* Uh oh, stale data loaded. Clean it and commit. */
@@ -154,6 +163,29 @@
     return blob_.blob_base_id();
 }
 
+bool BinaryStore::setBaseBlobId(const std::string& baseBlobId)
+{
+    if (baseBlobId_.empty())
+    {
+        baseBlobId_ = blob_.blob_base_id();
+    }
+
+    std::string oldBlobId = baseBlobId_;
+    size_t oldPrefixIndex = baseBlobId_.size();
+    baseBlobId_ = baseBlobId;
+    blob_.set_blob_base_id(baseBlobId_);
+    auto blobsPtr = blob_.mutable_blobs();
+    for (auto blob = blobsPtr->begin(); blob != blobsPtr->end(); blob++)
+    {
+        const std::string& blodId = blob->blob_id();
+        if (blodId.starts_with(oldBlobId))
+        {
+            blob->set_blob_id(baseBlobId_ + blodId.substr(oldPrefixIndex));
+        }
+    }
+    return this->commit();
+}
+
 std::vector<std::string> BinaryStore::getBlobIds() const
 {
     std::vector<std::string> result;
diff --git a/src/blobtool.cpp b/src/blobtool.cpp
index 2f45aab..c1e2e65 100644
--- a/src/blobtool.cpp
+++ b/src/blobtool.cpp
@@ -23,6 +23,7 @@
         HELP,
         LIST,
         READ,
+        MIGRATE,
     } action = Action::LIST;
 } toolConfig;
 
@@ -34,6 +35,8 @@
                    "\t--list\t\tList all supported blobs. This is a default.\n"
                    "\t--read\t\tRead blob specified in --blob argument (which "
                    "becomes mandatory).\n"
+                   "\t--migrate\tUpdate all binary stores to use the alias "
+                   "blob id if enabled.\n"
                    "\t--config\tFILENAME\tPath to the configuration file. The "
                    "default is /usr/share/binaryblob/config.json.\n"
                    "\t--binary-store\tFILENAME\tPath to the binary storage. If "
@@ -53,6 +56,7 @@
         {"help", no_argument, 0, 'h'},
         {"list", no_argument, 0, 'l'},
         {"read", no_argument, 0, 'r'},
+        {"migrate", no_argument, 0, 'm'},
         {"config", required_argument, 0, 'c'},
         {"binary-store", required_argument, 0, 's'},
         {"blob", required_argument, 0, 'b'},
@@ -61,7 +65,6 @@
     };
 
     int optionIndex = 0;
-    std::string configPath = defaultBlobConfigPath;
     bool res = true;
     while (1)
     {
@@ -81,6 +84,9 @@
             case 'r':
                 cfg.action = BlobToolConfig::Action::READ;
                 break;
+            case 'm':
+                cfg.action = BlobToolConfig::Action::MIGRATE;
+                break;
             case 'c':
                 cfg.configPath = optarg;
                 break;
@@ -170,11 +176,30 @@
                 config.sysFilePath, config.offsetBytes);
 
             auto store = binstore::BinaryStore::createFromConfig(
-                config.blobBaseId, std::move(file));
-            stores.push_back(std::move(store));
+                config.blobBaseId, std::move(file), config.maxSizeBytes,
+                config.aliasBlobBaseId);
+
+            if (toolConfig.action == BlobToolConfig::Action::MIGRATE)
+            {
+                if (config.migrateToAlias && config.aliasBlobBaseId.has_value())
+                {
+                    store->setBaseBlobId(config.aliasBlobBaseId.value());
+                }
+            }
+            else
+            {
+                stores.push_back(std::move(store));
+            }
         }
     }
 
+    if (toolConfig.action == BlobToolConfig::Action::MIGRATE)
+    {
+        stdplus::print(stderr,
+                       "Migrated all BinaryStore back to configured Alias\n");
+        return 0;
+    }
+
     if (toolConfig.action == BlobToolConfig::Action::LIST)
     {
         stdplus::print(stderr, "Supported Blobs: \n");
@@ -185,8 +210,9 @@
                 blobIds.begin(), blobIds.end(),
                 std::ostream_iterator<decltype(blobIds[0])>(std::cout, "\n"));
         }
+        return 0;
     }
-    else if (toolConfig.action == BlobToolConfig::Action::READ)
+    if (toolConfig.action == BlobToolConfig::Action::READ)
     {
         if (toolConfig.blobName.empty())
         {
@@ -231,6 +257,7 @@
             stdplus::print(stderr, "Blob {} not found.\n", toolConfig.blobName);
             return 1;
         }
+        return 0;
     }
 
     return 0;
diff --git a/src/main.cpp b/src/main.cpp
index 8e3d244..20858a4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -72,7 +72,8 @@
                                                             config.offsetBytes);
 
         handler->addNewBinaryStore(binstore::BinaryStore::createFromConfig(
-            config.blobBaseId, std::move(file), config.maxSizeBytes));
+            config.blobBaseId, std::move(file), config.maxSizeBytes,
+            config.aliasBlobBaseId));
     }
 
     return handler;
diff --git a/src/meson.build b/src/meson.build
index 0e20dcd..cc1a7e9 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -30,7 +30,7 @@
   install: true,
   install_dir: get_option('libdir') / 'blob-ipmid')
 
-if not get_option('blobtool').disabled()
+if get_option('blobtool').allowed()
   executable(
     'blobtool',
     'blobtool.cpp',
