diff --git a/README.md b/README.md
index 8632f33e60b197764fd29685e8b5c9d391b1e8b8..d1208c010dcab14de03e67badab84c71f3e65533 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,7 @@ Install all the dependencies with the package manager of your distribution:
 - opengl
 - openal
 - openssl or libressl
+- agg
 
 Optional dependencies:
 
@@ -55,6 +56,7 @@ On debian buster, the packages are the following:
 - libboost-regex-dev
 - libboost-thread-dev
 - astyle
+- libagg-dev
 
 ### Build the binary
 
diff --git a/assdraw/Makefile b/assdraw/Makefile
index 34127323566da17d1c482454c9c562c200279799..23f2479d6794bd31fc11af144b539dba437092b4 100644
--- a/assdraw/Makefile
+++ b/assdraw/Makefile
@@ -2,15 +2,6 @@ include $(dir $(lastword $(MAKEFILE_LIST)))../header.mk
 
 PROGRAM += $(d)assdraw
 
-libres_SOURCES := \
-	$(d)xpm/res.cpp \
-	$(d)xpm/res.h
-
-libaggwindow_SOURCES := \
-	$(d)wxAGG/AGGWindow.cpp \
-	$(d)wxAGG/AGGWindow.h \
-	$(d)wxAGG/PixelFormatConvertor.h
-
 assdraw_EXTRA_DIST := \
 	$(d)_common.hpp \
 	$(d)agghelper.hpp \
@@ -23,11 +14,18 @@ assdraw_EXTRA_DIST := \
 	$(d)enums.hpp \
 	$(d)include_once.hpp \
 	$(d)library.hpp \
-	$(d)settings.hpp
+	$(d)settings.hpp \
+ 	$(d)agg_bcspline.h \
+ 	$(d)agg_conv_bcspline.h \
+ 	$(d)agg_vcgen_bcspline.h \
+ 	$(d)resource.h \
+	$(d)xpm/res.h \
+	$(d)wxAGG/AGGWindow.h \
+	$(d)wxAGG/PixelFormatConvertor.h
 
 assdraw_SOURCES := \
-	$(libres_SOURCES) \
-	$(libaggwindow_SOURCES) \
+	$(d)xpm/res.cpp \
+	$(d)wxAGG/AGGWindow.cpp \
 	$(d)agg_bcspline.cpp \
 	$(d)agg_vcgen_bcspline.cpp \
 	$(d)assdraw.cpp \
@@ -40,11 +38,7 @@ assdraw_SOURCES := \
 	$(d)library.cpp \
 	$(d)settings.cpp
 
-assdraw_SOURCES += \
-	$(d)agg_bcspline.h \
-	$(d)agg_conv_bcspline.h \
-	$(d)agg_vcgen_bcspline.h \
-	$(d)resource.h
-
-
-assdraw_OBJ := $(assdraw_SOURCES:.cpp=.o)
+assdraw_CPPFLAGS := -I$(d)
+assdraw_CXXFLAGS := $(CXXFLAGS_WX)
+assdraw_OBJ      := $(assdraw_SOURCES:.cpp=.o)
+assdraw_LIBS     := $(LIBS_WX)
diff --git a/assdraw/agg_bcspline.h b/assdraw/agg_bcspline.h
index e5f049b97902d3b00ef6776bb01190182f5c545d..a91d4ba3e87bf9593d0c92bf155d9f99c2f16c6f 100644
--- a/assdraw/agg_bcspline.h
+++ b/assdraw/agg_bcspline.h
@@ -25,7 +25,7 @@
 #ifndef AGG_bcspline_INCLUDED
 #define AGG_bcspline_INCLUDED
 
