();
+ }
+ }
+}
diff --git a/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/BenchmarkDotNet.Artifacts/results/MyBenchmarks.StringAdd-report-github.md b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/BenchmarkDotNet.Artifacts/results/MyBenchmarks.StringAdd-report-github.md
new file mode 100644
index 00000000..70da1f2b
--- /dev/null
+++ b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/BenchmarkDotNet.Artifacts/results/MyBenchmarks.StringAdd-report-github.md
@@ -0,0 +1,15 @@
+``` ini
+
+BenchmarkDotNet=v0.13.0, OS=ubuntu 20.04
+Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R), 1 CPU, 8 logical and 4 physical cores
+.NET SDK=5.0.203
+ [Host] : .NET 5.0.6 (5.0.621.22011), X64 RyuJIT
+ DefaultJob : .NET 5.0.6 (5.0.621.22011), X64 RyuJIT
+
+
+```
+| Method | Mean | Error | StdDev |
+|------------ |-----------------:|------------------:|------------------:|
+| Join | 26.94 ns | 0.526 ns | 0.439 ns |
+| BuilderJoin | 85,051,155.23 ns | 11,071,144.320 ns | 32,643,518.817 ns |
+| Concatenate | 15.47 ns | 2.106 ns | 6.209 ns |
diff --git a/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/BenchmarkDotNet.Artifacts/results/MyBenchmarks.StringAdd-report.csv b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/BenchmarkDotNet.Artifacts/results/MyBenchmarks.StringAdd-report.csv
new file mode 100644
index 00000000..54146a7c
--- /dev/null
+++ b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/BenchmarkDotNet.Artifacts/results/MyBenchmarks.StringAdd-report.csv
@@ -0,0 +1,4 @@
+Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev
+Join,DefaultJob,False,Default,Default,Default,Default,Default,Default,11111111,Empty,RyuJit,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 5.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,1,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,26.94 ns,0.526 ns,0.439 ns
+BuilderJoin,DefaultJob,False,Default,Default,Default,Default,Default,Default,11111111,Empty,RyuJit,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 5.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,1,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"85,051,155.23 ns","11,071,144.320 ns","32,643,518.817 ns"
+Concatenate,DefaultJob,False,Default,Default,Default,Default,Default,Default,11111111,Empty,RyuJit,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 5.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,1,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,15.47 ns,2.106 ns,6.209 ns
diff --git a/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/BenchmarkDotNet.Artifacts/results/MyBenchmarks.StringAdd-report.html b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/BenchmarkDotNet.Artifacts/results/MyBenchmarks.StringAdd-report.html
new file mode 100644
index 00000000..178d3cf0
--- /dev/null
+++ b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/BenchmarkDotNet.Artifacts/results/MyBenchmarks.StringAdd-report.html
@@ -0,0 +1,32 @@
+
+
+
+
+MyBenchmarks.StringAdd-20210527-005536
+
+
+
+
+
+BenchmarkDotNet=v0.13.0, OS=ubuntu 20.04
+Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R), 1 CPU, 8 logical and 4 physical cores
+.NET SDK=5.0.203
+ [Host] : .NET 5.0.6 (5.0.621.22011), X64 RyuJIT
+ DefaultJob : .NET 5.0.6 (5.0.621.22011), X64 RyuJIT
+
+
+
+
+| Method | Mean | Error | StdDev |
+
+| Join | 26.94 ns | 0.526 ns | 0.439 ns |
+
| BuilderJoin | 85,051,155.23 ns | 11,071,144.320 ns | 32,643,518.817 ns |
+
| Concatenate | 15.47 ns | 2.106 ns | 6.209 ns |
+
+
+
diff --git a/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/Program.cs b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/Program.cs
new file mode 100644
index 00000000..9d874a13
--- /dev/null
+++ b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/Program.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Runtime.CompilerServices;
+
+[assembly: InternalsVisibleTo("WubbaLubbaDubDub.Tests")]
+
+namespace WubbaLubbaDubDub
+{
+ class Program
+ {
+ }
+}
diff --git a/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/RicksMercilessEncryptor.cs b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/RicksMercilessEncryptor.cs
index 1063065b..4fbb019c 100644
--- a/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/RicksMercilessEncryptor.cs
+++ b/course-2021-1/exercises/04-wubba-lubba-dub-dub/WubbaLubbaDubDub/WubbaLubbaDubDub/RicksMercilessEncryptor.cs
@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
+using System.Text.RegularExpressions;
+using System.Linq;
+
namespace WubbaLubbaDubDub
{
@@ -11,8 +14,7 @@ public static class RicksMercilessEncryptor
///