diff --git a/include/cryptsetupInterface.hpp b/include/cryptsetupInterface.hpp
new file mode 100644
index 0000000..9e26da9
--- /dev/null
+++ b/include/cryptsetupInterface.hpp
@@ -0,0 +1,193 @@
+#pragma once
+
+#include <libcryptsetup.h>
+
+#include <stdplus/handle/managed.hpp>
+
+namespace estoraged
+{
+
+/** @class CryptsetupInterface
+ *  @brief Interface to the cryptsetup functions used to manage a LUKS device.
+ *  @details This class is used to mock out the cryptsetup functions.
+ */
+class CryptsetupInterface
+{
+  public:
+    virtual ~CryptsetupInterface() = default;
+
+    /** @brief Wrapper around crypt_format.
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] cd - crypt device handle.
+     *  @param[in] type - type of device (optional params struct must be of
+     *    this type).
+     *  @param[in] cipher - (e.g. "aes").
+     *  @params[in cipher_mode - including IV specification (e.g. "xts-plain").
+     *  @params[in] uuid - requested UUID or NULL if it should be generated.
+     *  @params[in] volume_key - pre-generated volume key or NULL if it should
+     *    be generated (only for LUKS).
+     *  @params[in] volume_key_size - size of volume key in bytes.
+     *  @params[in] params - crypt type specific parameters.
+     *
+     *  @returns 0 on success or negative errno value otherwise.
+     */
+    virtual int cryptFormat(struct crypt_device* cd, const char* type,
+                            const char* cipher, const char* cipherMode,
+                            const char* uuid, const char* volumeKey,
+                            size_t volumeKeySize, void* params) = 0;
+
+    /** @brief Wrapper around crypt_keyslot_add_by_volume_key.
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] cd - crypt device handle.
+     *  @param[in] keyslot - requested keyslot or CRYPT_ANY_SLOT.
+     *  @param[in] volume_key - provided volume key or NULL if used after
+     *    crypt_format.
+     *  @param[in] volume_key_size - size of volume_key.
+     *  @param[in] passphrase - passphrase for new keyslot.
+     *  @param[in] passphrase_size - size of passphrase.
+     *
+     *  @returns allocated key slot number or negative errno otherwise.
+     */
+    virtual int cryptKeyslotAddByVolumeKey(struct crypt_device* cd, int keyslot,
+                                           const char* volumeKey,
+                                           size_t volumeKeySize,
+                                           const char* passphrase,
+                                           size_t passphraseSize) = 0;
+
+    /** @brief Wrapper around crypt_load.
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] cd - crypt device handle.
+     *  @param[in] requested_type - crypt-type or NULL for all known.
+     *  @param[in] params - crypt type specific parameters (see crypt-type).
+     *
+     *  @returns 0 on success or negative errno value otherwise.
+     */
+    virtual int cryptLoad(struct crypt_device* cd, const char* requestedType,
+                          void* params) = 0;
+
+    /** @brief Wrapper around crypt_activate_by_passphrase.
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] cd - crypt device handle.
+     *  @param[in] name - name of device to create, if NULL only check
+     *    passphrase.
+     *  @param[in] keyslot - requested keyslot to check or CRYPT_ANY_SLOT.
+     *  @param[in] passphrase - passphrase used to unlock volume key.
+     *  @param[in] passphrase_size - size of passphrase.
+     *  @param[in] flags - activation flags.
+     *
+     *  @returns unlocked key slot number or negative errno otherwise.
+     */
+    virtual int cryptActivateByPassphrase(struct crypt_device* cd,
+                                          const char* name, int keyslot,
+                                          const char* passphrase,
+                                          size_t passphraseSize,
+                                          uint32_t flags) = 0;
+
+    /** @brief Wrapper around crypt_deactivate.
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] cd - crypt device handle, can be NULL.
+     *  @param[in] name - name of device to deactivate.
+     *
+     *  @returns 0 on success or negative errno value otherwise.
+     */
+    virtual int cryptDeactivate(struct crypt_device* cd, const char* name) = 0;
+};
+
+/** @class Cryptsetup
+ *  @brief Implements CryptsetupInterface.
+ */
+class Cryptsetup : public CryptsetupInterface
+{
+  public:
+    ~Cryptsetup() = default;
+
+    int cryptFormat(struct crypt_device* cd, const char* type,
+                    const char* cipher, const char* cipherMode,
+                    const char* uuid, const char* volumeKey,
+                    size_t volumeKeySize, void* params) override
+    {
+        return crypt_format(cd, type, cipher, cipherMode, uuid, volumeKey,
+                            volumeKeySize, params);
+    }
+
+    int cryptKeyslotAddByVolumeKey(struct crypt_device* cd, int keyslot,
+                                   const char* volumeKey, size_t volumeKeySize,
+                                   const char* passphrase,
+                                   size_t passphraseSize) override
+    {
+        return crypt_keyslot_add_by_volume_key(
+            cd, keyslot, volumeKey, volumeKeySize, passphrase, passphraseSize);
+    }
+
+    int cryptLoad(struct crypt_device* cd, const char* requestedType,
+                  void* params) override
+    {
+        return crypt_load(cd, requestedType, params);
+    }
+
+    int cryptActivateByPassphrase(struct crypt_device* cd, const char* name,
+                                  int keyslot, const char* passphrase,
+                                  size_t passphraseSize,
+                                  uint32_t flags) override
+    {
+        return crypt_activate_by_passphrase(cd, name, keyslot, passphrase,
+                                            passphraseSize, flags);
+    }
+
+    int cryptDeactivate(struct crypt_device* cd, const char* name) override
+    {
+        return crypt_deactivate(cd, name);
+    }
+};
+
+/** @class CryptHandle
+ *  @brief This manages a crypt_device struct and automatically frees it when
+ *  this handle exits the current scope.
+ */
+class CryptHandle
+{
+  public:
+    /** @brief Constructor for CryptHandle
+     *
+     *  @param[out] cd - pointer to crypt_device*, to be allocated
+     *  @param[in] device - path to device file
+     */
+    CryptHandle(struct crypt_device** cd, const char* device) :
+        handle(init(cd, device))
+    {}
+
+    /** @brief Allocate and initialize the crypt_device struct
+     *
+     *  @param[out] cd - pointer to crypt_device*, to be allocated
+     *  @param[in] device - path to device file
+     */
+    struct crypt_device* init(struct crypt_device** cd, const char* device)
+    {
+        int retval = crypt_init(cd, device);
+        if (retval < 0)
+        {
+            return nullptr;
+        }
+
+        return *cd;
+    }
+
+    /** @brief Free the crypt_device struct
+     *
+     *  @param[in] cd - pointer to crypt_device*, to be freed
+     */
+    static void cryptFree(struct crypt_device*&& cd)
+    {
+        crypt_free(cd);
+    }
+
+    /** @brief Managed handle to crypt_device struct */
+    stdplus::Managed<struct crypt_device*>::Handle<cryptFree> handle;
+};
+
+} // namespace estoraged
diff --git a/include/estoraged.hpp b/include/estoraged.hpp
index 557c490..3a18416 100644
--- a/include/estoraged.hpp
+++ b/include/estoraged.hpp
@@ -1,17 +1,27 @@
 #pragma once
 