-#include "agg_array.h"
+#include <agg2/agg_array.h>
 
 namespace agg {
 //----------------------------------------------------------------bcspline
diff --git a/assdraw/agg_conv_bcspline.h b/assdraw/agg_conv_bcspline.h
index 6a4cac602c64af8a587c6edad2fed174efa229b9..984ddcfbce31248d63310e522a62184336999f53 100644
--- a/assdraw/agg_conv_bcspline.h
+++ b/assdraw/agg_conv_bcspline.h
@@ -25,9 +25,9 @@
 #ifndef AGG_conv_bcspline_INCLUDED
 #define AGG_conv_bcspline_INCLUDED
 
-#include "agg_basics.h"
+#include <agg2/agg_basics.h>
 #include "agg_vcgen_bcspline.h"
-#include "agg_conv_adaptor_vcgen.h"
+#include <agg2/agg_conv_adaptor_vcgen.h>
 
 
 namespace agg {
diff --git a/assdraw/agg_vcgen_bcspline.h b/assdraw/agg_vcgen_bcspline.h
index e9f68577b41a8c6baff9c8e79d2baf43b9ebf7ba..f7e5b85b8f1e5c530bd9986766ef8130bcc9311a 100644
--- a/assdraw/agg_vcgen_bcspline.h
+++ b/assdraw/agg_vcgen_bcspline.h
@@ -25,8 +25,8 @@
 #ifndef AGG_vcgen_bcspline_INCLUDED
 #define AGG_vcgen_bcspline_INCLUDED
 
-#include "agg_basics.h"
-#include "agg_array.h"
+#include <agg2/agg_basics.h>
+#include <agg2/agg_array.h>
 #include "agg_bcspline.h"
 
 
diff --git a/assdraw/agghelper.hpp b/assdraw/agghelper.hpp
index 4a2a9904fb836c0246a3101c16f461dd4e8caac3..a42916ccc63914bd209c91035f4adb6945d58b08 100644
--- a/assdraw/agghelper.hpp
+++ b/assdraw/agghelper.hpp
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "agg_path_storage.h"
+#include <agg2/agg_path_storage.h>
 
 class agghelper {
 public:
diff --git a/assdraw/assdraw.cpp b/assdraw/assdraw.cpp
index b80966e5d86c275b7196c4ed659d9972fe69f184..ebb3af45e6f9f36fa7fc9bf746a4e8bdfba6d9f7 100644
--- a/assdraw/assdraw.cpp
+++ b/assdraw/assdraw.cpp
@@ -615,11 +615,12 @@ void ASSDrawFrame::OnChoose_TBarRClickMenu(wxCommandEvent &event)
         if (tb[i]) {
             if (show[0])
                 m_mgr.GetPane(tbar[i]).Show(show[1]);
-            if (dock[0])
+            if (dock[0]) {
                 if (dock[1])
                     m_mgr.GetPane(tbar[i]).Dock();
                 else
                     m_mgr.GetPane(tbar[i]).Float();
+            }
         }
     }
     m_mgr.Update();
diff --git a/assdraw/canvas.cpp b/assdraw/canvas.cpp
index 56f6fe6155e58f3a52f758dd51b475e825f428d7..8cbe7929caff17adf81a1eb05397b4d1152dace7 100644
--- a/assdraw/canvas.cpp
+++ b/assdraw/canvas.cpp
@@ -35,11 +35,11 @@
 
 #include "assdraw.hpp"
 #include "cmd.hpp"
-#include "agg_gsv_text.h"
-#include "agg_ellipse.h"
-#include "agg_conv_dash.h"
-#include "agg_trans_bilinear.h"
-#include "agg_trans_perspective.h"
+#include <agg2/agg_gsv_text.h>
+#include <agg2/agg_ellipse.h>
+#include <agg2/agg_conv_dash.h>
+#include <agg2/agg_trans_bilinear.h>
+#include <agg2/agg_trans_perspective.h>
 
 #include "agghelper.hpp"
 #include <math.h>
@@ -300,6 +300,7 @@ void ASSDrawCanvas::OnMouseMove(wxMouseEvent &event)
                     undodesc = _T("Bilinear transform");
                     *dragAnchor_left = mouse_point;
                     break;
+
                 case MODE_SCALEROTATE:
                     if (rectbound2upd2 == -1) { //only one vertex dragged
                         int adjacent[2] = { (rectbound2upd + 3) % 4, (rectbound2upd + 1) % 4 };
@@ -378,6 +379,10 @@ void ASSDrawCanvas::OnMouseMove(wxMouseEvent &event)
                     UpdateTranformModeRectCenter();
                     undodesc = _T("Scale");
                     break;
+
+                default:
+                    /* FIXME: Add an error message here */
+                    break;
                 }
 
                 // update points
@@ -577,11 +582,17 @@ void ASSDrawCanvas::ProcessOnMouseLeftUp()
         newcommand->Init();
         switch (newcommand->type) {
         case M:
-            undodesc = _T("Add a new M"); break;
+            undodesc = _T("Add a new M");
+            break;
         case L:
-            undodesc = _T("Add a new L"); break;
+            undodesc = _T("Add a new L");
+            break;
         case B:
-            undodesc = _T("Add a new B"); break;
+            undodesc = _T("Add a new B");
+            break;
+        default:
+            /* FIXME: Add an error message here */
+            break;
         }
         newcommand = NULL;
         // we need to manually refresh the GUI to draw the new control points
@@ -603,11 +614,17 @@ void ASSDrawCanvas::ProcessOnMouseLeftUp()
             RefreshDisplay();
             switch (t) {
             case M:
-                undodesc = _T("Delete a M"); break;
+                undodesc = _T("Delete a M");
+                break;
             case L:
-                undodesc = _T("Delete a L"); break;
+                undodesc = _T("Delete a L");
+                break;
             case B:
-                undodesc = _T("Delete a B"); break;
+                undodesc = _T("Delete a B");
+                break;
+            default:
+                /* FIXME: Add an error message here */
+                break;
             }
         }
         else {
@@ -675,6 +692,9 @@ void ASSDrawCanvas::OnMouseLeftDown(wxMouseEvent &event)
     case MODE_B:
         newcommand = NewCmd(B, px, py);
         break;
+    default:
+        /* FIXME: Add an error message here */
+        break;
     }
 
     // continue working on the new command (if any)
@@ -812,10 +832,12 @@ void ASSDrawCanvas::OnMouseRightDClick(wxMouseEvent &event)
 #endif
         menu->Append(cmdmenuitem);
         menu->Enable(MENU_DUMMY, false);
+
         switch (dblclicked_point_right->cmd_main->type) {
         case L:
             menu->Append(MENU_DRC_LNTOBEZ, _T("Convert to Bezier curve (B command)"));
             break;
+
         case B:
             if (dblclicked_point_right->type != MP) break;
             menu->AppendCheckItem(MENU_DRC_BEZTOLN, _T("Convert to line (L command)"));
@@ -825,6 +847,10 @@ void ASSDrawCanvas::OnMouseRightDClick(wxMouseEvent &event)
                     menu->Check(MENU_DRC_C1CONTBEZ, true);
             }
             break;
+
+        default:
+            /* FIXME: Add an error message here */
+            break;
         }
 
     }
