diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php
index f56d3bdcf4..0a1ad7a732 100644
--- a/app/Http/Controllers/TagController.php
+++ b/app/Http/Controllers/TagController.php
@@ -192,7 +192,11 @@ class TagController extends Controller
             'firefly.journals_in_period_for_tag', ['tag' => $tag->tag, 'start' => $start->formatLocalized($this->monthAndDayFormat),
                                                    'end' => $end->formatLocalized($this->monthAndDayFormat),]
         );
-        $periods      = $this->getTagPeriodOverview($tag, $start);
+
+        $startPeriod = $this->repository->firstUseDate($tag);
+        $startPeriod  = $startPeriod ?? new Carbon;
+        $endPeriod    = clone $end;
+        $periods      = $this->getTagPeriodOverview($tag, $startPeriod, $endPeriod);
         $path         = route('tags.show', [$tag->id, $start->format('Y-m-d'), $end->format('Y-m-d')]);
 
         /** @var GroupCollectorInterface $collector */
@@ -224,7 +228,7 @@ class TagController extends Controller
         $subTitleIcon = 'fa-tag';
         $page         = (int)$request->get('page');
         $pageSize     = (int)app('preferences')->get('listPageSize', 50)->data;
-        $periods      = new Collection;
+        $periods      = [];
         $subTitle     = (string)trans('firefly.all_journals_for_tag', ['tag' => $tag->tag]);
         $start        = $this->repository->firstUseDate($tag) ?? new Carbon;
         $end          = new Carbon;
diff --git a/app/Support/Http/Controllers/PeriodOverview.php b/app/Support/Http/Controllers/PeriodOverview.php
index fb842b02cf..af63e4dc07 100644
--- a/app/Support/Http/Controllers/PeriodOverview.php
+++ b/app/Support/Http/Controllers/PeriodOverview.php
@@ -30,7 +30,6 @@ use FireflyIII\Models\Category;
 use FireflyIII\Models\Tag;
 use FireflyIII\Models\Transaction;
 use FireflyIII\Models\TransactionType;
-use FireflyIII\Repositories\Tag\TagRepositoryInterface;
 use FireflyIII\Support\CacheProperties;
 use Illuminate\Support\Collection;
 use Log;
@@ -361,57 +360,68 @@ trait PeriodOverview
      *
      * @param Carbon $date
      *
-     * @return Collection
+     * @return array
      */
