diff --git a/src/main/java/serializer/DrawerWithSave.java b/src/main/java/serializer/DrawerWithSave.java
index 2852edf47f756a132226ce5463599bdf1b95601c..e3b746fd415672722e43a9b679e9588d9e837fd8 100644
--- a/src/main/java/serializer/DrawerWithSave.java
+++ b/src/main/java/serializer/DrawerWithSave.java
@@ -1,14 +1,10 @@
 package serializer;
 
-import javafx.scene.canvas.Canvas;
 import javafx.scene.control.Alert;
 import javafx.stage.FileChooser;
-import shape.Shape;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.List;
-import java.util.stream.Collectors;
 
 
 public class DrawerWithSave extends state.Drawer {
diff --git a/src/main/java/serializer/ShapeReader.java b/src/main/java/serializer/ShapeReader.java
index 4905948e502223776ff4e2f8367b633669915e01..54540cca74b29246f5f44d2344925d4792a3e4a0 100644
--- a/src/main/java/serializer/ShapeReader.java
+++ b/src/main/java/serializer/ShapeReader.java
@@ -7,7 +7,6 @@ import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.util.List;
-import java.util.stream.Collector;
 
 public class ShapeReader {
     public static List<Shape> read(File file) throws IOException {
diff --git a/src/main/java/shape/AbstractShape.java b/src/main/java/shape/AbstractShape.java
new file mode 100644
index 0000000000000000000000000000000000000000..db97daddd5da35efae50a2178be048ab9c716e3f
--- /dev/null
+++ b/src/main/java/shape/AbstractShape.java
@@ -0,0 +1,33 @@
+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 {
+
+    protected List<Point2D> points = new ArrayList<>();
+
+    public void addPoints(Point2D... points){
+        this.points.addAll(Arrays.asList(points));
+    }
+    @Override
+    public int pointsCount() {
+        return points.size();
+    }
+
+    @Override
+    public Point2D point(int index) {
+        if( index >= 0 && index < points.size()){
+            return points.get(index);
+        }else {
+            throw new IndexOutOfBoundsException("Index out of bounds");
+        }
+    }
+
+    @Override
+    public abstract void draw(GraphicsContext context) ;
+}
diff --git a/src/main/java/shape/App.java b/src/main/java/shape/App.java
index 1a519e1401fe032f06aeee35967a27e48ca362fe..0ba88a56c91b19fc643b0488c92db27a9362a639 100644
--- a/src/main/java/shape/App.java
+++ b/src/main/java/shape/App.java
@@ -7,7 +7,6 @@ import javafx.scene.Scene;
 import javafx.scene.canvas.Canvas;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.paint.Color;
-import javafx.scene.paint.Paint;
 import javafx.stage.Stage;
 
 
@@ -21,12 +20,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
new file mode 100644
index 0000000000000000000000000000000000000000..bb0865612f230286f105742efda3e9c2a4fe51b0
--- /dev/null
+++ b/src/main/java/shape/BorderDecorator.java
@@ -0,0 +1,30 @@
+package shape;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+public class BorderDecorator extends Decorator {
+
+    private final double radius;
+
+    public BorderDecorator(Shape decoratedShape ,double radius) {
+        super(decoratedShape);
+        this.radius = radius;
+    }
+    protected void drawDecoration(GraphicsContext context) {
+        context.setStroke(Color.BLACK);
+        context.setLineWidth(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
new file mode 100644
index 0000000000000000000000000000000000000000..8a7c68a07a6b52549afdd6e8ba75520136c3c5d6
--- /dev/null
+++ b/src/main/java/shape/CenterDecorator.java
@@ -0,0 +1,26 @@
+package shape;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+public class CenterDecorator extends Decorator{
+    private final double radius;
+    public CenterDecorator(Shape decoratedShape, double radius) {
+        super(decoratedShape);
+        this.radius = radius;
+    }
+        protected void drawDecoration(GraphicsContext context) {
+
+        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);
+        }
+    }
+}
diff --git a/src/main/java/shape/Decorator.java b/src/main/java/shape/Decorator.java
new file mode 100644
index 0000000000000000000000000000000000000000..08bed2e38c7ac74ec230676535c0101f24189c61
--- /dev/null
+++ b/src/main/java/shape/Decorator.java
@@ -0,0 +1,27 @@
+package shape;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+
+public abstract class Decorator implements Shape {
+    protected final Shape decoratedshape;
+    public Decorator(Shape decoratedShape) {
+        this.decoratedshape = decoratedShape;
+    }
+    @Override
+    public int pointsCount() {
+        return decoratedshape.pointsCount();
+    }
+
+    @Override
+    public Point2D point(int index) {
+        return decoratedshape.point(index);
+    }
+
+    @Override
+    public void draw(GraphicsContext context) {
+        decoratedshape.draw(context);
+        drawDecoration(context);
+    }
+    protected abstract void drawDecoration(GraphicsContext context) ;
+}
diff --git a/src/main/java/shape/Polygon.java b/src/main/java/shape/Polygon.java
new file mode 100644
index 0000000000000000000000000000000000000000..9140320794131795fca7aed9cfd9cf713c133f65
--- /dev/null
+++ b/src/main/java/shape/Polygon.java
@@ -0,0 +1,29 @@
+package shape;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+public class Polygon extends AbstractShape {
+
+    private final Color color;
+
+    public Polygon(Color color, Point2D... points) {
+        this.color = color;
+        addPoints(points);
+    }
+
+
+    @Override
+    public void draw(GraphicsContext context) {
+        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 b0e90627b6345f22ac31ab8bf5fb40f81e4d4f66..efb2f0a8c1921129416949b2c95e29f6d50ab0b3 100644
--- a/src/main/java/shape/Rectangle.java
+++ b/src/main/java/shape/Rectangle.java
@@ -4,24 +4,26 @@ import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.paint.Color;
 
-public class Rectangle implements Shape{
-    Color color;
-    Rectangle(Color color, Point2D point0, Point2D point1){
+public class Rectangle extends AbstractShape{
+    private final Color color;
+
+    public Rectangle(Color color, Point2D point0, Point2D point1){
         this.color = color;
+        addPoints(point0, point1);
     }
 
     @Override
-    public int pointsCount() {
-        return 0;
-    }
+    public void draw(GraphicsContext context) {
+        context.setStroke(color);
 
-    @Override
-    public Point2D point(int index) {
-        return null;
-    }
+        Point2D point0 = points.get(0);
+        Point2D point1 = points.get(1);
 
-    @Override
-    public void draw(GraphicsContext context) {
+        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);
     }
 }
diff --git a/src/main/java/shape/ShapeContainer.java b/src/main/java/shape/ShapeContainer.java
index 91c7d2977ecd7352ceb7ffbe45f9c541bfd8d45f..aae70ed5e542047b60b0f7147f021811017bdbc7 100644
--- a/src/main/java/shape/ShapeContainer.java
+++ b/src/main/java/shape/ShapeContainer.java
@@ -9,7 +9,9 @@ public class ShapeContainer{
 
     private List<Shape> shapes = new ArrayList<>();
 
-    public void addShape(Shape shape){}
+    public void addShape(Shape shape){
+        shapes.add(shape);
+    }
 
     public void  draw(GraphicsContext context){
         for(Shape shape : shapes)
diff --git a/src/main/java/state/Drawer.java b/src/main/java/state/Drawer.java
index 67b9e1c37ec55c09b9965103ca38cab002b1d815..c6e5f278d50e2910a22e24478b246c9a9679dc87 100644
--- a/src/main/java/state/Drawer.java
+++ b/src/main/java/state/Drawer.java
@@ -1,7 +1,6 @@
 package state;
 
 import javafx.scene.canvas.Canvas;
-import shape.Circle;
 import shape.Shape;
 
 import java.util.ArrayList;