working on history api
diff --git a/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/CoreServerTest.java b/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/CoreServerTest.java
index 7d259a9..eb41865 100644
--- a/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/CoreServerTest.java
+++ b/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/CoreServerTest.java
@@ -24,6 +24,7 @@
 import org.eclipse.emf.emfstore.server.model.ModelFactory;
 import org.eclipse.emf.emfstore.server.model.ProjectHistory;
 import org.eclipse.emf.emfstore.server.model.ProjectId;
+import org.eclipse.emf.emfstore.server.model.ProjectInfo;
 import org.eclipse.emf.emfstore.server.model.ServerSpace;
 import org.eclipse.emf.emfstore.server.model.versioning.PrimaryVersionSpec;
 import org.eclipse.emf.emfstore.server.model.versioning.Versions;
@@ -146,6 +147,22 @@
 		}.run(false);
 	}
 
+	protected ProjectSpace checkout(final ProjectInfo projectInfo, final PrimaryVersionSpec baseVersion) {
+		return new EMFStoreCommandWithResult<ProjectSpace>() {
+			@Override
+			protected ProjectSpace doRun() {
+				try {
+					Workspace workspace = getWorkspace();
+					workspace.setConnectionManager(getConnectionMock());
+					return workspace.checkout(projectSpace.getUsersession(), ModelUtil.clone(projectInfo),
+						ModelUtil.clone(baseVersion), new NullProgressMonitor());
+				} catch (EmfStoreException e) {
+					throw new RuntimeException(e);
+				}
+			}
+		}.run(false);
+	}
+
 	protected void mergeWithBranch(final ProjectSpace trunk, final PrimaryVersionSpec latestOnBranch,
 		final int expectedConflicts) {
 		new EMFStoreCommand() {
diff --git a/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/HistoryAPITests.java b/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/HistoryAPITests.java
index 05ab8b8..f927c25 100644
--- a/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/HistoryAPITests.java
+++ b/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/HistoryAPITests.java
@@ -22,10 +22,13 @@
  * Branches for history test
  * 
  * <pre>
- *     b1     b2
- *     
- * v5 	      o
- * v4	o	  |
+ *     b1    b2    b3
+ * 
+ * v7              o
+ * 				/  |
+ * v6         /    o
+ * v5 	      o   / 
+ * v4	o	  |  /
  * v3	|	  o
  * v2	o	 /
  * v1 	 \ o
@@ -39,11 +42,12 @@
 public class HistoryAPITests extends CoreServerTest {
 
 	final private PrimaryVersionSpec[] versions = { Versions.PRIMARY("trunk", 0), Versions.PRIMARY("trunk", 1),
-		Versions.PRIMARY("b1", 2), Versions.PRIMARY("b2", 3), Versions.PRIMARY("b1", 4), Versions.PRIMARY("b2", 5), };
+		Versions.PRIMARY("b1", 2), Versions.PRIMARY("b2", 3), Versions.PRIMARY("b1", 4), Versions.PRIMARY("b2", 5),
+		Versions.PRIMARY("b3", 6), Versions.PRIMARY("b3", 7) };
 
-	final private String[] elementNames = { "v0", "v1", "v2", "v3", "v4", "v5" };
+	final private String[] elementNames = { "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7" };
 
-	final private String[] branches = { "b1", "b2" };
+	final private String[] branches = { "b1", "b2", "b3" };
 
 	private ProjectSpace createHistory() {
 		ProjectSpace ps = getProjectSpace();
@@ -72,6 +76,16 @@
 		rename(ps2, 5);
 		assertEquals(versions[5], commit(ps2));
 
+		// v6
+		ProjectSpace thirdBranch = checkout(ps.getProjectInfo(), versions[3]);
+		rename(thirdBranch, 6);
+		assertEquals(versions[6], branch(thirdBranch, branches[2]));
+
+		// v7
+		mergeWithBranch(thirdBranch, versions[5], 1);
+		rename(thirdBranch, 7);
+		assertEquals(versions[7], commit(thirdBranch));
+
 		return ps;
 	}
 
@@ -106,20 +120,22 @@
 		List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[3], 5, 25, true, false,
 			false, false));
 
-		assertEquals(6, result.size());
-		assertEquals(versions[5], result.get(0).getPrimerySpec());
-		assertEquals(versions[4], result.get(1).getPrimerySpec());
-		assertEquals(versions[3], result.get(2).getPrimerySpec());
-		assertEquals(versions[2], result.get(3).getPrimerySpec());
-		assertEquals(versions[1], result.get(4).getPrimerySpec());
-		assertEquals(versions[0], result.get(5).getPrimerySpec());
+		assertEquals(8, result.size());
+		assertEquals(versions[7], result.get(0).getPrimerySpec());
+		assertEquals(versions[6], result.get(1).getPrimerySpec());
+		assertEquals(versions[5], result.get(2).getPrimerySpec());
+		assertEquals(versions[4], result.get(3).getPrimerySpec());
+		assertEquals(versions[3], result.get(4).getPrimerySpec());
+		assertEquals(versions[2], result.get(5).getPrimerySpec());
+		assertEquals(versions[1], result.get(6).getPrimerySpec());
+		assertEquals(versions[0], result.get(7).getPrimerySpec());
 	}
 
 	@Test
 	public void rangequeryIncludeCp() throws EmfStoreException {
 		ProjectSpace ps = createHistory();
 
-		List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[3], 5, 25, false, false,
+		List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[3], 1, 25, false, false,
 			false, true));
 
 		assertEquals(4, result.size());
