diff --git a/.gitignore b/.gitignore
index 2746325db830dc88ab781f979292cf09f20e41a1..03fc2c78d2c0dea0dbf8498a235e46893304b422 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,4 @@ creeperDb*
 *.log
 release.properties
 aethermud-graph.json
+aethermud-graph.json*
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
index 2602ead4d4c1d354dee7f9e52d17a9f66103bf3e..92a97b8583815fd8b3636b71466fbe034d15407a 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
@@ -29,15 +29,23 @@ import org.apache.log4j.Logger;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.io.IoCore;
 
+import java.io.File;
+import java.io.FileFilter;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.*;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.stream.Collectors;
 
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+
 //TODO : multiple instances of this class could create conflicts in the DB
 public class GraphDbAetherMudStorage extends AbstractIdleService implements AetherMudStorage {
+    private static final int MAX_BACKUPS = 5;
     private static final Logger LOGGER = Logger.getLogger(GraphDbAetherMudStorage.class);
     private final WrappedFramedGraph<Graph> framedGraph;
     private final String graphDbFile;
@@ -80,7 +88,40 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth
 
     }
 
-    public void persist() {
+    public synchronized void persist() {
+        try {
+            Path defaultFilePath = Paths.get(this.graphDbFile);
+            if( Files.exists(defaultFilePath) )
+                Files.move(defaultFilePath, Paths.get(this.graphDbFile + new Date().getTime()), REPLACE_EXISTING);
+        } catch (IOException e) {
+            //do nothing, it probably doesnt exist
+        }
+
+        //remove all but the last 20 backedup files
+        NavigableSet<File> orderedFiles = new TreeSet<>(new Comparator<File>() {
+            @Override
+            public int compare(File file, File t1) {
+                if( file.lastModified() > t1.lastModified() )
+                    return 1;
+                else if( file.lastModified() < t1.lastModified() )
+                    return -1;
+                else
+                    return 0;
+            }
+        });
+        File folder = new File(".");
+        orderedFiles.addAll(Arrays.asList(folder.listFiles(new FileFilter() {
+            @Override
+            public boolean accept(File file) {
+                return file.getName().contains(graphDbFile);
+            }
+        })));
+        while(orderedFiles.size() > MAX_BACKUPS) {
+            File currentFile = orderedFiles.first();
+            orderedFiles.remove(currentFile);
+            currentFile.delete();
+        }
+
         try {
             this.framedGraph.getBaseGraph().io(IoCore.graphson()).writeGraph(this.graphDbFile);
         } catch (IOException e) {