diff --git a/internal/dynamo-browse/controllers/tableread_test.go b/internal/dynamo-browse/controllers/tableread_test.go
index 3ac1794..e2f3329 100644
--- a/internal/dynamo-browse/controllers/tableread_test.go
+++ b/internal/dynamo-browse/controllers/tableread_test.go
@@ -4,9 +4,12 @@ import (
 	"fmt"
 	tea "github.com/charmbracelet/bubbletea"
 	"github.com/lmika/audax/internal/common/ui/events"
+	"github.com/lmika/audax/internal/common/workspaces"
 	"github.com/lmika/audax/internal/dynamo-browse/controllers"
 	"github.com/lmika/audax/internal/dynamo-browse/providers/dynamo"
+	"github.com/lmika/audax/internal/dynamo-browse/providers/workspacestore"
 	"github.com/lmika/audax/internal/dynamo-browse/services/tables"
+	workspaces_service "github.com/lmika/audax/internal/dynamo-browse/services/workspaces"
 	"github.com/lmika/audax/test/testdynamo"
 	"github.com/stretchr/testify/assert"
 	"os"
@@ -17,11 +20,14 @@ import (
 func TestTableReadController_InitTable(t *testing.T) {
 	client := testdynamo.SetupTestTable(t, testData)
 
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	provider := dynamo.NewProvider(client)
 	service := tables.NewService(provider)
 
 	t.Run("should prompt for table if no table name provided", func(t *testing.T) {
-		readController := controllers.NewTableReadController(controllers.NewState(), service, "")
+		readController := controllers.NewTableReadController(controllers.NewState(), service, workspaceService, "")
 
 		cmd := readController.Init()
 		event := cmd()
@@ -30,7 +36,7 @@ func TestTableReadController_InitTable(t *testing.T) {
 	})
 
 	t.Run("should scan table if table name provided", func(t *testing.T) {
-		readController := controllers.NewTableReadController(controllers.NewState(), service, "")
+		readController := controllers.NewTableReadController(controllers.NewState(), service, workspaceService, "")
 
 		cmd := readController.Init()
 		event := cmd()
@@ -42,9 +48,12 @@ func TestTableReadController_InitTable(t *testing.T) {
 func TestTableReadController_ListTables(t *testing.T) {
 	client := testdynamo.SetupTestTable(t, testData)
 
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	provider := dynamo.NewProvider(client)
 	service := tables.NewService(provider)
-	readController := controllers.NewTableReadController(controllers.NewState(), service, "")
+	readController := controllers.NewTableReadController(controllers.NewState(), service, workspaceService, "")
 
 	t.Run("returns a list of tables", func(t *testing.T) {
 		cmd := readController.ListTables()
@@ -65,10 +74,13 @@ func TestTableReadController_ListTables(t *testing.T) {
 func TestTableReadController_Rescan(t *testing.T) {
 	client := testdynamo.SetupTestTable(t, testData)
 
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	provider := dynamo.NewProvider(client)
 	service := tables.NewService(provider)
 	state := controllers.NewState()
-	readController := controllers.NewTableReadController(state, service, "bravo-table")
+	readController := controllers.NewTableReadController(state, service, workspaceService, "bravo-table")
 
 	t.Run("should perform a rescan", func(t *testing.T) {
 		invokeCommand(t, readController.Init())
@@ -99,9 +111,12 @@ func TestTableReadController_Rescan(t *testing.T) {
 func TestTableReadController_ExportCSV(t *testing.T) {
 	client := testdynamo.SetupTestTable(t, testData)
 
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	provider := dynamo.NewProvider(client)
 	service := tables.NewService(provider)
-	readController := controllers.NewTableReadController(controllers.NewState(), service, "bravo-table")
+	readController := controllers.NewTableReadController(controllers.NewState(), service, workspaceService, "bravo-table")
 
 	t.Run("should export result set to CSV file", func(t *testing.T) {
 		tempFile := tempFile(t)
@@ -122,7 +137,7 @@ func TestTableReadController_ExportCSV(t *testing.T) {
 
 	t.Run("should return error if result set is not set", func(t *testing.T) {
 		tempFile := tempFile(t)
-		readController := controllers.NewTableReadController(controllers.NewState(), service, "non-existant-table")
+		readController := controllers.NewTableReadController(controllers.NewState(), service, workspaceService, "non-existant-table")
 
 		invokeCommandExpectingError(t, readController.Init())
 		invokeCommandExpectingError(t, readController.ExportCSV(tempFile))
@@ -134,9 +149,12 @@ func TestTableReadController_ExportCSV(t *testing.T) {
 func TestTableReadController_Query(t *testing.T) {
 	client := testdynamo.SetupTestTable(t, testData)
 
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	provider := dynamo.NewProvider(client)
 	service := tables.NewService(provider)
-	readController := controllers.NewTableReadController(controllers.NewState(), service, "bravo-table")
+	readController := controllers.NewTableReadController(controllers.NewState(), service, workspaceService, "bravo-table")
 
 	t.Run("should run scan with filter based on user query", func(t *testing.T) {
 		tempFile := tempFile(t)
@@ -156,7 +174,7 @@ func TestTableReadController_Query(t *testing.T) {
 
 	t.Run("should return error if result set is not set", func(t *testing.T) {
 		tempFile := tempFile(t)
-		readController := controllers.NewTableReadController(controllers.NewState(), service, "non-existant-table")
+		readController := controllers.NewTableReadController(controllers.NewState(), service, workspaceService, "non-existant-table")
 
 		invokeCommandExpectingError(t, readController.Init())
 		invokeCommandExpectingError(t, readController.ExportCSV(tempFile))
@@ -177,6 +195,19 @@ func tempFile(t *testing.T) string {
 	return tempFile.Name()
 }
 
+func testWorkspace(t *testing.T) *workspaces.Workspace {
+	wsTempFile := tempFile(t)
+
+	wsManager := workspaces.New(workspaces.MetaInfo{Command: "dynamo-browse"})
+	ws, err := wsManager.Open(wsTempFile)
+	if err != nil {
+		t.Fatalf("cannot create workspace manager: %v", err)
+	}
+	t.Cleanup(func() { ws.Close() })
+
+	return ws
+}
+
 func invokeCommand(t *testing.T, cmd tea.Cmd) tea.Msg {
 	msg := cmd()
 
diff --git a/internal/dynamo-browse/controllers/tablewrite_test.go b/internal/dynamo-browse/controllers/tablewrite_test.go
index cf6f1e4..ff29b8c 100644
--- a/internal/dynamo-browse/controllers/tablewrite_test.go
+++ b/internal/dynamo-browse/controllers/tablewrite_test.go
@@ -6,13 +6,18 @@ import (
 	"github.com/lmika/audax/internal/dynamo-browse/controllers"
 	"github.com/lmika/audax/internal/dynamo-browse/models"
 	"github.com/lmika/audax/internal/dynamo-browse/providers/dynamo"
+	"github.com/lmika/audax/internal/dynamo-browse/providers/workspacestore"
 	"github.com/lmika/audax/internal/dynamo-browse/services/tables"
+	workspaces_service "github.com/lmika/audax/internal/dynamo-browse/services/workspaces"
 	"github.com/lmika/audax/test/testdynamo"
 	"github.com/stretchr/testify/assert"
 	"testing"
 )
 
 func TestTableWriteController_NewItem(t *testing.T) {
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	t.Run("should add an item with pk and sk set at the end of the result set", func(t *testing.T) {
 		client := testdynamo.SetupTestTable(t, testData)
 
@@ -20,7 +25,7 @@ func TestTableWriteController_NewItem(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		invokeCommand(t, readController.Init())
@@ -43,6 +48,9 @@ func TestTableWriteController_NewItem(t *testing.T) {
 }
 
 func TestTableWriteController_SetAttributeValue(t *testing.T) {
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	t.Run("should preserve the type of the field if unspecified", func(t *testing.T) {
 
 		scenarios := []struct {
@@ -80,7 +88,7 @@ func TestTableWriteController_SetAttributeValue(t *testing.T) {
 				service := tables.NewService(provider)
 
 				state := controllers.NewState()
-				readController := controllers.NewTableReadController(state, service, "alpha-table")
+				readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 				writeController := controllers.NewTableWriteController(state, service, readController)
 
 				invokeCommand(t, readController.Init())
@@ -100,7 +108,7 @@ func TestTableWriteController_SetAttributeValue(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		invokeCommand(t, readController.Init())
@@ -154,7 +162,7 @@ func TestTableWriteController_SetAttributeValue(t *testing.T) {
 		for _, scenario := range scenarios {
 			t.Run(fmt.Sprintf("should change the value of a field to type %v", scenario.attrType), func(t *testing.T) {
 				state := controllers.NewState()
-				readController := controllers.NewTableReadController(state, service, "alpha-table")
+				readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 				writeController := controllers.NewTableWriteController(state, service, readController)
 
 				invokeCommand(t, readController.Init())
@@ -175,7 +183,7 @@ func TestTableWriteController_SetAttributeValue(t *testing.T) {
 
 			t.Run(fmt.Sprintf("should change value of nested field to type %v", scenario.attrType), func(t *testing.T) {
 				state := controllers.NewState()
-				readController := controllers.NewTableReadController(state, service, "alpha-table")
+				readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 				writeController := controllers.NewTableWriteController(state, service, readController)
 
 				invokeCommand(t, readController.Init())
@@ -205,12 +213,15 @@ func TestTableWriteController_SetAttributeValue(t *testing.T) {
 func TestTableWriteController_DeleteAttribute(t *testing.T) {
 	client := testdynamo.SetupTestTable(t, testData)
 
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	provider := dynamo.NewProvider(client)
 	service := tables.NewService(provider)
 
 	t.Run("should delete top level attribute", func(t *testing.T) {
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		invokeCommand(t, readController.Init())
@@ -226,7 +237,7 @@ func TestTableWriteController_DeleteAttribute(t *testing.T) {
 
 	t.Run("should delete attribute of map", func(t *testing.T) {
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		invokeCommand(t, readController.Init())
@@ -247,6 +258,9 @@ func TestTableWriteController_DeleteAttribute(t *testing.T) {
 }
 
 func TestTableWriteController_PutItem(t *testing.T) {
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	t.Run("should put the selected item if dirty", func(t *testing.T) {
 		client := testdynamo.SetupTestTable(t, testData)
 
@@ -254,7 +268,7 @@ func TestTableWriteController_PutItem(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		// Read the table
@@ -281,7 +295,7 @@ func TestTableWriteController_PutItem(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		// Read the table
@@ -312,7 +326,7 @@ func TestTableWriteController_PutItem(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		// Read the table
@@ -326,6 +340,9 @@ func TestTableWriteController_PutItem(t *testing.T) {
 }
 
 func TestTableWriteController_PutItems(t *testing.T) {
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	t.Run("should put all dirty items if none are marked", func(t *testing.T) {
 		client := testdynamo.SetupTestTable(t, testData)
 
@@ -333,7 +350,7 @@ func TestTableWriteController_PutItems(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		invokeCommand(t, readController.Init())
@@ -361,7 +378,7 @@ func TestTableWriteController_PutItems(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		invokeCommand(t, readController.Init())
@@ -397,7 +414,7 @@ func TestTableWriteController_PutItems(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		invokeCommand(t, readController.Init())
@@ -428,6 +445,9 @@ func TestTableWriteController_PutItems(t *testing.T) {
 }
 
 func TestTableWriteController_TouchItem(t *testing.T) {
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	t.Run("should put the selected item if unmodified", func(t *testing.T) {
 		client := testdynamo.SetupTestTable(t, testData)
 
@@ -435,7 +455,7 @@ func TestTableWriteController_TouchItem(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		// Read the table
@@ -461,7 +481,7 @@ func TestTableWriteController_TouchItem(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		// Read the table
@@ -477,6 +497,9 @@ func TestTableWriteController_TouchItem(t *testing.T) {
 }
 
 func TestTableWriteController_NoisyTouchItem(t *testing.T) {
+	resultSetSnapshotStore := workspacestore.NewResultSetSnapshotStore(testWorkspace(t))
+	workspaceService := workspaces_service.NewService(resultSetSnapshotStore)
+
 	t.Run("should delete and put the selected item if unmodified", func(t *testing.T) {
 		client := testdynamo.SetupTestTable(t, testData)
 
@@ -484,7 +507,7 @@ func TestTableWriteController_NoisyTouchItem(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		// Read the table
@@ -510,7 +533,7 @@ func TestTableWriteController_NoisyTouchItem(t *testing.T) {
 		service := tables.NewService(provider)
 
 		state := controllers.NewState()
-		readController := controllers.NewTableReadController(state, service, "alpha-table")
+		readController := controllers.NewTableReadController(state, service, workspaceService, "alpha-table")
 		writeController := controllers.NewTableWriteController(state, service, readController)
 
 		// Read the table