diff --git a/src/core/js/ext_xls_download.js b/src/core/js/ext_xls_download.js
index ebeb2ac94ca7bd84cc41ffef7bf3d1abc1982875..d80bf4efa539f483811ca1d3b7f85b817489a572 100644
--- a/src/core/js/ext_xls_download.js
+++ b/src/core/js/ext_xls_download.js
@@ -83,7 +83,7 @@ var caosdb_table_export = new function () {
         const table = $('.caosdb-select-table');
         return table.find("th").toArray()
             .map(e => caosdb_table_export._clean_cell(e.textContent))
-            .filter(e => e.length > 0);
+            .filter(e => e.length > 0 && e.toLowerCase() != "id" && e.toLowerCase() != "version");
     }
 
     /**
@@ -124,7 +124,7 @@ var caosdb_table_export = new function () {
      */
     this._create_tsv_string = function (entities, columns, raw) {
         logger.trace("enter _create_tsv_string ", entities, columns);
-        var header = "ID\t" + columns.join("\t") + "\n"
+        var header = "ID\tVersion\t" + columns.join("\t") + "\n"
         var rows = [];
         for (const table_row of entities) {
             rows.push(caosdb_table_export._get_entity_row(table_row, columns, raw).join("\t"));
@@ -146,7 +146,7 @@ var caosdb_table_export = new function () {
      * @return {string[]}
      */
     this._get_entity_row = function (entity, columns, raw) {
-        var cells = [getEntityID(entity)];
+        var cells = [getEntityID(entity), getEntityVersion(entity)];
         var properties = getProperties(entity);
 
         for (const column of columns) {
diff --git a/src/core/xsl/query.xsl b/src/core/xsl/query.xsl
index ca1884aea16d59c7df92de304d3154698dc471bf..44d1c1bd6cff8f4b22138c1287af15713069ed79 100644
--- a/src/core/xsl/query.xsl
+++ b/src/core/xsl/query.xsl
@@ -149,7 +149,7 @@
             <thead>
               <tr>
                 <th></th>
-                <xsl:for-each select="Selector[@name!='id']">
+                <xsl:for-each select="Selector">
                   <th>
                     <xsl:value-of select="@name"/>
                   </th>
@@ -160,6 +160,8 @@
               <xsl:for-each select="/Response/*[@id]">
                 <xsl:call-template name="select-table-row">
                   <xsl:with-param name="entity-id" select="@id"/>
+                  <xsl:with-param name="version-id" select="Version/@id"/>
+                  <xsl:with-param name="ishead" select="Version/@head"/>
                 </xsl:call-template>
               </xsl:for-each>
             </tbody>
@@ -170,9 +172,14 @@
   </xsl:template>
   <xsl:template name="entity-link">
     <xsl:param name="entity-id"/>
+    <xsl:param name="version-id"/>
+    <xsl:param name="ishead"/>
     <a class="btn btn-default btn-sm caosdb-select-id">
       <xsl:attribute name="href">
         <xsl:value-of select="concat($entitypath, $entity-id)"/>
+        <xsl:if test="$version-id and not($ishead)">
+          <xsl:value-of select="concat('@', $version-id)"/>
+        </xsl:if>
       </xsl:attribute>
       <!-- <xsl:value-of select="$entity-id" /> -->
       <span class="caosdb-select-id-target">
@@ -183,18 +190,26 @@
 
   <xsl:template name="select-table-row">
     <xsl:param name="entity-id"/>
+    <xsl:param name="version-id"/>
+    <xsl:param name="ishead"/>
     <tr>
       <xsl:attribute name="data-entity-id">
         <xsl:value-of select="$entity-id"/>
       </xsl:attribute>
+      <xsl:attribute name="data-version-id">
+        <xsl:value-of select="$version-id"/>
+      </xsl:attribute>
       <td>
         <xsl:call-template name="entity-link">
           <xsl:with-param name="entity-id" select="$entity-id"/>
+          <xsl:with-param name="version-id" select="$version-id"/>
+          <xsl:with-param name="ishead" select="$ishead"/>
         </xsl:call-template>
       </td>
       <xsl:for-each select="/Response/Query/Selection/Selector">
         <xsl:call-template name="select-table-cell">
           <xsl:with-param name="entity-id" select="$entity-id"/>
+          <xsl:with-param name="version-id" select="$version-id"/>
           <xsl:with-param name="field-name" select="translate(@name, $uppercase, $lowercase)"/>
         </xsl:call-template>
       </xsl:for-each>
@@ -203,13 +218,15 @@
 
   <xsl:template name="select-table-cell">
     <xsl:param name="entity-id"/>
+    <xsl:param name="version-id"/>
     <xsl:param name="field-name"/>
     <td class="caosdb-f-entity-property">
       <xsl:attribute name="data-property-name">
         <xsl:value-of select="$field-name"/>
       </xsl:attribute>
       <div class="caosdb-f-property-value caosdb-v-property-value">
-        <xsl:apply-templates select="/Response/*[@id=$entity-id]" mode="walk-select-segments">
+        <xsl:apply-templates select="/Response/*[@id=$entity-id and Version/@id=$version-id]" mode="walk-select-segments">
+        <!--<xsl:apply-templates select="/Response/*[@id=$entity-id]" mode="walk-select-segments">-->
           <xsl:with-param name="first-segment">
             <xsl:value-of select="substring-before(concat($field-name, '.'), '.')"/>
           </xsl:with-param>
@@ -223,9 +240,28 @@
 
   <xsl:template match="Property" mode="walk-select-segments">
     <!-- handle properties -->
+    <xsl:param name="first-segment"/>
     <xsl:param name="next-segments"/>
 
     <xsl:choose>
+      <xsl:when test="@*[translate($first-segment, $uppercase, $lowercase)=name()]">
+        <!--handle attributes-->
+        <xsl:call-template name="single-value">
+          <xsl:with-param name="value">
+            <xsl:value-of select="@*[translate(name(), $uppercase, $lowercase)=$first-segment]"/>
+          </xsl:with-param>
+        </xsl:call-template>
+      </xsl:when>
+
+      <xsl:when test="translate($first-segment, $uppercase, $lowercase)='version'">
+        <!--handle version-->
+        <xsl:call-template name="single-value">
+          <xsl:with-param name="value">
+            <xsl:value-of select="Version/@id"/>
+          </xsl:with-param>
+        </xsl:call-template>
+      </xsl:when>
+
       <xsl:when test="$next-segments='value'">
         <!--handle value-->
         <xsl:apply-templates mode="property-value" select="."/>
@@ -274,6 +310,15 @@
         </xsl:call-template>
       </xsl:when>
 
+      <xsl:when test="translate($first-segment, $uppercase, $lowercase)='version'">
+        <!--handle version-->
+        <xsl:call-template name="single-value">
+          <xsl:with-param name="value">
+            <xsl:value-of select="Version/@id"/>
+          </xsl:with-param>
+        </xsl:call-template>
+      </xsl:when>
+
       <xsl:when test="$next-segments">
         <!-- when there is a next-segmenst -->
         <xsl:apply-templates select="Property[translate(@name, $uppercase, $lowercase)=$first-segment]" mode="walk-select-segments">
diff --git a/test/core/js/modules/ext_xls_download.js.js b/test/core/js/modules/ext_xls_download.js.js
index 997a89ec21d4a22f49746cbda1c46bb56268f80d..2a5c3ff1fab7ab92bfd2de24bdc83151a2a5823b 100644
--- a/test/core/js/modules/ext_xls_download.js.js
+++ b/test/core/js/modules/ext_xls_download.js.js
@@ -115,17 +115,17 @@ QUnit.test("_get_property_value", function(assert) {
 QUnit.test("_get_tsv_string", function(assert) {
     const table = this.test_case_1;
     const entities = $(table).find("tbody tr").toArray();
-    assert.equal(entities.length, 2, "two example entities");
+    assert.equal(entities.length, 3, "three example entities");
 
-    var f = caosdb_table_export._create_tsv_string 
+    var f = caosdb_table_export._create_tsv_string
     var tsv_string = f(entities, ["Bag", "Number"], true);
     var prefix = "data:text/csv;charset=utf-8,"
     assert.equal(tsv_string, 
-        "ID\tBag\tNumber\n242\t6366, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413\t02 8   4aaa a\n2112\t\t1101", "tsv generated");
+        "ID\tBag\tNumber\n242\t6366, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413\t02 8   4aaa a\n2112\t\t1101\n2112\t\t1102", "tsv generated");
     tsv_string = caosdb_table_export._encode_tsv_string(tsv_string);
     assert.equal(tsv_string.slice(0,prefix.length), prefix);
-    assert.equal(decodeURIComponent(tsv_string.slice(prefix.length, tsv_string.length)), 
-        "ID\tBag\tNumber\n242\t6366, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413\t02 8   4aaa a\n2112\t\t1101", "tsv generated");
+    assert.equal(decodeURIComponent(tsv_string.slice(prefix.length, tsv_string.length)),
+        "ID\tBag\tNumber\n242\t6366, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413\t02 8   4aaa a\n2112\t\t1101\n2112\t\t1102", "tsv generated");
 });
 
 QUnit.test("_get_property_value", function (assert) {
diff --git a/test/core/xml/table_export/test_case_select_table_1.xml b/test/core/xml/table_export/test_case_select_table_1.xml
index ae0a856f106557be3712f303b06a99f6220ef827..be07fd42df8bc1275ab16802c0e82c19ece417ad 100644
--- a/test/core/xml/table_export/test_case_select_table_1.xml
+++ b/test/core/xml/table_export/test_case_select_table_1.xml
@@ -9,6 +9,7 @@
     </Selection>
   </Query>
   <Record id="242">
+    <Version id="abc123" head="true"/>
     <Property id="117" name="Number" datatype="TEXT" importance="FIX">
       02&#x9;8&#xA;&#xA;&#xA;4aaa&#x9;a
     </Property>
@@ -35,10 +36,19 @@
     </Property>
   </Record>
   <Record id="2112">
+    <Version id="abc124" head="true"/>
     <Property id="117" name="Number" datatype="TEXT" importance="FIX">
       1101
     </Property>
     <Property id="104" name="Bag" datatype="LIST&lt;Bag&gt;" importance="FIX">
     </Property>
   </Record>
+  <Record id="2112">
+    <Version id="abc125" head="true"/>
+    <Property id="117" name="Number" datatype="TEXT" importance="FIX">
+      1102
+    </Property>
+    <Property id="104" name="Bag" datatype="LIST&lt;Bag&gt;" importance="FIX">
+    </Property>
+  </Record>
 </Response>