diff --git a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java
index 4de1055..24a5a5a 100644
--- a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java
+++ b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/GerritConnector.java
@@ -256,6 +256,8 @@
 
 	@Override
 	public void updateTaskFromTaskData(TaskRepository taskRepository, ITask task, TaskData taskData) {
+		Date oldModificationDate = task.getModificationDate();
+
 		TaskMapper mapper = (TaskMapper) getTaskMapping(taskData);
 		mapper.applyTo(task);
 		String key = task.getTaskKey();
@@ -263,6 +265,11 @@
 			task.setSummary(NLS.bind("{0} [{1}]", mapper.getSummary(), key));
 			task.setTaskKey(task.getTaskId());
 		}
+
+		// retain modification date to force an update when full task data is received
+		if (taskData.isPartial()) {
+			task.setModificationDate(oldModificationDate);
+		}
 	}
 
 	public GerritSystemInfo validate(TaskRepository repository, IProgressMonitor monitor) throws CoreException {
diff --git a/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/AllGerritTests.java b/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/AllGerritTests.java
index 1678842..57066bb 100644
--- a/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/AllGerritTests.java
+++ b/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/AllGerritTests.java
@@ -17,6 +17,7 @@
 import org.eclipse.mylyn.commons.sdk.util.ManagedTestSuite;
 import org.eclipse.mylyn.commons.sdk.util.TestConfiguration;
 import org.eclipse.mylyn.gerrit.tests.core.GerritConnectorTest;
+import org.eclipse.mylyn.gerrit.tests.core.GerritSynchronizationTest;
 import org.eclipse.mylyn.gerrit.tests.core.client.GerritClientTest;
 import org.eclipse.mylyn.gerrit.tests.core.client.OpenIdAuthenticationTest;
 import org.eclipse.mylyn.gerrit.tests.support.GerritFixture;
@@ -58,6 +59,7 @@
 		fixture.createSuite(suite);
 		fixture.add(GerritClientTest.class);
 		fixture.add(GerritConnectorTest.class);
+		fixture.add(GerritSynchronizationTest.class);
 		fixture.done();
 	}
 
