diff --git a/test/Makefile.am b/test/Makefile.am
index b98cf53..540c3b7 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -35,7 +35,8 @@
 	file_handler_unittest \
 	firmware_state_notyetstarted_unittest \
 	firmware_state_uploadinprogress_unittest \
-	firmware_state_verificationpending_unittest
+	firmware_state_verificationpending_unittest \
+	firmware_state_verificationstarted_unittest
 
 if BUILD_HOST_TOOL
 check_PROGRAMS += \
@@ -91,6 +92,9 @@
 firmware_state_verificationpending_unittest_SOURCES = firmware_state_verificationpending_unittest.cpp
 firmware_state_verificationpending_unittest_LDADD = $(top_builddir)/libfirmwareblob_common.la
 
+firmware_state_verificationstarted_unittest_SOURCES = firmware_state_verificationstarted_unittest.cpp
+firmware_state_verificationstarted_unittest_LDADD = $(top_builddir)/libfirmwareblob_common.la
+
 if BUILD_HOST_TOOL
 tools_bt_unittest_SOURCES = tools_bt_unittest.cpp
 tools_bt_unittest_LDADD = $(top_builddir)/tools/libupdater.la
diff --git a/test/firmware_state_verificationpending_unittest.cpp b/test/firmware_state_verificationpending_unittest.cpp
index c7ef667..ba8360b 100644
--- a/test/firmware_state_verificationpending_unittest.cpp
+++ b/test/firmware_state_verificationpending_unittest.cpp
@@ -217,98 +217,6 @@
     EXPECT_EQ(expectedMeta, meta);
 }
 
-TEST_F(FirmwareHandlerVerificationPendingTest,
-       StatOnVerifyBlobIdAfterCommitChecksStateAndReturnsRunning)
-{
-    getToVerificationPending(staticLayoutBlobId);
-    EXPECT_TRUE(handler->open(session, flags, verifyBlobId));
-    EXPECT_CALL(*verifyMockPtr, triggerVerification()).WillOnce(Return(true));
-    EXPECT_CALL(*verifyMockPtr, checkVerificationState())
-        .WillOnce(Return(VerifyCheckResponses::running));
-
-    blobs::BlobMeta meta, expectedMeta = {};
-    expectedMeta.size = 0;
-    expectedMeta.blobState = flags | blobs::StateFlags::committing;
-    expectedMeta.metadata.push_back(
-        static_cast<std::uint8_t>(VerifyCheckResponses::running));
-
-    EXPECT_TRUE(handler->commit(session, {}));
-    EXPECT_TRUE(handler->stat(session, &meta));
-    EXPECT_EQ(expectedMeta, meta);
-}
-
-TEST_F(FirmwareHandlerVerificationPendingTest,
-       StatOnVerifyBlobIdAfterCommitCheckStateAndReturnsFailed)
-{
-    /* If the returned state from the verification handler is failed, it sets
-     * commit_error and transitions to verificationCompleted.
-     */
-    getToVerificationPending(staticLayoutBlobId);
-    EXPECT_TRUE(handler->open(session, flags, verifyBlobId));
-    EXPECT_CALL(*verifyMockPtr, triggerVerification()).WillOnce(Return(true));
-    EXPECT_CALL(*verifyMockPtr, checkVerificationState())
-        .WillOnce(Return(VerifyCheckResponses::failed));
-
-    blobs::BlobMeta meta, expectedMeta = {};
-    expectedMeta.size = 0;
-    expectedMeta.blobState = flags | blobs::StateFlags::commit_error;
-    expectedMeta.metadata.push_back(
-        static_cast<std::uint8_t>(VerifyCheckResponses::failed));
-
-    auto realHandler = dynamic_cast<FirmwareBlobHandler*>(handler.get());
-    EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationPending,
-              realHandler->getCurrentState());
-
-    EXPECT_TRUE(handler->commit(session, {}));
-
-    EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationStarted,
-              realHandler->getCurrentState());
-
-    EXPECT_TRUE(handler->stat(session, &meta));
-    EXPECT_EQ(expectedMeta, meta);
-
-    EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationCompleted,
-              realHandler->getCurrentState());
-}
-
-TEST_F(FirmwareHandlerVerificationPendingTest,
-       StatOnVerifyBlobIdAfterCommitCheckStateAndReturnsSuccess)
-{
-    /* If the returned state from the verification handler is success, it sets
-     * committed and transitions to verificationCompleted.
-     */
-    getToVerificationPending(staticLayoutBlobId);
-    EXPECT_TRUE(handler->open(session, flags, verifyBlobId));
-    EXPECT_CALL(*verifyMockPtr, triggerVerification()).WillOnce(Return(true));
-    EXPECT_CALL(*verifyMockPtr, checkVerificationState())
-        .WillOnce(Return(VerifyCheckResponses::success));
-
-    blobs::BlobMeta meta, expectedMeta = {};
-    expectedMeta.size = 0;
-    expectedMeta.blobState = flags | blobs::StateFlags::committed;
-    expectedMeta.metadata.push_back(
-        static_cast<std::uint8_t>(VerifyCheckResponses::success));
-
-    auto realHandler = dynamic_cast<FirmwareBlobHandler*>(handler.get());
-    EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationPending,
-              realHandler->getCurrentState());
-
-    EXPECT_TRUE(handler->commit(session, {}));
-
-    EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationStarted,
-              realHandler->getCurrentState());
-
-    EXPECT_TRUE(handler->stat(session, &meta));
-    EXPECT_EQ(expectedMeta, meta);
-
-    EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationCompleted,
-              realHandler->getCurrentState());
-}
-
-/* TODO: Once verificationCompleted is the state, canHandleBlob should accept
- * updateBlobId.
- */
-
 /*
  * writemeta(session)
  */
