diff --git a/.gitignore b/.gitignore
index e51f032..b959e6a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,74 +1,5 @@
 # This file is used to ignore files which are generated
 # ----------------------------------------------------------------------------
 
-*~
-*.autosave
-*.a
-*.core
-*.moc
-*.o
-*.obj
-*.orig
-*.rej
-*.so
-*.so.*
-*_pch.h.cpp
-*_resource.rc
-*.qm
-.#*
-*.*#
-core
-!core/
-tags
-.DS_Store
-.directory
-*.debug
-Makefile*
-*.prl
-*.app
-moc_*.cpp
-ui_*.h
-qrc_*.cpp
-Thumbs.db
-*.res
-*.rc
-/.qmake.cache
-/.qmake.stash
-
-# qtcreator generated files
-*.pro.user*
-
-# xemacs temporary files
-*.flc
-
-# Vim temporary files
-.*.swp
-
-# Visual Studio generated files
-*.ib_pdb_index
-*.idb
-*.ilk
-*.pdb
-*.sln
-*.suo
-*.vcproj
-*vcproj.*.*.user
-*.ncb
-*.sdf
-*.opensdf
-*.vcxproj
-*vcxproj.*
-
-# MinGW generated files
-*.Debug
-*.Release
-
-# Python byte code
-*.pyc
-
-# Binaries
-# --------
-*.dll
-*.exe
-
-*.stash
+build
+*.user
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..0e44cad
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,20 @@
+cmake_minimum_required(VERSION 3.5)
+
+project(cirno-puzzle LANGUAGES CXX)
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra -Wpedantic -g")
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build)
+set(CMAKE_RESOURCE_DIRECTORY       ${CMAKE_SOURCE_DIR}/resources)
+
+include_directories(${CMAKE_SOURCE_DIR}/include)
+file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h" "include/*.h")
+
+find_package(SFML REQUIRED graphics audio window system)
+add_executable(cirno-puzzle ${SOURCES} ${HEADER_FILES} )
+target_link_libraries(cirno-puzzle sfml-system sfml-audio sfml-graphics)
+
+file(COPY "${CMAKE_RESOURCE_DIRECTORY}" DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
diff --git a/build-debug/background_music.ogg b/build-debug/background_music.ogg
deleted file mode 100644
index d428853..0000000
Binary files a/build-debug/background_music.ogg and /dev/null differ
diff --git a/build-debug/footstep_sound.wav b/build-debug/footstep_sound.wav
deleted file mode 100644
index 8b5105b..0000000
Binary files a/build-debug/footstep_sound.wav and /dev/null differ
diff --git a/build-debug/sfml-test b/build-debug/sfml-test
deleted file mode 100755
index d9c7f87..0000000
Binary files a/build-debug/sfml-test and /dev/null differ
diff --git a/build-debug/test_map b/build-debug/test_map
deleted file mode 100644
index cb31002..0000000
--- a/build-debug/test_map
+++ /dev/null
@@ -1,14 +0,0 @@
-size
-7 7
-map
-2 2 2 2 2 2 2
-2 0 3 0 0 6 2
-2 0 0 1 0 0 2
-2 0 0 1 1 0 2
-2 1 1 2 2 2 2
-2 0 0 0 4 0 2
-2 2 2 2 2 2 2
-trigger
-1 5 4 5 6 3 1 3 1
-charge
-1 2 2
diff --git a/build-release/font/Bitstream Vera License.txt b/build-release/font/Bitstream Vera License.txt
deleted file mode 100644
index cf00835..0000000
--- a/build-release/font/Bitstream Vera License.txt	
+++ /dev/null
@@ -1,123 +0,0 @@
-Bitstream Vera Fonts Copyright
-
-The fonts have a generous copyright, allowing derivative works (as
-long as "Bitstream" or "Vera" are not in the names), and full
-redistribution (so long as they are not *sold* by themselves). They
-can be be bundled, redistributed and sold with any software.
-
-The fonts are distributed under the following copyright:
-
-Copyright
-=========
-
-Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream
-Vera is a trademark of Bitstream, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the fonts accompanying this license ("Fonts") and associated
-documentation files (the "Font Software"), to reproduce and distribute
-the Font Software, including without limitation the rights to use,
-copy, merge, publish, distribute, and/or sell copies of the Font
-Software, and to permit persons to whom the Font Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright and trademark notices and this permission notice
-shall be included in all copies of one or more of the Font Software
-typefaces.
-
-The Font Software may be modified, altered, or added to, and in
-particular the designs of glyphs or characters in the Fonts may be
-modified and additional glyphs or characters may be added to the
-Fonts, only if the fonts are renamed to names not containing either
-the words "Bitstream" or the word "Vera".
-
-This License becomes null and void to the extent applicable to Fonts
-or Font Software that has been modified and is distributed under the
-"Bitstream Vera" names.
-
-The Font Software may be sold as part of a larger software package but
-no copy of one or more of the Font Software typefaces may be sold by
-itself.
-
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
-BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT
-SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
-
-Except as contained in this notice, the names of Gnome, the Gnome
-Foundation, and Bitstream Inc., shall not be used in advertising or
-otherwise to promote the sale, use or other dealings in this Font
-Software without prior written authorization from the Gnome Foundation
-or Bitstream Inc., respectively. For further information, contact:
-fonts at gnome dot org.
-
-Copyright FAQ
-=============
-
-   1. I don't understand the resale restriction... What gives?
-
-      Bitstream is giving away these fonts, but wishes to ensure its
-      competitors can't just drop the fonts as is into a font sale system
-      and sell them as is. It seems fair that if Bitstream can't make money
-      from the Bitstream Vera fonts, their competitors should not be able to
-      do so either. You can sell the fonts as part of any software package,
-      however.
-
-   2. I want to package these fonts separately for distribution and
-      sale as part of a larger software package or system.  Can I do so?
-
-      Yes. A RPM or Debian package is a "larger software package" to begin 
-      with, and you aren't selling them independently by themselves. 
-      See 1. above.
-
-   3. Are derivative works allowed?
-      Yes!
-
-   4. Can I change or add to the font(s)?
-      Yes, but you must change the name(s) of the font(s).
-
-   5. Under what terms are derivative works allowed?
-
-      You must change the name(s) of the fonts. This is to ensure the
-      quality of the fonts, both to protect Bitstream and Gnome. We want to
-      ensure that if an application has opened a font specifically of these
-      names, it gets what it expects (though of course, using fontconfig,
-      substitutions could still could have occurred during font
-      opening). You must include the Bitstream copyright. Additional
-      copyrights can be added, as per copyright law. Happy Font Hacking!
-
-   6. If I have improvements for Bitstream Vera, is it possible they might get 
-       adopted in future versions?
-
-      Yes. The contract between the Gnome Foundation and Bitstream has
-      provisions for working with Bitstream to ensure quality additions to
-      the Bitstream Vera font family. Please contact us if you have such
-      additions. Note, that in general, we will want such additions for the
-      entire family, not just a single font, and that you'll have to keep
-      both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add
-      glyphs to the font, they must be stylistically in keeping with Vera's
-      design. Vera cannot become a "ransom note" font. Jim Lyles will be
-      providing a document describing the design elements used in Vera, as a
-      guide and aid for people interested in contributing to Vera.
-
-   7. I want to sell a software package that uses these fonts: Can I do so?
-
-      Sure. Bundle the fonts with your software and sell your software
-      with the fonts. That is the intent of the copyright.
-
-   8. If applications have built the names "Bitstream Vera" into them, 
-      can I override this somehow to use fonts of my choosing?
-
-      This depends on exact details of the software. Most open source
-      systems and software (e.g., Gnome, KDE, etc.) are now converting to
-      use fontconfig (see www.fontconfig.org) to handle font configuration,
-      selection and substitution; it has provisions for overriding font
-      names and subsituting alternatives. An example is provided by the
-      supplied local.conf file, which chooses the family Bitstream Vera for
-      "sans", "serif" and "monospace".  Other software (e.g., the XFree86
-      core server) has other mechanisms for font substitution.
\ No newline at end of file
diff --git a/build-release/font/VeraMono.ttf b/build-release/font/VeraMono.ttf
deleted file mode 100644
index 139f0b4..0000000
Binary files a/build-release/font/VeraMono.ttf and /dev/null differ
diff --git a/build-release/sfml-test b/build-release/sfml-test
deleted file mode 100755
index d9f572f..0000000
Binary files a/build-release/sfml-test and /dev/null differ
diff --git a/build-release/test_map b/build-release/test_map
deleted file mode 100644
index c4c0b65..0000000
--- a/build-release/test_map
+++ /dev/null
@@ -1,10 +0,0 @@
-size
-7 7
-map
-2 2 2 2 2 2 2
-2 0 0 0 0 0 2
-2 0 0 1 0 0 2
-2 0 0 1 1 0 2
-2 1 1 2 2 2 2
-2 0 0 0 0 0 2
-2 2 2 2 2 2 2
diff --git a/src/audio.h b/include/audio.h
similarity index 74%
rename from src/audio.h
rename to include/audio.h
index eee26c2..9f46231 100644
--- a/src/audio.h
+++ b/include/audio.h
@@ -1,5 +1,4 @@
-#ifndef AUDIO_H
-#define AUDIO_H
+#pragma once
 
 #include <memory>
 #include <array>
@@ -23,11 +22,8 @@ private:
         sf::Sound sound;
     };
 
-    using SfMusicPtr = std::unique_ptr<sf::Music>;
-    using SoundEffectPtr = std::unique_ptr<SoundEffect>;
-
-    std::array<SoundEffectPtr, N_SOUNDS> array_sounds;
-    SfMusicPtr background_music;
+    std::array<std::unique_ptr<SoundEffect>, N_SOUNDS> array_sounds;
+    std::unique_ptr<sf::Music> background_music;
 
 public:
     Audio(const std::string &background_file_name, std::array<std::string, N_SOUNDS> &&sounds_paths);
@@ -41,7 +37,3 @@ public:
     void pauseBackground();
     void setBackgroundVolume(const float &volume);
 };
-
-using AudioPtr = std::unique_ptr<Audio>;
-
-#endif // AUDIO_H
diff --git a/src/cell.h b/include/cell.h
similarity index 76%
rename from src/cell.h
rename to include/cell.h
index c84bacd..a6e9c88 100644
--- a/src/cell.h
+++ b/include/cell.h
@@ -1,5 +1,4 @@
-#ifndef CELL_H
-#define CELL_H
+#pragma once
 
 #include <memory>
 #include <vector>
@@ -39,10 +38,6 @@ class Hero;
 class Level;
 class Cell;
 
-using HeroPtr   = std::unique_ptr<Hero>;
-using LevelPtr  = std::unique_ptr<Level>;
-using CellPtr   = std::unique_ptr<Cell>;
-
 ///////////////////////////////////////
 
 /// Represents interface for all level cells
@@ -67,9 +62,9 @@ public:
     coordinate heightShift() const;
 
     /// Determine if Hero can move onto this cell or not
-    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) = 0;
+    virtual bool onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level) = 0;
 
-    virtual CellPtr clone() const = 0;
+    virtual std::unique_ptr<Cell> clone() const = 0;
 };
 
 ///////////////////////////////////////
@@ -84,9 +79,9 @@ public:
 
     virtual ~PassableCell() override;
 
-    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override;
+    virtual bool onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level) override;
 
-    virtual CellPtr clone() const override;
+    virtual std::unique_ptr<Cell> clone() const override;
 };
 
 ///////////////////////////////////////
@@ -101,9 +96,9 @@ public:
 
     virtual ~WaterCell() override;
 
-    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override;
+    virtual bool onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level) override;
 
-    virtual CellPtr clone() const override;
+    virtual std::unique_ptr<Cell> clone() const override;
 };
 
 ///////////////////////////////////////
@@ -118,9 +113,9 @@ public:
 
     virtual ~WallCell() override;
 
-    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override;
+    virtual bool onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level) override;
 
-    virtual CellPtr clone() const override;
+    virtual std::unique_ptr<Cell> clone() const override;
 };
 
 ///////////////////////////////////////
@@ -142,9 +137,9 @@ public:
 
     virtual ~ChargeCell() override;
 
-    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override;
+    virtual bool onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level) override;
 
-    virtual CellPtr clone() const override;
+    virtual std::unique_ptr<Cell> clone() const override;
 };
 
 ///////////////////////////////////////
@@ -159,9 +154,9 @@ public:
 
     virtual ~ExitCell() override;
 
-    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override;
+    virtual bool onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level) override;
 
-    virtual CellPtr clone() const override;
+    virtual std::unique_ptr<Cell> clone() const override;
 };
 
 ///////////////////////////////////////
@@ -184,9 +179,9 @@ public:
     /// Set the coordinates of this teleport destination
     void setDestination(coordinate new_cell_row, coordinate new_cell_col);
 
-    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override;
+    virtual bool onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level) override;
 
-    virtual CellPtr clone() const override;
+    virtual std::unique_ptr<Cell> clone() const override;
 };
 
 ///////////////////////////////////////
@@ -196,7 +191,7 @@ class TriggerCell final : public Cell
 {
 private:
     // Vector of cells to place on map
-    std::vector<CellPtr> vector_cells;
+    std::vector<std::unique_ptr<Cell>> vector_cells;
 
 public:
     TriggerCell(coordinate cell_row = 0,
@@ -206,11 +201,9 @@ public:
     virtual ~TriggerCell() override;
 
     /// Add a cell which has to be placed to map when the trigger gets activated
-    void addTarget(CellPtr &&cell);
+    void addTarget(std::unique_ptr<Cell> &&cell);
 
-    virtual bool onMovingTo(HeroPtr &hero, LevelPtr &level) override;
+    virtual bool onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level) override;
 
-    virtual CellPtr clone() const override;
+    virtual std::unique_ptr<Cell> clone() const override;
 };
-
-#endif // CELL_H
diff --git a/src/entity.h b/include/entity.h
similarity index 100%
rename from src/entity.h
rename to include/entity.h
diff --git a/src/game.h b/include/game.h
similarity index 88%
rename from src/game.h
rename to include/game.h
index e93c184..b4adcf2 100644
--- a/src/game.h
+++ b/include/game.h
@@ -15,9 +15,9 @@ class Game
 {
 private:
     // Game entities
-    HeroPtr hero;
-    LevelPtr level;
-    AudioPtr audio;
+    std::unique_ptr<Hero> hero;
+    std::unique_ptr<Level> level;
+    std::unique_ptr<Audio> audio;
     std::unique_ptr<Renderer> renderer; // wer is `using RendererPrt = ...` A?A?A?
 
     int current_level;
diff --git a/src/hero.h b/include/hero.h
similarity index 100%
rename from src/hero.h
rename to include/hero.h
diff --git a/src/level.h b/include/level.h
similarity index 92%
rename from src/level.h
rename to include/level.h
index 4e1e5d9..404348a 100644
--- a/src/level.h
+++ b/include/level.h
@@ -18,7 +18,7 @@ class Level
 private:
     struct Map
     {
-        using Row = std::vector<CellPtr>;
+        using Row = std::vector<std::unique_ptr<Cell>>;
         using Matrix = std::vector<Row>;
 
         enum class SECTION
@@ -43,7 +43,7 @@ private:
 
         Matrix data;
         size_t rows, cols;
-        std::array<CellPtr, N_CELLS> default_cells;
+        std::array<std::unique_ptr<Cell>, N_CELLS> default_cells;
 
         void init(const std::string &path = default_file_path);
 
@@ -72,7 +72,7 @@ public:
     size_t cols() const;
 
     /// Get cell at position row, col
-    CellPtr &getCellAt(coordinate row, coordinate col);
+    std::unique_ptr<Cell> &getCellAt(coordinate row, coordinate col);
 
     /// Place a bridge cell
     void placeBridge(coordinate x, coordinate y);
diff --git a/src/renderer.h b/include/renderer.h
similarity index 98%
rename from src/renderer.h
rename to include/renderer.h
index ba2dd78..c10dc2c 100644
--- a/src/renderer.h
+++ b/include/renderer.h
@@ -7,6 +7,8 @@
 #include <SFML/Graphics/RenderWindow.hpp>
 #include <SFML/Window.hpp>
 
+#include <memory>
+
 class Level;
 class Cell;
 class Hero;
diff --git a/build-debug/font/Bitstream Vera License.txt b/resources/font/Bitstream Vera License.txt
similarity index 100%
rename from build-debug/font/Bitstream Vera License.txt
rename to resources/font/Bitstream Vera License.txt
diff --git a/build-debug/font/VeraMono.ttf b/resources/font/VeraMono.ttf
similarity index 100%
rename from build-debug/font/VeraMono.ttf
rename to resources/font/VeraMono.ttf
diff --git a/src/audio.cpp b/src/audio.cpp
index 50f1db1..3ede45e 100644
--- a/src/audio.cpp
+++ b/src/audio.cpp
@@ -2,7 +2,7 @@
 
 Audio::Audio(const std::string &background_path, std::array<std::string, N_SOUNDS> &&sounds_paths)
 {
-    SfMusicPtr music = std::make_unique<sf::Music>();
+    std::unique_ptr<sf::Music> music = std::make_unique<sf::Music>();
     if (music->openFromFile(background_path))
         music->setLoop(true);
     else
@@ -10,7 +10,7 @@ Audio::Audio(const std::string &background_path, std::array<std::string, N_SOUND
 
     background_music = std::move(music);
 
-    SoundEffectPtr effect;
+    std::unique_ptr<SoundEffect> effect;
     for (int i = 0; i < N_SOUNDS; ++i)
     {
         effect = std::make_unique<SoundEffect>();
@@ -28,7 +28,7 @@ Audio::Audio(const std::string &background_path, std::array<std::string, N_SOUND
 
 bool Audio::setSound(const SOUND_TYPE &type, const std::string &sound_file_path)
 {
-    SoundEffectPtr effect = std::make_unique<SoundEffect>();
+    std::unique_ptr<SoundEffect> effect = std::make_unique<SoundEffect>();
 
     if (!effect->buffer.loadFromFile(sound_file_path))
         return false;
@@ -41,12 +41,13 @@ bool Audio::setSound(const SOUND_TYPE &type, const std::string &sound_file_path)
 
 void Audio::playSound(const SOUND_TYPE &type)
 {
-    array_sounds[type]->sound.play();
+    if (array_sounds[type])
+        array_sounds[type]->sound.play();
 }
 
 bool Audio::setBackground(const std::string &music_file_path)
 {
-    SfMusicPtr music = std::make_unique<sf::Music>();
+    std::unique_ptr<sf::Music> music = std::make_unique<sf::Music>();
 
     if (!music->openFromFile(music_file_path))
         return false;
@@ -57,20 +58,24 @@ bool Audio::setBackground(const std::string &music_file_path)
 
 void Audio::playBackground()
 {
-    background_music->play();
+    if (background_music)
+        background_music->play();
 }
 
 void Audio::stopBackground()
 {
-    background_music->stop();
+    if (background_music)
+        background_music->stop();
 }
 
 void Audio::pauseBackground()
 {
-    background_music->pause();
+    if (background_music)
+        background_music->pause();
 }
 
 void Audio::setBackgroundVolume(const float &volume)
 {
-    background_music->setVolume(volume);
+    if (background_music)
+        background_music->setVolume(volume);
 }
diff --git a/src/cell.cpp b/src/cell.cpp
index a90daaa..b61013d 100644
--- a/src/cell.cpp
+++ b/src/cell.cpp
@@ -38,7 +38,7 @@ PassableCell::PassableCell(coordinate cell_row, coordinate cell_col, const sf::C
 PassableCell::~PassableCell()
 {}
 
-bool PassableCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
+bool PassableCell::onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level)
 {
     UNUSED(hero), UNUSED(level);
 
@@ -46,7 +46,7 @@ bool PassableCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
     return true;
 }
 
-CellPtr PassableCell::clone() const
+std::unique_ptr<Cell> PassableCell::clone() const
 {
     return std::make_unique<PassableCell>();
 }
@@ -60,7 +60,7 @@ WaterCell::WaterCell(coordinate cell_row, coordinate cell_col, const sf::Color &
 WaterCell::~WaterCell()
 {}
 
-bool WaterCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
+bool WaterCell::onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level)
 {
     // Try to use one charge to place a bridge
     if (hero->useCharge())
@@ -69,7 +69,7 @@ bool WaterCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
     return false;
 }
 
-CellPtr WaterCell::clone() const
+std::unique_ptr<Cell> WaterCell::clone() const
 {
     return std::make_unique<WaterCell>();
 }
@@ -86,7 +86,7 @@ WallCell::WallCell(coordinate cell_row, coordinate cell_col, const sf::Color &co
 WallCell::~WallCell()
 {}
 
-bool WallCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
+bool WallCell::onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level)
 {
     UNUSED(hero), UNUSED(level);
 
@@ -94,7 +94,7 @@ bool WallCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
     return false;
 }
 
-CellPtr WallCell::clone() const
+std::unique_ptr<Cell> WallCell::clone() const
 {
     return std::make_unique<WallCell>();
 }
@@ -116,7 +116,7 @@ void ChargeCell::setCharges(const int &num_charges)
     cell_charges = num_charges;
 }
 
-bool ChargeCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
+bool ChargeCell::onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level)
 {
     // Hero picks up the charge; remove it from the map
     hero->refillCharges(cell_charges);
@@ -125,7 +125,7 @@ bool ChargeCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
     return true;
 }
 
-CellPtr ChargeCell::clone() const
+std::unique_ptr<Cell> ChargeCell::clone() const
 {
     return std::make_unique<ChargeCell>();
 }
@@ -139,7 +139,7 @@ ExitCell::ExitCell(coordinate cell_row, coordinate cell_col, const sf::Color &co
 ExitCell::~ExitCell()
 {}
 
-bool ExitCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
+bool ExitCell::onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level)
 {
     UNUSED(level);
 
@@ -148,7 +148,7 @@ bool ExitCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
     return true;
 }
 
-CellPtr ExitCell::clone() const
+std::unique_ptr<Cell> ExitCell::clone() const
 {
     return std::make_unique<ExitCell>();
 }
@@ -170,7 +170,7 @@ void TeleportCell::setDestination(coordinate new_cell_row, coordinate new_cell_c
     new_col = new_cell_col;
 }
 
-bool TeleportCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
+bool TeleportCell::onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level)
 {
     UNUSED(level);
 
@@ -179,7 +179,7 @@ bool TeleportCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
     return true;
 }
 
-CellPtr TeleportCell::clone() const
+std::unique_ptr<Cell> TeleportCell::clone() const
 {
     return std::make_unique<TeleportCell>();
 }
@@ -196,17 +196,17 @@ TriggerCell::TriggerCell(coordinate cell_row, coordinate cell_col, const sf::Col
 TriggerCell::~TriggerCell()
 {}
 
-void TriggerCell::addTarget(CellPtr &&cell)
+void TriggerCell::addTarget(std::unique_ptr<Cell> &&cell)
 {
     vector_cells.emplace_back(std::move(cell));
 }
 
-bool TriggerCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
+bool TriggerCell::onMovingTo(std::unique_ptr<Hero> &hero, std::unique_ptr<Level> &level)
 {
     UNUSED(hero);
 
 	// We replace needed cells with the ones that the trigger provides.
-    for (CellPtr &cell : vector_cells)
+    for (std::unique_ptr<Cell> &cell : vector_cells)
     {
         const coordinate &row = cell->row();
         const coordinate &col = cell->col();
@@ -221,7 +221,7 @@ bool TriggerCell::onMovingTo(HeroPtr &hero, LevelPtr &level)
     return false;
 }
 
-CellPtr TriggerCell::clone() const
+std::unique_ptr<Cell> TriggerCell::clone() const
 {
     return std::make_unique<TriggerCell>();
 }
diff --git a/src/font/Bitstream Vera License.txt b/src/font/Bitstream Vera License.txt
deleted file mode 100644
index cf00835..0000000
--- a/src/font/Bitstream Vera License.txt	
+++ /dev/null
@@ -1,123 +0,0 @@
-Bitstream Vera Fonts Copyright
-
-The fonts have a generous copyright, allowing derivative works (as
-long as "Bitstream" or "Vera" are not in the names), and full
-redistribution (so long as they are not *sold* by themselves). They
-can be be bundled, redistributed and sold with any software.
-
-The fonts are distributed under the following copyright:
-
-Copyright
-=========
-
-Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream
-Vera is a trademark of Bitstream, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the fonts accompanying this license ("Fonts") and associated
-documentation files (the "Font Software"), to reproduce and distribute
-the Font Software, including without limitation the rights to use,
-copy, merge, publish, distribute, and/or sell copies of the Font
-Software, and to permit persons to whom the Font Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright and trademark notices and this permission notice
-shall be included in all copies of one or more of the Font Software
-typefaces.
-
-The Font Software may be modified, altered, or added to, and in
-particular the designs of glyphs or characters in the Fonts may be
-modified and additional glyphs or characters may be added to the
-Fonts, only if the fonts are renamed to names not containing either
-the words "Bitstream" or the word "Vera".
-
-This License becomes null and void to the extent applicable to Fonts
-or Font Software that has been modified and is distributed under the
-"Bitstream Vera" names.
-
-The Font Software may be sold as part of a larger software package but
-no copy of one or more of the Font Software typefaces may be sold by
-itself.
-
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
-BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL,
-OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT
-SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
-
-Except as contained in this notice, the names of Gnome, the Gnome
-Foundation, and Bitstream Inc., shall not be used in advertising or
-otherwise to promote the sale, use or other dealings in this Font
-Software without prior written authorization from the Gnome Foundation
-or Bitstream Inc., respectively. For further information, contact:
-fonts at gnome dot org.
-
-Copyright FAQ
-=============
-
-   1. I don't understand the resale restriction... What gives?
-
-      Bitstream is giving away these fonts, but wishes to ensure its
-      competitors can't just drop the fonts as is into a font sale system
-      and sell them as is. It seems fair that if Bitstream can't make money
-      from the Bitstream Vera fonts, their competitors should not be able to
-      do so either. You can sell the fonts as part of any software package,
-      however.
-
-   2. I want to package these fonts separately for distribution and
-      sale as part of a larger software package or system.  Can I do so?
-
-      Yes. A RPM or Debian package is a "larger software package" to begin 
-      with, and you aren't selling them independently by themselves. 
-      See 1. above.
-
-   3. Are derivative works allowed?
-      Yes!
-
-   4. Can I change or add to the font(s)?
-      Yes, but you must change the name(s) of the font(s).
-
-   5. Under what terms are derivative works allowed?
-
-      You must change the name(s) of the fonts. This is to ensure the
-      quality of the fonts, both to protect Bitstream and Gnome. We want to
-      ensure that if an application has opened a font specifically of these
-      names, it gets what it expects (though of course, using fontconfig,
-      substitutions could still could have occurred during font
-      opening). You must include the Bitstream copyright. Additional
-      copyrights can be added, as per copyright law. Happy Font Hacking!
-
-   6. If I have improvements for Bitstream Vera, is it possible they might get 
-       adopted in future versions?
-
-      Yes. The contract between the Gnome Foundation and Bitstream has
-      provisions for working with Bitstream to ensure quality additions to
-      the Bitstream Vera font family. Please contact us if you have such
-      additions. Note, that in general, we will want such additions for the
-      entire family, not just a single font, and that you'll have to keep
-      both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add
-      glyphs to the font, they must be stylistically in keeping with Vera's
-      design. Vera cannot become a "ransom note" font. Jim Lyles will be
-      providing a document describing the design elements used in Vera, as a
-      guide and aid for people interested in contributing to Vera.
-
-   7. I want to sell a software package that uses these fonts: Can I do so?
-
-      Sure. Bundle the fonts with your software and sell your software
-      with the fonts. That is the intent of the copyright.
-
-   8. If applications have built the names "Bitstream Vera" into them, 
-      can I override this somehow to use fonts of my choosing?
-
-      This depends on exact details of the software. Most open source
-      systems and software (e.g., Gnome, KDE, etc.) are now converting to
-      use fontconfig (see www.fontconfig.org) to handle font configuration,
-      selection and substitution; it has provisions for overriding font
-      names and subsituting alternatives. An example is provided by the
-      supplied local.conf file, which chooses the family Bitstream Vera for
-      "sans", "serif" and "monospace".  Other software (e.g., the XFree86
-      core server) has other mechanisms for font substitution.
\ No newline at end of file
diff --git a/src/font/VeraMono.ttf b/src/font/VeraMono.ttf
deleted file mode 100644
index 139f0b4..0000000
Binary files a/src/font/VeraMono.ttf and /dev/null differ
diff --git a/src/level.cpp b/src/level.cpp
index dacd937..1da7281 100644
--- a/src/level.cpp
+++ b/src/level.cpp
@@ -169,7 +169,7 @@ size_t Level::cols() const
     return map.cols;
 }
 
-CellPtr &Level::getCellAt(coordinate row, coordinate col)
+std::unique_ptr<Cell> &Level::getCellAt(coordinate row, coordinate col)
 {
     return map.data[row][col];
 }
diff --git a/src/renderer.cpp b/src/renderer.cpp
index a6b3f1b..61e8f7e 100644
--- a/src/renderer.cpp
+++ b/src/renderer.cpp
@@ -19,7 +19,7 @@ Renderer::Renderer() :
     vertical_shift(0),
     horizontal_shift(0)
 {
-    font.loadFromFile("font/VeraMono.ttf");
+    font.loadFromFile("resources/font/VeraMono.ttf");
     text_charges.setFont(font);
     text_charges.setFillColor(palette::White);
     text_charges.setCharacterSize(25);
@@ -43,7 +43,7 @@ Renderer::Renderer() :
     brush_wall.setOutlineThickness(0);
 }
 
-bool Renderer::drawCell(const CellPtr &cell, sf::RenderWindow &main_window)
+bool Renderer::drawCell(const std::unique_ptr<Cell> &cell, sf::RenderWindow &main_window)
 {
     vertical_shift = static_cast<float>(cell->heightShift());
 
@@ -72,7 +72,7 @@ bool Renderer::drawCell(const CellPtr &cell, sf::RenderWindow &main_window)
     return true;
 }
 
-bool Renderer::render(const LevelPtr &level, const HeroPtr &hero, sf::RenderWindow &main_window)
+bool Renderer::render(const std::unique_ptr<Level> &level, const std::unique_ptr<Hero> &hero, sf::RenderWindow &main_window)
 {
     if (!hero || !level)
         return false;
diff --git a/src/sfml-test.pro b/src/sfml-test.pro
deleted file mode 100644
index 43e0b3e..0000000
--- a/src/sfml-test.pro
+++ /dev/null
@@ -1,30 +0,0 @@
-TEMPLATE = app
-CONFIG += c++17
-CONFIG -= console app_bundle
-CONFIG -= qt
-
-QMAKE_CXXFLAGS = -Wall -Werror -Wextra -Wpedantic -Wconversion -std=c++17 -O0 -g
-
-SOURCES += \
-    audio.cpp \
-    cell.cpp \
-    entity.cpp \
-    game.cpp \
-    hero.cpp \
-    level.cpp \
-    main.cpp \
-    renderer.cpp
-
-HEADERS += \
-    audio.h \
-    cell.h \
-    entity.h \
-    game.h \
-    hero.h \
-    level.h \
-    renderer.h
-
-# Only to highlight syntax when I am on Windows
-win32:INCLUDEPATH += d:\SFML-2.5.1\include
-
-LIBS += -lsfml-graphics -lsfml-audio -lsfml-window -lsfml-system