@@ -174,22 +190,26 @@
 	public void rangequeryIncoming() throws EmfStoreException {
 		ProjectSpace ps = createHistory();
 
-		List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[0], 0, 0, false, false,
+		List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[7], 0, 2, false, true,
 			false, false));
 
-		// TODO implement
-		assertTrue(false);
+		assertEquals(3, result.size());
+		assertEquals(versions[7], result.get(0).getPrimerySpec());
+		assertEquals(versions[6], result.get(1).getPrimerySpec());
+		assertEquals(versions[5], result.get(2).getPrimerySpec());
 	}
 
 	@Test
 	public void rangequeryOutgoing() throws EmfStoreException {
 		ProjectSpace ps = createHistory();
 
-		List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[0], 0, 0, false, false,
-			false, false));
+		List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[3], 2, 0, false, false,
+			true, false));
 
-		// TODO implement
-		assertTrue(false);
+		assertEquals(3, result.size());
+		assertEquals(versions[6], result.get(0).getPrimerySpec());
+		assertEquals(versions[5], result.get(1).getPrimerySpec());
+		assertEquals(versions[3], result.get(2).getPrimerySpec());
 	}
 
 	@Test
diff --git a/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/server/core/subinterfaces/HistorySubInterfaceImpl.java b/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/server/core/subinterfaces/HistorySubInterfaceImpl.java
index 19e09f0..22c6ca3 100644
--- a/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/server/core/subinterfaces/HistorySubInterfaceImpl.java
+++ b/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/server/core/subinterfaces/HistorySubInterfaceImpl.java
@@ -19,6 +19,8 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.emfstore.common.model.ModelElementId;
@@ -153,6 +155,7 @@
 		result.add(version);
 		result.addAll(addBackwardVersions(project, version, query.getLowerLimit(), query.isIncludeIncoming(),
 			query.isIncludeOutgoing()));
+		Collections.sort(result, new VersionComparator(false));
 		return result;
 	}
 
@@ -245,32 +248,48 @@
 		return result;
 	}
 
-	private List<Version> addForwardVersions(ProjectHistory project, Version version, int limit,
+	private Collection<Version> addForwardVersions(ProjectHistory project, Version version, int limit,
 		boolean includeIncoming, boolean includeOutgoing) {
-		List<Version> result = new ArrayList<Version>();
+		if (limit == 0) {
+			return Collections.emptyList();
+		}
+		SortedSet<Version> result = new TreeSet<Version>(new VersionComparator(false));
 		Version currentVersion = version;
 		while (currentVersion != null && result.size() < limit) {
-			if (currentVersion.getBranchedVersions().size() > 0) {
+			if (includeOutgoing && currentVersion.getBranchedVersions().size() > 0) {
 				result.addAll(currentVersion.getBranchedVersions());
 			}
+			if (includeIncoming && currentVersion.getMergedFromVersion().size() > 0) {
+				result.addAll(currentVersion.getMergedFromVersion());
+			}
+
 			currentVersion = currentVersion.getNextVersion();
 			if (currentVersion != null) {
 				result.add(currentVersion);
 			}
 		}
 
-		Collections.sort(result, new VersionComparator(false));
-		if (result.size() > limit) {
-			result = result.subList(0, limit - 1);
+		if (limit > 0 && result.size() > limit) {
+			return new ArrayList<Version>(result).subList(0, limit);
 		}
 		return result;
 	}
 
-	private List<Version> addBackwardVersions(ProjectHistory project, Version version, int limit,
+	private Collection<Version> addBackwardVersions(ProjectHistory project, Version version, int limit,
 		boolean includeIncoming, boolean includeOutgoing) {
-		ArrayList<Version> result = new ArrayList<Version>();
+		if (limit == 0) {
+			return Collections.emptyList();
+		}
+		SortedSet<Version> result = new TreeSet<Version>(new VersionComparator(false));
 		Version currentVersion = version;
-		while (currentVersion != null && limit > 0) {
+		while (currentVersion != null && result.size() < limit) {
+			if (includeOutgoing && currentVersion.getBranchedVersions().size() > 0) {
+				result.addAll(currentVersion.getBranchedVersions());
+			}
+			if (includeIncoming && currentVersion.getMergedFromVersion().size() > 0) {
+				result.addAll(currentVersion.getMergedFromVersion());
+			}
+			// move in tree
 			if (currentVersion.getPreviousVersion() != null) {
 				currentVersion = currentVersion.getPreviousVersion();
 			} else if (currentVersion.getAncestorVersion() != null) {
@@ -278,12 +297,14 @@
 			} else {
 				currentVersion = null;
 			}
+			// add versions
 			if (currentVersion != null) {
 				result.add(currentVersion);
-				limit--;
 			}
 		}
-
+		if (limit > 0 && result.size() > limit) {
+			return new ArrayList<Version>(result).subList(0, limit);
+		}
 		return result;
 	}