diff --git a/application.cpp b/application.cpp
index 85579c2b9f28978bfb683c92aca8803c2b8796d2..1a3b4bb7cd133dac21cff774705d06a556d16a92 100644
--- a/application.cpp
+++ b/application.cpp
@@ -1,72 +1,74 @@
 #include "application.hpp"
-#include "widgets.hpp"
+#include "widget.hpp"
+#include "gamemaster.hpp"
 
 using namespace genv;
 
-Application::Application() {}
+Application::Application(int szel, int mag)
+{
+    gout.open(szel,mag);
+}
 
 void Application::event_loop()
 {
+    GameMaster game("mo1.txt","fe1.txt");
+
+    Index focus(0,0);
     event ev;
-    int focus=-1;
-    while(gin >> ev)
+    widgets[0]->kezel(ev);
+
+    for (Widget *w : widgets)
     {
-        if (ev.type==ev_mouse)
+        w->rajzol();
+    }
+    gout << refresh;
+
+    while(gin>>ev)
+    {
+        if (ev.type==ev_key)
         {
-            if (ev.button==btn_left)
+            if (ev.keycode==key_up || ev.keycode==key_down ||
+                ev.keycode==key_left || ev.keycode==key_right)
             {
-                for (size_t i=0; i<widgets.size(); i++)
+                widgets[9*focus.sor+focus.oszlop]->unfocus();
+
+                if (ev.keycode==key_up)
                 {
-                    if (widgets[i]->belul(ev.pos_x,ev.pos_y))
-                        {
-                            if (focus!=-1)
-                            {
-                                widgets[focus]->unfocus();
-                            }
-                            focus=i;
-                        }
+                    if (focus.sor >0)
+                        focus.sor -= 1;
                 }
-            }
-
-            /*else if (ev.button==btn_right)
-            {
-                if (focus!=-1)
+                else if (ev.keycode==key_down)
                 {
-                    widgets[focus]->fajlba_ki("log.txt");
+                    if (focus.sor <8)
+                        focus.sor += 1;
+                }
+                else if (ev.keycode==key_left)
+                {
+                    if (focus.oszlop >0)
+                        focus.oszlop -= 1;
+                }
+                else if (ev.keycode==key_right)
+                {
+                    if (focus.oszlop <8)
+                        focus.oszlop += 1;
                 }
-            }*/
-
-            if (focus!=-1)
-            {
-                widgets[focus]->kezel(ev);
-            }
-        }
 
-        if (ev.type==ev_key)
-        {
-            if (focus!=-1)
-            {
-                widgets[focus]->kezel(ev);
-            }
-            if (ev.keycode==key_enter)
-            {
-                action("enter");
-            }
-            else if(ev.keycode==key_space)
-            {
-                action("space");
+                widgets[9*focus.sor+focus.oszlop]->kezel(ev);
             }
 
         }
-        for (Widget* w : widgets)
+
+        for (Widget *w : widgets)
         {
             w->rajzol();
         }
         gout << refresh;
+
+        game.save();
     }
 }
 
-void Application::widget_hozzaado(Widget* w)
+void Application::register_widget(Widget *w)
 {
     widgets.push_back(w);
 }
diff --git a/application.hpp b/application.hpp
index dac48dd1ec83d9659b9ccac41d8327bf2ad8c5bc..ebf3bf9dff38f89a3b1d86ca86977a47abe0370e 100644
--- a/application.hpp
+++ b/application.hpp
@@ -1,23 +1,41 @@
-#ifndef APPLICATION_HPP_INCLUDED
-#define APPLICATION_HPP_INCLUDED
+#ifndef APPLICATION_HPP
+#define APPLICATION_HPP
 
+#include "graphics.hpp"
 #include <vector>
-#include <string>
 
 class Widget;
 
-class Application
+class GameMaster;
+
+struct Index
 {
-protected:
-    std::vector<Widget*> widgets;
+    public:
+        Index(int s, int o) : sor(s), oszlop(o)
+        {
+            if (sor>8)
+                sor=8;
+            else if (sor<0)
+                sor=0;
+
+            if (oszlop>8)
+                oszlop=8;
+            else if (oszlop<0)
+                oszlop=0;
+        }
+        int sor,oszlop;
+};
 
-public:
-    Application();
+class Application
+{
+    public:
+        Application(int szel, int mag);
 
-    virtual void event_loop();
-    virtual void widget_hozzaado(Widget*);
+        virtual void event_loop();
+        virtual void register_widget(Widget*);
 
-    virtual void action(std::string) = 0;
+    protected:
+        std::vector<Widget*> widgets;
 };
 
