diff --git a/src/main/java/shape/AbstractShape.java b/src/main/java/shape/AbstractShape.java
index 3de588645a103659916d26406f220443fdef1e37..4947ec004be002124b6dbc79286c1584483de6f2 100644
--- a/src/main/java/shape/AbstractShape.java
+++ b/src/main/java/shape/AbstractShape.java
@@ -5,23 +5,19 @@ import javafx.scene.canvas.GraphicsContext;
 
 import java.util.List;
 
-public class AbstractShape implements Shape {
+public abstract class AbstractShape implements Shape {
     private List<Point2D> points;
 
     public AbstractShape(List<Point2D> points) {
         this.points = points;
     }
-    public List<Point2D> addPoints(Point2D points){
-        this.points.add(points);
-        return this.points;
+    public void addPoints(Point2D... points){
+        for (Point2D point: points)
+            this.points.add(point);
     }
     @Override
     public int pointsCount() {
-        int count = 0;
-        for (Point2D point : points) {
-            count++;
-        }
-        return count;
+        return points.size();
     }
 
     @Override
@@ -31,8 +27,14 @@ public class AbstractShape implements Shape {
 
     @Override
     public void draw(GraphicsContext context) {
-        for (Point2D point : points) {
-
+        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();
         }
 
     }
diff --git a/src/main/java/shape/BorderDecorator.java b/src/main/java/shape/BorderDecorator.java
index 05a6d6440ec5be918e4955bb36c018857efad67d..ff3c0d35ee02299d5eb4543504f0e5cbb5e6855f 100644
--- a/src/main/java/shape/BorderDecorator.java
+++ b/src/main/java/shape/BorderDecorator.java
@@ -1,6 +1,8 @@
 package shape;
 
+import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
 
 public class BorderDecorator extends Decorator {
 
@@ -10,7 +12,12 @@ public class BorderDecorator extends Decorator {
         super(decoratedShape);
         this.radius = radius;
     }
-        protected void drawDecoration(GraphicsContext context) {
-
+    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);
+        }
     }
 }
diff --git a/src/main/java/shape/CenterDecorator.java b/src/main/java/shape/CenterDecorator.java
index 0eece70968d81a4ae94863f3c15330a41ffcdccd..eb792b5ce01167369176654f661017d5046ecbc0 100644
--- a/src/main/java/shape/CenterDecorator.java
+++ b/src/main/java/shape/CenterDecorator.java
@@ -1,6 +1,8 @@
 package shape;
 
+import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
 
 public class CenterDecorator extends Decorator{
     private double radius;
@@ -9,6 +11,17 @@ public class CenterDecorator extends Decorator{
         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();
+        }
+        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 2f085454682d579dca82a4717c155defb11974f7..69ee423b88f6b451de184081bc5b22169cffc625 100644
--- a/src/main/java/shape/Decorator.java
+++ b/src/main/java/shape/Decorator.java
@@ -15,12 +15,13 @@ public abstract class Decorator implements Shape {
 
     @Override
     public Point2D point(int index) {
-        return null;
+        return decoratedshape.point(index);
     }
 
     @Override
     public void draw(GraphicsContext context) {
-
+        decoratedshape.draw(context);
+        drawDecoration(context);
     }
     protected void drawDecoration(GraphicsContext context) {
 
diff --git a/src/main/java/shape/Polygon.java b/src/main/java/shape/Polygon.java
index d5501cb0ae57ea3163bba3ebfbecd7f0efe1ba03..a53b2f408ffb4b9452bd8f9ac5dfbb39c20e65e2 100644
--- a/src/main/java/shape/Polygon.java
+++ b/src/main/java/shape/Polygon.java
@@ -4,27 +4,32 @@ import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.paint.Color;
 
-public class Polygon implements Shape {
+import java.util.List;
+
+public class Polygon extends AbstractShape {
 
     private Color color;
 
     public Polygon(Color color, Point2D... points) {
+        super(List.of(points));
         this.color = color;
     }
 
     @Override
     public int pointsCount() {
-        return 0;
+        return super.pointsCount();
     }
 
     @Override
     public Point2D point(int index) {
-        return point(index);
+        return super.point(index);
     }
 
     @Override
     public void draw(GraphicsContext context) {
         context.setFill(color);
+        super.draw(context);
+        context.fill();
 
     }
 }
diff --git a/src/main/java/shape/Rectangle.java b/src/main/java/shape/Rectangle.java
index ff2fcc4834612c25b5911b202c1972fd3f8060c3..e0ee83f4a16e91780f1e755845fd19d6f9fffd3d 100644
--- a/src/main/java/shape/Rectangle.java
+++ b/src/main/java/shape/Rectangle.java
@@ -4,24 +4,30 @@ import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.paint.Color;
 
-public class Rectangle implements Shape{
+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())));
         this.color = color;
     }
 
     @Override
     public int pointsCount() {
-        return 2;
+        return super.pointsCount();
     }
 
     @Override
     public Point2D point(int index) {
-        return point(index);
+        return super.point(index);
     }
 
     @Override
     public void draw(GraphicsContext context) {
         context.setFill(color);
+        super.draw(context);
+        context.fill();
     }
 }
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)