diff --git a/bin/fake.php b/bin/fake.php
index cb69b7f87393d98e50af7d8032ae54faedbcecc2..2d5d5f73368509666870dab668f3c9b9d3c18c31 100644
--- a/bin/fake.php
+++ b/bin/fake.php
@@ -14,69 +14,153 @@ use SimpleSAML\Module\accounting\Services\Logger;
 require 'vendor/autoload.php';
 
 $helpersManager = new HelpersManager();
-
+$logger = new Logger();
+$configDir = __DIR__ . '/config';
+putenv("SIMPLESAMLPHP_CONFIG_DIR=$configDir");
+$moduleConfiguration = new ModuleConfiguration();
+$sampleUsers = include 'sampleUsers.php';
+$activityTracker = new ActivityTracker($moduleConfiguration, $logger);
+$connectedServicesTracker = new ConnectedServicesTracker($moduleConfiguration, $logger);
 $start = new DateTime();
-
 $newLine = "\n";
 
 echo "Start: " . $start->format(DateTime::ATOM);
 echo $newLine;
 
-$options = getopt('c:');
+$options = getopt('c:o:a::');
 
-$numberOfItems = $options['c'] ?? 1000;
+$spMetadata = [];
 
-echo 'Number of items: ' . $numberOfItems;
-echo $newLine;
+if (isset($options['c'])) {
+    $numberOfItems = max((int) $options['c'], 100);
+    doSampleUsers($numberOfItems, $spMetadata, $sampleUsers, $activityTracker, $connectedServicesTracker);
+}
+
+if (isset($options['o'])) {
+    $numberOfUsers = max((int) $options['o'], 100);
+    $numberOfAuthentications = (int) ($options['a'] ?? 1000);
+    doRandomUsers($numberOfUsers, $numberOfAuthentications, $spMetadata, $activityTracker, $connectedServicesTracker);
+}
 
 
-/**/
-echo 'Starting ... ';
-$startTime = new DateTime();
-echo $startTime->format(DateTime::ATOM);
+echo $newLine;
+echo 'End: ' . (new DateTime())->format(DateTime::ATOM);
 echo $newLine;
 