-#endif // APPLICATION_HPP_INCLUDED
+#endif // APPLICATION_HPP
diff --git a/checkbox.cpp b/checkbox.cpp
deleted file mode 100644
index 9fbd27b1d0a72e68730fd70e5a78f9c92cd126ec..0000000000000000000000000000000000000000
--- a/checkbox.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "checkbox.hpp"
-
-using namespace genv;
-
-Checkbox::Checkbox(Application* parent, int x, int y, int szel, int mag):
-    Widget(parent,x,y,szel,mag)
-    {
-        _xelt=false;
-    }
-
-void Checkbox::rajzol()
-{
-    g0 color(black) << move_to(_x,_y) << box(_szel,_mag);
-
-    g0 color(light_purple);
-    g0 move_to(_x,_y)
-        << line(_szel,0)
-        << line(0,_mag)
-        << line(-_szel,0)
-        << line(0,-_mag);  //korvonal
-
-    if (_xelt)
-    {
-        g0 move_to(_x,_y) << line_to(_x+_szel,_y+_mag)
-            <<  move_to(_x,_y+_mag) << line_to(_x+_szel,_y);
-    }
-}
-
-void Checkbox::kezel(event ev)
-{
-    if (ev.type==ev_mouse && belul(ev.pos_x,ev.pos_y) && ev.button==btn_left)
-    {
-        _xelt = !_xelt;
-    }
-}
-
-bool Checkbox::xelt_e()
-{
-    return _xelt;
-}
diff --git a/checkbox.hpp b/checkbox.hpp
deleted file mode 100644
index 7da8dd42c885ed702f70df88a85f781d66204cb9..0000000000000000000000000000000000000000
--- a/checkbox.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef CHECKBOX_HPP_INCLUDED
-#define CHECKBOX_HPP_INCLUDED
-
-#include "widgets.hpp"
-
-class Checkbox : public Widget
-{
-protected:
-    bool _xelt;
-public:
-    Checkbox(Application*,int,int,int,int);
-    virtual void rajzol() override;
-    virtual void kezel(genv::event ev) override;
-    bool xelt_e();
-};
-
-#endif // CHECKBOX_HPP_INCLUDED
diff --git a/dropdown.cpp b/dropdown.cpp
deleted file mode 100644
index 29976d9217749a278f5dd914bca9303e600487df..0000000000000000000000000000000000000000
--- a/dropdown.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-#include "dropdown.hpp"
-#include <iostream>
-#include <fstream>
-
-using namespace genv;
-using namespace std;
-
-Dropdown::Dropdown(Application* parent, int x, int y, int szel, int mag, int doboz_mag, vector<string> ertekek):
-    Widget(parent,x,y,szel,mag), _doboz_mag(doboz_mag), _ertekek(ertekek)
-    {
-        _doboz_mag_ertekado();
-        _honnan=0;
-        _doboz_db=_mag/_doboz_mag;
-        _futas_db=_futas_db_ertekado();
-        _csuszka_szel=10;
-        _csuszka_mag=_csuszka_mag_ertekado();
-        _ertek_index=-1;
-    }
-
-void Dropdown::_doboz_mag_ertekado()
-{
-    if (_doboz_mag < gout.cascent()+gout.cdescent())
-    {
-        _doboz_mag=gout.cascent()+gout.cdescent();
-    }
-    if (_mag%_doboz_mag != 0)
-    {
-        _mag-=_mag%_doboz_mag;
-    }
-}
-
-int Dropdown::_futas_db_ertekado()
-{
-    if (_doboz_db > _ertekek.size())
-    {
-        return _ertekek.size();
-    }
-    else
-    {
-        return _doboz_db;
-    }
-}
-
-int Dropdown::_csuszka_mag_ertekado()
-{
-    if (_doboz_db > _ertekek.size())
-    {
-        return _mag;
-    }
-    else
-    {
-        return _mag/_ertekek.size()*_doboz_db;
-    }
-}
-
-void Dropdown::rajzol()
-{
-    if (_kijelolt)
-    {
-        g0 color(light_purple);
-    }
-    else
-    {
-        g0 color(dark_purple);
-    }
-
-    g0 move_to(_x,_y)
-        << line(_szel,0)
-        << line(0,_mag)
-        << line(-_szel,0)
-        << line(0,-_mag);  // korvonal
-    g0 move_to(_x+_szel-_csuszka_szel, _y) << line(0,_mag);
-
-    int vonal_y=_y;
-    for(int i=0; i<_doboz_db-1; i++)
-    {
-        vonal_y+=_doboz_mag;
-        g0 move_to(_x,vonal_y) << line(_szel-_csuszka_szel,0);  // vizszintes vonalak
-    }
-
-    elemrajzolo();
-    csuszkarajzolo();
-}
-
-void Dropdown::elemrajzolo()
-{
-    for(int i=0; i<_futas_db; i++)
-    {
-        g0 color(black) << move_to(_x+1, _y+1+i*_doboz_mag) << box(_szel-_csuszka_szel-1,_doboz_mag-2);
-    }
-
-    kijelolesrajzolo();
-
-    if (_kijelolt)
-    {
-        g0 color(light_purple);
-    }
-    else
-    {
-        g0 color(dark_purple);
-    }
-
-    int doboz_index=0;
-    for(int i=_honnan; i<_futas_db+_honnan; i++)
-    {
-        g0 move_to(_x+5, _y + _doboz_mag/2+gout.cascent()/2 + doboz_index*_doboz_mag)
-            << text(_ertekek[i]);
-        doboz_index++;
-    }
-}
-
-void Dropdown::csuszkarajzolo()
-{
-    g0 color(black) << move_to(_x+_szel-_csuszka_szel+1,_y+1) << box(_csuszka_szel-2,_mag-2);
-
-    if (_kijelolt)
-    {
-        g0 color(light_purple);
-    }
-    else
-    {
-        g0 color(dark_purple);
-    }
-    g0 move_to(_x+_szel-_csuszka_szel, _y+_mag/_ertekek.size()*_honnan) << box(_csuszka_szel,_csuszka_mag);
-}
-
-void Dropdown::dobozkijelolo(int eger_x, int eger_y)
-{
-    int _kijelolt_doboz_szama=-1;
-
-    for(int i=0; i<_futas_db;i++)
-    {
-        if (eger_x>_x && eger_x<_x+_szel &&
-            eger_y>_y+i*_doboz_mag && eger_y<_y+i*_doboz_mag+_doboz_mag)
-        {
-            _kijelolt_doboz_szama=i+_honnan;
-        }
-    }
-
-    if (_kijelolt_doboz_szama!=-1)
-    {
-        _ertek_index=_kijelolt_doboz_szama;
-
-        cout << _ertekek[_ertek_index] << endl;
-    }
-}
-
-void Dropdown::kijelolesrajzolo()
-{
-    if (_ertek_index!=-1)
-    {
-        if ((_y+1 + _ertek_index*_doboz_mag - _honnan*_doboz_mag) > _y &&
-            (_y+1 + _ertek_index*_doboz_mag - _honnan*_doboz_mag) < _y+_mag)
-        {
-            g0 color(white)
-            << move_to(_x+1, _y+1 + _ertek_index*_doboz_mag - _honnan*_doboz_mag)
-            << box(_szel-1-_csuszka_szel,_doboz_mag-2);
-        }
-    }
-}
-
-void Dropdown::kezel(event ev)
-{
-    if (ev.type == ev_mouse)
-    {
-        if (ev.button==btn_left)
-        {
-            if (belul(ev.pos_x, ev.pos_y))
-            {
-                _kijelolt = !_kijelolt;
-                dobozkijelolo(ev.pos_x,ev.pos_y);
-
-            }
-            else if (!belul(ev.pos_x, ev.pos_y))
-            {
-                _kijelolt = false;
-            }
-        }
-
-        if (_ertekek.size()!=_futas_db)
-        {
-            if (ev.button==btn_wheelup && _honnan>0)
-            {
-                _honnan--;
-                cout << _honnan << endl;
-                elemrajzolo();
-            }
-            if (ev.button==btn_wheeldown && _honnan<_ertekek.size()-_doboz_db)
-            {
-                _honnan++;
-                cout << _honnan << endl;
-                elemrajzolo();
-            }
-        }
-    }
-}
-
-std::string Dropdown::get_ertek()
-{
-    return _ertekek[_ertek_index];
-}
-
diff --git a/dropdown.hpp b/dropdown.hpp
deleted file mode 100644
index 34fdf0f3c1bb9d1dd8cc7649cf9c5a695d373b0f..0000000000000000000000000000000000000000
--- a/dropdown.hpp
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef DROPDOWN_HPP_INCLUDED
-#define DROPDOWN_HPP_INCLUDED
-
-#include "graphics.hpp"
-#include "widgets.hpp"
-#include <vector>
-#include <string>
-
-class Dropdown : public Widget
-{
-protected:
-    std::vector<std::string> _ertekek;
-    int _doboz_mag, _doboz_db;
-    int _futas_db, _honnan;
-    int _csuszka_szel, _csuszka_mag;
-    int _ertek_index;
-
-    int _futas_db_ertekado();
-    int _csuszka_mag_ertekado();
-    void _doboz_mag_ertekado();
-
-public:
-    Dropdown(Application*, int x, int y, int szel, int mag, int doboz_mag, std::vector<std::string> ertekek);
-    virtual void rajzol() override;
-    virtual void kezel(genv::event ev) override;
-
-    virtual void dobozkijelolo(int,int);
-    virtual void kijelolesrajzolo();
-    virtual void elemrajzolo();
-    virtual void csuszkarajzolo();
-    std::string get_ertek();
-};
-
-#endif // DROPDOWN_HPP_INCLUDED
diff --git a/fajl_beolvas.cpp b/fajl_beolvas.cpp
deleted file mode 100644
index 7791f5974fd41f5caa839ecbba0881c80e13526c..0000000000000000000000000000000000000000
--- a/fajl_beolvas.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-#include "fajl_beolvas.hpp"
-
-std::vector<std::vector<int>> fajl_beolvas(std::ifstream& fajlnev)
-{
-    std::vector<std::vector<int>> teljes;
-    for (int i=0; i<9; i++)
-    {
-        std::vector<int> sor;
-        for (int j=0; i<9; i++)
-        {
-            int szam;
-            fajlnev >> szam;
-            sor.pushback(szam);
-        }
-        teljes.push_back(sor)
-    }
-    return teljes;
-}
diff --git a/fajl_beolvas.hpp b/fajl_beolvas.hpp
deleted file mode 100644
index f1512cfb0f7046ecce667f0ddf65a14d8c11b9c6..0000000000000000000000000000000000000000
--- a/fajl_beolvas.hpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef FAJL_BEOLVAS_HPP_INCLUDED
-#define FAJL_BEOLVAS_HPP_INCLUDED
-
-#include <vector>
-#include <fstream>
-
-std::vector<std::vector<int>> fajl_beolvas(std::ifstream& fajlnev)
-{
-
-}
-
-#endif // FAJL_BEOLVAS_HPP_INCLUDED
diff --git a/field.cpp b/field.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0931e4b344e52464684f36c18e2c33aedc9c5881
--- /dev/null
+++ b/field.cpp
@@ -0,0 +1,48 @@
+#include "field.hpp"
+
+using namespace genv;
+
+Field::Field(Application* parent, int x, int y, int meret):
+    Widget(parent, x, y, meret, meret) {}
+
+void Field::rajzol() const
+{
+    if (_kijelolt)  //keret
+        gout << color(light_purple);
+    else
+        gout << color(dark_purple);
+
+    gout << move_to(_x,_y) << box(_szel,_mag);
+
+    if (_kijelolt)  //belul
+        gout << color(dark_purple);
+    else
+        gout << color(bg_purple);
+
+    gout << move_to(_x+1,_y+1) << box(_szel-2,_mag-2);
+
+    if (_kijelolt)  //szoveg
+    {
+        if (_fix)
+            gout << color(white);
+        else
+            gout << color(light_purple);
+    }
+    else
+    {
+        if (_fix)
+            gout << color(black);
+        else
+            gout << color(dark_purple);
+    }
+
+    gout << move_to(_x+(_szel-gout.twidth(_cimke))/2,
+                    _y+(_mag-gout.cascent()-gout.cdescent())/2)
+         << text(_cimke);
+
+}
+
+void Field::kezel(genv::event ev)
+{
+    _kijelolt=!_kijelolt;
+}
diff --git a/field.hpp b/field.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..3d31337c96c2bd54f67b88af68c02d10cc7947a9
--- /dev/null
+++ b/field.hpp
@@ -0,0 +1,20 @@
+#ifndef FIELD_HPP
+#define FIELD_HPP
+
+#include "widget.hpp"
+
+
+class Field : public Widget
+{
+    public:
+        Field(Application* parent, int x, int y, int meret);
+        virtual void rajzol() const override;
+        virtual void kezel(genv::event) override;
+
+    protected:
+        std::string _cimke;
+        bool _fix;
+
+};
+
+#endif // FIELD_HPP
diff --git a/gamemaster.cpp b/gamemaster.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4b298088fe817755f9e08199b2f7f835671f0cac
--- /dev/null
+++ b/gamemaster.cpp
@@ -0,0 +1,101 @@
+#include "gamemaster.hpp"
+
+using namespace std;
+
+GameMaster::GameMaster(std::string mo, std::string fe) :
+    _fajl_megoldas(mo), _fajl_feladat(fe)
+{
+    _megoldas = fajl_beolvasas(_fajl_megoldas);
+    _feladat = fajl_beolvasas(_fajl_feladat);
+    _save = _feladat;
+    _fajl_save = "save.txt";
+}
+
+
+
+vector<Index> GameMaster::aura(Index jelenlegi)
+{
+
+}
+
+int GameMaster::negyzet_szama(Index jelenlegi)
+{
+    if (jelenlegi.sor <= 2)
+    {
+        if (jelenlegi.oszlop <= 2)
+            return 0;
+        else if (jelenlegi.oszlop <= 5)
+            return 1;
+        else
+            return 2;
+    }
+    else if (jelenlegi.sor <= 5)
+    {
+        if (jelenlegi.oszlop <= 2)
+            return 3;
+        else if (jelenlegi.oszlop <= 5)
+            return 4;
+        else
+            return 5;
+    }
+    else
+    {
+        if (jelenlegi.oszlop <= 2)
+            return 6;
+        else if (jelenlegi.oszlop <= 5)
+            return 7;
+        else
+            return 8;
+    }
+}
+
+void GameMaster::action()
+{
+
+}
+
+bool GameMaster::szabalyos_e(Index jelenlegi)
+{
+
+}
+
+std::vector<std::vector<int>> GameMaster::fajl_beolvasas(std::string fajlnev)
+{
+    std::ifstream fajl(fajlnev);
+
+    std::vector<std::vector<int>> teljes;
+    for (int i=0; i<9; i++)
+    {
+        std::vector<int> sor;
+        for (int j=0; i<9; i++)
+        {
+            int szam;
+            fajl >> szam;
+            sor.push_back(szam);
+        }
+        fajl >> ws;
+        teljes.push_back(sor);
+    }
+    fajl.close();
+    return teljes;
+}
+
+void GameMaster::save()
+{
+    fajl_kiiras(_fajl_save,_save);
+}
+
+void GameMaster::fajl_kiiras(std::string fajlnev,std::vector<std::vector<int>> v) const
+{
+    std::ofstream fajl(fajlnev);
+
+    for (vector<int> sor : v)
+    {
+        for (int ertek : sor)
+        {
+            fajl << ertek;
+        }
+        fajl << endl;
+    }
+    fajl.close();
+}
diff --git a/gamemaster.hpp b/gamemaster.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..2ccfa7675db6dbdc527f71727868ba93d35f9790
--- /dev/null
+++ b/gamemaster.hpp
@@ -0,0 +1,25 @@
+#ifndef GAMEMASTER_HPP
+#define GAMEMASTER_HPP
+
+#include "application.hpp"
+#include <vector>
+#include <fstream>
+
+class GameMaster
+{
+    public:
+        GameMaster(std::string mo, std::string fe);
+        std::vector<std::vector<int>> fajl_beolvasas(std::string fajlnev);
+        void fajl_kiiras(std::string fajlnev, std::vector<std::vector<int>> v) const;
+        void save();
+        std::vector<Index> aura(Index);
+        virtual int negyzet_szama(Index);
+        virtual bool szabalyos_e(Index);
+        virtual void action();
+
+    protected:
+        std::string _fajl_megoldas, _fajl_feladat, _fajl_save;
+        std::vector<std::vector<int>> _megoldas, _feladat, _save;
+};
+
+#endif // GAMEMASTER_HPP
diff --git a/main.cpp b/main.cpp
index 26b45162368f7e7e454aceaccd6d682b59f6244f..7b4e8c67b888780cd82302eedf9efefaa576b6b8 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,78 +1,39 @@
 #include "graphics.hpp"