diff --git a/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/core/GerritSynchronizationTest.java b/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/core/GerritSynchronizationTest.java
new file mode 100644
index 0000000..66a28db
--- /dev/null
+++ b/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/core/GerritSynchronizationTest.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Tasktop Technologies and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.gerrit.tests.core;
+
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.gerrit.tests.support.GerritFixture;
+import org.eclipse.mylyn.gerrit.tests.support.GerritHarness;
+import org.eclipse.mylyn.internal.gerrit.core.GerritQuery;
+import org.eclipse.mylyn.internal.gerrit.core.client.GerritClient;
+import org.eclipse.mylyn.internal.gerrit.core.client.GerritException;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tests.util.TestFixture;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.gerrit.reviewdb.ApprovalCategoryValue;
+
+/**
+ * @author Steffen Pingel
+ */
+public class GerritSynchronizationTest extends TestCase {
+
+	private GerritHarness harness;
+
+	private TaskRepository repository;
+
+	private TaskDataManager taskDataManager;
+
+	private TaskList taskList;
+
+	@Override
+	@Before
+	public void setUp() throws Exception {
+		TasksUiPlugin.getDefault()
+				.getPreferenceStore()
+				.setValue(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, false);
+
+		harness = GerritFixture.current().harness();
+		repository = GerritFixture.current().singleRepository();
+		taskList = TasksUiPlugin.getTaskList();
+		taskDataManager = TasksUiPlugin.getTaskDataManager();
+	}
+
+	@After
+	@Override
+	public void tearDown() throws Exception {
+		harness.dispose();
+		TestFixture.resetTaskListAndRepositories();
+		TasksUiPlugin.getRepositoryModel().clear();
+	}
+
+	@Test
+	public void testSynchronizeBackgroundQueryTaskUpdated() throws Exception {
+		ITask task = createAndSynchronizeQuery(false);
+		String message = addComment(task);
+		synchronizeAllTasks(false);
+		assertHasNewComment(task, message);
+	}
+
+	@Test
+	public void testSynchronizeBackgroundTaskUpdated() throws Exception {
+		ITask task = createAndSynchronizeQuery(false);
+		String message = addComment(task);
+		synchronizeTask(task, false);
+		assertHasNewComment(task, message);
+	}
+
+	@Test
+	public void testSynchronizeQueryNewTask() throws Exception {
+		createAndSynchronizeQuery(true);
+	}
+
+	@Test
+	public void testSynchronizeQueryTaskUpdated() throws Exception {
+		ITask task = createAndSynchronizeQuery(true);
+		String message = addComment(task);
+		synchronizeAllTasks(true);
+		assertHasNewComment(task, message);
+	}
+
+	@Test
+	public void testSynchronizeTaskUpdated() throws Exception {
+		ITask task = createAndSynchronizeQuery(true);
+		String message = addComment(task);
+		synchronizeTask(task, true);
+		assertHasNewComment(task, message);
+	}
+
+	private String addComment(ITask task) throws GerritException {
+		taskDataManager.setTaskRead(task, true);
+		GerritClient client = new GerritClient(harness.location());
+		String message = "new comment, time: " + System.currentTimeMillis(); //$NON-NLS-1$
+		client.publishComments(task.getTaskId(), 1, message, Collections.<ApprovalCategoryValue.Id> emptySet(), null);
+		return message;
+	}
+
+	private void assertHasNewComment(ITask task, String message) throws CoreException {
+		assertEquals(SynchronizationState.INCOMING, task.getSynchronizationState());
+
+		// validate that task data was fully synchronized
+		TaskData taskData = taskDataManager.getTaskData(task);
+		List<TaskAttribute> comments = taskData.getAttributeMapper().getAttributesByType(taskData,
+				TaskAttribute.TYPE_COMMENT);
+		TaskCommentMapper lastComment = TaskCommentMapper.createFrom(comments.get(comments.size() - 1));
+		assertEquals("Patch Set 1:\n\n" + message, lastComment.getText()); //$NON-NLS-1$
+	}
+
+	private ITask assertTaskListHasOneTask() throws CoreException {
+		assertEquals(1, taskList.getAllTasks().size());
+		ITask task = taskList.getAllTasks().iterator().next();
+		assertEquals(repository.getUrl(), task.getRepositoryUrl());
+		assertTrue(taskDataManager.hasTaskData(task));
+		return task;
+	}
+
+	private ITask createAndSynchronizeQuery(boolean user) throws InterruptedException, CoreException, GerritException {
+		IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(repository);
+		query.setAttribute(GerritQuery.TYPE, GerritQuery.ALL_OPEN_CHANGES);
+		taskList.addQuery((RepositoryQuery) query);
+
+		synchronizeAllTasks(user);
+
+		ITask task = assertTaskListHasOneTask();
+		assertEquals(SynchronizationState.INCOMING_NEW, task.getSynchronizationState());
+		return task;
+	}
+
+	private void synchronizeAllTasks(boolean user) throws InterruptedException {
+		SynchronizationJob job = TasksUiPlugin.getTaskJobFactory().createSynchronizeRepositoriesJob(
+				Collections.singleton(repository));
+		job.setUser(user);
+		job.schedule();
+		job.join();
+		// wait for parallel query synchronization jobs
+		Job.getJobManager().join(ITasksCoreConstants.JOB_FAMILY_SYNCHRONIZATION, null);
+	}
+
+	private void synchronizeTask(ITask task, boolean user) throws InterruptedException {
+		SynchronizationJob job = TasksUiPlugin.getTaskJobFactory().createSynchronizeTasksJob(
+				TasksUi.getRepositoryConnector(repository.getConnectorKind()), repository, Collections.singleton(task));
+		job.setUser(user);
+		job.schedule();
+		job.join();
+	}
+
+}