-    protected function getTagPeriodOverview(Tag $tag, Carbon $date): Collection // period overview for tags.
+    protected function getTagPeriodOverview(Tag $tag, Carbon $start, Carbon $end): array // period overview for tags.
     {
-        die('not yet complete');
-        /** @var TagRepositoryInterface $repository */
-        $repository = app(TagRepositoryInterface::class);
-        $range      = app('preferences')->get('viewRange', '1M')->data;
-        /** @var Carbon $end */
-        $start = clone $date;
-        $end   = $repository->firstUseDate($tag) ?? new Carbon;
+
+        $range = app('preferences')->get('viewRange', '1M')->data;
         [$start, $end] = $end < $start ? [$end, $start] : [$start, $end];
 
-        // properties for entries with their amounts.
+        // properties for cache
         $cache = new CacheProperties;
         $cache->addProperty($start);
         $cache->addProperty($end);
         $cache->addProperty('tag-period-entries');
         $cache->addProperty($tag->id);
-
         if ($cache->has()) {
-            return $cache->get(); // @codeCoverageIgnore
+            // return $cache->get(); // @codeCoverageIgnore
         }
-
         /** @var array $dates */
         $dates   = app('navigation')->blockPeriods($start, $end, $range);
-        $entries = new Collection;
-        // while end larger or equal to start
+        $entries = [];
+
+        // collect all expenses in this period:
+        /** @var GroupCollectorInterface $collector */
+        $collector = app(GroupCollectorInterface::class);
+        $collector->setTag($tag);
+        $collector->setRange($start, $end);
+        $collector->setTypes([TransactionType::DEPOSIT]);
+        $earnedSet = $collector->getExtractedJournals();
+
+        // collect all income in this period:
+        /** @var GroupCollectorInterface $collector */
+        $collector = app(GroupCollectorInterface::class);
+        $collector->setTag($tag);
+        $collector->setRange($start, $end);
+        $collector->setTypes([TransactionType::WITHDRAWAL]);
+        $spentSet = $collector->getExtractedJournals();
+
+        // collect all transfers in this period:
+        /** @var GroupCollectorInterface $collector */
+        $collector = app(GroupCollectorInterface::class);
+        $collector->setTag($tag);
+        $collector->setRange($start, $end);
+        $collector->setTypes([TransactionType::TRANSFER]);
+        $transferSet = $collector->getExtractedJournals();
+
         foreach ($dates as $currentDate) {
-
-            $spentSet       = $repository->expenseInPeriod($tag, $currentDate['start'], $currentDate['end']);
-            $spent          = $this->groupByCurrency($spentSet);
-            $earnedSet      = $repository->incomeInPeriod($tag, $currentDate['start'], $currentDate['end']);
-            $earned         = $this->groupByCurrency($earnedSet);
-            $transferredSet = $repository->transferredInPeriod($tag, $currentDate['start'], $currentDate['end']);
-            $transferred    = $this->groupByCurrency($transferredSet);
-            $title          = app('navigation')->periodShow($currentDate['end'], $currentDate['period']);
-
-            $entries->push(
+            $spent       = $this->filterJournalsByDate($spentSet, $currentDate['start'], $currentDate['end']);
+            $earned      = $this->filterJournalsByDate($earnedSet, $currentDate['start'], $currentDate['end']);
+            $transferred = $this->filterJournalsByDate($transferSet, $currentDate['start'], $currentDate['end']);
+            $title       = app('navigation')->periodShow($currentDate['end'], $currentDate['period']);
+            $entries[]   =
                 [
-                    'transactions' => count($spentSet) + count($earnedSet) + count($transferredSet),
-                    'title'        => $title,
-                    'spent'        => $spent,
-                    'earned'       => $earned,
-                    'transferred'  => $transferred,
-                    'route'        => route('tags.show', [$tag->id, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]),
-                ]
-            );
-
+                    'transactions'       => 0,
+                    'title'              => $title,
+                    'route'              => route('tags.show',
+                                                  [$tag->id, $currentDate['start']->format('Y-m-d'), $currentDate['end']->format('Y-m-d')]),
+                    'total_transactions' => count($spent) + count($earned) + count($transferred),
+                    'spent'              => $this->groupByCurrency($spent),
+                    'earned'             => $this->groupByCurrency($earned),
+                    'transferred'        => $this->groupByCurrency($transferred),
+                ];
         }
-        $cache->store($entries);
 
         return $entries;
     }
@@ -435,7 +445,7 @@ trait PeriodOverview
         $cache->addProperty('transactions-period-entries');
         $cache->addProperty($transactionType);
         if ($cache->has()) {
-            // return $cache->get(); // @codeCoverageIgnore
+            return $cache->get(); // @codeCoverageIgnore
         }
         /** @var array $dates */
         $dates   = app('navigation')->blockPeriods($start, $end, $range);
diff --git a/resources/views/v1/tags/show.twig b/resources/views/v1/tags/show.twig
index b39ccca8d9..f55ef60956 100644
--- a/resources/views/v1/tags/show.twig
+++ b/resources/views/v1/tags/show.twig
@@ -105,7 +105,7 @@
             
         
     
-    {% if periods.count > 0 %}
+    {% if periods|length > 0 %}
         
             
     {% endif %}
     
-        
+        
             
                 
         
-        {% if periods.count > 0 %}
+        {% if periods|length > 0 %}
             
                 {% include 'list.periods' %}
             
         {% endif %}
     
 
-    {% if periods.count > 0 %}
+    {% if periods|length > 0 %}
         
             
                 {{ 'showEverything'|_ }}
diff --git a/tests/Feature/Controllers/TagControllerTest.php b/tests/Feature/Controllers/TagControllerTest.php
index eb50e1caa9..02242aacfc 100644
--- a/tests/Feature/Controllers/TagControllerTest.php
+++ b/tests/Feature/Controllers/TagControllerTest.php
@@ -22,13 +22,12 @@ declare(strict_types=1);
 
 namespace Tests\Feature\Controllers;
 