-#include "widgets.hpp"
 #include "application.hpp"
-#include "checkbox.hpp"
-//#include "spinbox.hpp"
-//#include "dropdown.hpp"
-//#include "statictext.hpp"
-#include "textedit.hpp"
-//#include "multiline.hpp"
-#include "palya.hpp"
+#include "widget.hpp"
+#include "field.hpp"
+#include "gamemaster.hpp"
 
-#include <iostream>
-#include <fstream>
 #include <vector>
-#include <string>
 
 using namespace std;
-using namespace genv;
-
-const int ablak_szel=702;
-const int ablak_mag=702;
 
 class MyApp : public Application
 {
-public:
-    MyApp()
-    {
-        p = new Palya(this, 0, 0, 702, "mo1.txt", "fe1.txt");
-    }
-
-    void action(string id)
-    {
-        /*if (id=="enter")
-            save();
-
-        else if (id=="space" && cb->xelt_e())
-            save2();*/
-    }
-
-    /*void save()
-    {
-        std::ofstream file(te1->get_szoveg());
-        file << te2->get_szoveg();
-        file.close();
-    }
-
-    void save2()
-    {
-        std::ofstream file(te2->get_szoveg());
-        file << te1->get_szoveg();
-        file.close();
-    }*/
+    public:
+        MyApp(int szel, int mag) : Application(szel,mag)
+        {
+            for (int i=0; i<9; i++)
+            {
+                vector<Field*> sor;
+                for (int j=0; j<9; j++)
+                {
+                    Field *f = new Field(this,j*78,i*78,78);
+                    sor.push_back(f);
+                }
+                palya.push_back(sor);
+            }
+        }
 
-protected:
-    Palya* p;
+    protected:
+        vector<vector<Field*>> palya;
 };
 
 int main()
 {
-    gout.open(ablak_szel,ablak_mag);
-
-    /*std::ofstream file("mentes.txt");
-    for (int i=0; i<9; i++)
-    {
-        for (int j=0; j<9; j++)
-        {
-            file << "0";
-        }
-        file << endl;
-    }
-    file.close();*/
-
-    MyApp app;
+    MyApp sudoku(702,702);
 
-    app.event_loop();
+    sudoku.event_loop();
 
     return 0;
 }
