diff --git a/com.oracle.truffle.r.pkgs/refcmp/NAMESPACE b/com.oracle.truffle.r.pkgs/refcmp/NAMESPACE
index 4fc3a467e1cb6aefd617da8c27e6c4ae26391b30..211930545bace09e2c5139710351e1ef30a7c35c 100644
--- a/com.oracle.truffle.r.pkgs/refcmp/NAMESPACE
+++ b/com.oracle.truffle.r.pkgs/refcmp/NAMESPACE
@@ -2,3 +2,5 @@
 
 export(snapshot)
 export(snapshot.init)
+export(snapshot_id)
+export(snapshot.show)
diff --git a/com.oracle.truffle.r.pkgs/refcmp/R/refcmp.R b/com.oracle.truffle.r.pkgs/refcmp/R/refcmp.R
index cfee528e3a88d3067ff18f795c541331f9631d58..254bbe0c51eee9d825c9e52325ac867ec44aea75 100644
--- a/com.oracle.truffle.r.pkgs/refcmp/R/refcmp.R
+++ b/com.oracle.truffle.r.pkgs/refcmp/R/refcmp.R
@@ -22,7 +22,7 @@
 ##
 
 refcmpEnv <- new.env(parent = emptyenv())
-refcmpEnv$reference_filename <- 'reference_values.obj'
+refcmpEnv$snapshot_dir <- 'snapshots'
 refcmpEnv$snapshot_id <- 0L
 
 snapshot.isFastR <- function() {
@@ -30,31 +30,69 @@ snapshot.isFastR <- function() {
 }
 refcmpEnv$isReferenceRun <- function() !snapshot.isFastR()
 
-snaphost.init <- function(filename) {
-    if(!missing(filename)) {
-        refcmpEnv$reference_filename <- filename
-    } else {
-    }
-}
-
-snaphost.has_reference_run <- function(...) {
+snapshot.init <- function(dir) {
+    if(!missing(dir)) {
+        refcmpEnv$snaphost_dir <- dir
+    } 
+    refcmpEnv$snapshot_id <- 0
 }
 
 snapshot <- function(...) {
     vars <- list(...)
+    try({
+        snapshot_id(refcmpEnv$snapshot_id, vars)
+        refcmpEnv$snapshot_id <- refcmpEnv$snapshot_id + 1
+    })
+}
 
-    if(recmpEnv$isReferenceRun()) {
-        snapshot.record(vars)
+snapshot_id <- function(id, vars) {
+    if(refcmpEnv$isReferenceRun()) {
+        snapshot.record(id, vars)
     } else {
-        snapshot.check(vars)
+        snapshot.check(id, vars)
     }
 }
 
-snapshot.record <- function(vars) {
-    fcon <- file(refcmpEnv$reference_filename
+snapshot.record <- function(id, vars) {
+    dumpDir <- file.path(refcmpEnv$snapshot_dir)
+    if(!dir.exists(dumpDir)) {
+        dir.create(dumpDir)
+    }
+    fcon <- file(file.path(refcmpEnv$snapshot_dir, paste0("snapshot", id, ".obj")))
+    saveRDS(vars, file=fcon)
+    close(fcon)
+}
 
+snapshot.check <- function(id, vars) {
+    fcon <- file(file.path(refcmpEnv$snapshot_dir, paste0("snapshot", id, ".obj")))
+    restoredVars <- readRDS(file=fcon)
+    close(fcon)
+
+    if(length(restoredVars) < length(vars)) {
+        stop(paste("recorded snapshot has", length(restoredVars), "recorded variables but expected", length(vars)))
+    }
+
+    var_names <- names(vars)
+    restored_names <- names(restoredVars)
+    for(i in seq_along(var_names)) {
+        if(var_names[[i]] %in% restored_names) {
+            actualVal <- vars[[var_names[[i]]]]
+            expectedVal <- restoredVars[[var_names[[i]]]]
+            if(actualVal != expectedVal) {
+                stop(paste0("Value of variable '", var_names[[i]], "' differs. Expected ", expectedVal, " but was ", actualVal))
+            }
+        } else {
+            stop(paste0("Missing variable '", var_names[[i]], "' in recorded variables"))
+        }
+
+    }
 }
 
-snapshot.check <- function(vars) {
+snapshot.show <- function(id = refcmpEnv$snapshot_id) {
+    fcon <- file(file.path(refcmpEnv$snapshot_dir, paste0("snapshot", id, ".obj")))
+    restoredVars <- readRDS(file=fcon)
+    close(fcon)
+
+    restoredVars
 }