+#include "cryptsetupInterface.hpp"
+#include "filesystemInterface.hpp"
+
+#include <libcryptsetup.h>
+
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/exception.hpp>
 #include <sdbusplus/server/object.hpp>
 #include <xyz/openbmc_project/eStoraged/server.hpp>
 
+#include <filesystem>
+#include <memory>
 #include <string>
+#include <string_view>
 #include <vector>
 
 namespace estoraged
 {
 using eStoragedInherit = sdbusplus::server::object_t<
     sdbusplus::xyz::openbmc_project::server::eStoraged>;
+using estoraged::Cryptsetup;
+using estoraged::Filesystem;
 
 /** @class eStoraged
  *  @brief eStoraged object to manage a LUKS encrypted storage device.
@@ -19,10 +29,27 @@
 class eStoraged : eStoragedInherit
 {
   public:
+    /** @brief Constructor for eStoraged
+     *
+     *  @param[in] bus - sdbusplus dbus object
+     *  @param[in] path - DBus object path
+     *  @param[in] devPath - path to device file, e.g. /dev/mmcblk0
+     *  @param[in] luksName - name for the LUKS container
+     *  @param[in] cryptInterface - (optional) pointer to CryptsetupInterface
+     *    object
+     *  @param[in] fsInterface - (optional) pointer to FilesystemInterface
+     *    object
+     */
     eStoraged(sdbusplus::bus::bus& bus, const char* path,
-              const std::string& devPath, const std::string& containerName) :
+              const std::string& devPath, const std::string& luksName,
+              std::unique_ptr<CryptsetupInterface> cryptInterface =
+                  std::make_unique<Cryptsetup>(),
+              std::unique_ptr<FilesystemInterface> fsInterface =
+                  std::make_unique<Filesystem>()) :
         eStoragedInherit(bus, path),
-        devPath(devPath), containerName(containerName)
+        devPath(devPath), containerName(luksName),
+        mountPoint("/mnt/" + luksName + "_fs"),
+        cryptIface(std::move(cryptInterface)), fsIface(std::move(fsInterface))
     {}
 
     /** @brief Format the LUKS encrypted device and create empty filesystem.
@@ -58,12 +85,65 @@
     void changePassword(std::vector<uint8_t> oldPassword,
                         std::vector<uint8_t> newPassword) override;
 
+    /** @brief Check if the LUKS device is currently locked. */
+    bool isLocked() const;
+
+    /** @brief Get the mount point for the filesystem on the LUKS device. */
+    std::string_view getMountPoint() const;
+
   private:
-    /* Full path of the device file, e.g. /dev/mmcblk0 */
+    /** @brief Full path of the device file, e.g. /dev/mmcblk0. */
     std::string devPath;
 
-    /* Name of the LUKS container. */
+    /** @brief Name of the LUKS container. */
     std::string containerName;
