diff --git a/src/main/java/shape/Circle.java b/src/main/java/shape/Circle.java
index 3c2060c6ea9a1adacfe65aa378facbe9844d6295..33184a54dec71f1778d69933ba5942e5d5be1ad0 100644
--- a/src/main/java/shape/Circle.java
+++ b/src/main/java/shape/Circle.java
@@ -22,7 +22,7 @@ public class Circle implements Shape {
         graphicsContext.setStroke(Color.BLACK);
         graphicsContext.setLineWidth(2);
         if (isFinished) {
-            graphicsContext.setFill(Color.GREEN);
+            graphicsContext.setFill(Color.GREEN.deriveColor(0,1,1,0.5));
             graphicsContext.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
         }
         graphicsContext.strokeOval(x - radius, y - radius, 2 * radius, 2 * radius);
@@ -70,4 +70,10 @@ public class Circle implements Shape {
         return y;
     }
 
+    public void setDimensions(double x, double y, double width, double height){
+        this.x = x;
+        this.y = y;
+        this.radius = width/2;
+    }
+
 }
diff --git a/src/main/java/shape/Rectangle.java b/src/main/java/shape/Rectangle.java
index b57f9dfdc85e91bbdc2e82f97d8570b17ad70507..97ac3810301cdc5efcd0a5fe20bccbaa0a663bed 100644
--- a/src/main/java/shape/Rectangle.java
+++ b/src/main/java/shape/Rectangle.java
@@ -23,7 +23,7 @@ public class Rectangle implements Shape{
         graphicsContext.setStroke(Color.BLACK);
         graphicsContext.setLineWidth(2);
         if(isFinished){
-            graphicsContext.setFill(Color.RED);
+            graphicsContext.setFill(Color.RED.deriveColor(0,1,1,0.5));
             graphicsContext.fillRect(x, y, width, height);
         }
         graphicsContext.strokeRect(x, y, width, height);
@@ -68,4 +68,21 @@ public class Rectangle implements Shape{
     public void setFillColor(Color fillColor) {
         this.fillColor = fillColor;
     }
+
+    public double getX() {
+        return x;
+    }
+
+    public double getY() {
+        return y;
+    }
+
+    public void setDimensions(double x, double y, double width, double height) {
+        this.x = x;
+        this.y = y;
+        this.width = Math.abs(width);
+        this.height = Math.abs(height);
+        if(width < 0 ){ this.x += width;}
+        if(height < 0){ this.y += height;}
+    }
 }
diff --git a/src/main/java/state/Drawer.java b/src/main/java/state/Drawer.java
index c6e5f278d50e2910a22e24478b246c9a9679dc87..5e2b152cc57104be0c95ac1cbcada797d50fb01a 100644
--- a/src/main/java/state/Drawer.java
+++ b/src/main/java/state/Drawer.java
@@ -18,10 +18,22 @@ public class Drawer extends Canvas {
         setOnMouseReleased(event->context.mouseReleased(event));
         setOnMouseMoved(event->context.mouseMoved(event));
         setOnMouseDragged(event->context.mouseMoved(event));
-        //setOnKeyPressed(event -> context.keyPressed(event));
+        setOnKeyPressed(event -> context.keyPressed(event));
     }
 
     public void repaint(){
         this.getGraphicsContext2D().clearRect(0,0,this.getWidth(),this.getHeight());
+        for(Shape shape : shapes){
+            shape.paint(this.getGraphicsContext2D());
+        }
+    }
+    public void addShape(Shape shape){
+        shapes.add(shape);
+    }
+    public Shape shapeContains(double x, double y){
+        for(Shape shape : shapes){
+            if(shape.contains(x,y))  return shape;
+        }
+        return null;
     }
 }
diff --git a/src/main/java/state/DrawerContext.java b/src/main/java/state/DrawerContext.java
index f82de3953ba8ae28f267393fdcb01fd7dcd3b6c2..8a36641d31ddd658a89f3267a4817600976d7726 100644
--- a/src/main/java/state/DrawerContext.java
+++ b/src/main/java/state/DrawerContext.java
@@ -1,6 +1,7 @@
 package state;
 
 
+import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.input.KeyEvent;
 import javafx.scene.input.MouseEvent;
 
