diff --git a/icinga-studio/aboutform.hpp b/icinga-studio/aboutform.hpp
index 3e0bc9022..1614acd24 100644
--- a/icinga-studio/aboutform.hpp
+++ b/icinga-studio/aboutform.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class AboutForm : public AboutFormBase
+class AboutForm final : public AboutFormBase
 {
 public:
 	AboutForm(wxWindow *parent);
diff --git a/icinga-studio/connectform.hpp b/icinga-studio/connectform.hpp
index 035b2a158..3820e7d66 100644
--- a/icinga-studio/connectform.hpp
+++ b/icinga-studio/connectform.hpp
@@ -26,7 +26,7 @@
 namespace icinga
 {
 
-class ConnectForm : public ConnectFormBase
+class ConnectForm final : public ConnectFormBase
 {
 public:
 	ConnectForm(wxWindow *parent, const Url::Ptr& url);
diff --git a/icinga-studio/icinga-studio.cpp b/icinga-studio/icinga-studio.cpp
index f6e5814c0..913fcde27 100644
--- a/icinga-studio/icinga-studio.cpp
+++ b/icinga-studio/icinga-studio.cpp
@@ -26,7 +26,7 @@
 
 using namespace icinga;
 
-class IcingaStudio : public wxApp
+class IcingaStudio final : public wxApp
 {
 public:
 	virtual bool OnInit(void) override
diff --git a/icinga-studio/mainform.hpp b/icinga-studio/mainform.hpp
index 99ec09c06..28c8bc99d 100644
--- a/icinga-studio/mainform.hpp
+++ b/icinga-studio/mainform.hpp
@@ -28,7 +28,7 @@
 namespace icinga
 {
 
-class MainForm : public MainFormBase
+class MainForm final : public MainFormBase
 {
 public:
 	MainForm(wxWindow *parent, const Url::Ptr& url);
diff --git a/lib/base/application.hpp b/lib/base/application.hpp
index 2ce037b23..4c207c38d 100644
--- a/lib/base/application.hpp
+++ b/lib/base/application.hpp
@@ -174,7 +174,7 @@ protected:
 
 	virtual void OnShutdown(void);
 
-	virtual void ValidateName(const String& value, const ValidationUtils& utils) override;
+	virtual void ValidateName(const String& value, const ValidationUtils& utils) override final;
 
 private:
 	static Application::Ptr m_Instance; /**< The application instance. */
diff --git a/lib/base/array.hpp b/lib/base/array.hpp
index a601b34d6..a6719c05d 100644
--- a/lib/base/array.hpp
+++ b/lib/base/array.hpp
@@ -35,7 +35,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class Array : public Object
+class Array final : public Object
 {
 public:
 	DECLARE_OBJECT(Array);
diff --git a/lib/base/configobject.cpp b/lib/base/configobject.cpp
index 50691ff9f..5610be878 100644
--- a/lib/base/configobject.cpp
+++ b/lib/base/configobject.cpp
@@ -91,7 +91,7 @@ void ConfigObject::ClearExtension(const String& key)
 	extensions->Remove(key);
 }
 
-class ModAttrValidationUtils : public ValidationUtils
+class ModAttrValidationUtils final : public ValidationUtils
 {
 public:
 	virtual bool ValidateName(const String& type, const String& name) const override
diff --git a/lib/base/configwriter.hpp b/lib/base/configwriter.hpp
index 3bb55249b..54eac6417 100644
--- a/lib/base/configwriter.hpp
+++ b/lib/base/configwriter.hpp
@@ -33,7 +33,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class ConfigIdentifier : public Object
+class ConfigIdentifier final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ConfigIdentifier);
diff --git a/lib/base/datetime.hpp b/lib/base/datetime.hpp
index 3637738d4..9378a6bde 100644
--- a/lib/base/datetime.hpp
+++ b/lib/base/datetime.hpp
@@ -33,7 +33,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class DateTime : public ObjectImpl<DateTime>
+class DateTime final : public ObjectImpl<DateTime>
 {
 public:
 	DECLARE_OBJECT(DateTime);
diff --git a/lib/base/dictionary.hpp b/lib/base/dictionary.hpp
index cfca95a6d..aae0ed8f9 100644
--- a/lib/base/dictionary.hpp
+++ b/lib/base/dictionary.hpp
@@ -35,7 +35,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class Dictionary : public Object
+class Dictionary final : public Object
 {
 public:
 	DECLARE_OBJECT(Dictionary);
diff --git a/lib/base/exception.hpp b/lib/base/exception.hpp
index 08ec022ff..18dbdd012 100644
--- a/lib/base/exception.hpp
+++ b/lib/base/exception.hpp
@@ -55,7 +55,7 @@ public:
 	ScriptError(const String& message, const DebugInfo& di, bool incompleteExpr = false);
 	~ScriptError(void) throw();
 
-	virtual const char *what(void) const throw() override;
+	virtual const char *what(void) const throw() override final;
 
 	DebugInfo GetDebugInfo(void) const;
 	bool IsIncompleteExpression(void) const;
@@ -79,7 +79,7 @@ public:
 	ValidationError(const ConfigObject::Ptr& object, const std::vector<String>& attributePath, const String& message);
 	~ValidationError(void) throw();
 
-	virtual const char *what(void) const throw() override;
+	virtual const char *what(void) const throw() override final;
 
 	ConfigObject::Ptr GetObject(void) const;
 	std::vector<String> GetAttributePath(void) const;
@@ -128,7 +128,7 @@ public:
 	posix_error(void);
 	virtual ~posix_error(void) throw();
 
-	virtual const char *what(void) const throw() override;
+	virtual const char *what(void) const throw() override final;
 
 private:
 	mutable char *m_Message;
diff --git a/lib/base/fifo.hpp b/lib/base/fifo.hpp
index f596e9426..163087e9a 100644
--- a/lib/base/fifo.hpp
+++ b/lib/base/fifo.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class FIFO : public Stream
+class FIFO final : public Stream
 {
 public:
 	DECLARE_PTR_TYPEDEFS(FIFO);
diff --git a/lib/base/filelogger.hpp b/lib/base/filelogger.hpp
index 1e82750ed..1728d973a 100644
--- a/lib/base/filelogger.hpp
+++ b/lib/base/filelogger.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class FileLogger : public ObjectImpl<FileLogger>
+class FileLogger final : public ObjectImpl<FileLogger>
 {
 public:
 	DECLARE_OBJECT(FileLogger);
diff --git a/lib/base/function.hpp b/lib/base/function.hpp
index 531bd3288..d17fef526 100644
--- a/lib/base/function.hpp
+++ b/lib/base/function.hpp
@@ -35,7 +35,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class Function : public ObjectImpl<Function>
+class Function final : public ObjectImpl<Function>
 {
 public:
 	DECLARE_OBJECT(Function);
diff --git a/lib/base/logger.hpp b/lib/base/logger.hpp
index 69606158c..a7532c615 100644
--- a/lib/base/logger.hpp
+++ b/lib/base/logger.hpp
@@ -90,7 +90,7 @@ public:
 	static void SetConsoleLogSeverity(LogSeverity logSeverity);
 	static LogSeverity GetConsoleLogSeverity(void);
 
-	virtual void ValidateSeverity(const String& value, const ValidationUtils& utils) override;
+	virtual void ValidateSeverity(const String& value, const ValidationUtils& utils) override final;
 
 protected:
 	virtual void Start(bool runtimeCreated) override;
diff --git a/lib/base/networkstream.hpp b/lib/base/networkstream.hpp
index be1000796..1860d777a 100644
--- a/lib/base/networkstream.hpp
+++ b/lib/base/networkstream.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class NetworkStream : public Stream
+class NetworkStream final : public Stream
 {
 public:
 	DECLARE_PTR_TYPEDEFS(NetworkStream);
diff --git a/lib/base/objecttype.hpp b/lib/base/objecttype.hpp
index 9b3da8972..f60b309b9 100644
--- a/lib/base/objecttype.hpp
+++ b/lib/base/objecttype.hpp
@@ -27,7 +27,7 @@
 namespace icinga
 {
 
-class ObjectType : public Type
+class ObjectType final : public Type
 {
 public:
 	ObjectType(void);
diff --git a/lib/base/perfdatavalue.hpp b/lib/base/perfdatavalue.hpp
index 3da0bd724..305758b4f 100644
--- a/lib/base/perfdatavalue.hpp
+++ b/lib/base/perfdatavalue.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class PerfdataValue : public ObjectImpl<PerfdataValue>
+class PerfdataValue final : public ObjectImpl<PerfdataValue>
 {
 public:
 	DECLARE_OBJECT(PerfdataValue);
diff --git a/lib/base/primitivetype.hpp b/lib/base/primitivetype.hpp
index 9c30ef5b8..9db856385 100644
--- a/lib/base/primitivetype.hpp
+++ b/lib/base/primitivetype.hpp
@@ -27,7 +27,7 @@
 namespace icinga
 {
 
-class PrimitiveType : public Type
+class PrimitiveType final : public Type
 {
 public:
 	PrimitiveType(const String& name, const String& base, const ObjectFactory& factory = ObjectFactory());
diff --git a/lib/base/process.hpp b/lib/base/process.hpp
index bfd28baa4..a4dd5aea6 100644
--- a/lib/base/process.hpp
+++ b/lib/base/process.hpp
@@ -49,7 +49,7 @@ struct ProcessResult
  *
  * @ingroup base
  */
-class Process : public Object
+class Process final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(Process);
diff --git a/lib/base/ringbuffer.hpp b/lib/base/ringbuffer.hpp
index 30b2f31bd..dd5fe7359 100644
--- a/lib/base/ringbuffer.hpp
+++ b/lib/base/ringbuffer.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class RingBuffer : public Object
+class RingBuffer final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(RingBuffer);
diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp
index 2acb13ab5..28a5f9b39 100644
--- a/lib/base/socketevents.hpp
+++ b/lib/base/socketevents.hpp
@@ -119,7 +119,7 @@ protected:
 	friend class SocketEvents;
 };
 
-class SocketEventEnginePoll : public SocketEventEngine
+class SocketEventEnginePoll final : public SocketEventEngine
 {
 public:
 	virtual void Register(SocketEvents *se, Object *lifesupportObject);
diff --git a/lib/base/stdiostream.hpp b/lib/base/stdiostream.hpp
index 238d37f87..a1f14ab01 100644
--- a/lib/base/stdiostream.hpp
+++ b/lib/base/stdiostream.hpp
@@ -26,7 +26,7 @@
 
 namespace icinga {
 
-class StdioStream : public Stream
+class StdioStream final : public Stream
 {
 public:
 	DECLARE_PTR_TYPEDEFS(StdioStream);
diff --git a/lib/base/streamlogger.hpp b/lib/base/streamlogger.hpp
index 793c00ccb..e89674f38 100644
--- a/lib/base/streamlogger.hpp
+++ b/lib/base/streamlogger.hpp
@@ -48,8 +48,8 @@ public:
 	static void ProcessLogEntry(std::ostream& stream, const LogEntry& entry);
 
 protected:
-	virtual void ProcessLogEntry(const LogEntry& entry) override;
-	virtual void Flush(void) override;
+	virtual void ProcessLogEntry(const LogEntry& entry) override final;
+	virtual void Flush(void) override final;
 
 private:
 	static boost::mutex m_Mutex;
diff --git a/lib/base/sysloglogger.hpp b/lib/base/sysloglogger.hpp
index 762f051e0..49c730dbf 100644
--- a/lib/base/sysloglogger.hpp
+++ b/lib/base/sysloglogger.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class SyslogLogger : public ObjectImpl<SyslogLogger>
+class SyslogLogger final : public ObjectImpl<SyslogLogger>
 {
 public:
 	DECLARE_OBJECT(SyslogLogger);
diff --git a/lib/base/tcpsocket.hpp b/lib/base/tcpsocket.hpp
index e8ba26428..1b99128ae 100644
--- a/lib/base/tcpsocket.hpp
+++ b/lib/base/tcpsocket.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class TcpSocket : public Socket
+class TcpSocket final : public Socket
 {
 public:
 	DECLARE_PTR_TYPEDEFS(TcpSocket);
diff --git a/lib/base/timer.hpp b/lib/base/timer.hpp
index e28c404d4..265d8acdf 100644
--- a/lib/base/timer.hpp
+++ b/lib/base/timer.hpp
@@ -33,7 +33,7 @@ class TimerHolder;
  *
  * @ingroup base
  */
-class Timer : public Object
+class Timer final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(Timer);
diff --git a/lib/base/tlsstream.hpp b/lib/base/tlsstream.hpp
index d4dd5a17d..6b7dd0e95 100644
--- a/lib/base/tlsstream.hpp
+++ b/lib/base/tlsstream.hpp
@@ -43,7 +43,7 @@ enum TlsAction
  *
  * @ingroup base
  */
-class TlsStream : public Stream, private SocketEvents
+class TlsStream final : public Stream, private SocketEvents
 {
 public:
 	DECLARE_PTR_TYPEDEFS(TlsStream);
diff --git a/lib/base/type.hpp b/lib/base/type.hpp
index 09d550bd4..817d347e8 100644
--- a/lib/base/type.hpp
+++ b/lib/base/type.hpp
@@ -117,7 +117,7 @@ private:
 	Object::Ptr m_Prototype;
 };
 
-class TypeType : public Type
+class TypeType final : public Type
 {
 public:
 	DECLARE_PTR_TYPEDEFS(Type);
diff --git a/lib/base/unixsocket.hpp b/lib/base/unixsocket.hpp
index a7e31f779..4105eee0d 100644
--- a/lib/base/unixsocket.hpp
+++ b/lib/base/unixsocket.hpp
@@ -26,7 +26,7 @@
 namespace icinga
 {
 
-class UnixSocket : public Socket
+class UnixSocket final : public Socket
 {
 public:
 	DECLARE_PTR_TYPEDEFS(UnixSocket);
diff --git a/lib/checker/checkercomponent.hpp b/lib/checker/checkercomponent.hpp
index 16d33a3e0..87823ce09 100644
--- a/lib/checker/checkercomponent.hpp
+++ b/lib/checker/checkercomponent.hpp
@@ -63,7 +63,7 @@ struct CheckableNextCheckExtractor
 /**
  * @ingroup checker
  */
-class CheckerComponent : public ObjectImpl<CheckerComponent>
+class CheckerComponent final : public ObjectImpl<CheckerComponent>
 {
 public:
 	DECLARE_OBJECT(CheckerComponent);
diff --git a/lib/cli/apisetupcommand.hpp b/lib/cli/apisetupcommand.hpp
index 7f8bda23f..5af132db3 100644
--- a/lib/cli/apisetupcommand.hpp
+++ b/lib/cli/apisetupcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class ApiSetupCommand : public CLICommand
+class ApiSetupCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ApiSetupCommand);
diff --git a/lib/cli/calistcommand.hpp b/lib/cli/calistcommand.hpp
index 508dca819..bc56fdc55 100644
--- a/lib/cli/calistcommand.hpp
+++ b/lib/cli/calistcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class CAListCommand : public CLICommand
+class CAListCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(CAListCommand);
diff --git a/lib/cli/casigncommand.hpp b/lib/cli/casigncommand.hpp
index 7a9894477..3cc785bbc 100644
--- a/lib/cli/casigncommand.hpp
+++ b/lib/cli/casigncommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class CASignCommand : public CLICommand
+class CASignCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(CASignCommand);
diff --git a/lib/cli/consolecommand.hpp b/lib/cli/consolecommand.hpp
index 54ff810ab..c6ea320cd 100644
--- a/lib/cli/consolecommand.hpp
+++ b/lib/cli/consolecommand.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class ConsoleCommand : public CLICommand
+class ConsoleCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ConsoleCommand);
diff --git a/lib/cli/daemoncommand.hpp b/lib/cli/daemoncommand.hpp
index ec2531da7..e919d8f1b 100644
--- a/lib/cli/daemoncommand.hpp
+++ b/lib/cli/daemoncommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class DaemonCommand : public CLICommand
+class DaemonCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(DaemonCommand);
diff --git a/lib/cli/featuredisablecommand.hpp b/lib/cli/featuredisablecommand.hpp
index 64d953a1e..f8d55a353 100644
--- a/lib/cli/featuredisablecommand.hpp
+++ b/lib/cli/featuredisablecommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class FeatureDisableCommand : public CLICommand
+class FeatureDisableCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(FeatureDisableCommand);
diff --git a/lib/cli/featureenablecommand.hpp b/lib/cli/featureenablecommand.hpp
index 259ea155f..e727c3536 100644
--- a/lib/cli/featureenablecommand.hpp
+++ b/lib/cli/featureenablecommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class FeatureEnableCommand : public CLICommand
+class FeatureEnableCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(FeatureEnableCommand);
diff --git a/lib/cli/featurelistcommand.hpp b/lib/cli/featurelistcommand.hpp
index 3238a8579..1fa0b4f92 100644
--- a/lib/cli/featurelistcommand.hpp
+++ b/lib/cli/featurelistcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class FeatureListCommand : public CLICommand
+class FeatureListCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(FeatureListCommand);
diff --git a/lib/cli/nodesetupcommand.hpp b/lib/cli/nodesetupcommand.hpp
index 5f346bda7..afa76e1e6 100644
--- a/lib/cli/nodesetupcommand.hpp
+++ b/lib/cli/nodesetupcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class NodeSetupCommand : public CLICommand
+class NodeSetupCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(NodeSetupCommand);
diff --git a/lib/cli/nodewizardcommand.hpp b/lib/cli/nodewizardcommand.hpp
index 380f859c4..6ef479037 100644
--- a/lib/cli/nodewizardcommand.hpp
+++ b/lib/cli/nodewizardcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class NodeWizardCommand : public CLICommand
+class NodeWizardCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(NodeWizardCommand);
diff --git a/lib/cli/objectlistcommand.hpp b/lib/cli/objectlistcommand.hpp
index e234ce159..c00aa07fb 100644
--- a/lib/cli/objectlistcommand.hpp
+++ b/lib/cli/objectlistcommand.hpp
@@ -33,7 +33,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class ObjectListCommand : public CLICommand
+class ObjectListCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ObjectListCommand);
diff --git a/lib/cli/pkinewcacommand.hpp b/lib/cli/pkinewcacommand.hpp
index 54fea8362..227e00101 100644
--- a/lib/cli/pkinewcacommand.hpp
+++ b/lib/cli/pkinewcacommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class PKINewCACommand : public CLICommand
+class PKINewCACommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(PKINewCACommand);
diff --git a/lib/cli/pkinewcertcommand.hpp b/lib/cli/pkinewcertcommand.hpp
index 966f1b2fd..438e20840 100644
--- a/lib/cli/pkinewcertcommand.hpp
+++ b/lib/cli/pkinewcertcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class PKINewCertCommand : public CLICommand
+class PKINewCertCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(PKINewCertCommand);
diff --git a/lib/cli/pkirequestcommand.hpp b/lib/cli/pkirequestcommand.hpp
index 107611dd9..51a5994d3 100644
--- a/lib/cli/pkirequestcommand.hpp
+++ b/lib/cli/pkirequestcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class PKIRequestCommand : public CLICommand
+class PKIRequestCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(PKIRequestCommand);
diff --git a/lib/cli/pkisavecertcommand.hpp b/lib/cli/pkisavecertcommand.hpp
index b74e28c5c..743368d7a 100644
--- a/lib/cli/pkisavecertcommand.hpp
+++ b/lib/cli/pkisavecertcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class PKISaveCertCommand : public CLICommand
+class PKISaveCertCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(PKISaveCertCommand);
diff --git a/lib/cli/pkisigncsrcommand.hpp b/lib/cli/pkisigncsrcommand.hpp
index de0c014a9..26ed2cd3e 100644
--- a/lib/cli/pkisigncsrcommand.hpp
+++ b/lib/cli/pkisigncsrcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class PKISignCSRCommand : public CLICommand
+class PKISignCSRCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(PKISignCSRCommand);
diff --git a/lib/cli/pkiticketcommand.hpp b/lib/cli/pkiticketcommand.hpp
index ce2d90655..1839889a8 100644
--- a/lib/cli/pkiticketcommand.hpp
+++ b/lib/cli/pkiticketcommand.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class PKITicketCommand : public CLICommand
+class PKITicketCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(PKITicketCommand);
diff --git a/lib/cli/troubleshootcommand.hpp b/lib/cli/troubleshootcommand.hpp
index e7eddf8a4..7f9e6283d 100644
--- a/lib/cli/troubleshootcommand.hpp
+++ b/lib/cli/troubleshootcommand.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class TroubleshootCommand : public CLICommand
+class TroubleshootCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(TroubleshootCommand);
diff --git a/lib/cli/variablegetcommand.hpp b/lib/cli/variablegetcommand.hpp
index a19956648..9c59310c2 100644
--- a/lib/cli/variablegetcommand.hpp
+++ b/lib/cli/variablegetcommand.hpp
@@ -33,7 +33,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class VariableGetCommand : public CLICommand
+class VariableGetCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(VariableGetCommand);
diff --git a/lib/cli/variablelistcommand.hpp b/lib/cli/variablelistcommand.hpp
index 43de41d3d..00048bd8e 100644
--- a/lib/cli/variablelistcommand.hpp
+++ b/lib/cli/variablelistcommand.hpp
@@ -33,7 +33,7 @@ namespace icinga
  *
  * @ingroup cli
  */
-class VariableListCommand : public CLICommand
+class VariableListCommand final : public CLICommand
 {
 public:
 	DECLARE_PTR_TYPEDEFS(VariableListCommand);
diff --git a/lib/compat/checkresultreader.hpp b/lib/compat/checkresultreader.hpp
index 8e1d4d6e2..ba2a741ca 100644
--- a/lib/compat/checkresultreader.hpp
+++ b/lib/compat/checkresultreader.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup compat
  */
-class CheckResultReader : public ObjectImpl<CheckResultReader>
+class CheckResultReader final : public ObjectImpl<CheckResultReader>
 {
 public:
 	DECLARE_OBJECT(CheckResultReader);
diff --git a/lib/compat/compatlogger.hpp b/lib/compat/compatlogger.hpp
index b875aa72a..c1edeef30 100644
--- a/lib/compat/compatlogger.hpp
+++ b/lib/compat/compatlogger.hpp
@@ -33,7 +33,7 @@ namespace icinga
  *
  * @ingroup compat
  */
-class CompatLogger : public ObjectImpl<CompatLogger>
+class CompatLogger final : public ObjectImpl<CompatLogger>
 {
 public:
 	DECLARE_OBJECT(CompatLogger);
diff --git a/lib/compat/externalcommandlistener.hpp b/lib/compat/externalcommandlistener.hpp
index 16eed348a..93c47ae33 100644
--- a/lib/compat/externalcommandlistener.hpp
+++ b/lib/compat/externalcommandlistener.hpp
@@ -33,7 +33,7 @@ namespace icinga
 /**
  * @ingroup compat
  */
-class ExternalCommandListener : public ObjectImpl<ExternalCommandListener>
+class ExternalCommandListener final : public ObjectImpl<ExternalCommandListener>
 {
 public:
 	DECLARE_OBJECT(ExternalCommandListener);
diff --git a/lib/compat/statusdatawriter.hpp b/lib/compat/statusdatawriter.hpp
index 9221273af..26a53eb5e 100644
--- a/lib/compat/statusdatawriter.hpp
+++ b/lib/compat/statusdatawriter.hpp
@@ -36,7 +36,7 @@ namespace icinga
 /**
  * @ingroup compat
  */
-class StatusDataWriter : public ObjectImpl<StatusDataWriter>
+class StatusDataWriter final : public ObjectImpl<StatusDataWriter>
 {
 public:
 	DECLARE_OBJECT(StatusDataWriter);
diff --git a/lib/config/activationcontext.hpp b/lib/config/activationcontext.hpp
index ff30b7d4b..5f773e409 100644
--- a/lib/config/activationcontext.hpp
+++ b/lib/config/activationcontext.hpp
@@ -28,7 +28,7 @@
 namespace icinga
 {
 
-class ActivationContext : public Object
+class ActivationContext final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ActivationContext);
diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp
index 0d501ef6f..9d657c4ca 100644
--- a/lib/config/configitem.cpp
+++ b/lib/config/configitem.cpp
@@ -152,7 +152,7 @@ std::shared_ptr<Expression> ConfigItem::GetFilter(void) const
 	return m_Filter;
 }
 
-class DefaultValidationUtils : public ValidationUtils
+class DefaultValidationUtils final : public ValidationUtils
 {
 public:
 	virtual bool ValidateName(const String& type, const String& name) const override
diff --git a/lib/config/configitem.hpp b/lib/config/configitem.hpp
index f2fc84037..29b332f92 100644
--- a/lib/config/configitem.hpp
+++ b/lib/config/configitem.hpp
@@ -36,7 +36,7 @@ namespace icinga
  *
  * @ingroup config
  */
-class ConfigItem : public Object {
+class ConfigItem final : public Object {
 public:
 	DECLARE_PTR_TYPEDEFS(ConfigItem);
 
diff --git a/lib/config/configitembuilder.hpp b/lib/config/configitembuilder.hpp
index d1a344a29..1e400a5a5 100644
--- a/lib/config/configitembuilder.hpp
+++ b/lib/config/configitembuilder.hpp
@@ -34,7 +34,7 @@ namespace icinga
  *
  * @ingroup config
  */
-class ConfigItemBuilder : public Object
+class ConfigItemBuilder final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ConfigItemBuilder);
diff --git a/lib/config/expression.hpp b/lib/config/expression.hpp
index 1bf55b0d4..d9c3e841b 100644
--- a/lib/config/expression.hpp
+++ b/lib/config/expression.hpp
@@ -217,7 +217,7 @@ public:
 
 std::unique_ptr<Expression> MakeIndexer(ScopeSpecifier scopeSpec, const String& index);
 
-class OwnedExpression : public Expression
+class OwnedExpression final : public Expression
 {
 public:
 	OwnedExpression(const std::shared_ptr<Expression>& expression)
@@ -239,7 +239,7 @@ private:
 	std::shared_ptr<Expression> m_Expression;
 };
 
-class LiteralExpression : public Expression
+class LiteralExpression final : public Expression
 {
 public:
 	LiteralExpression(const Value& value = Value());
@@ -274,7 +274,7 @@ public:
 	{ }
 
 protected:
-	virtual const DebugInfo& GetDebugInfo(void) const override;
+	virtual const DebugInfo& GetDebugInfo(void) const override final;
 
 	DebugInfo m_DebugInfo;
 };
@@ -302,7 +302,7 @@ protected:
 	std::unique_ptr<Expression> m_Operand2;
 };
 
-class VariableExpression : public DebuggableExpression
+class VariableExpression final : public DebuggableExpression
 {
 public:
 	VariableExpression(const String& variable, const DebugInfo& debugInfo = DebugInfo())
@@ -324,7 +324,7 @@ private:
 	friend void BindToScope(std::unique_ptr<Expression>& expr, ScopeSpecifier scopeSpec);
 };
 
-class NegateExpression : public UnaryExpression
+class NegateExpression final : public UnaryExpression
 {
 public:
 	NegateExpression(std::unique_ptr<Expression> operand, const DebugInfo& debugInfo = DebugInfo())
@@ -335,7 +335,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class LogicalNegateExpression : public UnaryExpression
+class LogicalNegateExpression final : public UnaryExpression
 {
 public:
 	LogicalNegateExpression(std::unique_ptr<Expression> operand, const DebugInfo& debugInfo = DebugInfo())
@@ -346,7 +346,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class AddExpression : public BinaryExpression
+class AddExpression final : public BinaryExpression
 {
 public:
 	AddExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -357,7 +357,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class SubtractExpression : public BinaryExpression
+class SubtractExpression final : public BinaryExpression
 {
 public:
 	SubtractExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -368,7 +368,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class MultiplyExpression : public BinaryExpression
+class MultiplyExpression final : public BinaryExpression
 {
 public:
 	MultiplyExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -379,7 +379,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class DivideExpression : public BinaryExpression
+class DivideExpression final : public BinaryExpression
 {
 public:
 	DivideExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -390,7 +390,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class ModuloExpression : public BinaryExpression
+class ModuloExpression final : public BinaryExpression
 {
 public:
 	ModuloExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -401,7 +401,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class XorExpression : public BinaryExpression
+class XorExpression final : public BinaryExpression
 {
 public:
 	XorExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -412,7 +412,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class BinaryAndExpression : public BinaryExpression
+class BinaryAndExpression final : public BinaryExpression
 {
 public:
 	BinaryAndExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -423,7 +423,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class BinaryOrExpression : public BinaryExpression
+class BinaryOrExpression final : public BinaryExpression
 {
 public:
 	BinaryOrExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -434,7 +434,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class ShiftLeftExpression : public BinaryExpression
+class ShiftLeftExpression final : public BinaryExpression
 {
 public:
 	ShiftLeftExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -445,7 +445,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class ShiftRightExpression : public BinaryExpression
+class ShiftRightExpression final : public BinaryExpression
 {
 public:
 	ShiftRightExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -456,7 +456,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class EqualExpression : public BinaryExpression
+class EqualExpression final : public BinaryExpression
 {
 public:
 	EqualExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -467,7 +467,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class NotEqualExpression : public BinaryExpression
+class NotEqualExpression final : public BinaryExpression
 {
 public:
 	NotEqualExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -478,7 +478,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class LessThanExpression : public BinaryExpression
+class LessThanExpression final : public BinaryExpression
 {
 public:
 	LessThanExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -489,7 +489,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class GreaterThanExpression : public BinaryExpression
+class GreaterThanExpression final : public BinaryExpression
 {
 public:
 	GreaterThanExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -500,7 +500,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class LessThanOrEqualExpression : public BinaryExpression
+class LessThanOrEqualExpression final : public BinaryExpression
 {
 public:
 	LessThanOrEqualExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -511,7 +511,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class GreaterThanOrEqualExpression : public BinaryExpression
+class GreaterThanOrEqualExpression final : public BinaryExpression
 {
 public:
 	GreaterThanOrEqualExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -522,7 +522,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class InExpression : public BinaryExpression
+class InExpression final : public BinaryExpression
 {
 public:
 	InExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -533,7 +533,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class NotInExpression : public BinaryExpression
+class NotInExpression final : public BinaryExpression
 {
 public:
 	NotInExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -544,7 +544,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class LogicalAndExpression : public BinaryExpression
+class LogicalAndExpression final : public BinaryExpression
 {
 public:
 	LogicalAndExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -555,7 +555,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class LogicalOrExpression : public BinaryExpression
+class LogicalOrExpression final : public BinaryExpression
 {
 public:
 	LogicalOrExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -566,7 +566,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class FunctionCallExpression : public DebuggableExpression
+class FunctionCallExpression final : public DebuggableExpression
 {
 public:
 	FunctionCallExpression(std::unique_ptr<Expression> fname, std::vector<std::unique_ptr<Expression> >&& args, const DebugInfo& debugInfo = DebugInfo())
@@ -581,7 +581,7 @@ public:
 	std::vector<std::unique_ptr<Expression> > m_Args;
 };
 
-class ArrayExpression : public DebuggableExpression
+class ArrayExpression final : public DebuggableExpression
 {
 public:
 	ArrayExpression(std::vector<std::unique_ptr<Expression > >&& expressions, const DebugInfo& debugInfo = DebugInfo())
@@ -595,7 +595,7 @@ private:
 	std::vector<std::unique_ptr<Expression> > m_Expressions;
 };
 
-class DictExpression : public DebuggableExpression
+class DictExpression final : public DebuggableExpression
 {
 public:
 	DictExpression(std::vector<std::unique_ptr<Expression> >&& expressions = {}, const DebugInfo& debugInfo = DebugInfo())
@@ -614,7 +614,7 @@ private:
 	friend void BindToScope(std::unique_ptr<Expression>& expr, ScopeSpecifier scopeSpec);
 };
 
-class SetExpression : public BinaryExpression
+class SetExpression final : public BinaryExpression
 {
 public:
 	SetExpression(std::unique_ptr<Expression> operand1, CombinedSetOp op, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -630,7 +630,7 @@ private:
 	friend void BindToScope(std::unique_ptr<Expression>& expr, ScopeSpecifier scopeSpec);
 };
 
-class ConditionalExpression : public DebuggableExpression
+class ConditionalExpression final : public DebuggableExpression
 {
 public:
 	ConditionalExpression(std::unique_ptr<Expression> condition, std::unique_ptr<Expression> true_branch, std::unique_ptr<Expression> false_branch, const DebugInfo& debugInfo = DebugInfo())
@@ -646,7 +646,7 @@ private:
 	std::unique_ptr<Expression> m_FalseBranch;
 };
 
-class WhileExpression : public DebuggableExpression
+class WhileExpression final : public DebuggableExpression
 {
 public:
 	WhileExpression(std::unique_ptr<Expression> condition, std::unique_ptr<Expression> loop_body, const DebugInfo& debugInfo = DebugInfo())
@@ -662,7 +662,7 @@ private:
 };
 
 
-class ReturnExpression : public UnaryExpression
+class ReturnExpression final : public UnaryExpression
 {
 public:
 	ReturnExpression(std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
@@ -673,7 +673,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class BreakExpression : public DebuggableExpression
+class BreakExpression final : public DebuggableExpression
 {
 public:
 	BreakExpression(const DebugInfo& debugInfo = DebugInfo())
@@ -684,7 +684,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class ContinueExpression : public DebuggableExpression
+class ContinueExpression final : public DebuggableExpression
 {
 public:
 	ContinueExpression(const DebugInfo& debugInfo = DebugInfo())
@@ -695,7 +695,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class GetScopeExpression : public Expression
+class GetScopeExpression final : public Expression
 {
 public:
 	GetScopeExpression(ScopeSpecifier scopeSpec)
@@ -709,7 +709,7 @@ private:
 	ScopeSpecifier m_ScopeSpec;
 };
 
-class IndexerExpression : public BinaryExpression
+class IndexerExpression final : public BinaryExpression
 {
 public:
 	IndexerExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
@@ -725,7 +725,7 @@ protected:
 
 void BindToScope(std::unique_ptr<Expression>& expr, ScopeSpecifier scopeSpec);
 
-class ThrowExpression : public DebuggableExpression
+class ThrowExpression final : public DebuggableExpression
 {
 public:
 	ThrowExpression(std::unique_ptr<Expression> message, bool incompleteExpr, const DebugInfo& debugInfo = DebugInfo())
@@ -740,7 +740,7 @@ private:
 	bool m_IncompleteExpr;
 };
 
-class ImportExpression : public DebuggableExpression
+class ImportExpression final : public DebuggableExpression
 {
 public:
 	ImportExpression(std::unique_ptr<Expression> name, const DebugInfo& debugInfo = DebugInfo())
@@ -754,7 +754,7 @@ private:
 	std::unique_ptr<Expression> m_Name;
 };
 
-class ImportDefaultTemplatesExpression : public DebuggableExpression
+class ImportDefaultTemplatesExpression final : public DebuggableExpression
 {
 public:
 	ImportDefaultTemplatesExpression(const DebugInfo& debugInfo = DebugInfo())
@@ -765,7 +765,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class FunctionExpression : public DebuggableExpression
+class FunctionExpression final : public DebuggableExpression
 {
 public:
 	FunctionExpression(const String& name, const std::vector<String>& args,
@@ -783,7 +783,7 @@ private:
 	std::shared_ptr<Expression> m_Expression;
 };
 
-class ApplyExpression : public DebuggableExpression
+class ApplyExpression final : public DebuggableExpression
 {
 public:
 	ApplyExpression(const String& type, const String& target, std::unique_ptr<Expression> name,
@@ -813,7 +813,7 @@ private:
 	std::shared_ptr<Expression> m_Expression;
 };
 
-class ObjectExpression : public DebuggableExpression
+class ObjectExpression final : public DebuggableExpression
 {
 public:
 	ObjectExpression(bool abstract, std::unique_ptr<Expression> type, std::unique_ptr<Expression> name, std::unique_ptr<Expression> filter,
@@ -840,7 +840,7 @@ private:
 	std::shared_ptr<Expression> m_Expression;
 };
 
-class ForExpression : public DebuggableExpression
+class ForExpression final : public DebuggableExpression
 {
 public:
 	ForExpression(const String& fkvar, const String& fvvar, std::unique_ptr<Expression> value, std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
@@ -857,7 +857,7 @@ private:
 	std::unique_ptr<Expression> m_Expression;
 };
 
-class LibraryExpression : public UnaryExpression
+class LibraryExpression final : public UnaryExpression
 {
 public:
 	LibraryExpression(std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
@@ -875,7 +875,7 @@ enum IncludeType
 	IncludeZones
 };
 
-class IncludeExpression : public DebuggableExpression
+class IncludeExpression final : public DebuggableExpression
 {
 public:
 	IncludeExpression(const String& relativeBase, std::unique_ptr<Expression> path, std::unique_ptr<Expression> pattern, std::unique_ptr<Expression> name,
@@ -898,7 +898,7 @@ private:
 	String m_Package;
 };
 
-class BreakpointExpression : public DebuggableExpression
+class BreakpointExpression final : public DebuggableExpression
 {
 public:
 	BreakpointExpression(const DebugInfo& debugInfo = DebugInfo())
@@ -909,7 +909,7 @@ protected:
 	virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
 };
 
-class UsingExpression : public DebuggableExpression
+class UsingExpression final : public DebuggableExpression
 {
 public:
 	UsingExpression(std::unique_ptr<Expression> name, const DebugInfo& debugInfo = DebugInfo())
@@ -923,7 +923,7 @@ private:
 	std::unique_ptr<Expression> m_Name;
 };
 
-class TryExceptExpression : public DebuggableExpression
+class TryExceptExpression final : public DebuggableExpression
 {
 public:
 	TryExceptExpression(std::unique_ptr<Expression> tryBody, std::unique_ptr<Expression> exceptBody, const DebugInfo& debugInfo = DebugInfo())
diff --git a/lib/db_ido/commanddbobject.hpp b/lib/db_ido/commanddbobject.hpp
index 3afa72a86..862f26a77 100644
--- a/lib/db_ido/commanddbobject.hpp
+++ b/lib/db_ido/commanddbobject.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class CommandDbObject : public DbObject
+class CommandDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(CommandDbObject);
diff --git a/lib/db_ido/dbconnection.hpp b/lib/db_ido/dbconnection.hpp
index afd8aedaf..eab1170aa 100644
--- a/lib/db_ido/dbconnection.hpp
+++ b/lib/db_ido/dbconnection.hpp
@@ -76,8 +76,8 @@ public:
 	int GetQueryCount(RingBuffer::SizeType span);
 	virtual int GetPendingQueryCount(void) const = 0;
 
-	virtual void ValidateFailoverTimeout(double value, const ValidationUtils& utils) override;
-	virtual void ValidateCategories(const Array::Ptr& value, const ValidationUtils& utils) override;
+	virtual void ValidateFailoverTimeout(double value, const ValidationUtils& utils) override final;
+	virtual void ValidateCategories(const Array::Ptr& value, const ValidationUtils& utils) override final;
 
 protected:
 	virtual void OnConfigLoaded(void) override;
diff --git a/lib/db_ido/dbtype.hpp b/lib/db_ido/dbtype.hpp
index e0c42ff69..2f79e8c64 100644
--- a/lib/db_ido/dbtype.hpp
+++ b/lib/db_ido/dbtype.hpp
@@ -36,7 +36,7 @@ class DbObject;
  *
  * @ingroup ido
  */
-class DbType : public Object
+class DbType final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(DbType);
diff --git a/lib/db_ido/dbvalue.hpp b/lib/db_ido/dbvalue.hpp
index f52bfc2c2..ac3fbc8df 100644
--- a/lib/db_ido/dbvalue.hpp
+++ b/lib/db_ido/dbvalue.hpp
@@ -39,7 +39,7 @@ enum DbValueType
  *
  * @ingroup ido
  */
-struct DbValue : public Object
+struct DbValue final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(DbValue);
diff --git a/lib/db_ido/endpointdbobject.hpp b/lib/db_ido/endpointdbobject.hpp
index f75a3832e..b773f6241 100644
--- a/lib/db_ido/endpointdbobject.hpp
+++ b/lib/db_ido/endpointdbobject.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class EndpointDbObject : public DbObject
+class EndpointDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(EndpointDbObject);
diff --git a/lib/db_ido/hostdbobject.hpp b/lib/db_ido/hostdbobject.hpp
index 71e8a78b5..68fc4307a 100644
--- a/lib/db_ido/hostdbobject.hpp
+++ b/lib/db_ido/hostdbobject.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class HostDbObject : public DbObject
+class HostDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(HostDbObject);
diff --git a/lib/db_ido/hostgroupdbobject.hpp b/lib/db_ido/hostgroupdbobject.hpp
index a3342018d..4033f9b3a 100644
--- a/lib/db_ido/hostgroupdbobject.hpp
+++ b/lib/db_ido/hostgroupdbobject.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class HostGroupDbObject : public DbObject
+class HostGroupDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(HostGroupDbObject);
diff --git a/lib/db_ido/servicedbobject.hpp b/lib/db_ido/servicedbobject.hpp
index 882cba6d3..b10c56108 100644
--- a/lib/db_ido/servicedbobject.hpp
+++ b/lib/db_ido/servicedbobject.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class ServiceDbObject : public DbObject
+class ServiceDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ServiceDbObject);
diff --git a/lib/db_ido/servicegroupdbobject.hpp b/lib/db_ido/servicegroupdbobject.hpp
index 30262eda5..e7a2601cc 100644
--- a/lib/db_ido/servicegroupdbobject.hpp
+++ b/lib/db_ido/servicegroupdbobject.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class ServiceGroupDbObject : public DbObject
+class ServiceGroupDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ServiceGroupDbObject);
diff --git a/lib/db_ido/timeperioddbobject.hpp b/lib/db_ido/timeperioddbobject.hpp
index ef7fac915..2f110db53 100644
--- a/lib/db_ido/timeperioddbobject.hpp
+++ b/lib/db_ido/timeperioddbobject.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class TimePeriodDbObject : public DbObject
+class TimePeriodDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(TimePeriodDbObject);
diff --git a/lib/db_ido/userdbobject.hpp b/lib/db_ido/userdbobject.hpp
index 32cb2ed41..5f55fd175 100644
--- a/lib/db_ido/userdbobject.hpp
+++ b/lib/db_ido/userdbobject.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class UserDbObject : public DbObject
+class UserDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(UserDbObject);
diff --git a/lib/db_ido/usergroupdbobject.hpp b/lib/db_ido/usergroupdbobject.hpp
index ecb07ff11..8e3aa6204 100644
--- a/lib/db_ido/usergroupdbobject.hpp
+++ b/lib/db_ido/usergroupdbobject.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class UserGroupDbObject : public DbObject
+class UserGroupDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(UserGroupDbObject);
diff --git a/lib/db_ido/zonedbobject.hpp b/lib/db_ido/zonedbobject.hpp
index 4bdc4cefc..433487751 100644
--- a/lib/db_ido/zonedbobject.hpp
+++ b/lib/db_ido/zonedbobject.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup ido
  */
-class ZoneDbObject : public DbObject
+class ZoneDbObject final : public DbObject
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ZoneDbObject);
diff --git a/lib/db_ido_mysql/idomysqlconnection.hpp b/lib/db_ido_mysql/idomysqlconnection.hpp
index 2b0ce81bb..357fe200b 100644
--- a/lib/db_ido_mysql/idomysqlconnection.hpp
+++ b/lib/db_ido_mysql/idomysqlconnection.hpp
@@ -45,7 +45,7 @@ struct IdoAsyncQuery
  *
  * @ingroup ido
  */
-class IdoMysqlConnection : public ObjectImpl<IdoMysqlConnection>
+class IdoMysqlConnection final : public ObjectImpl<IdoMysqlConnection>
 {
 public:
 	DECLARE_OBJECT(IdoMysqlConnection);
diff --git a/lib/db_ido_pgsql/idopgsqlconnection.hpp b/lib/db_ido_pgsql/idopgsqlconnection.hpp
index 577bdf348..69cd57ef2 100644
--- a/lib/db_ido_pgsql/idopgsqlconnection.hpp
+++ b/lib/db_ido_pgsql/idopgsqlconnection.hpp
@@ -37,7 +37,7 @@ typedef std::shared_ptr<PGresult> IdoPgsqlResult;
  *
  * @ingroup ido
  */
-class IdoPgsqlConnection : public ObjectImpl<IdoPgsqlConnection>
+class IdoPgsqlConnection final : public ObjectImpl<IdoPgsqlConnection>
 {
 public:
 	DECLARE_OBJECT(IdoPgsqlConnection);
diff --git a/lib/demo/demo.hpp b/lib/demo/demo.hpp
index d566bb122..f4a8b256a 100644
--- a/lib/demo/demo.hpp
+++ b/lib/demo/demo.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup demo
  */
-class Demo : public ObjectImpl<Demo>
+class Demo final : public ObjectImpl<Demo>
 {
 public:
 	DECLARE_OBJECT(Demo);
diff --git a/lib/hello/helloapplication.hpp b/lib/hello/helloapplication.hpp
index c6ca60598..2dcbaeeb4 100644
--- a/lib/hello/helloapplication.hpp
+++ b/lib/hello/helloapplication.hpp
@@ -30,7 +30,7 @@ namespace icinga
  *
  * @ingroup hello
  */
-class HelloApplication : public ObjectImpl<HelloApplication>
+class HelloApplication final : public ObjectImpl<HelloApplication>
 {
 public:
 	DECLARE_OBJECT(HelloApplication);
diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp
index da15fb212..7f1a3a991 100644
--- a/lib/icinga/checkable.hpp
+++ b/lib/icinga/checkable.hpp
@@ -115,7 +115,7 @@ public:
 	bool HasBeenChecked(void) const;
 	virtual bool IsStateOK(ServiceState state) = 0;
 
-	virtual double GetLastCheck(void) const override;
+	virtual double GetLastCheck(void) const override final;
 
 	virtual void SaveLastState(ServiceState state, double timestamp) = 0;
 
@@ -145,7 +145,7 @@ public:
 	static boost::signals2::signal<void (const Checkable::Ptr&)> OnEventCommandExecuted;
 
 	/* Downtimes */
-	virtual int GetDowntimeDepth(void) const override;
+	virtual int GetDowntimeDepth(void) const override final;
 
 	void RemoveAllDowntimes(void);
 	void TriggerDowntimes(void);
@@ -191,8 +191,8 @@ public:
 	void RemoveReverseDependency(const intrusive_ptr<Dependency>& dep);
 	std::vector<intrusive_ptr<Dependency> > GetReverseDependencies(void) const;
 
-	virtual void ValidateCheckInterval(double value, const ValidationUtils& utils) override;
-	virtual void ValidateMaxCheckAttempts(int value, const ValidationUtils& utils) override;
+	virtual void ValidateCheckInterval(double value, const ValidationUtils& utils) override final;
+	virtual void ValidateMaxCheckAttempts(int value, const ValidationUtils& utils) override final;
 
 	static void IncreasePendingChecks(void);
 	static void DecreasePendingChecks(void);
diff --git a/lib/icinga/checkcommand.hpp b/lib/icinga/checkcommand.hpp
index 2502bc1b4..84c89fe82 100644
--- a/lib/icinga/checkcommand.hpp
+++ b/lib/icinga/checkcommand.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class CheckCommand : public ObjectImpl<CheckCommand>
+class CheckCommand final : public ObjectImpl<CheckCommand>
 {
 public:
 	DECLARE_OBJECT(CheckCommand);
diff --git a/lib/icinga/checkresult.hpp b/lib/icinga/checkresult.hpp
index 08c635008..e577d8f57 100644
--- a/lib/icinga/checkresult.hpp
+++ b/lib/icinga/checkresult.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class CheckResult : public ObjectImpl<CheckResult>
+class CheckResult final : public ObjectImpl<CheckResult>
 {
 public:
 	DECLARE_OBJECT(CheckResult);
diff --git a/lib/icinga/comment.hpp b/lib/icinga/comment.hpp
index 023726133..a0dae3ee7 100644
--- a/lib/icinga/comment.hpp
+++ b/lib/icinga/comment.hpp
@@ -33,7 +33,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class Comment : public ObjectImpl<Comment>
+class Comment final : public ObjectImpl<Comment>
 {
 public:
 	DECLARE_OBJECT(Comment);
diff --git a/lib/icinga/customvarobject.hpp b/lib/icinga/customvarobject.hpp
index 53bf323d8..aa88c64e5 100644
--- a/lib/icinga/customvarobject.hpp
+++ b/lib/icinga/customvarobject.hpp
@@ -38,7 +38,7 @@ class CustomVarObject : public ObjectImpl<CustomVarObject>
 public:
 	DECLARE_OBJECT(CustomVarObject);
 
-	virtual void ValidateVars(const Dictionary::Ptr& value, const ValidationUtils& utils) override;
+	virtual void ValidateVars(const Dictionary::Ptr& value, const ValidationUtils& utils) override final;
 };
 
 int FilterArrayToInt(const Array::Ptr& typeFilters, const std::map<String, int>& filterMap, int defaultValue);
diff --git a/lib/icinga/dependency.hpp b/lib/icinga/dependency.hpp
index be2152179..d5c7c2870 100644
--- a/lib/icinga/dependency.hpp
+++ b/lib/icinga/dependency.hpp
@@ -36,7 +36,7 @@ class Service;
  *
  * @ingroup icinga
  */
-class Dependency : public ObjectImpl<Dependency>
+class Dependency final : public ObjectImpl<Dependency>
 {
 public:
 	DECLARE_OBJECT(Dependency);
diff --git a/lib/icinga/downtime.hpp b/lib/icinga/downtime.hpp
index c806ec22c..7fa547d02 100644
--- a/lib/icinga/downtime.hpp
+++ b/lib/icinga/downtime.hpp
@@ -33,7 +33,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class Downtime : public ObjectImpl<Downtime>
+class Downtime final : public ObjectImpl<Downtime>
 {
 public:
 	DECLARE_OBJECT(Downtime);
diff --git a/lib/icinga/eventcommand.hpp b/lib/icinga/eventcommand.hpp
index e0a61671b..38a5610c4 100644
--- a/lib/icinga/eventcommand.hpp
+++ b/lib/icinga/eventcommand.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class EventCommand : public ObjectImpl<EventCommand>
+class EventCommand final : public ObjectImpl<EventCommand>
 {
 public:
 	DECLARE_OBJECT(EventCommand);
diff --git a/lib/icinga/host.hpp b/lib/icinga/host.hpp
index 7666f5561..564839683 100644
--- a/lib/icinga/host.hpp
+++ b/lib/icinga/host.hpp
@@ -35,7 +35,7 @@ class Service;
  *
  * @ingroup icinga
  */
-class Host : public ObjectImpl<Host>, public MacroResolver
+class Host final : public ObjectImpl<Host>, public MacroResolver
 {
 public:
 	DECLARE_OBJECT(Host);
diff --git a/lib/icinga/hostgroup.hpp b/lib/icinga/hostgroup.hpp
index 1df85823e..c18aa86fc 100644
--- a/lib/icinga/hostgroup.hpp
+++ b/lib/icinga/hostgroup.hpp
@@ -34,7 +34,7 @@ class ConfigItem;
  *
  * @ingroup icinga
  */
-class HostGroup : public ObjectImpl<HostGroup>
+class HostGroup final : public ObjectImpl<HostGroup>
 {
 public:
 	DECLARE_OBJECT(HostGroup);
diff --git a/lib/icinga/icingaapplication.hpp b/lib/icinga/icingaapplication.hpp
index 3a9f6ea63..e67ca1f71 100644
--- a/lib/icinga/icingaapplication.hpp
+++ b/lib/icinga/icingaapplication.hpp
@@ -32,7 +32,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class IcingaApplication : public ObjectImpl<IcingaApplication>, public MacroResolver
+class IcingaApplication final : public ObjectImpl<IcingaApplication>, public MacroResolver
 {
 public:
 	DECLARE_OBJECT(IcingaApplication);
diff --git a/lib/icinga/notification.hpp b/lib/icinga/notification.hpp
index 5a2f04141..567ebc55d 100644
--- a/lib/icinga/notification.hpp
+++ b/lib/icinga/notification.hpp
@@ -77,7 +77,7 @@ class Service;
  *
  * @ingroup icinga
  */
-class Notification : public ObjectImpl<Notification>
+class Notification final : public ObjectImpl<Notification>
 {
 public:
 	DECLARE_OBJECT(Notification);
diff --git a/lib/icinga/notificationcommand.hpp b/lib/icinga/notificationcommand.hpp
index 3e6586b38..d1c604b6c 100644
--- a/lib/icinga/notificationcommand.hpp
+++ b/lib/icinga/notificationcommand.hpp
@@ -33,7 +33,7 @@ class Notification;
  *
  * @ingroup icinga
  */
-class NotificationCommand : public ObjectImpl<NotificationCommand>
+class NotificationCommand final : public ObjectImpl<NotificationCommand>
 {
 public:
 	DECLARE_OBJECT(NotificationCommand);
diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp
index 5054e365c..0c1883c95 100644
--- a/lib/icinga/scheduleddowntime.hpp
+++ b/lib/icinga/scheduleddowntime.hpp
@@ -38,7 +38,7 @@ class Service;
  *
  * @ingroup icinga
  */
-class ScheduledDowntime : public ObjectImpl<ScheduledDowntime>
+class ScheduledDowntime final : public ObjectImpl<ScheduledDowntime>
 {
 public:
 	DECLARE_OBJECT(ScheduledDowntime);
diff --git a/lib/icinga/service.hpp b/lib/icinga/service.hpp
index 24b90036c..8e7bb69c0 100644
--- a/lib/icinga/service.hpp
+++ b/lib/icinga/service.hpp
@@ -37,7 +37,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class Service : public ObjectImpl<Service>, public MacroResolver
+class Service final : public ObjectImpl<Service>, public MacroResolver
 {
 public:
 	DECLARE_OBJECT(Service);
diff --git a/lib/icinga/servicegroup.hpp b/lib/icinga/servicegroup.hpp
index cc05a9ecc..a99d65bc0 100644
--- a/lib/icinga/servicegroup.hpp
+++ b/lib/icinga/servicegroup.hpp
@@ -34,7 +34,7 @@ class ConfigItem;
  *
  * @ingroup icinga
  */
-class ServiceGroup : public ObjectImpl<ServiceGroup>
+class ServiceGroup final : public ObjectImpl<ServiceGroup>
 {
 public:
 	DECLARE_OBJECT(ServiceGroup);
diff --git a/lib/icinga/timeperiod.hpp b/lib/icinga/timeperiod.hpp
index b6a4b0873..38be76265 100644
--- a/lib/icinga/timeperiod.hpp
+++ b/lib/icinga/timeperiod.hpp
@@ -31,7 +31,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class TimePeriod : public ObjectImpl<TimePeriod>
+class TimePeriod final : public ObjectImpl<TimePeriod>
 {
 public:
 	DECLARE_OBJECT(TimePeriod);
diff --git a/lib/icinga/user.hpp b/lib/icinga/user.hpp
index b7984722d..12c3a6cc2 100644
--- a/lib/icinga/user.hpp
+++ b/lib/icinga/user.hpp
@@ -33,7 +33,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class User : public ObjectImpl<User>
+class User final : public ObjectImpl<User>
 {
 public:
 	DECLARE_OBJECT(User);
diff --git a/lib/icinga/usergroup.hpp b/lib/icinga/usergroup.hpp
index eca1745a1..0620c0059 100644
--- a/lib/icinga/usergroup.hpp
+++ b/lib/icinga/usergroup.hpp
@@ -34,7 +34,7 @@ class ConfigItem;
  *
  * @ingroup icinga
  */
-class UserGroup : public ObjectImpl<UserGroup>
+class UserGroup final : public ObjectImpl<UserGroup>
 {
 public:
 	DECLARE_OBJECT(UserGroup);
diff --git a/lib/livestatus/CMakeLists.txt b/lib/livestatus/CMakeLists.txt
index e260f8ecf..36daacaa7 100644
--- a/lib/livestatus/CMakeLists.txt
+++ b/lib/livestatus/CMakeLists.txt
@@ -32,8 +32,8 @@ set(livestatus_SOURCES
   countaggregator.cpp countaggregator.hpp
   downtimestable.cpp downtimestable.hpp
   endpointstable.cpp endpointstable.hpp
-  filter.cpp filter.hpp
-  historytable.cpp historytable.hpp
+  filter.hpp
+  historytable.hpp
   hostgroupstable.cpp hostgroupstable.hpp
   hoststable.cpp hoststable.hpp
   invavgaggregator.cpp invavgaggregator.hpp
diff --git a/lib/livestatus/andfilter.hpp b/lib/livestatus/andfilter.hpp
index 37feead8b..1a212d6da 100644
--- a/lib/livestatus/andfilter.hpp
+++ b/lib/livestatus/andfilter.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class AndFilter : public CombinerFilter
+class AndFilter final : public CombinerFilter
 {
 public:
 	DECLARE_PTR_TYPEDEFS(AndFilter);
diff --git a/lib/livestatus/attributefilter.hpp b/lib/livestatus/attributefilter.hpp
index eaf555894..a3fb1c161 100644
--- a/lib/livestatus/attributefilter.hpp
+++ b/lib/livestatus/attributefilter.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class AttributeFilter : public Filter
+class AttributeFilter final : public Filter
 {
 public:
 	DECLARE_PTR_TYPEDEFS(AttributeFilter);
diff --git a/lib/livestatus/avgaggregator.hpp b/lib/livestatus/avgaggregator.hpp
index 50ec98453..67d5303d9 100644
--- a/lib/livestatus/avgaggregator.hpp
+++ b/lib/livestatus/avgaggregator.hpp
@@ -29,7 +29,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-struct AvgAggregatorState : public AggregatorState
+struct AvgAggregatorState final : public AggregatorState
 {
 	AvgAggregatorState(void)
 		: Avg(0), AvgCount(0)
@@ -42,7 +42,7 @@ struct AvgAggregatorState : public AggregatorState
 /**
  * @ingroup livestatus
  */
-class AvgAggregator : public Aggregator
+class AvgAggregator final : public Aggregator
 {
 public:
 	DECLARE_PTR_TYPEDEFS(AvgAggregator);
diff --git a/lib/livestatus/combinerfilter.hpp b/lib/livestatus/combinerfilter.hpp
index 2a9075860..b30158159 100644
--- a/lib/livestatus/combinerfilter.hpp
+++ b/lib/livestatus/combinerfilter.hpp
@@ -35,12 +35,12 @@ class CombinerFilter : public Filter
 public:
 	DECLARE_PTR_TYPEDEFS(CombinerFilter);
 
-	CombinerFilter(void);
-
 	void AddSubFilter(const Filter::Ptr& filter);
 
 protected:
 	std::vector<Filter::Ptr> m_Filters;
+
+	CombinerFilter(void);
 };
 
 }
diff --git a/lib/livestatus/commandstable.hpp b/lib/livestatus/commandstable.hpp
index b54776c8f..8e18c0ef7 100644
--- a/lib/livestatus/commandstable.hpp
+++ b/lib/livestatus/commandstable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class CommandsTable : public Table
+class CommandsTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(CommandsTable);
diff --git a/lib/livestatus/commentstable.hpp b/lib/livestatus/commentstable.hpp
index a0bc3ab30..6b53e1235 100644
--- a/lib/livestatus/commentstable.hpp
+++ b/lib/livestatus/commentstable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class CommentsTable : public Table
+class CommentsTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(CommentsTable);
diff --git a/lib/livestatus/contactgroupstable.hpp b/lib/livestatus/contactgroupstable.hpp
index b1ee6c6ee..c4010c94b 100644
--- a/lib/livestatus/contactgroupstable.hpp
+++ b/lib/livestatus/contactgroupstable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class ContactGroupsTable : public Table
+class ContactGroupsTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ContactGroupsTable);
diff --git a/lib/livestatus/contactstable.hpp b/lib/livestatus/contactstable.hpp
index 23a625ec3..04387201b 100644
--- a/lib/livestatus/contactstable.hpp
+++ b/lib/livestatus/contactstable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class ContactsTable : public Table
+class ContactsTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ContactsTable);
diff --git a/lib/livestatus/countaggregator.hpp b/lib/livestatus/countaggregator.hpp
index 9d1cc6f40..1dc6cc93e 100644
--- a/lib/livestatus/countaggregator.hpp
+++ b/lib/livestatus/countaggregator.hpp
@@ -29,7 +29,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-struct CountAggregatorState : public AggregatorState
+struct CountAggregatorState final : public AggregatorState
 {
 	CountAggregatorState(void)
 		: Count(0)
@@ -41,7 +41,7 @@ struct CountAggregatorState : public AggregatorState
 /**
  * @ingroup livestatus
  */
-class CountAggregator : public Aggregator
+class CountAggregator final : public Aggregator
 {
 public:
 	DECLARE_PTR_TYPEDEFS(CountAggregator);
diff --git a/lib/livestatus/downtimestable.hpp b/lib/livestatus/downtimestable.hpp
index 7df6078a4..22f716400 100644
--- a/lib/livestatus/downtimestable.hpp
+++ b/lib/livestatus/downtimestable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class DowntimesTable : public Table
+class DowntimesTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(DowntimesTable);
diff --git a/lib/livestatus/endpointstable.hpp b/lib/livestatus/endpointstable.hpp
index 38cabfe28..a04fd9de7 100644
--- a/lib/livestatus/endpointstable.hpp
+++ b/lib/livestatus/endpointstable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class EndpointsTable : public Table
+class EndpointsTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(EndpointsTable);
diff --git a/lib/livestatus/filter.cpp b/lib/livestatus/filter.cpp
deleted file mode 100644
index b8b681870..000000000
--- a/lib/livestatus/filter.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/******************************************************************************
- * Icinga 2                                                                   *
- * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/)  *
- *                                                                            *
- * This program is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU General Public License                *
- * as published by the Free Software Foundation; either version 2             *
- * of the License, or (at your option) any later version.                     *
- *                                                                            *
- * This program is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
- * GNU General Public License for more details.                               *
- *                                                                            *
- * You should have received a copy of the GNU General Public License          *
- * along with this program; if not, write to the Free Software Foundation     *
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
- ******************************************************************************/
-
-#include "livestatus/filter.hpp"
-
-using namespace icinga;
-
-Filter::Filter(void)
-{ }
diff --git a/lib/livestatus/filter.hpp b/lib/livestatus/filter.hpp
index 0942fccd4..629ca392a 100644
--- a/lib/livestatus/filter.hpp
+++ b/lib/livestatus/filter.hpp
@@ -35,9 +35,6 @@ public:
 	DECLARE_PTR_TYPEDEFS(Filter);
 
 	virtual bool Apply(const Table::Ptr& table, const Value& row) = 0;
-
-protected:
-	Filter(void);
 };
 
 }
diff --git a/lib/livestatus/historytable.cpp b/lib/livestatus/historytable.cpp
deleted file mode 100644
index bbb7704e6..000000000
--- a/lib/livestatus/historytable.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/******************************************************************************
- * Icinga 2                                                                   *
- * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/)  *
- *                                                                            *
- * This program is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU General Public License                *
- * as published by the Free Software Foundation; either version 2             *
- * of the License, or (at your option) any later version.                     *
- *                                                                            *
- * This program is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
- * GNU General Public License for more details.                               *
- *                                                                            *
- * You should have received a copy of the GNU General Public License          *
- * along with this program; if not, write to the Free Software Foundation     *
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
- ******************************************************************************/
-
-#include "livestatus/historytable.hpp"
-
-using namespace icinga;
-
-void HistoryTable::UpdateLogEntries(const Dictionary::Ptr&, int, int, const AddRowFunction&)
-{
-	/* does nothing by default */
-}
diff --git a/lib/livestatus/historytable.hpp b/lib/livestatus/historytable.hpp
index 7daaef617..9d032e617 100644
--- a/lib/livestatus/historytable.hpp
+++ b/lib/livestatus/historytable.hpp
@@ -33,7 +33,7 @@ namespace icinga
 class HistoryTable : public Table
 {
 public:
-	virtual void UpdateLogEntries(const Dictionary::Ptr& bag, int line_count, int lineno, const AddRowFunction& addRowFn);
+	virtual void UpdateLogEntries(const Dictionary::Ptr& bag, int line_count, int lineno, const AddRowFunction& addRowFn) = 0;
 };
 
 }
diff --git a/lib/livestatus/hostgroupstable.hpp b/lib/livestatus/hostgroupstable.hpp
index df8dc5c30..16875119c 100644
--- a/lib/livestatus/hostgroupstable.hpp
+++ b/lib/livestatus/hostgroupstable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class HostGroupsTable : public Table
+class HostGroupsTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(HostGroupsTable);
diff --git a/lib/livestatus/hoststable.hpp b/lib/livestatus/hoststable.hpp
index dbf0dfb5e..080fc451b 100644
--- a/lib/livestatus/hoststable.hpp
+++ b/lib/livestatus/hoststable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class HostsTable : public Table
+class HostsTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(HostsTable);
diff --git a/lib/livestatus/invavgaggregator.hpp b/lib/livestatus/invavgaggregator.hpp
index 3559cc2f7..7154de65b 100644
--- a/lib/livestatus/invavgaggregator.hpp
+++ b/lib/livestatus/invavgaggregator.hpp
@@ -29,7 +29,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-struct InvAvgAggregatorState : public AggregatorState
+struct InvAvgAggregatorState final : public AggregatorState
 {
 	InvAvgAggregatorState(void)
 		: InvAvg(0), InvAvgCount(0)
@@ -42,7 +42,7 @@ struct InvAvgAggregatorState : public AggregatorState
 /**
  * @ingroup livestatus
  */
-class InvAvgAggregator : public Aggregator
+class InvAvgAggregator final : public Aggregator
 {
 public:
 	DECLARE_PTR_TYPEDEFS(InvAvgAggregator);
diff --git a/lib/livestatus/invsumaggregator.hpp b/lib/livestatus/invsumaggregator.hpp
index 8541f406e..8528c25a3 100644
--- a/lib/livestatus/invsumaggregator.hpp
+++ b/lib/livestatus/invsumaggregator.hpp
@@ -29,7 +29,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-struct InvSumAggregatorState : public AggregatorState
+struct InvSumAggregatorState final : public AggregatorState
 {
 	InvSumAggregatorState(void)
 		: InvSum(0)
@@ -41,7 +41,7 @@ struct InvSumAggregatorState : public AggregatorState
 /**
  * @ingroup livestatus
  */
-class InvSumAggregator : public Aggregator
+class InvSumAggregator final : public Aggregator
 {
 public:
 	DECLARE_PTR_TYPEDEFS(InvSumAggregator);
diff --git a/lib/livestatus/livestatuslistener.hpp b/lib/livestatus/livestatuslistener.hpp
index 56c298a0a..1b707b91f 100644
--- a/lib/livestatus/livestatuslistener.hpp
+++ b/lib/livestatus/livestatuslistener.hpp
@@ -34,7 +34,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class LivestatusListener : public ObjectImpl<LivestatusListener>
+class LivestatusListener final : public ObjectImpl<LivestatusListener>
 {
 public:
 	DECLARE_OBJECT(LivestatusListener);
diff --git a/lib/livestatus/livestatusquery.hpp b/lib/livestatus/livestatusquery.hpp
index 36a86b166..a6e4c3655 100644
--- a/lib/livestatus/livestatusquery.hpp
+++ b/lib/livestatus/livestatusquery.hpp
@@ -43,7 +43,7 @@ enum LivestatusError
 /**
  * @ingroup livestatus
  */
-class LivestatusQuery : public Object
+class LivestatusQuery final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(LivestatusQuery);
diff --git a/lib/livestatus/logtable.hpp b/lib/livestatus/logtable.hpp
index 648334270..2b60fcc4d 100644
--- a/lib/livestatus/logtable.hpp
+++ b/lib/livestatus/logtable.hpp
@@ -31,7 +31,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class LogTable : public HistoryTable
+class LogTable final : public HistoryTable
 {
 public:
 	DECLARE_PTR_TYPEDEFS(LogTable);
diff --git a/lib/livestatus/maxaggregator.hpp b/lib/livestatus/maxaggregator.hpp
index 7a3b1b544..c239d1c3b 100644
--- a/lib/livestatus/maxaggregator.hpp
+++ b/lib/livestatus/maxaggregator.hpp
@@ -29,7 +29,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-struct MaxAggregatorState : public AggregatorState
+struct MaxAggregatorState final : public AggregatorState
 {
 	MaxAggregatorState(void)
 		: Max(0)
@@ -41,7 +41,7 @@ struct MaxAggregatorState : public AggregatorState
 /**
  * @ingroup livestatus
  */
-class MaxAggregator : public Aggregator
+class MaxAggregator final : public Aggregator
 {
 public:
 	DECLARE_PTR_TYPEDEFS(MaxAggregator);
diff --git a/lib/livestatus/minaggregator.hpp b/lib/livestatus/minaggregator.hpp
index 82b40f1f6..dbffad4fe 100644
--- a/lib/livestatus/minaggregator.hpp
+++ b/lib/livestatus/minaggregator.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-struct MinAggregatorState : public AggregatorState
+struct MinAggregatorState final : public AggregatorState
 {
 	MinAggregatorState(void)
 		: Min(DBL_MAX)
@@ -42,7 +42,7 @@ struct MinAggregatorState : public AggregatorState
 /**
  * @ingroup livestatus
  */
-class MinAggregator : public Aggregator
+class MinAggregator final : public Aggregator
 {
 public:
 	DECLARE_PTR_TYPEDEFS(MinAggregator);
diff --git a/lib/livestatus/negatefilter.hpp b/lib/livestatus/negatefilter.hpp
index 0ba575be8..6bc50e3b0 100644
--- a/lib/livestatus/negatefilter.hpp
+++ b/lib/livestatus/negatefilter.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class NegateFilter : public Filter
+class NegateFilter final : public Filter
 {
 public:
 	DECLARE_PTR_TYPEDEFS(NegateFilter);
diff --git a/lib/livestatus/orfilter.hpp b/lib/livestatus/orfilter.hpp
index 45389de38..e06179f03 100644
--- a/lib/livestatus/orfilter.hpp
+++ b/lib/livestatus/orfilter.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class OrFilter : public CombinerFilter
+class OrFilter final : public CombinerFilter
 {
 public:
 	DECLARE_PTR_TYPEDEFS(OrFilter);
diff --git a/lib/livestatus/servicegroupstable.hpp b/lib/livestatus/servicegroupstable.hpp
index f42e979e1..c66965307 100644
--- a/lib/livestatus/servicegroupstable.hpp
+++ b/lib/livestatus/servicegroupstable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class ServiceGroupsTable : public Table
+class ServiceGroupsTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ServiceGroupsTable);
diff --git a/lib/livestatus/servicestable.hpp b/lib/livestatus/servicestable.hpp
index 2b43ed789..f64f4a257 100644
--- a/lib/livestatus/servicestable.hpp
+++ b/lib/livestatus/servicestable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class ServicesTable : public Table
+class ServicesTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ServicesTable);
diff --git a/lib/livestatus/statehisttable.hpp b/lib/livestatus/statehisttable.hpp
index 505e5bedb..141dd31fd 100644
--- a/lib/livestatus/statehisttable.hpp
+++ b/lib/livestatus/statehisttable.hpp
@@ -32,7 +32,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class StateHistTable : public HistoryTable
+class StateHistTable final : public HistoryTable
 {
 public:
 	DECLARE_PTR_TYPEDEFS(StateHistTable);
diff --git a/lib/livestatus/statustable.hpp b/lib/livestatus/statustable.hpp
index 2c036937b..de59d12f4 100644
--- a/lib/livestatus/statustable.hpp
+++ b/lib/livestatus/statustable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class StatusTable : public Table
+class StatusTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(StatusTable);
diff --git a/lib/livestatus/stdaggregator.hpp b/lib/livestatus/stdaggregator.hpp
index f105458a2..cd49f9992 100644
--- a/lib/livestatus/stdaggregator.hpp
+++ b/lib/livestatus/stdaggregator.hpp
@@ -29,7 +29,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-struct StdAggregatorState : public AggregatorState
+struct StdAggregatorState final : public AggregatorState
 {
 	StdAggregatorState(void)
 		: StdSum(0), StdQSum(0), StdCount(0)
@@ -43,7 +43,7 @@ struct StdAggregatorState : public AggregatorState
 /**
  * @ingroup livestatus
  */
-class StdAggregator : public Aggregator
+class StdAggregator final : public Aggregator
 {
 public:
 	DECLARE_PTR_TYPEDEFS(StdAggregator);
diff --git a/lib/livestatus/sumaggregator.hpp b/lib/livestatus/sumaggregator.hpp
index 43fa7bb61..32f8574bd 100644
--- a/lib/livestatus/sumaggregator.hpp
+++ b/lib/livestatus/sumaggregator.hpp
@@ -29,7 +29,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-struct SumAggregatorState : public AggregatorState
+struct SumAggregatorState final : public AggregatorState
 {
 	SumAggregatorState(void)
 		: Sum(0)
@@ -41,7 +41,7 @@ struct SumAggregatorState : public AggregatorState
 /**
  * @ingroup livestatus
  */
-class SumAggregator : public Aggregator
+class SumAggregator final : public Aggregator
 {
 public:
 	DECLARE_PTR_TYPEDEFS(SumAggregator);
diff --git a/lib/livestatus/table.hpp b/lib/livestatus/table.hpp
index d39de04ad..0dddf40ed 100644
--- a/lib/livestatus/table.hpp
+++ b/lib/livestatus/table.hpp
@@ -58,7 +58,7 @@ public:
 	Column GetColumn(const String& name) const;
 	std::vector<String> GetColumnNames(void) const;
 
-	virtual LivestatusGroupByType GetGroupByType(void) const;
+	LivestatusGroupByType GetGroupByType(void) const;
 
 protected:
 	Table(LivestatusGroupByType type = LivestatusGroupByNone);
diff --git a/lib/livestatus/timeperiodstable.hpp b/lib/livestatus/timeperiodstable.hpp
index e234cb7b0..2f84f19f3 100644
--- a/lib/livestatus/timeperiodstable.hpp
+++ b/lib/livestatus/timeperiodstable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class TimePeriodsTable : public Table
+class TimePeriodsTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(TimePeriodsTable);
diff --git a/lib/livestatus/zonestable.hpp b/lib/livestatus/zonestable.hpp
index b1ccaf620..89dc33ead 100644
--- a/lib/livestatus/zonestable.hpp
+++ b/lib/livestatus/zonestable.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup livestatus
  */
-class ZonesTable : public Table
+class ZonesTable final : public Table
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ZonesTable);
diff --git a/lib/mysql_shim/mysqlinterface.cpp b/lib/mysql_shim/mysqlinterface.cpp
index bbc9abea8..d7e40e7ed 100644
--- a/lib/mysql_shim/mysqlinterface.cpp
+++ b/lib/mysql_shim/mysqlinterface.cpp
@@ -21,7 +21,7 @@
 
 using namespace icinga;
 
-struct MysqlInterfaceImpl : public MysqlInterface
+struct MysqlInterfaceImpl final : public MysqlInterface
 {
 	void Destroy(void) override
 	{
diff --git a/lib/notification/notificationcomponent.hpp b/lib/notification/notificationcomponent.hpp
index 2599cbc6d..3dd98d02e 100644
--- a/lib/notification/notificationcomponent.hpp
+++ b/lib/notification/notificationcomponent.hpp
@@ -31,7 +31,7 @@ namespace icinga
 /**
  * @ingroup notification
  */
-class NotificationComponent : public ObjectImpl<NotificationComponent>
+class NotificationComponent final : public ObjectImpl<NotificationComponent>
 {
 public:
 	DECLARE_OBJECT(NotificationComponent);
diff --git a/lib/perfdata/elasticsearchwriter.hpp b/lib/perfdata/elasticsearchwriter.hpp
index 39bee6ca7..ed0c3a8ad 100644
--- a/lib/perfdata/elasticsearchwriter.hpp
+++ b/lib/perfdata/elasticsearchwriter.hpp
@@ -29,7 +29,7 @@
 namespace icinga
 {
 
-class ElasticsearchWriter : public ObjectImpl<ElasticsearchWriter>
+class ElasticsearchWriter final : public ObjectImpl<ElasticsearchWriter>
 {
 public:
 	DECLARE_OBJECT(ElasticsearchWriter);
diff --git a/lib/perfdata/gelfwriter.hpp b/lib/perfdata/gelfwriter.hpp
index 7e46d7b25..0ea62c349 100644
--- a/lib/perfdata/gelfwriter.hpp
+++ b/lib/perfdata/gelfwriter.hpp
@@ -36,7 +36,7 @@ namespace icinga
  *
  * @ingroup perfdata
  */
-class GelfWriter : public ObjectImpl<GelfWriter>
+class GelfWriter final : public ObjectImpl<GelfWriter>
 {
 public:
 	DECLARE_OBJECT(GelfWriter);
diff --git a/lib/perfdata/graphitewriter.hpp b/lib/perfdata/graphitewriter.hpp
index 975b531b3..a26b15bd5 100644
--- a/lib/perfdata/graphitewriter.hpp
+++ b/lib/perfdata/graphitewriter.hpp
@@ -36,7 +36,7 @@ namespace icinga
  *
  * @ingroup perfdata
  */
-class GraphiteWriter : public ObjectImpl<GraphiteWriter>
+class GraphiteWriter final : public ObjectImpl<GraphiteWriter>
 {
 public:
 	DECLARE_OBJECT(GraphiteWriter);
diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp
index daadae203..58e0509e1 100644
--- a/lib/perfdata/influxdbwriter.cpp
+++ b/lib/perfdata/influxdbwriter.cpp
@@ -49,7 +49,7 @@
 
 using namespace icinga;
 
-class InfluxdbInteger : public Object
+class InfluxdbInteger final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(InfluxdbInteger);
diff --git a/lib/perfdata/influxdbwriter.hpp b/lib/perfdata/influxdbwriter.hpp
index 118adea58..e950475e7 100644
--- a/lib/perfdata/influxdbwriter.hpp
+++ b/lib/perfdata/influxdbwriter.hpp
@@ -36,7 +36,7 @@ namespace icinga
  *
  * @ingroup perfdata
  */
-class InfluxdbWriter : public ObjectImpl<InfluxdbWriter>
+class InfluxdbWriter final : public ObjectImpl<InfluxdbWriter>
 {
 public:
 	DECLARE_OBJECT(InfluxdbWriter);
diff --git a/lib/perfdata/opentsdbwriter.hpp b/lib/perfdata/opentsdbwriter.hpp
index 8099dcddd..b659d5434 100644
--- a/lib/perfdata/opentsdbwriter.hpp
+++ b/lib/perfdata/opentsdbwriter.hpp
@@ -35,7 +35,7 @@ namespace icinga
  *
  * @ingroup perfdata
  */
-class OpenTsdbWriter : public ObjectImpl<OpenTsdbWriter>
+class OpenTsdbWriter final : public ObjectImpl<OpenTsdbWriter>
 {
 public:
 	DECLARE_OBJECT(OpenTsdbWriter);
diff --git a/lib/perfdata/perfdatawriter.hpp b/lib/perfdata/perfdatawriter.hpp
index 24209e7e2..6639fad15 100644
--- a/lib/perfdata/perfdatawriter.hpp
+++ b/lib/perfdata/perfdatawriter.hpp
@@ -34,7 +34,7 @@ namespace icinga
  *
  * @ingroup icinga
  */
-class PerfdataWriter : public ObjectImpl<PerfdataWriter>
+class PerfdataWriter final : public ObjectImpl<PerfdataWriter>
 {
 public:
 	DECLARE_OBJECT(PerfdataWriter);
diff --git a/lib/pgsql_shim/pgsqlinterface.cpp b/lib/pgsql_shim/pgsqlinterface.cpp
index fef41f475..31f0f2e76 100644
--- a/lib/pgsql_shim/pgsqlinterface.cpp
+++ b/lib/pgsql_shim/pgsqlinterface.cpp
@@ -21,7 +21,7 @@
 
 using namespace icinga;
 
-struct PgsqlInterfaceImpl : public PgsqlInterface
+struct PgsqlInterfaceImpl final : public PgsqlInterface
 {
 	void Destroy(void) override
 	{
diff --git a/lib/remote/actionshandler.hpp b/lib/remote/actionshandler.hpp
index 4fc54bfd9..2e6d4e099 100644
--- a/lib/remote/actionshandler.hpp
+++ b/lib/remote/actionshandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class ActionsHandler : public HttpHandler
+class ActionsHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ActionsHandler);
diff --git a/lib/remote/apiaction.hpp b/lib/remote/apiaction.hpp
index 9921b734d..4c827a4d6 100644
--- a/lib/remote/apiaction.hpp
+++ b/lib/remote/apiaction.hpp
@@ -38,7 +38,7 @@ namespace icinga
  *
  * @ingroup remote
  */
-class ApiAction : public Object
+class ApiAction final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ApiAction);
diff --git a/lib/remote/apiclient.hpp b/lib/remote/apiclient.hpp
index a552a0d23..cd3acadfe 100644
--- a/lib/remote/apiclient.hpp
+++ b/lib/remote/apiclient.hpp
@@ -52,7 +52,7 @@ public:
 	intrusive_ptr<ApiType> Type;
 };
 
-class ApiType : public Object
+class ApiType final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ApiType);
diff --git a/lib/remote/apifunction.hpp b/lib/remote/apifunction.hpp
index 7a722e26b..e16809c10 100644
--- a/lib/remote/apifunction.hpp
+++ b/lib/remote/apifunction.hpp
@@ -35,7 +35,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class ApiFunction : public Object
+class ApiFunction final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ApiFunction);
diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp
index 71d7a7d46..8655e47cf 100644
--- a/lib/remote/apilistener.hpp
+++ b/lib/remote/apilistener.hpp
@@ -49,7 +49,7 @@ struct ConfigDirInformation
 /**
 * @ingroup remote
 */
-class ApiListener : public ObjectImpl<ApiListener>
+class ApiListener final : public ObjectImpl<ApiListener>
 {
 public:
 	DECLARE_OBJECT(ApiListener);
diff --git a/lib/remote/apiuser.hpp b/lib/remote/apiuser.hpp
index b64f48da6..1a8f8b661 100644
--- a/lib/remote/apiuser.hpp
+++ b/lib/remote/apiuser.hpp
@@ -29,7 +29,7 @@ namespace icinga
 /**
  * @ingroup remote
  */
-class ApiUser : public ObjectImpl<ApiUser>
+class ApiUser final : public ObjectImpl<ApiUser>
 {
 public:
 	DECLARE_OBJECT(ApiUser);
diff --git a/lib/remote/configfileshandler.hpp b/lib/remote/configfileshandler.hpp
index 8de6a2f6c..452abbc33 100644
--- a/lib/remote/configfileshandler.hpp
+++ b/lib/remote/configfileshandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class ConfigFilesHandler : public HttpHandler
+class ConfigFilesHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ConfigFilesHandler);
diff --git a/lib/remote/configpackageshandler.hpp b/lib/remote/configpackageshandler.hpp
index a6eb782eb..f7898943d 100644
--- a/lib/remote/configpackageshandler.hpp
+++ b/lib/remote/configpackageshandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class ConfigPackagesHandler : public HttpHandler
+class ConfigPackagesHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ConfigPackagesHandler);
diff --git a/lib/remote/configstageshandler.hpp b/lib/remote/configstageshandler.hpp
index cb215deaa..4366c58c1 100644
--- a/lib/remote/configstageshandler.hpp
+++ b/lib/remote/configstageshandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class ConfigStagesHandler : public HttpHandler
+class ConfigStagesHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ConfigStagesHandler);
diff --git a/lib/remote/consolehandler.hpp b/lib/remote/consolehandler.hpp
index 605e3cb1d..5d5cab9ac 100644
--- a/lib/remote/consolehandler.hpp
+++ b/lib/remote/consolehandler.hpp
@@ -38,7 +38,7 @@ struct ApiScriptFrame
 	{ }
 };
 
-class ConsoleHandler : public HttpHandler
+class ConsoleHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ConsoleHandler);
diff --git a/lib/remote/createobjecthandler.hpp b/lib/remote/createobjecthandler.hpp
index 85b407d76..6cda7a289 100644
--- a/lib/remote/createobjecthandler.hpp
+++ b/lib/remote/createobjecthandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class CreateObjectHandler : public HttpHandler
+class CreateObjectHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(CreateObjectHandler);
diff --git a/lib/remote/deleteobjecthandler.hpp b/lib/remote/deleteobjecthandler.hpp
index 951d957a2..ecf4e8e5d 100644
--- a/lib/remote/deleteobjecthandler.hpp
+++ b/lib/remote/deleteobjecthandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class DeleteObjectHandler : public HttpHandler
+class DeleteObjectHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(DeleteObjectHandler);
diff --git a/lib/remote/endpoint.hpp b/lib/remote/endpoint.hpp
index 344d49bbc..18d4c76f5 100644
--- a/lib/remote/endpoint.hpp
+++ b/lib/remote/endpoint.hpp
@@ -36,7 +36,7 @@ class Zone;
  *
  * @ingroup remote
  */
-class Endpoint : public ObjectImpl<Endpoint>
+class Endpoint final : public ObjectImpl<Endpoint>
 {
 public:
 	DECLARE_OBJECT(Endpoint);
diff --git a/lib/remote/eventqueue.hpp b/lib/remote/eventqueue.hpp
index eb5778b56..a2f7ece71 100644
--- a/lib/remote/eventqueue.hpp
+++ b/lib/remote/eventqueue.hpp
@@ -32,7 +32,7 @@
 namespace icinga
 {
 
-class EventQueue : public Object
+class EventQueue final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(EventQueue);
diff --git a/lib/remote/eventshandler.hpp b/lib/remote/eventshandler.hpp
index f58cefd5c..69ce7cb97 100644
--- a/lib/remote/eventshandler.hpp
+++ b/lib/remote/eventshandler.hpp
@@ -26,7 +26,7 @@
 namespace icinga
 {
 
-class EventsHandler : public HttpHandler
+class EventsHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(EventsHandler);
diff --git a/lib/remote/filterutility.hpp b/lib/remote/filterutility.hpp
index a41567a27..0e6a4ace8 100644
--- a/lib/remote/filterutility.hpp
+++ b/lib/remote/filterutility.hpp
@@ -41,7 +41,7 @@ public:
 	virtual String GetPluralName(const String& type) const = 0;
 };
 
-class ConfigObjectTargetProvider : public TargetProvider
+class ConfigObjectTargetProvider final : public TargetProvider
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ConfigObjectTargetProvider);
diff --git a/lib/remote/httpclientconnection.hpp b/lib/remote/httpclientconnection.hpp
index 9971cd41d..87e1dc948 100644
--- a/lib/remote/httpclientconnection.hpp
+++ b/lib/remote/httpclientconnection.hpp
@@ -34,7 +34,7 @@ namespace icinga
  *
  * @ingroup remote
  */
-class HttpClientConnection : public Object
+class HttpClientConnection final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(HttpClientConnection);
diff --git a/lib/remote/httpserverconnection.hpp b/lib/remote/httpserverconnection.hpp
index 1f4326531..a89dc6016 100644
--- a/lib/remote/httpserverconnection.hpp
+++ b/lib/remote/httpserverconnection.hpp
@@ -34,7 +34,7 @@ namespace icinga
  *
  * @ingroup remote
  */
-class HttpServerConnection : public Object
+class HttpServerConnection final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(HttpServerConnection);
diff --git a/lib/remote/infohandler.hpp b/lib/remote/infohandler.hpp
index 1d318018c..52bb8ba8e 100644
--- a/lib/remote/infohandler.hpp
+++ b/lib/remote/infohandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class InfoHandler : public HttpHandler
+class InfoHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(InfoHandler);
diff --git a/lib/remote/jsonrpcconnection.hpp b/lib/remote/jsonrpcconnection.hpp
index 1d1cc4a7e..6febfc56d 100644
--- a/lib/remote/jsonrpcconnection.hpp
+++ b/lib/remote/jsonrpcconnection.hpp
@@ -48,7 +48,7 @@ class MessageOrigin;
  *
  * @ingroup remote
  */
-class JsonRpcConnection : public Object
+class JsonRpcConnection final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(JsonRpcConnection);
diff --git a/lib/remote/messageorigin.hpp b/lib/remote/messageorigin.hpp
index f32b2b434..a12d8e9c3 100644
--- a/lib/remote/messageorigin.hpp
+++ b/lib/remote/messageorigin.hpp
@@ -29,7 +29,7 @@ namespace icinga
 /**
  * @ingroup remote
  */
-class MessageOrigin : public Object
+class MessageOrigin final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(MessageOrigin);
diff --git a/lib/remote/modifyobjecthandler.hpp b/lib/remote/modifyobjecthandler.hpp
index aa46e259c..0ed717975 100644
--- a/lib/remote/modifyobjecthandler.hpp
+++ b/lib/remote/modifyobjecthandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class ModifyObjectHandler : public HttpHandler
+class ModifyObjectHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ModifyObjectHandler);
diff --git a/lib/remote/objectqueryhandler.hpp b/lib/remote/objectqueryhandler.hpp
index ebcd5e47f..6e0b020ce 100644
--- a/lib/remote/objectqueryhandler.hpp
+++ b/lib/remote/objectqueryhandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class ObjectQueryHandler : public HttpHandler
+class ObjectQueryHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(ObjectQueryHandler);
diff --git a/lib/remote/statushandler.cpp b/lib/remote/statushandler.cpp
index b480a78d9..96f044b64 100644
--- a/lib/remote/statushandler.cpp
+++ b/lib/remote/statushandler.cpp
@@ -27,7 +27,7 @@ using namespace icinga;
 
 REGISTER_URLHANDLER("/v1/status", StatusHandler);
 
-class StatusTargetProvider : public TargetProvider
+class StatusTargetProvider final : public TargetProvider
 {
 public:
 	DECLARE_PTR_TYPEDEFS(StatusTargetProvider);
diff --git a/lib/remote/statushandler.hpp b/lib/remote/statushandler.hpp
index 0e2db4d4c..70f72b586 100644
--- a/lib/remote/statushandler.hpp
+++ b/lib/remote/statushandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class StatusHandler : public HttpHandler
+class StatusHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(StatusHandler);
diff --git a/lib/remote/templatequeryhandler.cpp b/lib/remote/templatequeryhandler.cpp
index 5efe1b71a..9406e3645 100644
--- a/lib/remote/templatequeryhandler.cpp
+++ b/lib/remote/templatequeryhandler.cpp
@@ -31,7 +31,7 @@ using namespace icinga;
 
 REGISTER_URLHANDLER("/v1/templates", TemplateQueryHandler);
 
-class TemplateTargetProvider : public TargetProvider
+class TemplateTargetProvider final : public TargetProvider
 {
 public:
 	DECLARE_PTR_TYPEDEFS(TemplateTargetProvider);
diff --git a/lib/remote/templatequeryhandler.hpp b/lib/remote/templatequeryhandler.hpp
index 55de097d1..4c3e7c1ae 100644
--- a/lib/remote/templatequeryhandler.hpp
+++ b/lib/remote/templatequeryhandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class TemplateQueryHandler : public HttpHandler
+class TemplateQueryHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(TemplateQueryHandler);
diff --git a/lib/remote/typequeryhandler.cpp b/lib/remote/typequeryhandler.cpp
index 365d2387c..991d5e156 100644
--- a/lib/remote/typequeryhandler.cpp
+++ b/lib/remote/typequeryhandler.cpp
@@ -30,7 +30,7 @@ using namespace icinga;
 
 REGISTER_URLHANDLER("/v1/types", TypeQueryHandler);
 
-class TypeTargetProvider : public TargetProvider
+class TypeTargetProvider final : public TargetProvider
 {
 public:
 	DECLARE_PTR_TYPEDEFS(TypeTargetProvider);
diff --git a/lib/remote/typequeryhandler.hpp b/lib/remote/typequeryhandler.hpp
index 12ff5c293..177cf7419 100644
--- a/lib/remote/typequeryhandler.hpp
+++ b/lib/remote/typequeryhandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class TypeQueryHandler : public HttpHandler
+class TypeQueryHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(TypeQueryHandler);
diff --git a/lib/remote/url.hpp b/lib/remote/url.hpp
index 531c7c26a..5bbe6ac18 100644
--- a/lib/remote/url.hpp
+++ b/lib/remote/url.hpp
@@ -36,7 +36,7 @@ namespace icinga
  *
  * @ingroup base
  */
-class Url : public Object
+class Url final : public Object
 {
 public:
 	DECLARE_PTR_TYPEDEFS(Url);
diff --git a/lib/remote/variablequeryhandler.cpp b/lib/remote/variablequeryhandler.cpp
index 4f06ecb0b..9fbfa5893 100644
--- a/lib/remote/variablequeryhandler.cpp
+++ b/lib/remote/variablequeryhandler.cpp
@@ -31,7 +31,7 @@ using namespace icinga;
 
 REGISTER_URLHANDLER("/v1/variables", VariableQueryHandler);
 
-class VariableTargetProvider : public TargetProvider
+class VariableTargetProvider final : public TargetProvider
 {
 public:
 	DECLARE_PTR_TYPEDEFS(VariableTargetProvider);
diff --git a/lib/remote/variablequeryhandler.hpp b/lib/remote/variablequeryhandler.hpp
index 469a3442f..884ed53a3 100644
--- a/lib/remote/variablequeryhandler.hpp
+++ b/lib/remote/variablequeryhandler.hpp
@@ -25,7 +25,7 @@
 namespace icinga
 {
 
-class VariableQueryHandler : public HttpHandler
+class VariableQueryHandler final : public HttpHandler
 {
 public:
 	DECLARE_PTR_TYPEDEFS(VariableQueryHandler);
diff --git a/lib/remote/zone.hpp b/lib/remote/zone.hpp
index 218e148cd..7c4254ad7 100644
--- a/lib/remote/zone.hpp
+++ b/lib/remote/zone.hpp
@@ -30,7 +30,7 @@ namespace icinga
 /**
  * @ingroup remote
  */
-class Zone : public ObjectImpl<Zone>
+class Zone final : public ObjectImpl<Zone>
 {
 public:
 	DECLARE_OBJECT(Zone);