diff --git a/multiline.cpp b/multiline.cpp
deleted file mode 100644
index 42d21c259c4d877509a2a998d5ecaba0d2867c96..0000000000000000000000000000000000000000
--- a/multiline.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-#include "multiline.hpp"
-
-#include <fstream>
-
-using namespace genv;
-
-Multiline::Multiline(Application* parent, int x, int y, int szel, int mag, std::string filenev):
-    Widget(parent,x,y,szel,mag), _elso(0)
-    {
-        std::ifstream file(filenev);
-
-        while (file.good())
-        {
-            std::string sor;
-            getline(file,sor) >> std::ws;
-
-            _sorok.push_back(sor);
-        }
-
-        file.close();
-    }
-
-void Multiline::rajzol()
-{
-    //gout.load_font("LiberationsSans-Regular.ttf",10);
-
-    if (_kijelolt)
-        g0 color(light_purple);
-    else
-        g0 color(dark_purple);
-
-    g0 move_to(_x,_y)
-        << line(_szel,0)
-        << line(0,_mag)
-        << line(-_szel,0)
-        << line(0,-_mag);
-
-    int height = gout.cascent()+gout.cdescent()+5;
-
-    for(int i=_elso; i<_sorok.size(); i++)
-    {
-        g0 move_to(_x + 5, _y + 5 + (i-_elso)*height)
-            << text(_sorok[i]);
-    }
-}
-
-void Multiline::kezel(event ev)
-{
-    if (ev.type == ev_mouse)
-    {
-        if (ev.button == btn_wheelup)
-            fel();
-        else if (ev.button == btn_wheeldown)
-            le();
-    }
-
-    if (ev.type==ev_mouse && ev.button==btn_left)
-    {
-        if(belul(ev.pos_x, ev.pos_y))
-        {
-            _kijelolt = !_kijelolt;
-        }
-        else if (!belul(ev.pos_x, ev.pos_y))
-        {
-            _kijelolt = false;
-        }
-    }
-}
-
-void Multiline::fel()
-{
-    if (_elso > 0)
-        _elso--;
-}
-
-void Multiline::le()
-{
-    _elso++;
-}
diff --git a/multiline.hpp b/multiline.hpp
deleted file mode 100644
index 95040670349edbcf50b03332b17f68ee55f37953..0000000000000000000000000000000000000000
--- a/multiline.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef MULTILINE_HPP_INCLUDED
-#define MULTILINE_HPP_INCLUDED
-
-#include "widgets.hpp"
-
-class Multiline : public Widget
-{
-protected:
-    std::vector<std::string> _sorok;
-    int _elso;
-
-public:
-    Multiline(Application*,int,int,int,int, std::string);
-
-    void rajzol() override;
-    void kezel(genv::event) override;
-
-    void fel();
-    void le();
-};
-
-#endif // MULTILINE_HPP_INCLUDED
diff --git a/palya.cpp b/palya.cpp
deleted file mode 100644
index e3b1c425b8977a86c6690605a4dec323bdd13f27..0000000000000000000000000000000000000000
--- a/palya.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#include "palya.hpp"
-
-using namespace genv;
-using namespace std;
-
-Palya::Palya(Application* parent,int x,int y,int meret,
-             std::string mo, std::string fe):
-                 Widget(parent,x,y,meret,meret), _fajl_megoldas(mo), _fajl_feladat(fe)
-{
-    _megoldas = fajl_beolvas(_fajl_megoldas);
-    _feladat = fajl_beolvas(_fajl_feladat);
-    _mentes = _feladat;
-    _fajl_mentes = "mentes.txt"
-}
-
-void Palya::rajzol()
-{
-    g0 color(bg_color) << move_to(_x,_y) << box(_szel,_mag);
-
-    g0 color(dark_purple);
-    for (int i=1; i<9; i++)
-    {
-        g0 move_to(_x+i*(_szel/9),_y) << line(0,_mag);
-        if (i%3==0)
-        {
-            g0 move_to(_x+i*(_szel/9)-1,_y) << line(0,_mag);
-            g0 move_to(_x+i*(_szel/9)+1,_y) << line(0,_mag);
-        }
-    }
-    for (int i=1; i<9; i++)
-    {
-        g0 move_to(_x,_y+i*(_mag/9)) << line(_szel,0);
-        if (i%3==0)
-        {
-            g0 move_to(_x,_y+i*(_mag/9)-1) << line(_szel,0);
-            g0 move_to(_x,_y+i*(_mag/9)+1) << line(_szel,0);
-        }
-    }
-
-}
-
-void Palya::kezel(event ev)
-{
-
-}
-
-std::vector<std::vector<int>> Palya::fajl_beolvas(std::string fajlnev)
-{
-    ifstream& fajl(fajlnev);
-
-    std::vector<std::vector<int>> teljes;
-    for (int i=0; i<9; i++)
-    {
-        std::vector<int> sor;
-        for (int j=0; i<9; i++)
-        {
-            int szam;
-            fajl >> szam;
-            sor.push_back(szam);
-        }
-        teljes.push_back(sor);
-    }
-    return teljes;
-}
-
diff --git a/palya.hpp b/palya.hpp
deleted file mode 100644
index a0a4a7d1154f50c472fbb1c6c4453eb29767d44c..0000000000000000000000000000000000000000
--- a/palya.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef PALYA_HPP_INCLUDED
-#define PALYA_HPP_INCLUDED
-
-#include "widgets.hpp"
-#include <vector>
-#include <fstream>
-#include <iostream>
-
-#define bg_color 246,232,255
-
-class Palya : public Widget
-{
-protected:
-    std::string _fajl_megoldas, _fajl_feladat, _fajl_mentes;
-    std::vector<std::vector<int>> _megoldas;
-    std::vector<std::vector<int>> _feladat;
-    std::vector<std::vector<int>> _mentes;
-
-public:
-    Palya(Application* parent,int x,int y,int meret,
-          std::vector<std::vector<int>> mo, std::vector<std::vector<int>> fe);
-    virtual void rajzol() override;
-    virtual void kezel(genv::event) override;
-
-    std::vector<std::vector<int>> fajl_beolvas(std::ifstream& fajlnev);
-};
-
-
-#endif // PALYA_HPP_INCLUDED
diff --git a/spinbox.cpp b/spinbox.cpp
deleted file mode 100644
index e3555612fdb1abc7770c85d976f63e14559e50d1..0000000000000000000000000000000000000000
--- a/spinbox.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-#include "spinbox.hpp"
-#include <iostream>
-#include <fstream>
-#define g0 gout<<
-using namespace genv;
-using namespace std;
-
-Spinbox::Spinbox(Application* parent,int x, int y, int szel, int mag, int min_ertek, int max_ertek):
-    Widget(parent,x,y,szel,mag), _min(min_ertek), _max(max_ertek)
-{
-    _ertek=_min;
-
-    _alsogomb_y = _y+_mag/2;
-    _gomb_x = _x+_szel-_mag/2;
-    _gomb_meret = _mag/2;
-}
-
-void Spinbox::rajzol()
-{
-    if (_kijelolt)
-        g0 color(light_purple);
-    else
-        g0 color(dark_purple);
-
-    g0 move_to(_x,_y)
-        << line(_szel,0)
-        << line(0,_mag)
-        << line(-_szel,0)
-        << line(0,-_mag);   // doboz
-    g0 move_to(_gomb_x,_y) << line(0,_mag);  // fuggoleges vonal
-    g0 move_to(_gomb_x,_alsogomb_y) << line(_gomb_meret,0);  // gombok k�zti v�zszintes vonal
-
-    g0 move_to(_gomb_x+_gomb_meret/4, _alsogomb_y-_gomb_meret/4)
-        << line(_gomb_meret/4,-_gomb_meret/2)
-        << line(_gomb_meret/4,_gomb_meret/2);  // felfele nyil
-
-    g0 move_to(_gomb_x+_gomb_meret/4, _alsogomb_y+_gomb_meret/4)
-        << line(_gomb_meret/4,_gomb_meret/2)
-        << line(_gomb_meret/4,-_gomb_meret/2);  // lefele nyil
-
-    g0 move_to(_x+5,_y+_mag/2+gout.cascent()/2)
-        << text(to_string(_ertek));  // ertekkiiras
-}
-
-void Spinbox::szamnovelo(int mennyivel)
-{
-    if (_ertek+mennyivel <= _max)
-    {
-        _ertek+=mennyivel;
-        cout << _ertek << endl;
-        g0 color(black) << move_to(_x+1,_y+1) << box(_szel-2,_mag-2);
-    }
-}
-
-void Spinbox::szamcsokkento(int mennyivel)
-{
-    if (_ertek-mennyivel >= _min)
-    {
-        _ertek-=mennyivel;
-        cout << _ertek << endl;
-        g0 color(black) << move_to(_x+1,_y+1) << box(_szel-2,_mag-2);
-    }
-}
-
-void Spinbox::kezel(event ev)
-{
-    if (ev.type == ev_mouse && ev.button==btn_left)
-    {
-        if (belul(ev.pos_x, ev.pos_y))
-        {
-            _kijelolt = !_kijelolt;
-
-            if (ev.pos_x>_gomb_x && ev.pos_x<_x+_szel &&
-                ev.pos_y>_y && ev.pos_y<_alsogomb_y)
-            {
-                szamnovelo(1);
-                _kijelolt=true;
-            }
-            else if (ev.pos_x>_gomb_x && ev.pos_x<_x+_szel &&
-                ev.pos_y>_alsogomb_y && ev.pos_y<_y+_mag)
-            {
-                szamcsokkento(1);
-                _kijelolt=true;
-            }
-        }
-        else if (!belul(ev.pos_x, ev.pos_y))
-        {
-            _kijelolt = false;
-        }
-
-    }
-
-    if (ev.type == ev_key && _kijelolt)
-    {
-
-        if (ev.keycode==key_up)
-        {
-            szamnovelo(1);
-        }
-        if (ev.keycode==key_pgup)
-        {
-            szamnovelo(10);
-        }
-        if (ev.keycode==key_down)
-        {
-            szamcsokkento(1);
-        }
-        if (ev.keycode==key_pgdn)
-        {
-            szamcsokkento(10);
-        }
-    }
-
-}
-
-int Spinbox::get_ertek()
-{
-    return _ertek;
-}
-
diff --git a/spinbox.hpp b/spinbox.hpp
deleted file mode 100644
index a72b5abe418997e01eb615a3cc20c67b71f36133..0000000000000000000000000000000000000000
--- a/spinbox.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef SPINBOX_HPP_INCLUDED
-#define SPINBOX_HPP_INCLUDED
-
-#include "graphics.hpp"
-#include "widgets.hpp"
-
-class Spinbox : public Widget
-{
-protected:
-    int _ertek, _min, _max;
-    int _alsogomb_y, _gomb_x, _gomb_meret;
-
-public:
-    Spinbox(Application*, int x, int y, int szel, int mag, int min_ertek, int max_ertek);
-    virtual void rajzol() override;
-    virtual void kezel(genv::event ev) override;
-
-    virtual void szamnovelo(int mennyivel);
-    virtual void szamcsokkento(int mennyivel);
-    int get_ertek();
-};
-
-#endif // SPINBOX_HPP_INCLUDED
diff --git a/statictext.cpp b/statictext.cpp
deleted file mode 100644
index 2cb0c328956e1faa2b97fec1a301b149b362d636..0000000000000000000000000000000000000000
--- a/statictext.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "statictext.hpp"
-#include <string>
-#define g0 gout<<
-
-using namespace genv;
-using namespace std;
-
-Statictext::Statictext(Application* parent, int x, int y, int szel, int mag, std::string szoveg):
-    Widget(parent,x,y,szel,mag), _szoveg(szoveg)
-{
-    _kijelolt=false;
-}
-
-void Statictext::rajzol()
-{
-    if (_kijelolt)
-        g0 color(light_purple);
-    else
-        g0 color(dark_purple);
-
-    g0 move_to(_x,_y)
-        << line(_szel,0)
-        << line(0,_mag)
-        << line(-_szel,0)
-        << line(0,-_mag);
-
-    g0 move_to(_x+5,_y+_mag/2+gout.cascent()/2)
-        << text(_szoveg);
-}
-
-void Statictext::kezel(event ev)
-{
-}
diff --git a/statictext.hpp b/statictext.hpp
deleted file mode 100644
index 66dcc1b43d7456c8f018494b37803b46e55a5684..0000000000000000000000000000000000000000
--- a/statictext.hpp
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef STATICTEXT_HPP_INCLUDED
-#define STATICTEXT_HPP_INCLUDED
-
-#include "graphics.hpp"
-#include "widgets.hpp"
-
-class Statictext : public Widget
-{
-protected:
-    std::string _szoveg;
-
-public:
-    Statictext(Application*, int, int, int, int, std::string);
-    virtual void rajzol() override;
-    virtual void kezel(genv::event ev) override;
-};
-
-#endif // STATICTEXT_HPP_INCLUDED
diff --git a/textedit.cpp b/textedit.cpp
deleted file mode 100644
index 6e4f38d62dbaf7808f2b4506a3fe519b5e6cf2f7..0000000000000000000000000000000000000000
--- a/textedit.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#include "textedit.hpp"
-
-using namespace genv;
-using namespace std;
-
-Textedit::Textedit(Application* parent, int x, int y, int szel, int mag, std::string szoveg): Widget(parent,x,y,szel,mag), _szoveg(szoveg)
-{
-}
-
-void Textedit::rajzol()
-{
-    g0 color(black) << move_to(_x,_y) << box(_szel,_mag);
-
-    if (_kijelolt)
-    {
-        g0 color(light_purple);
-    }
-    else
-    {
-        g0 color(dark_purple);
-    }
-
-    g0 move_to(_x,_y)
-        << line(_szel,0)
-        << line(0,_mag)
-        << line(-_szel,0)
-        << line(0,-_mag);  // korvonal
-    g0 move_to(_x+5,_y+gout.cascent()) << text(_szoveg);
-}
-
-void Textedit::kezel(event ev)
-{
-    if (ev.type == ev_key && _kijelolt)
-    {
-        if (ev.keycode == key_backspace)
-        {
-            _szoveg = utf8_remove_last(_szoveg);
-        }
-        else
-        {
-            if (gout.twidth(_szoveg + ev.keyutf8) < _szel-10)
-            {
-                _szoveg += ev.keyutf8;
-            }
-        }
-    }
-    if (ev.type==ev_mouse && ev.button==btn_left)
-    {
-        if(belul(ev.pos_x, ev.pos_y))
-        {
-            _kijelolt = !_kijelolt;
-        }
-        else if (!belul(ev.pos_x, ev.pos_y))
-        {
-            _kijelolt = false;
-        }
-    }
-}
-
-std::string Textedit::get_szoveg()
-{
-    return _szoveg;
-}
diff --git a/textedit.hpp b/textedit.hpp
deleted file mode 100644
index e27c3f05dd56fbffb887198ef57fa1ffd272648d..0000000000000000000000000000000000000000
--- a/textedit.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef TEXTEDIT_HPP_INCLUDED
-#define TEXTEDIT_HPP_INCLUDED
-
-#include "widgets.hpp"
-
-class Textedit : public Widget
-{
-protected:
-    std::string _szoveg;
-
-public:
-    Textedit(Application*, int, int ,int ,int , std::string);
-    virtual void rajzol() override;
-    virtual void kezel(genv::event) override;
-    std::string get_szoveg();
-
-};
-
-
-#endif // TEXTEDIT_HPP_INCLUDED
diff --git a/widget.cpp b/widget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..63f63e44cdc65c79a8fb774a9f8dd080800a382f
--- /dev/null
+++ b/widget.cpp
@@ -0,0 +1,19 @@
+#include "widget.hpp"
+
+Widget::Widget(Application* parent, int x, int y, int szel, int mag) :
+    _parent(parent),_x(x), _y(y), _szel(szel), _mag(mag)
+{
+    _kijelolt=false;
+    _parent->register_widget(this);
+}
+
+bool Widget::belul(int eger_x, int eger_y) const
+{
+    return (eger_x>_x && eger_x<_x+_szel &&
+        eger_y>_y && eger_y<_y+_mag);
+}
+
+void Widget::unfocus()
+{
+    _kijelolt=false;
+}
diff --git a/widget.hpp b/widget.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..2fd3ea51535e4b9e6c0d64e539cf9e325cb37d99
--- /dev/null
+++ b/widget.hpp
@@ -0,0 +1,30 @@
+#ifndef WIDGET_HPP
+#define WIDGET_HPP
+
+#include "graphics.hpp"
+#include "application.hpp"
+
+#define dark_purple 130,37,184
+#define light_purple 210,145,255
+#define bg_purple 246,232,255
+#define white 255,255,255
+#define black 0,0,0
+
+class Widget
+{
+    public:
+        Widget(Application*, int x, int y, int szel, int mag);
+        virtual bool belul(int eger_x, int eger_y) const;
+        virtual void unfocus();
+
+        virtual void rajzol() const = 0;
+        virtual void kezel(genv::event) = 0;
+
+    protected:
+        int _x, _y, _szel, _mag;
+        Application *_parent;
+        bool _kijelolt;
+
+};
+
+#endif // WIDGET_HPP
diff --git a/widgets.cpp b/widgets.cpp
deleted file mode 100644
index c8ecefba82fd069465a109e3daec4203cb9e6a24..0000000000000000000000000000000000000000
--- a/widgets.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "graphics.hpp"
-#include "widgets.hpp"
-
-
-
-using namespace genv;
-
-Widget::Widget(Application* parent, int x, int y, int szel, int mag):
-    _parent(parent),_x(x), _y(y), _szel(szel), _mag(mag)
-{
-    _kijelolt=false;
-    _parent->widget_hozzaado(this);
-}
-
-bool Widget::belul(int eger_x, int eger_y)
-{
-    if (eger_x>_x && eger_x<_x+_szel &&
-        eger_y>_y && eger_y<_y+_mag)
-        return true;
-    else
-        return false;
-}
-
-void Widget::unfocus()
-{
-    _kijelolt=false;
-}
-
diff --git a/widgets.hpp b/widgets.hpp
deleted file mode 100644
index 668de3e83e94215c2a7f215b2a6333acc5ab6078..0000000000000000000000000000000000000000
--- a/widgets.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef WIDGETS_HPP_INCLUDED
-#define WIDGETS_HPP_INCLUDED
-
-#include "graphics.hpp"
-#include "application.hpp"
-
-#define g0 gout<<
-#define dark_purple 130,37,184
-#define light_purple 210,145,255
-#define white 255,255,255
-#define black 0,0,0
-
-class Widget
-{
-protected:
-    int _x, _y, _szel, _mag;
-    Application* _parent;
-    bool _kijelolt;
-
-public:
-    Widget(Application*, int x, int y, int szel, int mag);
-    virtual bool belul(int eger_x, int eger_y);
-    virtual void unfocus();
-
-    virtual void rajzol() = 0;
-    virtual void kezel(genv::event ev) = 0;
-};
-
-#endif // WIDGETS_HPP_INCLUDED