diff --git a/.idea/misc.xml b/.idea/misc.xml
index 480dc8a7b94017006a3c6b6c36395e0fff6eaa41..5d9825616f6a0738b6c655b9418a4d1d99c32d55 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -4,7 +4,7 @@
   <component name="FrameworkDetectionExcludesConfiguration">
     <file type="web" url="file://$PROJECT_DIR$" />
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="11" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/out" />
   </component>
 </project>
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 20534b2a198109bf2e4f0efc3434f50b39d21bc8..2b3d703fd63a5bd31593d888cde38d3297f8f099 100644
--- a/build.gradle
+++ b/build.gradle
@@ -16,6 +16,7 @@ repositories {
     mavenCentral()
 }
 dependencies {
+    implementation 'org.junit.jupiter:junit-jupiter:5.8.1'
     testImplementation group: 'junit', name: 'junit', version: '4.12'
     testImplementation 'org.hamcrest:hamcrest-library:1.3'
 }
diff --git a/src/main/java/shape/AbstractShape.java b/src/main/java/shape/AbstractShape.java
index 18e40103d9edef9220290bbf1b60c6aa230942b3..287711493aaf7508800dbf0ac3aadf49107e6d44 100644
--- a/src/main/java/shape/AbstractShape.java
+++ b/src/main/java/shape/AbstractShape.java
@@ -1,6 +1,28 @@
 package shape;
 
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+
+import java.util.ArrayList;
+import java.util.List;
+
 abstract public class AbstractShape implements Shape {
 
+    private List<Point2D> points = new ArrayList<>();
+
+    public void addPoints(List<Point2D> lpoints){
+        for (Point2D point : lpoints) {
+            points.add(point);
+        }
+    }
+    public int pointsCount() {
+        return points.size();
+    }
+
+    public Point2D point(int index) {
+        return points.get(index);
+    }
+
+    public abstract void draw(GraphicsContext graphicsContext);
 
 }
diff --git a/src/main/java/shape/App.java b/src/main/java/shape/App.java
index 1a519e1401fe032f06aeee35967a27e48ca362fe..c1016a9f8b3211b847624fa9d400ad8151d9e03a 100644
--- a/src/main/java/shape/App.java
+++ b/src/main/java/shape/App.java
@@ -1,6 +1,7 @@
 package shape;
 
 import javafx.application.Application;
+import javafx.beans.binding.BooleanExpression;
 import javafx.geometry.Point2D;
 import javafx.scene.Group;
 import javafx.scene.Scene;
