diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q3/ConnectableProperty.java b/src/main/java/fr/univlille/iut/r304/tp3/q3/ConnectableProperty.java
index ce7269d5ecfe5adf17694c31683a359b9322d7ca..e782319add7b10735ac7cd01c999f84345b9f5ed 100644
--- a/src/main/java/fr/univlille/iut/r304/tp3/q3/ConnectableProperty.java
+++ b/src/main/java/fr/univlille/iut/r304/tp3/q3/ConnectableProperty.java
@@ -1,14 +1,38 @@
 package fr.univlille.iut.r304.tp3.q3;
 
-public class ConnectableProperty extends ObservableProperty {
+import fr.univlille.iut.r304.tp3.q1.Observable;
+import fr.univlille.iut.r304.tp3.q1.Observer;
 
+public class ConnectableProperty extends ObservableProperty implements Observer{
 	public void connectTo(ConnectableProperty other) {
+		other.attach(this);
+		other.notifyObservers(other.getValue());
 	}
 
 	public void biconnectTo(ConnectableProperty other) {
+		other.attach(this);
+		this.attach(other);
+		if (!changing){
+			changing=true;
+			other.notifyObservers(other.getValue());
+			this.notifyObservers(this.getValue());
+		}
+		changing=false;
 	}
 
 	public void unconnectFrom(ConnectableProperty other) {
+		other.detach(this);
 	}
 
+	@Override
+	public void update(Observable subj) {
+	}
+
+	@Override
+	public void update(Observable subj, Object data) {
+		if (!data.equals(getValue())){
+			setValue(data);
+		}
+
+	}
 }
diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q3/ObservableProperty.java b/src/main/java/fr/univlille/iut/r304/tp3/q3/ObservableProperty.java
index b126380c2db52424f68500f08c07cadb10af73c0..07fa58619614d7058d812369edcbc73ffa8ec6c2 100644
--- a/src/main/java/fr/univlille/iut/r304/tp3/q3/ObservableProperty.java
+++ b/src/main/java/fr/univlille/iut/r304/tp3/q3/ObservableProperty.java
@@ -1,24 +1,23 @@
 package fr.univlille.iut.r304.tp3.q3;
 
+import fr.univlille.iut.r304.tp3.q1.Observable;
 import fr.univlille.iut.r304.tp3.q1.Observer;
 
-public class ObservableProperty {
+public class ObservableProperty extends Observable  {
+	protected Object value=0;
+	protected boolean changing=false;
 
 	public void setValue(Object i) {
+		if(!changing){
+			changing=true;
+			this.value= i;
+			this.notifyObservers(i);
+		}
+		changing=false;
 	}
 
 	public Object getValue() {
-		return null;
-	}
-
-	public void attach(Observer observer) {
-		// methode cree pour que les tests compilent sans erreurs
-		// n'est pas censée rester une fois que vous avez fini Q2.1
-	}
-
-	public void detach(Observer observer) {
-		// methode cree pour que les tests compilent sans erreur
-		// n'est pas censée rester une fois que vous avez fini Q2.1
+		return value;
 	}
 
 }
diff --git a/src/main/java/fr/univlille/iut/r304/tp3/q4/Devise.java b/src/main/java/fr/univlille/iut/r304/tp3/q4/Devise.java
new file mode 100644
index 0000000000000000000000000000000000000000..a8e74bad2c18469a92e9085a1ef7d705b8483f86
--- /dev/null
+++ b/src/main/java/fr/univlille/iut/r304/tp3/q4/Devise.java
@@ -0,0 +1,46 @@
+package fr.univlille.iut.r304.tp3.q4;
+
+import fr.univlille.iut.r304.tp3.q1.Observable;
+import fr.univlille.iut.r304.tp3.q2.Objectif;
+import fr.univlille.iut.r304.tp3.q2.Texte;
+import fr.univlille.iut.r304.tp3.q3.ConnectableProperty;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+public class Devise extends ConnectableProperty {
+
+    private double valeur=0.0;
+    @Override
+    public void update(Observable subj, Object data) {
+        double taux=1.12;
+        if (!data.equals(getValue())){
+            setValue((double)data*taux);
+        }
+
+    }
+    public double getValeur() {
+        return valeur;
+    }
+
+    public void setValeur(double valeur) {
+        this.valeur = valeur;
+    }
+
+
+    public static void main(String[] args){
+        Devise euro=new Devise();
+        Devise dollar=new Devise();
+        dollar.biconnectTo(euro);
+
+        dollar.setValue(8.0);
+        System.out.println(euro.getValue()+" €");
+        System.out.println(dollar.getValue()+" $");
+
+        dollar.setValue(11.0);
+        System.out.println(euro.getValue()+" €");
+        System.out.println(dollar.getValue()+ " $");
+    }
+
+
+}