@@ -898,11 +924,12 @@ void ASSDrawCanvas::ChangeZoomLevel( double amount, wxPoint bgzoomctr )
     if (CanZoom() && drag_mode.drawing)
         ChangeDrawingZoomLevel( amount );
 
-    if (CanZoom() && drag_mode.bgimg)
+    if (CanZoom() && drag_mode.bgimg) {
         if (drag_mode.drawing)
             ChangeBackgroundZoomLevel(bgimg.scale * pointsys->scale / old_scale, wxRealPoint(pointsys->originx, pointsys->originy));
         else
             ChangeBackgroundZoomLevel(bgimg.scale + amount / 10.0,  wxRealPoint(bgzoomctr.x, bgzoomctr.y));
+    }
 
     RefreshDisplay();
 }
@@ -952,7 +979,12 @@ void ASSDrawCanvas::MoveCanvasDrawing(double xamount, double yamount)
             rectbound2[i].x += (int) xamount;
             rectbound2[i].y += (int) yamount;
         }
-        unsigned vertices = backupcmds.total_vertices();
+        unsigned vertices_unsigned = backupcmds.total_vertices();
+        int vertices               = vertices_unsigned;
+        if (vertices < 0) {
+            /* Place an overflow error message here */
+            abort();
+        }
         double x, y;
         for (int i = 0; i < vertices; i++) {
             backupcmds.vertex(i, &x, &y);
@@ -1045,7 +1077,8 @@ void ASSDrawCanvas::EnforceC1Continuity (DrawCmd *cmd, Point *pnt)
         theotherpoint = *it;
         mainpoint = prevb->m_point;
     }
