diff --git oak-it/src/test/java/org/apache/jackrabbit/oak/spi/state/CheckpointTest.java oak-it/src/test/java/org/apache/jackrabbit/oak/spi/state/CheckpointTest.java
index f718bfc..e4b6800 100644
--- oak-it/src/test/java/org/apache/jackrabbit/oak/spi/state/CheckpointTest.java
+++ oak-it/src/test/java/org/apache/jackrabbit/oak/spi/state/CheckpointTest.java
@@ -19,6 +19,11 @@
 
 package org.apache.jackrabbit.oak.spi.state;
 
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -31,6 +36,8 @@ import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.fixture.NodeStoreFixture;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.commit.Observable;
+import org.apache.jackrabbit.oak.spi.commit.Observer;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -84,6 +91,26 @@ public class CheckpointTest extends OakBaseTest {
     }
 
     @Test
+    public void noContentChangeForCheckpoints() throws Exception{
+        final AtomicInteger invocationCount = new AtomicInteger();
+        ((Observable)store).addObserver(new Observer() {
+            @Override
+            public void contentChanged(@Nonnull NodeState root, @Nullable CommitInfo info) {
+                invocationCount.incrementAndGet();
+            }
+        });
+
+        invocationCount.set(0);
+
+        String cp = store.checkpoint(Long.MAX_VALUE);
+        assertEquals(0, invocationCount.get());
+
+        store.release(cp);
+        assertEquals(0, invocationCount.get());
+
+    }
+
+    @Test
     public void retrieveAny() {
         assertTrue(store.retrieve("r42-0-0") == null);
     }
diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
index 1060d3a..53eaac3 100644
--- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
+++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
@@ -234,7 +234,7 @@ public class SegmentNodeStore implements NodeStore, Observable {
             } finally {
                 // Explicitly give up reference to the previous root state
                 // otherwise they would block cleanup. See OAK-3347
-                refreshHead();
+                refreshHead(true);
                 commitSemaphore.release();
             }
         }
@@ -244,12 +244,15 @@ public class SegmentNodeStore implements NodeStore, Observable {
     /**
      * Refreshes the head state. Should only be called while holding a
      * permit from the {@link #commitSemaphore}.
+     * @param dispatchChanges if set to true the changes would also be dispatched
      */
-    private void refreshHead() {
+    private void refreshHead(boolean dispatchChanges) {
         SegmentNodeState state = reader.readHeadState(revisions);
         if (!state.getRecordId().equals(head.get().getRecordId())) {
             head.set(state);
-            contentChanged(state.getChildNode(ROOT), null);
+            if (dispatchChanges) {
+                contentChanged(state.getChildNode(ROOT), null);
+            }
         }
     }
 
@@ -265,7 +268,7 @@ public class SegmentNodeStore implements NodeStore, Observable {
     public NodeState getRoot() {
         if (commitSemaphore.tryAcquire()) {
             try {
-                refreshHead();
+                refreshHead(true);
             } finally {
                 commitSemaphore.release();
             }
@@ -392,7 +395,7 @@ public class SegmentNodeStore implements NodeStore, Observable {
         public Boolean call() {
             long now = System.currentTimeMillis();
 
-            refreshHead();
+            refreshHead(true);
 
             SegmentNodeState state = head.get();
             SegmentNodeBuilder builder = state.builder();
@@ -423,7 +426,7 @@ public class SegmentNodeStore implements NodeStore, Observable {
 
             SegmentNodeState newState = builder.getNodeState();
             if (revisions.setHead(state.getRecordId(), newState.getRecordId())) {
-                refreshHead();
+                refreshHead(false);
                 return true;
             } else {
                 return false;
@@ -480,7 +483,7 @@ public class SegmentNodeStore implements NodeStore, Observable {
         for (int i = 0; i < 5; i++) {
             if (commitSemaphore.tryAcquire()) {
                 try {
-                    refreshHead();
+                    refreshHead(true);
 
                     SegmentNodeState state = head.get();
                     SegmentNodeBuilder builder = state.builder();
@@ -491,7 +494,7 @@ public class SegmentNodeStore implements NodeStore, Observable {
                         cp.remove();
                         SegmentNodeState newState = builder.getNodeState();
                         if (revisions.setHead(state.getRecordId(), newState.getRecordId())) {
-                            refreshHead();
+                            refreshHead(false);
                             return true;
                         }
                     }
@@ -530,11 +533,11 @@ public class SegmentNodeStore implements NodeStore, Observable {
         }
 
         private boolean setHead(SegmentNodeState before, SegmentNodeState after) {
-            refreshHead();
+            refreshHead(true);
             if (revisions.setHead(before.getRecordId(), after.getRecordId())) {
                 head.set(after);
                 contentChanged(after.getChildNode(ROOT), info);
-                refreshHead();
+                refreshHead(true);
                 return true;
             } else {
                 return false;
@@ -569,7 +572,7 @@ public class SegmentNodeStore implements NodeStore, Observable {
             for (long backoff = 1; backoff < maximumBackoff; backoff *= 2) {
                 long start = System.nanoTime();
 
-                refreshHead();
+                refreshHead(true);
                 SegmentNodeState state = head.get();
                 if (state.hasProperty("token")
                         && state.getLong("timeout") >= currentTimeMillis()) {