+use Amount;
 use Carbon\Carbon;
-
 use FireflyIII\Helpers\Collector\GroupCollectorInterface;
 use FireflyIII\Helpers\Fiscal\FiscalHelperInterface;
 use FireflyIII\Models\Preference;
 use FireflyIII\Models\Tag;
-use FireflyIII\Models\TransactionJournal;
 use FireflyIII\Models\TransactionType;
 use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
 use FireflyIII\Repositories\Tag\TagRepositoryInterface;
@@ -129,7 +128,6 @@ class TagControllerTest extends TestCase
     }
 
     /**
-     * @covers \FireflyIII\Http\Controllers\TagController
      * @covers \FireflyIII\Http\Controllers\TagController
      */
     public function testIndex(): void
@@ -153,7 +151,6 @@ class TagControllerTest extends TestCase
     }
 
     /**
-     * @covers \FireflyIII\Http\Controllers\TagController
      * @covers \FireflyIII\Http\Controllers\TagController
      */
     public function testShow(): void
@@ -171,28 +168,36 @@ class TagControllerTest extends TestCase
         Preferences::shouldReceive('get')->withArgs(['listPageSize', 50])->atLeast()->once()->andReturn($pref);
 
         // mock stuff
-        $repository   = $this->mock(TagRepositoryInterface::class);
-        $collector    = $this->mock(GroupCollectorInterface::class);
-        $userRepos    = $this->mock(UserRepositoryInterface::class);
+        $group      = $this->getRandomWithdrawalGroup();
+        $paginator  = new LengthAwarePaginator([$group], 1, 40, 1);
+        $repository = $this->mock(TagRepositoryInterface::class);
+        $collector  = $this->mock(GroupCollectorInterface::class);
+        $userRepos  = $this->mock(UserRepositoryInterface::class);
         $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true);
 
+        //Preferences::shouldReceive('mark')->atLeast()->once();
+        Preferences::shouldReceive('lastActivity')->atLeast()->once()->andReturn('md512345');
+
         $repository->shouldReceive('firstUseDate')->andReturn(new Carbon)->once();
         $repository->shouldReceive('sumsOfTag')->andReturn($amounts)->once();
 
-        $repository->shouldReceive('expenseInPeriod')->andReturn(new Collection)->atLeast()->times(1);
-        $repository->shouldReceive('incomeInPeriod')->andReturn(new Collection)->atLeast()->times(1);
-        $repository->shouldReceive('transferredInPeriod')->andReturn(new Collection)->atLeast()->times(1);
+        //$repository->shouldReceive('expenseInPeriod')->andReturn(new Collection)->atLeast()->times(1);
+        //$repository->shouldReceive('incomeInPeriod')->andReturn(new Collection)->atLeast()->times(1);
+        //$repository->shouldReceive('transferredInPeriod')->andReturn(new Collection)->atLeast()->times(1);
 
-        $collector->shouldReceive('removeFilter')->andReturnSelf()->once();
-        $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf()->once();
-        $collector->shouldReceive('setLimit')->andReturnSelf()->once();
-        $collector->shouldReceive('setPage')->andReturnSelf()->once();
-        $collector->shouldReceive('setTag')->andReturnSelf()->once();
-        $collector->shouldReceive('withOpposingAccount')->andReturnSelf()->once();
-        $collector->shouldReceive('withBudgetInformation')->andReturnSelf()->once();
-        $collector->shouldReceive('withCategoryInformation')->andReturnSelf()->once();
-        $collector->shouldReceive('setRange')->andReturnSelf()->once();
-        $collector->shouldReceive('getPaginatedTransactions')->andReturn(new LengthAwarePaginator([], 0, 10))->once();
+        $collector->shouldReceive('setTypes')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('setLimit')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('setPage')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('setTag')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('withBudgetInformation')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('withCategoryInformation')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('withAccountInformation')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('getPaginatedGroups')->andReturn($paginator)->atLeast()->once();
+
+        Amount::shouldReceive('formatAnything')->atLeast()->once()->andReturn('x');
+
+        $collector->shouldReceive('setRange')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('getExtractedJournals')->atLeast()->once()->andReturn([]);
 
         $this->be($this->user());
         $response = $this->get(route('tags.show', [1]));
