diff --git a/demo/include/PerlinNoise.hpp b/demo/include/PerlinNoise.hpp
index 453af651243bad64e36615cb7f44e9ff41708a7d..65e53d6b114561a314fc13162ff5a27b5625a1f0 100644
--- a/demo/include/PerlinNoise.hpp
+++ b/demo/include/PerlinNoise.hpp
@@ -1,29 +1,16 @@
-//----------------------------------------------------------------------------------------
-//
-//	siv::PerlinNoise
-//	Perlin noise library for modern C++
-//
-//	Copyright (C) 2013-2021 Ryo Suzuki <reputeless@gmail.com>
-//
-//	Permission is hereby granted, free of charge, to any person obtaining a copy
-//	of this software and associated documentation files(the "Software"), to deal
-//	in the Software without restriction, including without limitation the rights
-//	to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
-//	copies of the Software, and to permit persons to whom the Software is
-//	furnished to do so, subject to the following conditions :
-//
-//	The above copyright notice and this permission notice shall be included in
-//	all copies or substantial portions of the Software.
-//
-//	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-//	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-//	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
-//	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-//	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-//	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-//	THE SOFTWARE.
-//
-//----------------------------------------------------------------------------------------
+/*
+ * This file is part of FGGL.
+ *
+ * FGGL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
+ * later version.
+ *
+ * FGGL 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along with FGGL.
+ * If not, see <https://www.gnu.org/licenses/>.
+ */
 
 # pragma once
 # include <cstdint>
diff --git a/fggl/gfx/ogl/renderer.cpp b/fggl/gfx/ogl/renderer.cpp
index 8f38d3445a11b1bf2cb62226e721df0557e46bb8..241dfc5afead8adc3e0f869c0d2682406981ec3c 100644
--- a/fggl/gfx/ogl/renderer.cpp
+++ b/fggl/gfx/ogl/renderer.cpp
@@ -161,7 +161,7 @@ namespace fggl::gfx {
 		m_cache = std::make_unique<ShaderCache>(m_storage);
 
 		// setup 2D rendering system
-		ShaderConfig shader2DConfig = ShaderFromName("canvas");
+		ShaderConfig shader2DConfig = ShaderConfig::named("canvas");
 		m_canvasPipeline = m_cache->load(shader2DConfig);
 		if ( m_canvasPipeline == INVALID_SHADER_ID) {
 			debug::error("failed to load shader2D - using fallback");
@@ -169,15 +169,15 @@ namespace fggl::gfx {
 		}
 
 		// FIXME this should not be hard-coded, it should be part of the scene loading process
-		m_cache->load(ShaderFromName("phong"));
-		m_cache->load(ShaderFromName("redbook/lighting"));
-		m_cache->load(ShaderFromName("redbook/debug"));
+		m_cache->load(ShaderConfig::named("phong"));
+		m_cache->load(ShaderConfig::named("redbook/lighting"));
+		m_cache->load(ShaderConfig::named("redbook/debug"));
 
 		// rendering helpers
 		m_canvasRenderer = std::make_unique<ogl4::CanvasRenderer>(fonts);
 		m_modelRenderer = std::make_unique<ogl4::StaticModelRenderer>(m_cache.get());
 
-		m_debugRenderer = std::make_unique<ogl4::DebugRenderer>(m_cache->getOrLoad(ShaderFromName("debug")));
+		m_debugRenderer = std::make_unique<ogl4::DebugRenderer>(m_cache->getOrLoad(ShaderConfig::named("debug")));
 		if ( m_debugRenderer ) {
 			dd::initialize(m_debugRenderer.get());
 		}
diff --git a/include/fggl/audio/audio.hpp b/include/fggl/audio/audio.hpp
index db2cb60eead4d0196ed005d804d004799e07c12f..4f733d2aa733fb391ba04bf42e71f3b029eeeb55 100644
--- a/include/fggl/audio/audio.hpp
+++ b/include/fggl/audio/audio.hpp
@@ -43,12 +43,10 @@ namespace fggl::audio {
 	class AudioService {
 		public:
 			constexpr static const modules::ModuleService service = SERVICE_AUDIO_PLAYBACK;
-
-			AudioService() = default;
-			virtual ~AudioService() = default;
-
 			virtual void play(const std::string& filename, bool looping = false) = 0;
 			virtual void play(AudioClip& clip, bool looping = false) = 0;
+
+			virtual ~AudioService() = default;
 	};
 
 } // namespace fggl::audio
diff --git a/include/fggl/gfx/ogl/shader.hpp b/include/fggl/gfx/ogl/shader.hpp
index ef9d89508d430de4ed1732fa9b089846d1642582..f1fef1f8dc68b18188dd43a2795f37f32b9a5633 100644
--- a/include/fggl/gfx/ogl/shader.hpp
+++ b/include/fggl/gfx/ogl/shader.hpp
@@ -36,6 +36,16 @@ namespace fggl::gfx {
 		// optional parts
 		std::string geometry;
 		bool hasGeom = false;
+
+		constexpr static ShaderConfig named(const std::string& name, bool hasGeom = false) {
+			return {
+				.name = name,
+				.vertex = name + "_vert.glsl",
+				.fragment = name + "_frag.glsl",
+				.geometry = hasGeom ? name + "_geom.glsl" : "",
+				.hasGeom = hasGeom
+			};
+		}
 	};
 
 	struct ShaderSources {
@@ -45,14 +55,6 @@ namespace fggl::gfx {
 		std::string geometrySource;
 	};
 
-	inline ShaderConfig ShaderFromName(const std::string &name) {
-		return {
-			name,
-			name + "_vert.glsl",
-			name + "_frag.glsl"
-		};
-	}
-
 	struct BinaryCache {
 		void *data = nullptr;
 		GLsizei size = 0;
diff --git a/include/fggl/modules/module.hpp b/include/fggl/modules/module.hpp
index 6fac536cebb369f7c6d4eee3cd6a260ca80523a0..1c8c8eeaf9705e1a4221236f85db9ce73d6791de 100644
--- a/include/fggl/modules/module.hpp
+++ b/include/fggl/modules/module.hpp
@@ -30,7 +30,6 @@
 namespace fggl::modules {
 
 	using ModuleIdentifier = std::string;
-
 	using ModuleService = util::OpaqueName<std::string_view, struct ModuleServiceTag>;
 
 	constexpr ModuleService make_service(const std::string_view name) {