Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/BackupManagerImpl.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/BackupManagerImpl.java	(revision 0)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/BackupManagerImpl.java	(revision 0)
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.backup;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BackupManagerImpl implements BackupManager {
+
+    private static final Logger log = LoggerFactory
+            .getLogger(BackupManagerImpl.class);
+
+    private static final long DEFAULT_LIFETIME = TimeUnit.HOURS.toMillis(1);
+
+    private static int CACHE_SIZE = 256;
+
+    private final NodeStore store;
+
+    public BackupManagerImpl(NodeStore store) {
+        this.store = store;
+    }
+
+    public void backup(File destination) throws IOException {
+        long s = System.currentTimeMillis();
+
+        // 1. create a new checkpoint with the current state
+        String checkpoint = store.checkpoint(DEFAULT_LIFETIME);
+        NodeState current = store.retrieve(checkpoint);
+        if (current == null) {
+            log.debug("Unable to retrieve checkpoint {}", checkpoint);
+            return;
+        }
+
+        // 2. init filestore
+        destination.mkdirs();
+        FileStore backup = null;
+        try {
+            backup = new FileStore(destination, current, CACHE_SIZE,
+                    CACHE_SIZE, true);
+
+            // TODO incremental backup
+            // Journal root = backup.getJournal("root");
+            // SegmentNodeState state = new SegmentNodeState(backup.getWriter()
+            // .getDummySegment(), root.getHead());
+            // SegmentRootBuilder builder = state.builder();
+            //
+            // current.compareAgainstBaseState(state, new ApplyDiff(builder));
+            // root.setHead(state.getRecordId(), builder.getNodeState()
+            // .getRecordId());
+
+        } finally {
+            backup.close();
+            log.debug("Backup done in {} ms.", System.currentTimeMillis() - s);
+        }
+    }
+}
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/BackupManager.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/BackupManager.java	(revision 0)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/BackupManager.java	(revision 0)
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.backup;
+
+import java.io.File;
+import java.io.IOException;
+
+public interface BackupManager {
+
+    void backup(File destination) throws IOException;
+
+}
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java	(revision 1545984)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java	(working copy)
@@ -39,6 +39,7 @@
 import org.apache.jackrabbit.oak.plugins.segment.Segment;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 public class FileStore extends AbstractStore {
 
@@ -64,11 +65,16 @@
 
     public FileStore(File directory, int maxFileSizeMB, boolean memoryMapping)
             throws IOException {
-        this(directory, maxFileSizeMB, DEFAULT_MEMORY_CACHE_SIZE, memoryMapping);
+        this(directory, EMPTY_NODE, maxFileSizeMB, DEFAULT_MEMORY_CACHE_SIZE, memoryMapping);
     }
 
     public FileStore(File directory, int maxFileSizeMB, int cacheSizeMB,
             boolean memoryMapping) throws IOException {
+        this(directory, EMPTY_NODE, maxFileSizeMB, cacheSizeMB, memoryMapping);
+    }
+
+    public FileStore(File directory, NodeState initial, int maxFileSizeMB,
+            int cacheSizeMB, boolean memoryMapping) throws IOException {
         super(cacheSizeMB);
         checkNotNull(directory).mkdirs();
         this.directory = directory;
@@ -115,8 +121,8 @@
         }
 
         if (!journals.containsKey("root")) {
-            NodeBuilder builder = EMPTY_NODE.builder();
-            builder.setChildNode("root", EMPTY_NODE);
+            NodeBuilder builder = initial.builder();
+            builder.setChildNode("root", initial);
             journals.put("root", new FileJournal(this, builder.getNodeState()));
         }
     }
Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/backup/BackupTest.java
===================================================================
--- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/backup/BackupTest.java	(revision 0)
+++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/backup/BackupTest.java	(revision 0)
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.backup;
+
+import static org.apache.commons.io.FileUtils.deleteQuietly;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
+import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
+import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
+import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class BackupTest {
+
+    private static int CACHE_SIZE = 256;
+
+    private File src;
+    private File destination;
+
+    @Before
+    public void before() {
+        long run = System.currentTimeMillis();
+        File root = new File("target");
+        src = new File(root, "tar-src-" + run);
+        destination = new File(root, "tar-dest-" + run);
+    }
+
+    @After
+    public void after() {
+        deleteQuietly(src);
+        deleteQuietly(destination);
+    }
+
+    @Test
+    public void testBackup() throws IOException {
+        BackupVerifier bv = new BackupVerifier();
+
+        NodeStore store = newSegmentNodeStore(src);
+        init(store, bv);
+
+        new BackupManagerImpl(store).backup(destination);
+        NodeStore backup = newSegmentNodeStore(destination);
+
+        bv.verify("main", store);
+        bv.verify("backup", backup);
+    }
+
+    private static void init(NodeStore store, BackupVerifier bv) {
+        new Oak(store).with(new OpenSecurityProvider()).with(bv)
+                .createContentRepository();
+    }
+
+    private static SegmentNodeStore newSegmentNodeStore(File file)
+            throws IOException {
+        return new SegmentNodeStore(new FileStore(file, CACHE_SIZE, CACHE_SIZE,
+                true));
+    }
+
+    private static class BackupVerifier implements RepositoryInitializer {
+
+        private String testRoot = "tests";
+
+        @Override
+        public void initialize(NodeBuilder builder) {
+            builder.child(testRoot);
+        }
+
+        public void verify(String name, NodeStore store) {
+            assertTrue("Expected to find node '" + testRoot + "' in '" + name
+                    + "' store.", store.getRoot().hasChildNode(testRoot));
+        }
+    }
+
+}
