diff --git a/src/TimeStampAuthority3.sol b/src/TimeStampAuthority3.sol
new file mode 100644
index 0000000000000000000000000000000000000000..542feeb4fd6bdf85ceff3e7a0105a649cb265691
--- /dev/null
+++ b/src/TimeStampAuthority3.sol
@@ -0,0 +1,60 @@
+// 20180718 Robert Martin-Legene <robert@nic.ar>
+// Time stamp authority
+// vim:filetype=javascript
+
+pragma solidity ^0.5.2;
+      
+contract TimeStampAuthority {
+    struct          stamp {
+        uint256         stamped;
+        address         stamper;
+        uint256         blockno;
+    }
+    stamp[]         stamplist;
+    // Provide mappings from what is being stamped, back to the stamplist
+    mapping ( uint256 => uint256[] )  hashstamped;
+    // Provide mappings from who is stamping, back to the stamplist
+    mapping ( address => uint256[] )  hashstamper;
+    constructor() public {
+        // We don't like to assign anything to position 0, so we fill
+        // it with a dummy which just happens to also have information
+        // about the creator and the blocknumber it was created.
+        stamplist.push( stamp( 0, msg.sender, block.number) );
+    }
+    // Stores hashes (256 bit uint) in the mapping
+    function put( uint256[] memory hasharray ) public {
+        uint256     i           =   0;
+        uint256     max         =   hasharray.length;
+        while ( i<max )
+        {
+            uint256     h       =   hasharray[i];
+            uint256     idx     =   stamplist.push( stamp( h, msg.sender, block.number ) ) - 1;
+            hashstamped[h].push( idx );
+            hashstamper[msg.sender].push( idx );
+            i++;
+        }
+    }
+
+    function getStamplistPos( uint256 pos ) public view returns ( uint256, address, uint256 )
+    {
+        return  (stamplist[pos].stamped, stamplist[pos].stamper, stamplist[pos].blockno );
+    }
+    // returns the number of stamps stored with this hash
+    function getStampedCount( uint256 hash ) public view returns (uint256) {
+	return hashstamped[hash].length;
+    }
+    // returns the index position into the stamplist
+    function getStampedPos( uint256 hash, uint256 pos ) public view returns (uint256)
+    {
+        return hashstamped[hash][pos];
+    }
+    // returns the number of stamps stored from this sender
+    function getStamperCount( address sndr ) public view returns (uint256) {
+	return hashstamper[sndr].length;
+    }
+    // returns the index position into the stamplist
+    function getStampedPos( address sndr, uint256 pos ) public view returns (uint256)
+    {
+        return hashstamper[sndr][pos];
+    }
+}