@@ -11,6 +12,10 @@ public class DrawerContext {
 
     public DrawerContext(Drawer drawer) {
         this.drawer = drawer;
+        this.currentState = new NullDrawerState();
+    }
+    public void paint(GraphicsContext graphicsContext) {
+        drawer.repaint();
     }
 
     void mousePressed(MouseEvent event){
@@ -22,12 +27,34 @@ public class DrawerContext {
         currentState.mouseReleased(this,event.getX(),event.getY());
     }
 
-    void mouseMoved(MouseEvent event){}
+    void mouseMoved(MouseEvent event){
+        currentState.mouseMoved(this,event.getX(),event.getY());
+    }
 
     public void keyPressed(KeyEvent event) {
         switch (event.getText()) {
             case "c":
-                currentState = new StateCircle0();
+                setState(new StateCircle0());
+                break;
+            case "r":
+                setState(new StateRectangle0());
+                break;
+            case "m":
+                setState(new StateMoveShape());
+                break;
+            default:
+                setState(new NullDrawerState());
         }
     }
+    public Drawer drawer(){
+        return drawer;
+    }
+
+    public Drawer getDrawer() {
+        return drawer;
+    }
+
+    public void setState(DrawerState state) {
+        this.currentState = state;
+    }
 }
diff --git a/src/main/java/state/DrawerState.java b/src/main/java/state/DrawerState.java
index 680324c78948ecab7c870f28f0901f15bf4d8045..ce79e22f3a4daf90821caeda7f12648f91e7aac0 100644
--- a/src/main/java/state/DrawerState.java
+++ b/src/main/java/state/DrawerState.java
@@ -3,4 +3,6 @@ package state;
 public interface DrawerState {
     void mousePressed(DrawerContext context, double x, double y);
     void mouseReleased(DrawerContext context, double x, double y);
+    void mouseMoved(DrawerContext context, double x, double y);
+    public void paint(DrawerContext context);
 }
diff --git a/src/main/java/state/NullDrawerState.java b/src/main/java/state/NullDrawerState.java
new file mode 100644
index 0000000000000000000000000000000000000000..11f4543d8155ce123082603b53446066cb324a15
--- /dev/null
+++ b/src/main/java/state/NullDrawerState.java
@@ -0,0 +1,17 @@
+package state;
+
+public class NullDrawerState implements DrawerState {
+    @Override
+    public void mousePressed(DrawerContext context, double x, double y) {}
+
+    @Override
+    public void mouseReleased(DrawerContext context, double x, double y) {}
+
+    @Override
+    public void mouseMoved(DrawerContext context, double x, double y) {}
+
+    @Override
+    public void paint(DrawerContext context) {
+
+    }
+}
diff --git a/src/main/java/state/Shapes.java b/src/main/java/state/Shapes.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e49a93065b5d6e99bfb738deb9b6ce1bcfd8c27
--- /dev/null
+++ b/src/main/java/state/Shapes.java
@@ -0,0 +1,6 @@
+package state;
+
+public enum Shapes {
+    RECTANGLE,
+    CIRCLE,
+}
diff --git a/src/main/java/state/StateCircle0.java b/src/main/java/state/StateCircle0.java
index 073c48176cc7b838435f9dd78295558b55eada72..c3608dee13e3c1c92b4e843387a29c40081b3ba4 100644
--- a/src/main/java/state/StateCircle0.java
+++ b/src/main/java/state/StateCircle0.java
@@ -10,4 +10,14 @@ public class StateCircle0 implements DrawerState {
     public void mouseReleased(DrawerContext context, double x, double y) {
 
     }
+
+    @Override
+    public void mouseMoved(DrawerContext context, double x, double y) {
+
+    }
+
+    @Override
+    public void paint(DrawerContext context) {
+
+    }
 }
diff --git a/src/main/java/state/StateCircle1.java b/src/main/java/state/StateCircle1.java
new file mode 100644
index 0000000000000000000000000000000000000000..c8d87e652896ed37701c0669fc1a5fb353c13e7b
--- /dev/null
+++ b/src/main/java/state/StateCircle1.java
@@ -0,0 +1,32 @@
+package state;
+
+import shape.Circle;
+
+public class StateCircle1 implements DrawerState{
+    private Circle circle;
+
+    public StateCircle1(Circle circle) {
+        this.circle = circle;
+    }
+    @Override
+    public void mousePressed(DrawerContext context, double x, double y) {}
+
+    @Override
+    public void mouseReleased(DrawerContext context, double x, double y) {
+        circle.setFinished(true);
+        context.paint(context.getDrawer().getGraphicsContext2D());
+        context.setState(new StateCircle0());
+    }
+
+    @Override
+    public void mouseMoved(DrawerContext context, double x, double y) {
+        double radius = Math.sqrt(Math.pow(x - circle.getX(), 2) + Math.pow(y - circle.getY(), 2));
+        circle.setDimensions(circle.getX(), circle.getY(), radius*2, radius*2);
+        context.paint(context.getDrawer().getGraphicsContext2D());
+    }
+
+    @Override
+    public void paint(DrawerContext context) {
+
+    }
+}
diff --git a/src/main/java/state/StateMoveShape.java b/src/main/java/state/StateMoveShape.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6e827553c6b9823be25970186599ae5652226d4
--- /dev/null
+++ b/src/main/java/state/StateMoveShape.java
@@ -0,0 +1,40 @@
+package state;
+
+import shape.Shape;
+
+public class StateMoveShape implements DrawerState{
+    private Shape selectedShape;
+    private double previousX, previousY;
+
+    @Override
+    public void mousePressed(DrawerContext context, double x, double y) {
+        selectedShape = context.getDrawer().shapeContains(x,y);
+        if(selectedShape != null) {
+            previousX = x;
+            previousY = y;
+        }
+
+    }
+
+    @Override
+    public void mouseReleased(DrawerContext context, double x, double y) {
+        if(selectedShape != null) {
+            double deltaX = x - previousX;
+            double deltaY = y - previousY;
+            selectedShape.translate(deltaX, deltaY);
+            previousX = x;
+            previousY = y;
+            context.getDrawer().repaint();
+        }
+    }
+
+    @Override
+    public void mouseMoved(DrawerContext context, double x, double y) {
+        selectedShape = null;
+    }
+
+    @Override
+    public void paint(DrawerContext context) {
+
+    }
+}
diff --git a/src/main/java/state/StateRectangle0.java b/src/main/java/state/StateRectangle0.java
new file mode 100644
index 0000000000000000000000000000000000000000..d311145c2845e3397fb60688d9d4156a59350b1c
--- /dev/null
+++ b/src/main/java/state/StateRectangle0.java
@@ -0,0 +1,30 @@
+package state;
+
+import shape.Rectangle;
+
+public class StateRectangle0 implements DrawerState{
+    public StateRectangle0() { }
+
+    @Override
+    public void mousePressed(DrawerContext context, double x, double y) {
+        Rectangle rectangle = new Rectangle(x, y,0,0);
+        rectangle.setFinished(false);
+        context.getDrawer().addShape(rectangle);
+        context.setState(new StateRectangle1(rectangle));
+    }
+
+    @Override
+    public void mouseReleased(DrawerContext context, double x, double y) {
+
+    }
+
+    @Override
+    public void mouseMoved(DrawerContext context, double x, double y) {
+
+    }
+
+    @Override
+    public void paint(DrawerContext context) {
+
+    }
+}
diff --git a/src/main/java/state/StateRectangle1.java b/src/main/java/state/StateRectangle1.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4ce1002e06a3142c928495d7315edae4e4a274e
--- /dev/null
+++ b/src/main/java/state/StateRectangle1.java
@@ -0,0 +1,35 @@
+package state;
+
+import shape.Rectangle;
+
+public class StateRectangle1 implements DrawerState {
+    private Rectangle rectangle;
+    private double startX, startY;
+    public StateRectangle1(Rectangle rectangle) {
+        this.rectangle = rectangle;
+        this.startX = rectangle.getX();
+        this.startY = rectangle.getY();
+    }
+    @Override
+    public void mousePressed(DrawerContext context, double x, double y) {}
+
+    @Override
+    public void mouseReleased(DrawerContext context, double x, double y) {
+        rectangle.setFinished(true);
+        context.paint(context.getDrawer().getGraphicsContext2D());
+        context.setState(new StateRectangle0());
+    }
+
+    @Override
+    public void mouseMoved(DrawerContext context, double x, double y) {
+        double width = x - startX;
+        double height = y - startY;
+        rectangle.setDimensions(startX,startY,width,height);
+        context.paint(context.getDrawer().getGraphicsContext2D());
+    }
+
+    @Override
+    public void paint(DrawerContext context) {
+
+    }
+}