diff --git a/tests/unit/scanner.test.cpp b/tests/unit/scanner.test.cpp
index 330347a..3895f9f 100644
--- a/tests/unit/scanner.test.cpp
+++ b/tests/unit/scanner.test.cpp
@@ -148,15 +148,14 @@ namespace
     crypto::secret_key key;
     crypto::public_key pub_key;
     crypto::public_key spend_public;
-    rct::key mask;
   };
 
-  transaction make_miner_tx(lws::db::block_id height, const lws::db::account_address& miner_address, bool use_view_tags)
+  transaction make_miner_tx(lest::env& lest_env, lws::db::block_id height, const lws::db::account_address& miner_address, bool use_view_tags)
   {
     static constexpr std::uint64_t fee = 0;
     transaction tx{};
     crypto::generate_keys(tx.pub_key, tx.key);
-    add_tx_pub_key_to_extra(tx.tx, tx.pub_key);
+    EXPECT(add_tx_pub_key_to_extra(tx.tx, tx.pub_key));
 
     cryptonote::txin_gen in;
     in.height = std::uint64_t(height);
@@ -164,13 +163,12 @@ namespace
 
     // This will work, until size of constructed block is less then CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE
     uint64_t block_reward;
-    if (!cryptonote::get_block_reward(0, 0, 1000000, block_reward, num_testnet_hard_forks))
-      throw std::runtime_error{"Blcok is too big"};
+    EXPECT(cryptonote::get_block_reward(0, 0, 1000000, block_reward, num_testnet_hard_forks));
     block_reward += fee;
 
     crypto::key_derivation derivation;
-    crypto::generate_key_derivation(miner_address.view_public, tx.key, derivation);
-    crypto::derive_public_key(derivation, 0, miner_address.spend_public, tx.spend_public);
+    EXPECT(crypto::generate_key_derivation(miner_address.view_public, tx.key, derivation));
+    EXPECT(crypto::derive_public_key(derivation, 0, miner_address.spend_public, tx.spend_public));
  
     crypto::view_tag view_tag;
     if (use_view_tags)
@@ -182,16 +180,17 @@ namespace
     tx.tx.vout.push_back(out);
     tx.tx.version = 2;
     tx.tx.unlock_time = std::uint64_t(height) + CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW;
-    tx.mask = rct::identity();
 
     return tx;
   }
 
-  transaction make_tx(lest::env& lest_env, const cryptonote::account_keys& keys, const bool use_view_tag)
+  transaction make_tx(lest::env& lest_env, const cryptonote::account_keys& keys, const std::uint32_t ring_base, const bool use_view_tag)
   {
     static constexpr std::uint64_t input_amount = 20000;
     static constexpr std::uint64_t output_amount = 8000;
 
+    EXPECT(15 < std::numeric_limits<std::uint32_t>::max() - ring_base);
+
     crypto::secret_key unused_key{};
     crypto::secret_key og_tx_key{};
     crypto::public_key og_tx_public{};
@@ -199,8 +198,8 @@ namespace
 
     crypto::key_derivation derivation{};
     crypto::public_key spend_public{};
-    crypto::generate_key_derivation(keys.m_account_address.m_view_public_key, og_tx_key, derivation);
-    crypto::derive_public_key(derivation, 0, keys.m_account_address.m_spend_public_key, spend_public);
+    EXPECT(crypto::generate_key_derivation(keys.m_account_address.m_view_public_key, og_tx_key, derivation));
+    EXPECT(crypto::derive_public_key(derivation, 0, keys.m_account_address.m_spend_public_key, spend_public));
 
     std::unordered_map<crypto::public_key, cryptonote::subaddress_index> subaddresses;
     subaddresses[keys.m_account_address.m_spend_public_key] = {0, 0};
@@ -208,21 +207,19 @@ namespace
     std::vector<cryptonote::tx_source_entry> sources;
     sources.emplace_back();
     sources.back().amount = input_amount;
-    sources.back().mask = rct::identity(); //crypto::rand<rct::key>();
     sources.back().rct = true;
     sources.back().real_output = 15;
     sources.back().real_output_in_tx_index = 0;
     sources.back().real_out_tx_key = og_tx_public;
-    for (std::size_t i = 0; i < 15; ++i)
+    for (std::uint32_t i = ring_base; i < 15 + ring_base; ++i)
     {
       crypto::public_key next{};
       crypto::generate_keys(next, unused_key);
-      sources.back().push_output(i + 20, next, 10000);
+      sources.back().push_output(i, next, 10000);
     }
     sources.back().outputs.emplace_back();
-    sources.back().outputs.back().first = 15 + 20;
+    sources.back().outputs.back().first = 15 + ring_base;
     sources.back().outputs.back().second.dest = rct::pk2rct(spend_public);
-    sources.back().outputs.back().second.mask = rct::commit(input_amount, sources.back().mask);
 
     std::vector<cryptonote::tx_destination_entry> destinations;
     destinations.emplace_back();
@@ -237,7 +234,6 @@ namespace
       )
     );
 