+
+    /** @brief Mount point for the filesystem. */
+    std::string mountPoint;
+
+    /** @brief Pointer to cryptsetup interface object.
+     *  @details This is used to mock out the cryptsetup functions.
+     */
+    std::unique_ptr<CryptsetupInterface> cryptIface;
+
+    /** @brief Pointer to filesystem interface object.
+     *  @details This is used to mock out filesystem operations.
+     */
+    std::unique_ptr<FilesystemInterface> fsIface;
+
+    /** @brief Format LUKS encrypted device.
+     *
+     *  @param[in] cd - initialized crypt_device struct for the device.
+     *  @param[in] password - password to set for the LUKS device.
+     */
+    void formatLuksDev(struct crypt_device* cd, std::vector<uint8_t> password);
+
+    /** @brief Unlock the device.
+     *
+     *  @param[in] cd - initialized crypt_device struct for the device.
+     *  @param[in] password - password to activate the LUKS device.
+     */
+    void activateLuksDev(struct crypt_device* cd,
+                         std::vector<uint8_t> password);
+
+    /** @brief Create the filesystem on the LUKS device.
+     *  @details The LUKS device should already be activated, i.e. unlocked.
+     */
+    void createFilesystem();
+
+    /** @brief Deactivate the LUKS device.
+     *  @details The filesystem is assumed to be unmounted already.
+     */
+    void deactivateLuksDev();
+
+    /** @brief Mount the filesystem.
+     *  @details The filesystem should already exist and the LUKS device should
+     *  be unlocked already.
+     */
+    void mountFilesystem();
+
+    /** @brief Unmount the filesystem. */
+    void unmountFilesystem();
 };
 
 } // namespace estoraged
diff --git a/include/filesystemInterface.hpp b/include/filesystemInterface.hpp
new file mode 100644
index 0000000..d34ff06
--- /dev/null
+++ b/include/filesystemInterface.hpp
@@ -0,0 +1,111 @@
+#pragma once
+
+#include <sys/mount.h>
+
+#include <filesystem>
+#include <string>
+
+namespace estoraged
+{
+
+/** @class FilesystemInterface
+ *  @brief Interface to the filesystem operations that eStoraged needs.
+ *  @details This class is used to mock out the filesystem operations.
+ */
+class FilesystemInterface
+{
+  public:
+    virtual ~FilesystemInterface() = default;
+
+    /** @brief Runs the mkfs command to create the filesystem.
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] logicalVolume - name of the mapped LUKS device.
+     *
+     *  @returns 0 on success, nonzero on failure.
+     */
+    virtual int runMkfs(const std::string& logicalVolume) = 0;
+
+    /** @brief Wrapper around mount().
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] source - device where the filesystem is located.
+     *  @param[in] target - path to where the filesystem should be mounted.
+     *  @param[in] filesystemType - (e.g. "ext4").
+     *  @param[in] mountflags - flags bit mask (see mount() documentation).
+     *  @param[in] data - options for specific filesystem type, can be NULL
+     *    (see mount() documentation).
+     *
+     *  @returns On success, zero is returned.  On error, -1 is returned, and
+     *    errno is set to indicate the error.
+     */
+    virtual int doMount(const char* source, const char* target,
+                        const char* filesystemtype, unsigned long mountflags,
+                        const void* data) = 0;
+
+    /** @brief Wrapper around umount().
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] target - path location where the filesystem is mounted.
+     *
+     *  @returns On success, zero is returned.  On error, -1 is returned, and
+     *    errno is set to indicate the error.
+     */
+    virtual int doUnmount(const char* target) = 0;
+
+    /** @brief Wrapper around std::filesystem::create_directory.
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] p - path to directory that should be created.
+     *
+     *  @returns true on success, false otherwise.
+     */
+    virtual bool createDirectory(const std::filesystem::path& p) = 0;
+
+    /** @brief Wrapper around std::filesystem::remove.
+     *  @details Used for mocking purposes.
+     *
+     *  @param[in] p - path to directory that should be removed.
+     *
+     *  @returns true on success, false otherwise.
+     */
+    virtual bool removeDirectory(const std::filesystem::path& p) = 0;
+};
+
+/** @class Filesystem
+ *  @brief Implements FilesystemInterface
+ */
+class Filesystem : public FilesystemInterface
+{
+  public:
+    ~Filesystem() = default;
+
+    int runMkfs(const std::string& logicalVolume) override
+    {
+        std::string mkfsCommand("mkfs.ext4 /dev/mapper/" + logicalVolume);
+        return system(mkfsCommand.c_str());
+    }
+
+    int doMount(const char* source, const char* target,
+                const char* filesystemtype, unsigned long mountflags,
+                const void* data) override
+    {
+        return mount(source, target, filesystemtype, mountflags, data);
+    }
+
+    int doUnmount(const char* target) override
+    {
+        return umount(target);
+    }
+
+    bool createDirectory(const std::filesystem::path& p) override
+    {
+        return std::filesystem::create_directory(p);
+    }
+
+    bool removeDirectory(const std::filesystem::path& p) override
+    {
+        return std::filesystem::remove(p);
+    }
+};
+} // namespace estoraged