diff --git a/test/firmware_state_verificationstarted_unittest.cpp b/test/firmware_state_verificationstarted_unittest.cpp
new file mode 100644
index 0000000..b8fb579
--- /dev/null
+++ b/test/firmware_state_verificationstarted_unittest.cpp
@@ -0,0 +1,156 @@
+/* The goal of these tests is to verify the behavior of all blob commands given
+ * the current state is verificationStarted.  This state is achieved as a out of
+ * verificationPending.
+ */
+#include "firmware_handler.hpp"
+#include "firmware_unittest.hpp"
+#include "status.hpp"
+#include "util.hpp"
+
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+namespace ipmi_flash
+{
+namespace
+{
+
+using ::testing::Return;
+
+/*
+ * There are the following calls (parameters may vary):
+ * canHandleBlob(blob)
+ * getBlobIds
+ * deleteBlob(blob)
+ * stat(blob)
+ * stat(session)
+ * open(blob)
+ * close(session)
+ * writemeta(session)
+ * write(session)
+ * read(session)
+ * commit(session)
+ *
+ * Testing canHandleBlob is uninteresting in this state.  Getting the BlobIDs
+ * will inform what canHandleBlob will return.
+ */
+
+class FirmwareHandlerVerificationStartedTest : public IpmiOnlyFirmwareStaticTest
+{
+  protected:
+    void getToVerificationStarted(const std::string& blobId)
+    {
+        auto realHandler = dynamic_cast<FirmwareBlobHandler*>(handler.get());
+        EXPECT_CALL(imageMock, open(blobId)).WillOnce(Return(true));
+        EXPECT_TRUE(handler->open(session, flags, blobId));
+        EXPECT_EQ(FirmwareBlobHandler::UpdateState::uploadInProgress,
+                  realHandler->getCurrentState());
+        EXPECT_CALL(imageMock, close()).WillRepeatedly(Return());
+        handler->close(session);
+        EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationPending,
+                  realHandler->getCurrentState());
+
+        EXPECT_TRUE(handler->open(session, flags, verifyBlobId));
+        EXPECT_CALL(*verifyMockPtr, triggerVerification())
+            .WillOnce(Return(true));
+
+        EXPECT_TRUE(handler->commit(session, {}));
+        EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationStarted,
+                  realHandler->getCurrentState());
+    }
+
+    std::uint16_t session = 1;
+    std::uint16_t flags =
+        blobs::OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi;
+};
+
+/*
+ * stat(session)
+ */
+TEST_F(FirmwareHandlerVerificationStartedTest,
+       StatOnVerifyBlobIdAfterCommitChecksStateAndReturnsRunning)
+{
+    getToVerificationStarted(staticLayoutBlobId);
+    EXPECT_CALL(*verifyMockPtr, checkVerificationState())
+        .WillOnce(Return(VerifyCheckResponses::running));
+
+    blobs::BlobMeta meta, expectedMeta = {};
+    expectedMeta.size = 0;
+    expectedMeta.blobState = flags | blobs::StateFlags::committing;
+    expectedMeta.metadata.push_back(
+        static_cast<std::uint8_t>(VerifyCheckResponses::running));
+
+    EXPECT_TRUE(handler->stat(session, &meta));
+    EXPECT_EQ(expectedMeta, meta);
+}
+
+TEST_F(FirmwareHandlerVerificationStartedTest,
+       StatOnVerifyBlobIdAfterCommitCheckStateAndReturnsFailed)
+{
+    /* If the returned state from the verification handler is failed, it sets
+     * commit_error and transitions to verificationCompleted.
+     */
+    getToVerificationStarted(staticLayoutBlobId);
+    EXPECT_CALL(*verifyMockPtr, checkVerificationState())
+        .WillOnce(Return(VerifyCheckResponses::failed));
+
+    blobs::BlobMeta meta, expectedMeta = {};
+    expectedMeta.size = 0;
+    expectedMeta.blobState = flags | blobs::StateFlags::commit_error;
+    expectedMeta.metadata.push_back(
+        static_cast<std::uint8_t>(VerifyCheckResponses::failed));
+
+    auto realHandler = dynamic_cast<FirmwareBlobHandler*>(handler.get());
+    EXPECT_TRUE(handler->stat(session, &meta));
+    EXPECT_EQ(expectedMeta, meta);
+
+    EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationCompleted,
+              realHandler->getCurrentState());
+}
+
+TEST_F(FirmwareHandlerVerificationStartedTest,
+       StatOnVerifyBlobIdAfterCommitCheckStateAndReturnsSuccess)
+{
+    /* If the returned state from the verification handler is success, it sets
+     * committed and transitions to verificationCompleted.
+     */
+    getToVerificationStarted(staticLayoutBlobId);
+    EXPECT_CALL(*verifyMockPtr, checkVerificationState())
+        .WillOnce(Return(VerifyCheckResponses::success));
+
+    blobs::BlobMeta meta, expectedMeta = {};
+    expectedMeta.size = 0;
+    expectedMeta.blobState = flags | blobs::StateFlags::committed;
+    expectedMeta.metadata.push_back(
+        static_cast<std::uint8_t>(VerifyCheckResponses::success));
+
+    auto realHandler = dynamic_cast<FirmwareBlobHandler*>(handler.get());
+    EXPECT_TRUE(handler->stat(session, &meta));
+    EXPECT_EQ(expectedMeta, meta);
+
+    EXPECT_EQ(FirmwareBlobHandler::UpdateState::verificationCompleted,
+              realHandler->getCurrentState());
+}
+
+/* TODO: Once verificationCompleted is the state, canHandleBlob should accept
+ * updateBlobId.
+ */
+
+/* TODO:
+ * canHandleBlob(blob)
+ * getBlobIds
+ * deleteBlob(blob)
+ * stat(blob)
+ * open(blob) - there is nothing you can open, this state has an open file.
+ * close(session)
+ * writemeta(session)
+ * write(session)
+ * read(session)
+ * commit(session)
+ */
+
+} // namespace
+} // namespace ipmi_flash