@@ -207,34 +212,39 @@ class TagControllerTest extends TestCase
     {
         $this->mockDefaultSession();
 
-        // mock stuff
-        $repository   = $this->mock(TagRepositoryInterface::class);
-        $collector    = $this->mock(TransactionCollectorInterface::class);
-        $journalRepos = $this->mock(JournalRepositoryInterface::class);
-        $userRepos    = $this->mock(UserRepositoryInterface::class);
-        $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true);
-
-        
-        $repository->shouldReceive('firstUseDate')->andReturn(new Carbon)->once();
-
-        $collector->shouldReceive('removeFilter')->andReturnSelf()->once();
-        $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf()->once();
-        $collector->shouldReceive('setLimit')->andReturnSelf()->once();
-        $collector->shouldReceive('setPage')->andReturnSelf()->once();
-        $collector->shouldReceive('setTag')->andReturnSelf()->once();
-        $collector->shouldReceive('withOpposingAccount')->andReturnSelf()->once();
-        $collector->shouldReceive('withBudgetInformation')->andReturnSelf()->once();
-        $collector->shouldReceive('withCategoryInformation')->andReturnSelf()->once();
-        $collector->shouldReceive('setRange')->andReturnSelf()->once();
-        $collector->shouldReceive('getPaginatedTransactions')->andReturn(new LengthAwarePaginator([], 0, 10))->once();
-
         $amounts = [
             TransactionType::WITHDRAWAL => '0',
             TransactionType::TRANSFER   => '0',
             TransactionType::DEPOSIT    => '0',
         ];
+
+        $pref       = new Preference;
+        $pref->data = 50;
+        Preferences::shouldReceive('get')->withArgs(['listPageSize', 50])->atLeast()->once()->andReturn($pref);
+
+        // mock stuff
+        $group      = $this->getRandomWithdrawalGroup();
+        $paginator  = new LengthAwarePaginator([$group], 1, 40, 1);
+        $repository = $this->mock(TagRepositoryInterface::class);
+        $collector  = $this->mock(GroupCollectorInterface::class);
+        $userRepos  = $this->mock(UserRepositoryInterface::class);
+        $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true);
+
+        $repository->shouldReceive('firstUseDate')->andReturn(new Carbon)->once();
         $repository->shouldReceive('sumsOfTag')->andReturn($amounts)->once();
 
+        $collector->shouldReceive('setLimit')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('setPage')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('setTag')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('withBudgetInformation')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('withCategoryInformation')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('withAccountInformation')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('getPaginatedGroups')->andReturn($paginator)->atLeast()->once();
+
+        Amount::shouldReceive('formatAnything')->atLeast()->once()->andReturn('x');
+
+        $collector->shouldReceive('setRange')->andReturnSelf()->atLeast()->once();
+
         $this->be($this->user());
         $response = $this->get(route('tags.show', [1, 'all']));
         $response->assertStatus(200);
@@ -248,43 +258,50 @@ class TagControllerTest extends TestCase
     {
         $this->mockDefaultSession();
 
-        // mock stuff
-        $repository   = $this->mock(TagRepositoryInterface::class);
-        $collector    = $this->mock(TransactionCollectorInterface::class);
-        $journalRepos = $this->mock(JournalRepositoryInterface::class);
-        $userRepos    = $this->mock(UserRepositoryInterface::class);
-        $fiscalHelper = $this->mock(FiscalHelperInterface::class);
-        $date         = new Carbon;
-        $fiscalHelper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn($date);
-        $fiscalHelper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn($date);
-
-        $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true);
-        
-        $repository->shouldReceive('firstUseDate')->andReturn(new Carbon)->once();
-
-        $repository->shouldReceive('expenseInPeriod')->andReturn(new Collection)->atLeast()->times(1);
-        $repository->shouldReceive('incomeInPeriod')->andReturn(new Collection)->atLeast()->times(1);
-        $repository->shouldReceive('transferredInPeriod')->andReturn(new Collection)->atLeast()->times(1);
-
-
-        $collector->shouldReceive('removeFilter')->andReturnSelf()->once();
-        $collector->shouldReceive('setAllAssetAccounts')->andReturnSelf()->once();
-        $collector->shouldReceive('setLimit')->andReturnSelf()->once();
-        $collector->shouldReceive('setPage')->andReturnSelf()->once();
-        $collector->shouldReceive('setTag')->andReturnSelf()->once();
-        $collector->shouldReceive('withOpposingAccount')->andReturnSelf()->once();
-        $collector->shouldReceive('withBudgetInformation')->andReturnSelf()->once();
-        $collector->shouldReceive('withCategoryInformation')->andReturnSelf()->once();
-        $collector->shouldReceive('setRange')->andReturnSelf()->once();
-        $collector->shouldReceive('getPaginatedTransactions')->andReturn(new LengthAwarePaginator([], 0, 10))->once();
-
         $amounts = [
             TransactionType::WITHDRAWAL => '0',
             TransactionType::TRANSFER   => '0',
             TransactionType::DEPOSIT    => '0',
         ];