-$logger = new Logger();
-$configDir = __DIR__ . '/config';
-putenv("SIMPLESAMLPHP_CONFIG_DIR=$configDir");
-$moduleConfiguration = new ModuleConfiguration();
-$durationInSeconds = (new DateTime())->getTimestamp() - $startTime->getTimestamp();
-$sampleUsers = include 'sampleUsers.php';
-$activityTracker = new ActivityTracker($moduleConfiguration, $logger);
-$connectedServicesTracker = new ConnectedServicesTracker($moduleConfiguration, $logger);
+function doSampleUsers(
+        int $numberOfAuthentications,
+        array &$spMetadata,
+        $sampleUsers,
+        ActivityTracker $activityTracker,
+        ConnectedServicesTracker $connectedServicesTracker
+) {
+    echo "Doing $numberOfAuthentications authentications for sample users. \n";
+
+    if (count($spMetadata) < 100) {
+        $spMetadata[] = prepareSampleSpMetadata();
+    }
+    $happenedAt = new DateTimeImmutable('-12 months');
 
-$spMetadata = [];
-$spMetadata[] = prepareSampleSpMetadata();
-$happenedAt = new DateTimeImmutable('-6 months');
+    for ($i = 1; $i <= $numberOfAuthentications; $i++) {
+        printSingleLine('Doing item ' . $i);
+
+        if ($i % ((int)($numberOfAuthentications / 100)) === 0) {
+            $happenedAt = $happenedAt->add(new DateInterval('P1D'));
+            if (count($spMetadata) < 100) {
+                $spMetadata[] = prepareSampleSpMetadata();
+            }
+        }
+
+
+        $event = prepareEvent(
+            Saml2::DESIGNATION,
+            $sampleUsers[array_rand($sampleUsers)],
+            $spMetadata[array_rand($spMetadata)],
+            $happenedAt
+        );
 
-for ($i = 1; $i <= $numberOfItems; $i++) {
-    printSingleLine('Doing item ' . $i);
+        $activityTracker->process($event);
+        $connectedServicesTracker->process($event);
 
-    if ($i % ((int)($numberOfItems / 100)) === 0) {
-        $happenedAt = $happenedAt->add(new DateInterval('P1D'));
-        if (count($spMetadata) < 100) {
+        $happenedAt = $happenedAt->add(new DateInterval('PT1H'));
+    }
+}
+
+
+function doRandomUsers(
+    int $numberOfUsers,
+    int $numberOfAuthentications,
+    array $spMetadata,
+    ActivityTracker $activityTracker,
+    ConnectedServicesTracker $connectedServicesTracker
+) {
+    echo "Doing $numberOfUsers random users with $numberOfAuthentications authentications.\n";
+
+    while (count($spMetadata) < 100) {
+        $spMetadata[] = prepareSampleSpMetadata();
+    }
+
+    for ($i = 0; $i < $numberOfUsers; $i++) {
+        $randomUser = prepareRandomUser();
+
+        if (count($spMetadata) < 500) {
             $spMetadata[] = prepareSampleSpMetadata();
         }
-    }
 
-    $event = prepareEvent(
-        Saml2::DESIGNATION,
-        $sampleUsers[array_rand($sampleUsers)],
-        $spMetadata[array_rand($spMetadata)],
-        $happenedAt
-    );
+        $startForUser = new DateTimeImmutable();
+
+        $happenedAt = new DateTimeImmutable('-12 months');
+
+        for($j = 0; $j < $numberOfAuthentications; $j++) {
+            if ($numberOfAuthentications >= 500 && ($j % 500) === 0) {
+                versionUser($randomUser);
+            }
+
+            printSingleLine('Doing user ' . $i . ', authentication ' . $j);
+
+            if ($i % ((int)($numberOfAuthentications / 10)) === 0) {
+                $happenedAt = $happenedAt->add(new DateInterval('P1D'));
+            }
+
+            $event = prepareEvent(
+                Saml2::DESIGNATION,
+                $randomUser,
+                $spMetadata[array_rand($spMetadata)],
+                $happenedAt
+            );
 
-    $activityTracker->process($event);
-    $connectedServicesTracker->process($event);
+            $activityTracker->process($event);
+            $connectedServicesTracker->process($event);
 
-    $happenedAt = $happenedAt->add(new DateInterval('PT1H'));
+            $happenedAt = $happenedAt->add(new DateInterval('PT1H'));
+        }
+        echo "\n";
+        echo 'Done in ' . ((new DateTimeImmutable())->getTimestamp() - $startForUser->getTimestamp()) . " seconds.\n";
+    }
 }
 
-echo $newLine;
-echo 'End: ' . (new DateTime())->format(DateTime::ATOM);
-echo $newLine;
-echo 'Duration in seconds:  ' . $durationInSeconds;
-echo $newLine;
+function prepareRandomUser(): array
+{
+    $faker = Faker\Factory::create();
+    $firstName = $faker->firstName();
+    $lastName = $faker->lastName();
+    $userName = strtolower(str_replace(' ', '', $firstName . '.' . $lastName));
+
+    return [
+        'uid' => [$userName],
+        'sn' => [$lastName],
+        'givenName' => [$firstName],
+        'mail' => [$userName . '@' . $faker->domainName()],
+        'hrEduPersonPersistentID' => [$faker->regexify('[A-Z0-9]{64}')],
+    ];
+}
+
+function versionUser(array &$user): void
+{
+    $faker = Faker\Factory::create();
+    // Simulate addition of another email address.
+    $user['mail'][] = $faker->email();
+}
 
 function printSingleLine(string $message): void
 {
@@ -140,4 +224,4 @@ function prepareSampleSpMetadata(string $protocol = Saml2::DESIGNATION)
     $rpMetadata['name'] = $faker->company();
 
     return $rpMetadata;
-}
\ No newline at end of file
+}