-    else if (pnt->num = cmd->controlpoints.size()) {
+    /* XXX: Here replaced `=` by `==`. See if it breaks things or not */
+    else if (pnt->num == cmd->controlpoints.size()) {
         DrawCmd_B *thisb = static_cast< DrawCmd_B * >(cmd);
         if (!thisb->C1Cont) return;
         theotherpoint = *(cmd->m_point->cmd_next->controlpoints.begin());
@@ -1209,7 +1242,7 @@ void ASSDrawCanvas::DoDraw( RendererBase &rbase, RendererPrimitives &rprim, Rend
         rasterizer.reset();
         interpolator_type interpolator(bgimg.img_mtx);
         PixelFormat::AGGType ipixfmt(bgimg.ibuf);
-        span_gen_type spangen(ipixfmt, agg::rgba_pre(0, 0, 0), interpolator);
+        span_gen_type spangen(ipixfmt, agg::rgba_pre(0, 0, 0, 0), interpolator);
         agg::conv_transform< agg::path_storage > bg_border(bgimg.bg_path, bgimg.path_mtx);
         agg::conv_clip_polygon< agg::conv_transform< agg::path_storage >> bg_clip(bg_border);
         bg_clip.clip_box(0, 0, ww, hh);
@@ -1640,7 +1673,12 @@ void ASSDrawCanvas::UpdateNonUniformTransformation()
         rectbound2[3].x, rectbound2[3].y
     };
     agg::path_storage trans;
-    unsigned vertices = backupcmds.total_vertices();
+    unsigned vertices_unsigned = backupcmds.total_vertices();
+    int vertices               = vertices_unsigned;
+    if (vertices < 0) {
+        /* FIXME: Place an abort overflow error message here */
+        abort();
+    }
 
     agg::trans_bilinear trans_b(rectbound[0].x, rectbound[0].y, rectbound[2].x, rectbound[2].y, bound);
     agg::conv_transform<agg::path_storage, agg::trans_bilinear> transb(backupcmds, trans_b);
@@ -1740,33 +1778,33 @@ void ASSDrawCanvas::CustomOnKeyDown(wxKeyEvent &event)
                 }
                 else {
                     Point *warpto = NULL;
-                    if (pointedAt_point->type == MP && pointedAt_point->cmd_next)
+                    if (pointedAt_point->type == MP && pointedAt_point->cmd_next) {
                         if (pointedAt_point->cmd_next->controlpoints.size() > 0)
                             warpto = pointedAt_point->cmd_next->controlpoints.front();
                         else
                             warpto = pointedAt_point->cmd_next->m_point;
+                    }
+                    else {
+                        PointList::iterator it = pointedAt_point->cmd_main->controlpoints.begin();
+                        while (*it != pointedAt_point) it++;
+                        it++;
+                        if (it == pointedAt_point->cmd_main->controlpoints.end())
+                            warpto = pointedAt_point->cmd_main->m_point;
+                        else
+                            warpto = *it;
+                    }
+                    if (warpto == NULL)
+                        warpto = cmds.front()->m_point;
+                    wxPoint point = warpto->ToWxPoint();
+                    WarpPointer(point.x, point.y);
                 }
-                else {
-                    PointList::iterator it = pointedAt_point->cmd_main->controlpoints.begin();
-                    while (*it != pointedAt_point) it++;
-                    it++;
-                    if (it == pointedAt_point->cmd_main->controlpoints.end())
-                        warpto = pointedAt_point->cmd_main->m_point;
-                    else
-                        warpto = *it;
-                }
-                if (warpto == NULL)
-                    warpto = cmds.front()->m_point;
-                wxPoint point = warpto->ToWxPoint();
-                WarpPointer(point.x, point.y);
             }