@@ -26,6 +27,8 @@ public class App extends Application {
         ShapeContainer shapeContainer = new ShapeContainer();
         graphicsContext.setFill(Color.AQUAMARINE);
         graphicsContext.fillOval(10,10,10,10);
+        Rectangle rect  = new Rectangle(Color.BLUE,new Point2D(10,10), new Point2D(40,40));
+        System.out.println(rect.pointsCount());
         shapeContainer.addShape(new Rectangle(Color.BLUE,new Point2D(10,10), new Point2D(40,40)));
         shapeContainer.draw(graphicsContext);
         root.getChildren().add(canvas);
diff --git a/src/main/java/shape/BorderDecorator.java b/src/main/java/shape/BorderDecorator.java
new file mode 100644
index 0000000000000000000000000000000000000000..a66dfe61b96bc7c8d834a7eb84c971e09fe77767
--- /dev/null
+++ b/src/main/java/shape/BorderDecorator.java
@@ -0,0 +1,22 @@
+package shape;
+
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+public class BorderDecorator extends Decorator {
+
+    private double radius;
+
+    BorderDecorator(Shape decoratedShape, double radius){
+        super(decoratedShape);
+        this.radius = radius;
+    }
+
+    @Override
+    void drawDecoration(GraphicsContext graphicsContext) {
+        graphicsContext.setFill(Color.BLUE);
+        for(int i = 0; i< decoratedShape.pointsCount(); i++){
+            graphicsContext.fillOval(decoratedShape.point(i).getX(),decoratedShape.point(i).getY(),5,5);
+        }
+    }
+}
diff --git a/src/main/java/shape/CenterDecorator.java b/src/main/java/shape/CenterDecorator.java
new file mode 100644
index 0000000000000000000000000000000000000000..a57b9a0bb15d4ed1db56f76b452f672877ade489
--- /dev/null
+++ b/src/main/java/shape/CenterDecorator.java
@@ -0,0 +1,18 @@
+package shape;
+
+import javafx.scene.canvas.GraphicsContext;
+
+public class CenterDecorator extends Decorator{
+
+    private double radius;
+
+    CenterDecorator(Shape decoratedShape, double radius){
+        super(decoratedShape);
+        this.radius = radius;
+    }
+
+    @Override
+    void drawDecoration(GraphicsContext graphicsContext) {
+
+    }
+}
diff --git a/src/main/java/shape/Circle.java b/src/main/java/shape/Circle.java
deleted file mode 100644
index 81d9175dc3977c5c95dec3693569c12ad12d8315..0000000000000000000000000000000000000000
--- a/src/main/java/shape/Circle.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package shape;
-
-import javafx.geometry.Point2D;
-import javafx.scene.canvas.GraphicsContext;
-
-public class Circle implements Shape {
-
-    public Circle(double x, double y, double sqrt) {
-    }
-
-    @Override
-    public int pointsCount() {
-        return 0;
-    }
-
-    @Override
-    public Point2D point(int index) {
-        return null;
-    }
-
-    @Override
-    public void draw(GraphicsContext context) {
-
-    }
-}
diff --git a/src/main/java/shape/Decorator.java b/src/main/java/shape/Decorator.java
index d08a3c3fd08a281ccb7b3d0404d3e2b071a762c7..43032b0763febf5b843aed2fbf6e4a18d8ac4860 100644
--- a/src/main/java/shape/Decorator.java
+++ b/src/main/java/shape/Decorator.java
@@ -4,9 +4,11 @@ import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
 
 abstract public class Decorator implements Shape{
-    private Shape decoratedShape;
-
+    protected Shape decoratedShape;
 
+    Decorator(Shape decoratedShape){
+        this.decoratedShape = decoratedShape;
+    }
     public int pointsCount() {
         return decoratedShape.pointsCount();
     }
@@ -15,7 +17,6 @@ abstract public class Decorator implements Shape{
         return decoratedShape.point(index);
     }
 
-    @Override
     public void draw(GraphicsContext context) {
         decoratedShape.draw(context);
     }
diff --git a/src/main/java/shape/Polygon.java b/src/main/java/shape/Polygon.java
new file mode 100644
index 0000000000000000000000000000000000000000..f568e6c715cb9ca4ddf0bc3b8410ba5919f78d24
--- /dev/null
+++ b/src/main/java/shape/Polygon.java
@@ -0,0 +1,28 @@
+package shape;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+import java.util.List;
+
+public class Polygon extends AbstractShape{
+
+    Color color;
+    Polygon(Color color, List<Point2D> points){
+        this.color = color;
+        addPoints(points);
+    }
+
+    @Override
+    public void draw(GraphicsContext context) {
+        context.setFill(color);
+        double[] xPoints = new double[pointsCount()];
+        double[] yPoints = new double[pointsCount()];
+        for (int i = 0; i < pointsCount(); i++){
+            xPoints[i] = point(i).getX();
+            yPoints[i] = point(i).getY();
+        }
+        context.fillPolygon(xPoints, yPoints, pointsCount());
+    }
+}
diff --git a/src/main/java/shape/Rectangle.java b/src/main/java/shape/Rectangle.java
index 5894c35d444559a59b5c042c47dc012cc56df6ec..232057e0166eb34d3c4d82dae52fd25d3315c93b 100644
--- a/src/main/java/shape/Rectangle.java
+++ b/src/main/java/shape/Rectangle.java
@@ -4,24 +4,22 @@ import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.paint.Color;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class Rectangle extends AbstractShape{
     Color color;
     Rectangle(Color color, Point2D point0, Point2D point1){
         this.color = color;
-    }
-
-    @Override
-    public int pointsCount() {
-        return 0;
-    }
-
-    @Override
-    public Point2D point(int index) {
-        return null;
+        List<Point2D> points = new ArrayList<>();
+        points.add(point0);
+        points.add(point1);
+        addPoints(points);
     }
 
     @Override
     public void draw(GraphicsContext context) {
-
+        context.setFill(color);
+        context.fillRect(point(0).getX(), point(0).getY(), point(1).getX() - point(0).getX(), point(1).getY() - point(0).getY());
     }
 }
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;