diff --git a/src/main/java/shape/AbstractShape.java b/src/main/java/shape/AbstractShape.java
index 4947ec004be002124b6dbc79286c1584483de6f2..db97daddd5da35efae50a2178be048ab9c716e3f 100644
--- a/src/main/java/shape/AbstractShape.java
+++ b/src/main/java/shape/AbstractShape.java
@@ -3,17 +3,16 @@ package shape;
 import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 public abstract class AbstractShape implements Shape {
-    private List<Point2D> points;
 
-    public AbstractShape(List<Point2D> points) {
-        this.points = points;
-    }
+    protected List<Point2D> points = new ArrayList<>();
+
     public void addPoints(Point2D... points){
-        for (Point2D point: points)
-            this.points.add(point);
+        this.points.addAll(Arrays.asList(points));
     }
     @Override
     public int pointsCount() {
@@ -22,20 +21,13 @@ public abstract class AbstractShape implements Shape {
 
     @Override
     public Point2D point(int index) {
-        return index < points.size() ? points.get(index) : null;
+        if( index >= 0 && index < points.size()){
+            return points.get(index);
+        }else {
+            throw new IndexOutOfBoundsException("Index out of bounds");
+        }
     }
 
     @Override
-    public void draw(GraphicsContext context) {
-        if (pointsCount()>0){
-            context.beginPath();
-            context.moveTo(point(0).getX(), point(0).getY());
-            for (int i = 1; i<pointsCount(); i++){
-                context.lineTo(point(i).getX(),point(i).getY());
-            }
-            context.closePath();
-            context.stroke();
-        }
-
-    }
+    public abstract void draw(GraphicsContext context) ;
 }
diff --git a/src/main/java/shape/App.java b/src/main/java/shape/App.java
index 1a519e1401fe032f06aeee35967a27e48ca362fe..c9a1063c2d57595e858c74743e072a69ebb84e5b 100644
--- a/src/main/java/shape/App.java
+++ b/src/main/java/shape/App.java
@@ -21,12 +21,20 @@ public class App extends Application {
     @Override
     public void start(Stage primaryStage) {
         Group root = new Group();
-        Canvas canvas = new Canvas(130, 110);
+        Canvas canvas = new Canvas(300, 300);
         GraphicsContext graphicsContext = canvas.getGraphicsContext2D();
         ShapeContainer shapeContainer = new ShapeContainer();
-        graphicsContext.setFill(Color.AQUAMARINE);
-        graphicsContext.fillOval(10,10,10,10);
-        shapeContainer.addShape(new Rectangle(Color.BLUE,new Point2D(10,10), new Point2D(40,40)));
+
+        Shape rectangle = new Rectangle(Color.BLUE, new Point2D(50, 50), new Point2D(150, 100));
+        rectangle = new BorderDecorator(rectangle, 10);
+        rectangle = new CenterDecorator(rectangle, 5);
+        shapeContainer.addShape(rectangle);
+
+        Shape polygone = new Polygon(Color.YELLOW, new Point2D(210,100),new Point2D(250,100),new Point2D(150,160), new Point2D(90,100));
+        polygone = new BorderDecorator(polygone, 15);
+        polygone = new CenterDecorator(polygone, 5);
+        shapeContainer.addShape(polygone);
+
         shapeContainer.draw(graphicsContext);
         root.getChildren().add(canvas);
         primaryStage.setScene(new Scene(root));
diff --git a/src/main/java/shape/BorderDecorator.java b/src/main/java/shape/BorderDecorator.java
index ff3c0d35ee02299d5eb4543504f0e5cbb5e6855f..bb0865612f230286f105742efda3e9c2a4fe51b0 100644
--- a/src/main/java/shape/BorderDecorator.java
+++ b/src/main/java/shape/BorderDecorator.java
@@ -6,7 +6,7 @@ import javafx.scene.paint.Color;
 
 public class BorderDecorator extends Decorator {
 
-    private double radius;
+    private final double radius;
 
     public BorderDecorator(Shape decoratedShape ,double radius) {
         super(decoratedShape);
@@ -15,9 +15,16 @@ public class BorderDecorator extends Decorator {
     protected void drawDecoration(GraphicsContext context) {
         context.setStroke(Color.BLACK);
         context.setLineWidth(2);
-        for (int i=0; i<pointsCount(); i++){
-            Point2D point = point(i);
-            context.strokeOval(point.getX() - radius, point.getY()- radius,radius*2,radius*2);
+
+        if (decoratedshape.pointsCount() >= 2){
+            Point2D point0 = decoratedshape.point(0);
+            Point2D point1 = decoratedshape.point(1);
+
+            double x = Math.min(point0.getX(), point1.getX());
+            double y = Math.min(point0.getY(), point1.getY());
+            double width = Math.abs(point1.getX() - point0.getX());
+            double height = Math.abs(point1.getY() - point0.getY());
+            context.strokeRoundRect(x,y, width,height,radius, radius);
         }
     }
 }
diff --git a/src/main/java/shape/CenterDecorator.java b/src/main/java/shape/CenterDecorator.java
index eb792b5ce01167369176654f661017d5046ecbc0..8a7c68a07a6b52549afdd6e8ba75520136c3c5d6 100644
--- a/src/main/java/shape/CenterDecorator.java
+++ b/src/main/java/shape/CenterDecorator.java
@@ -5,23 +5,22 @@ import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.paint.Color;
 
 public class CenterDecorator extends Decorator{
-    private double radius;
+    private final double radius;
     public CenterDecorator(Shape decoratedShape, double radius) {
         super(decoratedShape);
         this.radius = radius;
     }
         protected void drawDecoration(GraphicsContext context) {
-        double centerX = 0;
-        double centerY = 0;
-        for (int i =0; i<pointsCount(); i++){
-            Point2D point = point(i);
-            centerX += point.getX();
-            centerY += point.getY();
+
+        if (decoratedshape.pointsCount() >= 2) {
+            Point2D point0 = decoratedshape.point(0);
+            Point2D point1 = decoratedshape.point(1);
+
+            double centerX = point0.getX() + point1.getX() / 2;
+            double centerY = point0.getY() + point1.getY() / 2;
+
+            context.setFill(Color.RED);
+            context.strokeOval(centerX - radius, centerY - radius, radius * 2, radius * 2);
         }
-        centerX /= pointsCount();
-        centerY /= pointsCount();
-        context.setStroke(Color.RED);
-        context.setLineWidth(2);
-        context.strokeOval(centerX-radius, centerY-radius, radius*2,radius*2);
     }
 }
diff --git a/src/main/java/shape/Decorator.java b/src/main/java/shape/Decorator.java
index 69ee423b88f6b451de184081bc5b22169cffc625..08bed2e38c7ac74ec230676535c0101f24189c61 100644
--- a/src/main/java/shape/Decorator.java
+++ b/src/main/java/shape/Decorator.java
@@ -4,7 +4,7 @@ import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
 
 public abstract class Decorator implements Shape {
-    protected Shape decoratedshape;
+    protected final Shape decoratedshape;
     public Decorator(Shape decoratedShape) {
         this.decoratedshape = decoratedShape;
     }
@@ -23,7 +23,5 @@ public abstract class Decorator implements Shape {
         decoratedshape.draw(context);
         drawDecoration(context);
     }
-    protected void drawDecoration(GraphicsContext context) {
-
-    }
+    protected abstract void drawDecoration(GraphicsContext context) ;
 }
diff --git a/src/main/java/shape/Polygon.java b/src/main/java/shape/Polygon.java
index a53b2f408ffb4b9452bd8f9ac5dfbb39c20e65e2..7f417cc2f3e649f485a87fba3246896ac41fbe94 100644
--- a/src/main/java/shape/Polygon.java
+++ b/src/main/java/shape/Polygon.java
@@ -8,28 +8,24 @@ import java.util.List;
 
 public class Polygon extends AbstractShape {
 
-    private Color color;
+    private final Color color;
 
     public Polygon(Color color, Point2D... points) {
-        super(List.of(points));
         this.color = color;
+        addPoints(points);
     }
 
-    @Override
-    public int pointsCount() {
-        return super.pointsCount();
-    }
-
-    @Override
-    public Point2D point(int index) {
-        return super.point(index);
-    }
 
     @Override
     public void draw(GraphicsContext context) {
-        context.setFill(color);
-        super.draw(context);
-        context.fill();
+        context.setStroke(color);
+        context.beginPath();
+        context.moveTo(points.get(0).getX(), points.get(0).getY());
+        for (int i = 1; i < pointsCount() ; i++) {
+            context.lineTo(points.get(i).getX(), points.get(i).getY());
+        }
+        context.closePath();
+        context.stroke();
 
     }
 }
diff --git a/src/main/java/shape/Rectangle.java b/src/main/java/shape/Rectangle.java
index e0ee83f4a16e91780f1e755845fd19d6f9fffd3d..c3b272453e674541b0b6aef50587825fe915dab3 100644
--- a/src/main/java/shape/Rectangle.java
+++ b/src/main/java/shape/Rectangle.java
@@ -7,27 +7,25 @@ import javafx.scene.paint.Color;
 import java.util.List;
 
 public class Rectangle extends AbstractShape{
-    private Color color;
-    Rectangle(Color color, Point2D point0, Point2D point1){
-        super(List.of(point0, new Point2D(point1.getX(),point0.getY()),
-                point1,new Point2D(point0.getX(),point1.getY())));
+    private final Color color;
+
+    public Rectangle(Color color, Point2D point0, Point2D point1){
         this.color = color;
+        addPoints(point0, point1);
     }
 
     @Override
-    public int pointsCount() {
-        return super.pointsCount();
-    }
+    public void draw(GraphicsContext context) {
+        context.setStroke(color);
 
-    @Override
-    public Point2D point(int index) {
-        return super.point(index);
-    }
+        Point2D point0 = points.get(0);
+        Point2D point1 = points.get(1);
 
-    @Override
-    public void draw(GraphicsContext context) {
-        context.setFill(color);
-        super.draw(context);
-        context.fill();
+        double x = Math.min(point0.getX(), point1.getX());
+        double y = Math.min(point0.getY(), point1.getY());
+        double width = Math.abs(point1.getX() - point0.getX());
+        double height = Math.abs(point1.getY() - point0.getY());
+
+        context.strokeRect(x,y,width,height);
     }
 }