+            break;
+        default:
+            event.Skip();
         }
-        break;
-    default:
-        event.Skip();
     }
 }
-}
 
 void ASSDrawCanvas::CustomOnKeyUp(wxKeyEvent &event)
 {
diff --git a/assdraw/canvas.hpp b/assdraw/canvas.hpp
index 8f83d6127cd7c1d1292fda3b84dd59be99edb76b..73a3ecd44e03081bc1eafbe7cfdfa83f1a12a3a9 100644
--- a/assdraw/canvas.hpp
+++ b/assdraw/canvas.hpp
@@ -44,12 +44,12 @@
 #include <wx/splitter.h>
 #include <wx/clntdata.h>
 
-#include "agg_span_allocator.h"
-#include "agg_span_interpolator_linear.h"
-#include "agg_span_image_filter_rgb.h"
-#include "agg_span_image_filter_rgba.h"
-#include "agg_image_accessors.h"
-#include "agg_conv_clip_polygon.h"
+#include <agg2/agg_span_allocator.h>
+#include <agg2/agg_span_interpolator_linear.h>
+#include <agg2/agg_span_image_filter_rgb.h>
+#include <agg2/agg_span_image_filter_rgba.h>
+#include <agg2/agg_image_accessors.h>
+#include <agg2/agg_conv_clip_polygon.h>
 
 class ASSDrawFrame;
 class ASSDrawCanvas;
diff --git a/assdraw/engine.hpp b/assdraw/engine.hpp
index 30c1d4e604ef1c709bce846241ac8de2921c6bec..e5155351ebed8a22dd4c8768be5682d48693f7a1 100644
--- a/assdraw/engine.hpp
+++ b/assdraw/engine.hpp
@@ -45,19 +45,19 @@
 
 // agg support
 #include "wxAGG/AGGWindow.h"
-#include "agg_color_rgba.h"
-#include "agg_rasterizer_scanline_aa.h"
-#include "agg_scanline_p.h"
-#include "agg_renderer_base.h"
-#include "agg_renderer_primitives.h"
-#include "agg_renderer_scanline.h"
-#include "agg_path_storage.h"
-#include "agg_curves.h"
-#include "agg_conv_curve.h"
-#include "agg_conv_contour.h"
-#include "agg_conv_stroke.h"
+#include <agg2/agg_color_rgba.h>
+#include <agg2/agg_rasterizer_scanline_aa.h>
+#include <agg2/agg_scanline_p.h>
+#include <agg2/agg_renderer_base.h>
+#include <agg2/agg_renderer_primitives.h>
+#include <agg2/agg_renderer_scanline.h>
+#include <agg2/agg_path_storage.h>
+#include <agg2/agg_curves.h>
+#include <agg2/agg_conv_curve.h>
+#include <agg2/agg_conv_contour.h>
+#include <agg2/agg_conv_stroke.h>
 #include "agg_conv_bcspline.h"
-#include "agg_math.h"
+#include <agg2/agg_math.h>
 
 #define DEFAULT_SCALE 10
 
diff --git a/assdraw/wxAGG/AGGWindow.cpp b/assdraw/wxAGG/AGGWindow.cpp
index f412edfcf0864829abb2b71b50637a644bc60698..08de413189d43aff8069eaa02a7e1fcbe9d76bdd 100644
--- a/assdraw/wxAGG/AGGWindow.cpp
+++ b/assdraw/wxAGG/AGGWindow.cpp
@@ -1,7 +1,7 @@
 #include "AGGWindow.h"
 
-#include "agg_rendering_buffer.h"
-#include "agg_pixfmt_rgb.h"
+#include <agg2/agg_rendering_buffer.h>
+#include <agg2/agg_pixfmt_rgb.h>
 
 #include <wx/dcclient.h>
 
diff --git a/assdraw/wxAGG/AGGWindow.h b/assdraw/wxAGG/AGGWindow.h
index 3c46990c8f7a7e2e34d722319a1b3fc093d89040..21a91b387fcce9440991aeb4d5ab5986dfe5a7ac 100644
--- a/assdraw/wxAGG/AGGWindow.h
+++ b/assdraw/wxAGG/AGGWindow.h
@@ -8,7 +8,7 @@
 #include <wx/window.h>
 #include <wx/dcmemory.h>
 
-#include "agg_rendering_buffer.h"
+#include <agg2/agg_rendering_buffer.h>
 
 namespace GUI {
 
diff --git a/assdraw/wxAGG/PixelFormatConvertor.h b/assdraw/wxAGG/PixelFormatConvertor.h
index 4f89c44949b012a84724564c141ccba681c4b60d..f5cfaab123eca8666fb7810016d5918011ce037b 100644
--- a/assdraw/wxAGG/PixelFormatConvertor.h
+++ b/assdraw/wxAGG/PixelFormatConvertor.h
@@ -28,8 +28,8 @@
 #ifndef WX_AGG_PIXEL_FORMAT_CONVERTOR_H
 #define WX_AGG_PIXEL_FORMAT_CONVERTOR_H
 
-#include "agg_pixfmt_rgb.h"
-#include "agg_pixfmt_rgba.h"
+#include <agg2/agg_pixfmt_rgb.h>
+#include <agg2/agg_pixfmt_rgba.h>
 
 namespace {
 
diff --git a/libaegisub/lua/modules/lfs.cpp b/libaegisub/lua/modules/lfs.cpp
index 8053b6893a76fc28af0a6a77d308c5a86af398c8..38f29d7928852a64ba247379c0ff366c067b6220 100644
--- a/libaegisub/lua/modules/lfs.cpp
+++ b/libaegisub/lua/modules/lfs.cpp
@@ -112,7 +112,7 @@ DirectoryIterator *dir_new(const char *path, char **err)
 
 const char *get_mode(const char *path, char **err)
 {
-    return wrap(err, [ = ]() -> const char* {
+    return wrap(err, [ = ]() -> const char * {
         switch (bfs::status(path).type())
         {
         case bfs::file_not_found: return nullptr;         break;
diff --git a/src/mkv_wrap.cpp b/src/mkv_wrap.cpp
index bc9aa58d97a978112a6e5279b3822a6574cb01a3..acb4be0e7c9732b0be224ea1f3ad2bdc0c26c282 100644
--- a/src/mkv_wrap.cpp
+++ b/src/mkv_wrap.cpp
@@ -105,7 +105,7 @@ struct MkvStdIO final : InputStream {
         read = &MkvStdIO::Read;
         scan = &MkvStdIO::Scan;
         getcachesize = [](InputStream *) -> unsigned int { return 16 * 1024 * 1024; };
-        geterror = [](InputStream * st) -> const char* { return ((MkvStdIO *)st)->error.c_str(); };
+        geterror = [](InputStream * st) -> const char * { return ((MkvStdIO *)st)->error.c_str(); };
         memalloc = [](InputStream *, size_t size) { return malloc(size); };
         memrealloc = [](InputStream *, void *mem, size_t size) { return realloc(mem, size); };
         memfree = [](InputStream *, void *mem) { free(mem); };