diff --git a/src/main/java/formula/Addition.java b/src/main/java/formula/Addition.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f332a7dea65a51249d43aa152be8e271582c542
--- /dev/null
+++ b/src/main/java/formula/Addition.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Addition extends BinaryOperation {
+  public Addition(Formula leftMember, Formula rightMember) {
+    super(leftMember, rightMember, "+");
+  }
+
+  @Override
+  protected double compute(double leftValue, double rightValue) {
+    return leftValue + rightValue;
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Addition(leftMember.derivative(), rightMember.derivative());
+  }
+}
diff --git a/src/main/java/formula/BinaryOperation.java b/src/main/java/formula/BinaryOperation.java
new file mode 100644
index 0000000000000000000000000000000000000000..caccbbeef03dfa0649c26d91a81600cbf7bd99a4
--- /dev/null
+++ b/src/main/java/formula/BinaryOperation.java
@@ -0,0 +1,25 @@
+package formula;
+
+public abstract class BinaryOperation implements Formula {
+  final Formula leftMember;
+  final Formula rightMember;
+  final String operatorSymbol;
+
+  public BinaryOperation(Formula leftMember, Formula rightMember, String operatorSymbol) {
+    this.leftMember = leftMember;
+    this.rightMember = rightMember;
+    this.operatorSymbol = operatorSymbol;
+  }
+
+  @Override
+  public String toString() {
+    return "(" + leftMember + " " + operatorSymbol + " " + rightMember + ")";
+  }
+
+  @Override
+  public double eval(double xValue) {
+    return compute(leftMember.eval(xValue), rightMember.eval(xValue));
+  }
+
+  protected abstract double compute(double leftValue, double rightValue);
+}
diff --git a/src/main/java/formula/Constant.java b/src/main/java/formula/Constant.java
index 12359a7ee721948a677a54a091215e65d5c3b5bc..a4e9e5ed14af5f9b73e9ad05fab7c5361c89870b 100644
--- a/src/main/java/formula/Constant.java
+++ b/src/main/java/formula/Constant.java
@@ -4,10 +4,10 @@ import java.util.HashMap;
 
 public class Constant implements Formula {
 
-  private double value;
+  private final double value;
 
   public Constant(double value) {
-    // TODO : change the code.
+   this.value = value;
   }
 
   /**
@@ -18,8 +18,7 @@ public class Constant implements Formula {
    */
   @Override
   public double eval(double xValue) {
-    // TODO : change the code.
-    return 0;
+    return value;
   }
 
   /**
@@ -29,8 +28,7 @@ public class Constant implements Formula {
    */
   @Override
   public Formula derivative() {
-    // TODO : change the code.
-    return this;
+    return new Constant(0);
   }
 
   /**
@@ -40,8 +38,7 @@ public class Constant implements Formula {
    */
   @Override
   public String toString() {
-    // TODO : change the code.
-    return "toto";
+    return Double.toString(value);
   }
 
   /**
diff --git a/src/main/java/formula/Cosine.java b/src/main/java/formula/Cosine.java
new file mode 100644
index 0000000000000000000000000000000000000000..5108eef7282a55343515c82b2e57e6d03825cf8e
--- /dev/null
+++ b/src/main/java/formula/Cosine.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Cosine extends UnaryOperation {
+  public Cosine(Formula member) {
+    super(member, "cos");
+  }
+
+  @Override
+  protected double compute(double value) {
+    return Math.cos(value);
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Opposite(new Multiplication(member.derivative(), new Sine(member)));
+  }
+}
diff --git a/src/main/java/formula/Division.java b/src/main/java/formula/Division.java
new file mode 100644
index 0000000000000000000000000000000000000000..528bac9dd9c9b73e69377d4695b948e7019bdf7a
--- /dev/null
+++ b/src/main/java/formula/Division.java
@@ -0,0 +1,19 @@
+package formula;
+
+public class Division extends BinaryOperation {
+  public Division(Formula dividend, Formula divisor) {
+    super(dividend, divisor, "/");
+  }
+
+  @Override
+  protected double compute(double leftValue, double rightValue) {
+    return leftValue/rightValue;
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Division(new Subtraction(new Multiplication(leftMember.derivative(), rightMember),
+            new Multiplication(leftMember, rightMember.derivative())),
+            new Multiplication(rightMember, rightMember));
+  }
+}
diff --git a/src/main/java/formula/Exponential.java b/src/main/java/formula/Exponential.java
new file mode 100644
index 0000000000000000000000000000000000000000..7fdc0e8f4dd9e6afdedd740d169e90e7aa3d551b
--- /dev/null
+++ b/src/main/java/formula/Exponential.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Exponential extends UnaryOperation {
+  public Exponential(Formula member) {
+    super(member, "e^");
+  }
+
+  @Override
+  protected double compute(double value) {
+    return Math.exp(value);
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Multiplication(member.derivative(), new Exponential(member));
+  }
+}
diff --git a/src/main/java/formula/Logarithm.java b/src/main/java/formula/Logarithm.java
new file mode 100644
index 0000000000000000000000000000000000000000..963c3b9fb0d9330fa25ba76ab07987b30e6130d5
--- /dev/null
+++ b/src/main/java/formula/Logarithm.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Logarithm extends UnaryOperation {
+  public Logarithm(Formula member) {
+    super(member, "log");
+  }
+
+  @Override
+  protected double compute(double value) {
+    return Math.log(value);
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Division(member.derivative(), member);
+  }
+}
diff --git a/src/main/java/formula/Multiplication.java b/src/main/java/formula/Multiplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..ebef51fdc3693fca152c8675aa41fa7fb203a13e
--- /dev/null
+++ b/src/main/java/formula/Multiplication.java
@@ -0,0 +1,18 @@
+package formula;
+
+public class Multiplication extends BinaryOperation {
+  public Multiplication(Formula leftMember, Formula rightMember) {
+    super(leftMember, rightMember, "*");
+  }
+
+  @Override
+  protected double compute(double leftValue, double rightValue) {
+    return leftValue * rightValue;
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Addition(new Multiplication(leftMember.derivative(), rightMember),
+            new Multiplication(leftMember, rightMember.derivative()));
+  }
+}
diff --git a/src/main/java/formula/Opposite.java b/src/main/java/formula/Opposite.java
new file mode 100644
index 0000000000000000000000000000000000000000..1402959f5133e115f0303ac035283733f3a71470
--- /dev/null
+++ b/src/main/java/formula/Opposite.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Opposite extends UnaryOperation{
+  public Opposite(Formula member) {
+    super(member, "-");
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Opposite(member.derivative());
+  }
+
+  @Override
+  protected double compute(double value) {
+    return -value;
+  }
+}
diff --git a/src/main/java/formula/Sine.java b/src/main/java/formula/Sine.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2e4aceec8a113584046e40d7f41b414e6978c93
--- /dev/null
+++ b/src/main/java/formula/Sine.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Sine extends UnaryOperation {
+  public Sine(Formula member) {
+    super(member, "sin");
+  }
+
+  @Override
+  protected double compute(double value) {
+    return Math.sin(value);
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Multiplication(member.derivative(), new Cosine(member));
+  }
+}
diff --git a/src/main/java/formula/Subtraction.java b/src/main/java/formula/Subtraction.java
new file mode 100644
index 0000000000000000000000000000000000000000..e52c052a7ea47790181a180005a9730711c78603
--- /dev/null
+++ b/src/main/java/formula/Subtraction.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Subtraction extends BinaryOperation {
+  public Subtraction(Formula subtrahend, Formula minuend) {
+    super(subtrahend, minuend, "-");
+  }
+
+  @Override
+  protected double compute(double leftValue, double rightValue) {
+    return leftValue - rightValue;
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Subtraction(leftMember.derivative(), rightMember.derivative());
+  }
+}
diff --git a/src/main/java/formula/UnaryOperation.java b/src/main/java/formula/UnaryOperation.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1bb7b9ddd2421e2fb3ebe369f75f089eb3e1d2b
--- /dev/null
+++ b/src/main/java/formula/UnaryOperation.java
@@ -0,0 +1,23 @@
+package formula;
+
+public abstract class UnaryOperation implements Formula {
+  protected final Formula member;
+  private final String symbol;
+
+  public UnaryOperation(Formula member, String symbol) {
+    this.member = member;
+    this.symbol = symbol;
+  }
+
+  @Override
+  public double eval(double xValue) {
+    return compute(member.eval(xValue));
+  }
+
+  protected abstract double compute(double value);
+
+  @Override
+  public String toString() {
+    return  symbol + "(" + member + ")";
+  }
+}
diff --git a/src/main/java/formula/VariableX.java b/src/main/java/formula/VariableX.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ecbe56a5aecc69d57fac55273e84b8782333bcf
--- /dev/null
+++ b/src/main/java/formula/VariableX.java
@@ -0,0 +1,18 @@
+package formula;
+
+public class VariableX implements Formula {
+  @Override
+  public double eval(double xValue) {
+    return xValue;
+  }
+
+  @Override
+  public String toString() {
+    return "x";
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Constant(1);
+  }
+}
diff --git a/src/main/java/viewer/FunctionList.java b/src/main/java/viewer/FunctionList.java
index 68d0c3485c957d0b831ccbe92e99897892706741..cca47099c5732f7d8039b10920408f698b73627a 100644
--- a/src/main/java/viewer/FunctionList.java
+++ b/src/main/java/viewer/FunctionList.java
@@ -1,6 +1,6 @@
 package viewer;
 
-import formula.Constant;
+import formula.*;
 import javafx.scene.chart.XYChart;
 
 import java.util.ArrayList;
@@ -19,8 +19,12 @@ class FunctionList {
     this.lowerBound = functionChart.getLowerBound();
     this.upperBound = functionChart.getUpperBound();
 
-    PlottableFunction function = new PlottableFunction(new Constant(1), "f");
-    addFunctionAndItsDerivative(function);
+    List<PlottableFunction> functions = List.of(new PlottableFunction(new Logarithm(new VariableX()),"f"),
+            new PlottableFunction(new Multiplication(new VariableX(), new Constant(3)), "g"),
+            new PlottableFunction(new Division(new Constant(1), new VariableX()), "h"),
+            new PlottableFunction(new Cosine(new Multiplication(new Constant(2), new VariableX())), "a"),
+            new PlottableFunction(new Exponential(new Multiplication(new Constant(2), new VariableX())), "a"));
+    addFunctionsAndTheirDerivative(functions);
   }
 
   void toggleFunction(PlottableFunction function) {
diff --git a/src/main/java/viewer/MainAppController.java b/src/main/java/viewer/MainAppController.java
index 329cd94050ed206717deeca17a3b11859e8559d1..fa240197e00ec9a2e97d1aa9f8052e886d1056c6 100644
--- a/src/main/java/viewer/MainAppController.java
+++ b/src/main/java/viewer/MainAppController.java
@@ -45,7 +45,6 @@ public class MainAppController implements Initializable {
     Button button = new Button(function.toString());
     addButton(button);
     button.setOnAction(event -> toggleFunction(function));
-    toggleFunction(function);
   }
 
   private void toggleFunction(PlottableFunction function){