-    out.mask = sources.back().mask;
     crypto::secret_key_to_public_key(out.key, out.pub_key);
     crypto::generate_key_derivation(keys.m_account_address.m_view_public_key, out.key, derivation);
     crypto::derive_public_key(derivation, 0, keys.m_account_address.m_spend_public_key, out.spend_public);
@@ -356,8 +352,9 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
     SECTION("lws::scanner::run")
     {
       std::vector<epee::byte_slice> messages{};
-      transaction tx = make_miner_tx(last_block.id, account, false);
-      transaction tx2 = make_tx(lest_env, keys, true);
+      transaction tx = make_miner_tx(lest_env, last_block.id, account, false);
+      transaction tx2 = make_tx(lest_env, keys, 20, true);
+      transaction tx3 = make_tx(lest_env, keys, 86, true);
 
       cryptonote::rpc::GetBlocksFast::Response bmessage{};
       bmessage.start_height = std::uint64_t(last_block.id) + 1;
@@ -365,12 +362,16 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
       bmessage.blocks.emplace_back();
       bmessage.blocks.back().block.miner_tx = tx.tx;
       bmessage.blocks.back().block.tx_hashes.push_back(cryptonote::get_transaction_hash(tx2.tx));
+      bmessage.blocks.back().block.tx_hashes.push_back(cryptonote::get_transaction_hash(tx3.tx));
       bmessage.blocks.back().transactions.push_back(tx2.tx);
+      bmessage.blocks.back().transactions.push_back(tx3.tx);
       bmessage.output_indices.emplace_back();
       bmessage.output_indices.back().emplace_back();
       bmessage.output_indices.back().back().push_back(100);
       bmessage.output_indices.back().emplace_back();
       bmessage.output_indices.back().back().push_back(101);
+      bmessage.output_indices.back().emplace_back();
+      bmessage.output_indices.back().back().push_back(102);
       bmessage.blocks.push_back(bmessage.blocks.back());
       bmessage.output_indices.push_back(bmessage.output_indices.back());
 
@@ -456,11 +457,29 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
               {},
               12000 // fee
             },
+          },
+	        {
+            cryptonote::get_transaction_hash(tx3.tx), lws::db::output{
+              lws::db::transaction_link{new_last_block_id, cryptonote::get_transaction_hash(tx3.tx)},
+              lws::db::output::spend_meta_{
+                lws::db::output_id{0, 102}, 8000, 15, 0, tx3.pub_key
+              },
+              0,
+              0,
+              cryptonote::get_transaction_prefix_hash(tx3.tx),
+              tx3.spend_public,
+              tx3.tx.rct_signatures.outPk.at(0).mask,
+              {},
+              lws::db::pack(lws::db::extra::ringct_output, 8),
+              {},
+              12000 // fee
+            },
           }
+
         };
         auto reader = MONERO_UNWRAP(db.start_read());
         auto outputs = MONERO_UNWRAP(reader.get_outputs(lws::db::account_id(1)));
-        EXPECT(outputs.count() == 2);
+        EXPECT(outputs.count() == 3);
         auto output_it = outputs.make_iterator();
         for (auto output_it = outputs.make_iterator(); !output_it.is_end(); ++output_it)
         {
@@ -484,8 +503,19 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
           EXPECT(real_output.fee == expected_output->second.fee);
         }
 
+        auto spends = MONERO_UNWRAP(reader.get_spends(lws::db::account_id(1)));
+        EXPECT(spends.count() == 1);
+        auto spend_it = spends.make_iterator();
+        auto real_spend = *spend_it;
+        EXPECT(real_spend.link.height == new_last_block_id);
+        EXPECT(real_spend.link.tx_hash == cryptonote::get_transaction_hash(tx3.tx));
+        const lws::db::output_id expected_out{0, 100};
+        EXPECT(real_spend.source == expected_out);
+        EXPECT(real_spend.mixin_count == 15);
+        EXPECT(real_spend.length == 0);
+        EXPECT(real_spend.payment_id == crypto::hash{});
+
         EXPECT(MONERO_UNWRAP(reader.get_outputs(lws::db::account_id(2))).count() == 0);
-        EXPECT(MONERO_UNWRAP(reader.get_spends(lws::db::account_id(1))).count() == 0);
         EXPECT(MONERO_UNWRAP(reader.get_spends(lws::db::account_id(2))).count() == 0);
       }
     } //SECTION (lws::scanner::run)