+
+        $pref       = new Preference;
+        $pref->data = 50;
+        Preferences::shouldReceive('get')->withArgs(['listPageSize', 50])->atLeast()->once()->andReturn($pref);
+
+        // mock stuff
+        $helper = $this->mock(FiscalHelperInterface::class);
+
+        $helper->shouldReceive('startOfFiscalYear')->atLeast()->once()->andReturn(new Carbon);
+        $helper->shouldReceive('endOfFiscalYear')->atLeast()->once()->andReturn(new Carbon);
+
+        $group      = $this->getRandomWithdrawalGroup();
+        $paginator  = new LengthAwarePaginator([$group], 1, 40, 1);
+        $repository = $this->mock(TagRepositoryInterface::class);
+        $collector  = $this->mock(GroupCollectorInterface::class);
+        $userRepos  = $this->mock(UserRepositoryInterface::class);
+        $userRepos->shouldReceive('hasRole')->withArgs([Mockery::any(), 'owner'])->atLeast()->once()->andReturn(true);
+
+        //Preferences::shouldReceive('mark')->atLeast()->once();
+        Preferences::shouldReceive('lastActivity')->atLeast()->once()->andReturn('md512345');
+
+        $repository->shouldReceive('firstUseDate')->andReturn(new Carbon)->once();
         $repository->shouldReceive('sumsOfTag')->andReturn($amounts)->once();
 
+        $collector->shouldReceive('setTypes')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('setLimit')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('setPage')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('setTag')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('withBudgetInformation')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('withCategoryInformation')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('withAccountInformation')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('getPaginatedGroups')->andReturn($paginator)->atLeast()->once();
+
+        Amount::shouldReceive('formatAnything')->atLeast()->once()->andReturn('x');
+
+        $collector->shouldReceive('setRange')->andReturnSelf()->atLeast()->once();
+        $collector->shouldReceive('getExtractedJournals')->atLeast()->once()->andReturn([]);
+
+
         $this->be($this->user());
         $response = $this->get(route('tags.show', [1, '2016-01-01']));
         $response->assertStatus(200);
@@ -299,10 +316,8 @@ class TagControllerTest extends TestCase
     {
         $this->mockDefaultSession();
         $repository   = $this->mock(TagRepositoryInterface::class);
-        $journalRepos = $this->mock(JournalRepositoryInterface::class);
-        $userRepos    = $this->mock(UserRepositoryInterface::class);
+        Preferences::shouldReceive('mark')->atLeast()->once();
 
-        
         $repository->shouldReceive('findNull')->andReturn(null);
         $repository->shouldReceive('store')->andReturn(new Tag);
 
@@ -327,9 +342,9 @@ class TagControllerTest extends TestCase
     {
         $this->mockDefaultSession();
         $repository   = $this->mock(TagRepositoryInterface::class);
-        $journalRepos = $this->mock(JournalRepositoryInterface::class);
         $userRepos    = $this->mock(UserRepositoryInterface::class);
-        
+        Preferences::shouldReceive('mark')->atLeast()->once();
+
 
         $this->session(['tags.edit.uri' => 'http://localhost']);
         $data = [