diff --git "a/infobank/Articles/\303\230ving 4.pdf" "b/infobank/Articles/\303\230ving 4.pdf"
new file mode 100644
index 0000000000000000000000000000000000000000..ad291384e3cb1c25cff0036791701cb59f67683b
Binary files /dev/null and "b/infobank/Articles/\303\230ving 4.pdf" differ
diff --git a/templates/_folder_Exercises/O04/main.cpp b/templates/_folder_Exercises/O04/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..44bb3ed3c029b24f10c0701dd5eb377b46b68697
--- /dev/null
+++ b/templates/_folder_Exercises/O04/main.cpp
@@ -0,0 +1,12 @@
+
+#include "std_lib_facilities.h"
+#include "test.h"
+
+int main()
+{
+
+	// Her kan du teste koden og funksjonene dine, 
+	// Ingenting som skrives her blir automatisk rettet, du tester her for din egen del
+
+	return 0;
+}
diff --git a/templates/_folder_Exercises/O04/masterVisual.cpp b/templates/_folder_Exercises/O04/masterVisual.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..98c48f0af066340043173e838a37e9e4ee4667de
--- /dev/null
+++ b/templates/_folder_Exercises/O04/masterVisual.cpp
@@ -0,0 +1,147 @@
+#include "masterVisual.h"
+
+
+// i denne løses 5 a, d, g og litt av f
+// BEGIN: 5
+
+//void playMasterMindVisual(){}
+
+// END: 5
+
+
+void addGuess(MastermindWindow &mwin, const string code, const char startLetter)
+{
+	// BEGIN: 5b
+
+	// END: 5b
+}
+
+void addFeedback(MastermindWindow &mwin, const int correctPosition, const int correctCharacter)
+{
+	// BEGIN: 5e
+
+	// END: 5e
+}
+
+void MastermindWindow::drawCodeHider()
+{
+	if (code_hidden) {
+		draw_rectangle(Point{padX, 3 * padY}, winW - size * padX, padY, Color::black);
+	}
+}
+
+MastermindWindow::MastermindWindow(int x, int y, int w, int h, int size, const string &title) 
+: AnimationWindow(x, y, w, h, title),
+guessBtn{{upperLeftCornerBtn.x, upperLeftCornerBtn.y}, btnW, btnH, "Add"},
+guess{{upperLeftCornerInBox.x, upperLeftCornerInBox.y}, inBoxW, inBoxH, ""},
+size(size)
+{
+	add(guess);
+	add(guessBtn);
+	guessBtn.setCallback(std::bind(&MastermindWindow::cb_guess, this));
+};
+
+void MastermindWindow::drawGuessesAndFeedbacks()
+{
+	std::map<int, Color> colorConverter{
+		{1, Color::red},
+		{2, Color::green},
+		{3, Color::yellow},
+		{4, Color::blue},
+		{5, Color::blue_violet},
+		{6, Color::dark_cyan}};
+
+	for (int guessIndex = 0; guessIndex < static_cast<int>(guesses.size()); guessIndex++)
+	{
+		/*********************************************************************/
+
+		// BEGIN: 5c
+
+		// Implementer funksjonalitet slik at det vises fargede rektangler i grafikkvinduet
+		// Legg merke til at vi er i et for-løkke som går gjennom alle gjettene som er gjort.
+		// Tegn gjettet som ligger på plassen guessIndex i vektoren guesses.
+		
+
+		for (int i = 0; i < size; i++)
+		{
+			// Denne for-løkken går gjennom alle firkantene som skal tegnes i et gjett.
+			// Tegn rektangler ved bruk av draw_rectangle(). Bruk: colorConverter.at() for å få riktig farge
+
+		}
+		// END: 5c
+	}
+
+	for (int feedbackIndex = 0; feedbackIndex < static_cast<int>(feedbacks.size()); feedbackIndex++)
+	{
+		/*********************************************************************/
+
+		// BEGIN: 5f
+
+		// Implementer feedback
+		// Her skal mye likt gjøres som i 5c
+
+		for (int i = 0; i < size; i++)
+		{
+			// Tegn sirkler ved hjelp av draw_circle().
+
+		}
+		// END: 5f
+	}
+}
+
+string MastermindWindow::wait_for_guess()
+{
+
+	while (!button_pressed && !should_close())
+	{
+		drawGuessesAndFeedbacks();
+		// Burde tegnes sist siden den skal ligge på toppen
+		drawCodeHider();
+
+		next_frame();
+	}
+	button_pressed = false;
+
+	string newGuess = guess.getText();
+	guess.setText("");
+
+	return newGuess;
+}
+
+string MastermindWindow::getInput(unsigned int n, char lower, char upper)
+{
+	bool validInput = false;
+	string guess;
+	while (!validInput && !should_close())
+	{
+		guess.clear();
+		string input = wait_for_guess();
+		if (input.size() == n)
+		{
+			for (unsigned int i = 0; i < n; i++)
+			{
+				char ch = input.at(i);
+				if (isalpha(ch) && toupper(ch) <= upper && lower <= toupper(ch))
+				{
+					guess += toupper(ch);
+				}
+				else
+					break;
+			}
+		}
+		if (guess.size() == n)
+		{
+			validInput = true;
+		}
+		else
+		{
+			cout << "Invalid input guess again" << endl;
+		}
+	}
+	return guess;
+}
+
+void MastermindWindow::setCodeHidden(bool hidden) {
+	code_hidden = hidden;
+}
+
diff --git a/templates/_folder_Exercises/O04/masterVisual.h b/templates/_folder_Exercises/O04/masterVisual.h
new file mode 100644
index 0000000000000000000000000000000000000000..70b209d306ede8c1e14fafddac23089ae1f84613
--- /dev/null
+++ b/templates/_folder_Exercises/O04/masterVisual.h
@@ -0,0 +1,75 @@
+#pragma once
+#include "widgets/Button.h" 
+#include "widgets/TextInput.h" 
+#include "AnimationWindow.h"
+#include "std_lib_facilities.h"
+
+using namespace TDT4102;
+
+// BEGIN: 5a
+constexpr int winW = 0;      // velg vindu bredde
+constexpr int winH = 0;      // velg vindu hoyde
+
+constexpr int padX = 0;      // velg x skalering
+constexpr int padY = 0;      // velg y skalering
+constexpr int radCircle = 0; // velg sirkel radius
+
+// END: 5a
+
+// BEGIN 5
+// deklarer playMasterMindVisual her
+// END: 5
+
+
+constexpr int btnW = padX * 2;
+constexpr int btnH = padY;      
+constexpr Point upperLeftCornerBtn = Point{winW - padX - btnW, padY};
+
+constexpr int inBoxW = winW - 3 * padX - btnW;
+constexpr int inBoxH = padY;
+constexpr Point upperLeftCornerInBox = Point{padX, padY};
+
+struct Guess {
+    const string code; 
+    char startLetter = 'a';
+};
+
+struct Feedback {
+    const int correctPosition = 0;
+    const int correctCharacter = 0;
+};
+
+// Her defineres klassen MastermindWindow, som arver fra klassen AnimationWindow.
+// Det betyr at alle medlemsvariable og medlemsfunksjoner i AnimationWindow, også er en
+// del av MastermindWindow. Du kan lese mer om klasser i kapittel 9.4 og om arv
+// i kapittel 14.3 i læreboka. Dette skal du lære mer om senere i faget.
+class MastermindWindow : public AnimationWindow
+{
+public:
+    MastermindWindow(int x, int y, int w, int h, int size, const std::string &title);
+
+    void cb_guess(){ newGuess(); }
+
+    vector<Guess> guesses;
+    vector<Feedback> feedbacks;
+
+    void drawGuessesAndFeedbacks();
+
+    void setCodeHidden(bool hidden);
+
+    string getInput(unsigned int n, char lower, char upper);
+
+private:
+    string wait_for_guess();
+    void newGuess() { button_pressed = true; }
+    void drawCodeHider();
+    
+    bool button_pressed = false;
+    bool code_hidden = true;
+    Button guessBtn;
+    TextInput guess;
+    int size = 0;
+};
+
+void addGuess(MastermindWindow &mwin, const string code, const char startLetter);
+void addFeedback(MastermindWindow &mwin, const int correctPosition, const int correctCharacter);
diff --git a/templates/_folder_Exercises/O04/mastermind.cpp b/templates/_folder_Exercises/O04/mastermind.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fa73282fd4bd68be53cb384fa6875a95dc9aeb85
--- /dev/null
+++ b/templates/_folder_Exercises/O04/mastermind.cpp
@@ -0,0 +1,14 @@
+#include "mastermind.h"
+
+// BEGIN: 4
+//Oppgave 4a til 4j løses her forutenom 4e og 4f
+//playMastermind(){}
+// END: 4
+
+// BEGIN: 4e
+///*returverdi*/ checkCharactersAndPosition(/*param 1: code, param 2: guess*/) {}
+// END: 4e
+
+// BEGIN: 4f
+///*returverdi*/ checkCharacters(/*param 1: code, param 2: guess*/) {}
+// END: 4f
diff --git a/templates/_folder_Exercises/O04/mastermind.h b/templates/_folder_Exercises/O04/mastermind.h
new file mode 100644
index 0000000000000000000000000000000000000000..13390cd3f83586fe6353e9a715f0638c62c9960e
--- /dev/null
+++ b/templates/_folder_Exercises/O04/mastermind.h
@@ -0,0 +1,15 @@
+#pragma once
+#include "std_lib_facilities.h"
+#include "utilities.h"
+
+// BEGIN: 4
+//deklarer playMastermind her
+// END: 4
+
+// BEGIN: 4e
+//deklarer checkCharactersAndPosition her
+// END: 4e
+
+// BEGIN: 4f
+//deklarer checkCharacters her
+// END: 4f
diff --git a/templates/_folder_Exercises/O04/test.cpp b/templates/_folder_Exercises/O04/test.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..dda8380bd89ffea1462a1704b32ac8597d65fc1a
--- /dev/null
+++ b/templates/_folder_Exercises/O04/test.cpp
@@ -0,0 +1,27 @@
+#include "test.h"
+
+void testCallByValue()
+{
+	int v0 = 5;
+	int increment = 2;
+	int iterations = 10;
+	int result = incrementByValueNumTimes(v0, increment, iterations);
+	cout << "v0: " << v0 << " increment: " << increment
+		 << " iterations: " << iterations << " result: " << result << '\n';
+}
+
+void testCallByReference()
+{
+	// BEGIN: 1d
+
+	// END: 1d
+
+}
+
+
+void testString(){
+	// 3b OG 3e gjøres inne i her
+	// BEGIN: 3e
+
+	// END: 3e
+}
\ No newline at end of file
diff --git a/templates/_folder_Exercises/O04/test.h b/templates/_folder_Exercises/O04/test.h
new file mode 100644
index 0000000000000000000000000000000000000000..3b1a33fba6409c095499638c0a92507b4dd2016c
--- /dev/null
+++ b/templates/_folder_Exercises/O04/test.h
@@ -0,0 +1,7 @@
+#pragma once
+#include "utilities.h"
+#include "std_lib_facilities.h"
+
+void testCallByValue();
+void testCallByReference();
+void testString();
\ No newline at end of file
diff --git a/templates/_folder_Exercises/O04/utilities.cpp b/templates/_folder_Exercises/O04/utilities.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..73e0ff9823110a058154e6262417a147b9fc7eb8
--- /dev/null
+++ b/templates/_folder_Exercises/O04/utilities.cpp
@@ -0,0 +1,38 @@
+#include "utilities.h"
+
+int incrementByValueNumTimes(int startValue, int increment, int numTimes)
+{
+	for (int i = 0; i < numTimes; i++)
+		startValue += increment;
+
+	return startValue;
+}
+
+// BEGIN: 1d
+///*returverdi*/ incrementByValueNumTimesRef(/*param 1: startValue(ref), param 2: increment, param 3: numtimes*/){}
+// END: 1d
+
+// BEGIN: 1e
+///*returverdi*/ swapNumbers(/*parametre*/){}
+// END: 1e
+
+// BEGIN: 2b
+///*returverdi*/ printStudent(/*input Student*/) {}
+// END: 2b
+
+// BEGIN: 2c
+///*returverdi*/ isInProgram(/*param 1: Student, param 2: string*/){}
+// END: 2c
+
+
+// BEGIN: 3a
+///*returverdi*/ randomizeString(/*param 1: antall tegn, param 2: øvre grense, param 3: nedre grense */) 
+// END: 3a
+
+// BEGIN: 3c
+///*returverdi*/ readInputToString(/*param 1: lengde n, param 2: øvre grense, param 3: nedre grense*/)
+// END: 3c
+
+// BEGIN: 3d
+///*returverdi*/ countChar(/*param 1: string, param 2: char*/)
+// END: 3d
diff --git a/templates/_folder_Exercises/O04/utilities.h b/templates/_folder_Exercises/O04/utilities.h
new file mode 100644
index 0000000000000000000000000000000000000000..4bd57197d0ae2a27196957ac70e3c6792a1c75af
--- /dev/null
+++ b/templates/_folder_Exercises/O04/utilities.h
@@ -0,0 +1,39 @@
+
+#pragma once
+#include "std_lib_facilities.h"
+
+// BEGIN: 1b
+ // deklarerer funksjonen incrementByValueNumTimes her
+// END: 1b
+
+// BEGIN: 1d
+ // deklarerer funksjonen incrementByValueNumTimesRef her
+// END: 1d
+
+// BEGIN: 1e
+ // deklarerer funksjonen swapNumbers her
+// END: 1e
+
+// BEGIN: 2a
+ // lag struct Student her
+// END: 2a
+
+// BEGIN: 2b
+// deklarerer funksjonen printStudent her
+// END: 2b
+
+// BEGIN: 2c
+// deklarerer funksjonen isInProgram her
+// END: 2c
+
+// BEGIN: 3a
+ // deklarerer funksjonen randomizeString her
+// END: 3a
+
+// BEGIN: 3c
+ // deklarerer funksjonen readInputToString her
+// END: 3c
+
+// BEGIN: 3d
+ // deklarerer funksjonen countChar her
+// END: 3d