diff --git a/lib/SimpleSAML/Auth/Simple.php b/lib/SimpleSAML/Auth/Simple.php
index 2bfa424ec821ddfec48306b82f69867b0c8b4f67..efd77a70dce4e2ddfaf01d29c0c9f9d701a6de7b 100644
--- a/lib/SimpleSAML/Auth/Simple.php
+++ b/lib/SimpleSAML/Auth/Simple.php
@@ -23,7 +23,7 @@ class Simple
      */
     protected $authSource;
 
-    /** @var \SimpleSAML\Configuration|null */
+    /** @var \SimpleSAML\Configuration */
     protected $app_config;
 
     /** @var \SimpleSAML\Session */
@@ -45,7 +45,7 @@ class Simple
             $config = Configuration::getInstance();
         }
         $this->authSource = $authSource;
-        $this->app_config = $config->getConfigItem('application', null);
+        $this->app_config = $config->getConfigItem('application');
 
         if ($session === null) {
             $session = Session::getSessionFromRequest();
@@ -389,12 +389,7 @@ class Simple
             $port = '';
         }
 
-        if (is_null($this->app_config)) {
-            // nothing more we can do here
-            return $scheme.'://'.$host.$port.$path.($query ? '?'.$query : '').($fragment ? '#'.$fragment : '');
-        }
-
-        $base = rtrim($this->app_config->getString(
+        $base = trim($this->app_config->getString(
             'baseURL',
             $scheme.'://'.$host.$port
         ), '/');
diff --git a/lib/SimpleSAML/Configuration.php b/lib/SimpleSAML/Configuration.php
index 25627f565133a43b6541fa5c9062f8c50c35af71..2350b0665233db4d2603cc28531a4c3c40ba576f 100644
--- a/lib/SimpleSAML/Configuration.php
+++ b/lib/SimpleSAML/Configuration.php
@@ -981,23 +981,25 @@ class Configuration implements Utils\ClearableState
      * is given.
      *
      * @param string $name The name of the option.
-     * @param mixed  $default A default value which will be returned if the option isn't found. The option will be
-     *                        required if this parameter isn't given. The default value can be any value, including
-     *                        null.
+     * @param array|null $default A default value which will be used if the option isn't found. An empty Configuration
+     *                        object will be returned if this parameter isn't given and the option doesn't exist.
+     *                        This function will only return null if $default is set to null and the option
+     *                        doesn't exist.
      *
      * @return mixed The option with the given name, or $default if the option isn't found and $default is specified.
      *
      * @throws \Exception If the option is not an array.
      */
-    public function getConfigItem($name, $default = self::REQUIRED_OPTION)
+    public function getConfigItem($name, $default = [])
     {
         assert(is_string($name));
 
         $ret = $this->getValue($name, $default);
 
-        if ($ret === $default) {
-            // the option wasn't found, or it matches the default value. In any case, return this value
-            return $ret;
+        if ($ret === null) {
+            // the option wasn't found, or it is explicitly null
+            // do not instantiate a new Configuration instance, but just return null
+            return null;
         }
 
         if (!is_array($ret)) {
@@ -1022,24 +1024,18 @@ class Configuration implements Utils\ClearableState
      * default value is given.
      *
      * @param string $name The name of the option.
-     * @param mixed  $default A default value which will be returned if the option isn't found. The option will be
-     *                        required if this parameter isn't given. The default value can be any value, including
-     *                        null.
      *
-     * @return mixed The option with the given name, or $default if the option isn't found and $default is specified.
+     * @return array The array of \SimpleSAML\Configuration objects.
      *
      * @throws \Exception If the value of this element is not an array.
+     *
+     * @deprecated Very specific function, will be removed in a future release; use getConfigItem or getArray instead
      */
-    public function getConfigList($name, $default = self::REQUIRED_OPTION)
+    public function getConfigList($name)
     {
         assert(is_string($name));
 
-        $ret = $this->getValue($name, $default);
-
-        if ($ret === $default) {
-            // the option wasn't found, or it matches the default value. In any case, return this value
-            return $ret;
-        }
+        $ret = $this->getValue($name, []);
 
         if (!is_array($ret)) {
             throw new \Exception(
diff --git a/lib/SimpleSAML/Locale/Translate.php b/lib/SimpleSAML/Locale/Translate.php
index a92ca7ee8cad95a695dedbf6c6e8f2afeaaeacc2..77c00f0e67e9685b968c23edec74f709dd76fb35 100644
--- a/lib/SimpleSAML/Locale/Translate.php
+++ b/lib/SimpleSAML/Locale/Translate.php
@@ -546,11 +546,8 @@ class Translate
 
         // we don't have a translation for the current language, load alternative priorities
         $sspcfg = Configuration::getInstance();
-        $langcfg = $sspcfg->getConfigItem('language', null);
-        $priorities = [];
-        if ($langcfg instanceof Configuration) {
-            $priorities = $langcfg->getArray('priorities', []);
-        }
+        $langcfg = $sspcfg->getConfigItem('language');
+        $priorities = $langcfg->getArray('priorities', []);
 
         if (!empty($priorities[$context['currentLanguage']])) {
             foreach ($priorities[$context['currentLanguage']] as $lang) {
diff --git a/lib/SimpleSAML/Module.php b/lib/SimpleSAML/Module.php
index 2fd6426ea79d9a70e873ccb7f9237cd373666dd9..61986c276c6b918c84e62ee2f2be2ed4791e8650 100644
--- a/lib/SimpleSAML/Module.php
+++ b/lib/SimpleSAML/Module.php
@@ -272,8 +272,8 @@ class Module
             }
         }
 
-        $assetConfig = $config->getConfigItem('assets', new Configuration([], '[assets]'));
-        $cacheConfig = $assetConfig->getConfigItem('caching', new Configuration([], '[assets][caching]'));
+        $assetConfig = $config->getConfigItem('assets');
+        $cacheConfig = $assetConfig->getConfigItem('caching');
         $response = new BinaryFileResponse($path);
         $response->setCache([
             // "public" allows response caching even if the request was authenticated,
diff --git a/lib/SimpleSAML/Stats.php b/lib/SimpleSAML/Stats.php
index 3a75fc357ad42cea2eef6bae8b951aaff57a5873..25ff214ac09394780488485936aa0deb1da83e41 100644
--- a/lib/SimpleSAML/Stats.php
+++ b/lib/SimpleSAML/Stats.php
@@ -54,7 +54,7 @@ class Stats
     {
 
         $config = Configuration::getInstance();
-        $outputCfgs = $config->getConfigList('statistics.out', []);
+        $outputCfgs = $config->getConfigList('statistics.out');
 
         self::$outputs = [];
         foreach ($outputCfgs as $cfg) {
diff --git a/lib/SimpleSAML/Utils/HTTP.php b/lib/SimpleSAML/Utils/HTTP.php
index 2fc9f2226f8793ae7c1cc64f5265e4fa67689570..52cae76ed9a07ec3bdd8489533005e09333a81e1 100644
--- a/lib/SimpleSAML/Utils/HTTP.php
+++ b/lib/SimpleSAML/Utils/HTTP.php
@@ -829,8 +829,8 @@ class HTTP
              */
 
             /** @var \SimpleSAML\Configuration $appcfg */
-            $appcfg = $cfg->getConfigItem('application', null);
-            $appurl = ($appcfg instanceof Configuration) ? $appcfg->getString('baseURL', '') : '';
+            $appcfg = $cfg->getConfigItem('application');
+            $appurl = $appcfg->getString('baseURL', '');
             if (!empty($appurl)) {
                 $protocol = parse_url($appurl, PHP_URL_SCHEME);
                 $hostname = parse_url($appurl, PHP_URL_HOST);
@@ -838,8 +838,7 @@ class HTTP
                 $port = !empty($port) ? ':'.$port : '';
             } else {
                 // no base URL specified for app, just use the current URL
-                $protocol = 'http';
-                $protocol .= (self::getServerHTTPS()) ? 's' : '';
+                $protocol = self::getServerHTTPS() ? 'https' : 'http';
                 $hostname = self::getServerHost();
                 $port = self::getServerPort();
             }
diff --git a/tests/lib/SimpleSAML/ConfigurationTest.php b/tests/lib/SimpleSAML/ConfigurationTest.php
index 0fde35e9f0addfa8a7308c5787763a44a46b396d..2ffa31d7409bcaf9b380a0dbc8157292c840052b 100644
--- a/tests/lib/SimpleSAML/ConfigurationTest.php
+++ b/tests/lib/SimpleSAML/ConfigurationTest.php
@@ -523,9 +523,11 @@ class ConfigurationTest extends \SimpleSAML\Test\Utils\ClearStateTestCase
         $c = Configuration::loadFromArray([
             'opt' => ['a' => 42],
         ]);
-        $this->assertEquals($c->getConfigItem('missing_opt', '--missing--'), '--missing--');
+        $this->assertNull($c->getConfigItem('missing_opt', null));
         $opt = $c->getConfigItem('opt');
+        $notOpt = $c->getConfigItem('notOpt');
         $this->assertInstanceOf('SimpleSAML\Configuration', $opt);
+        $this->assertInstanceOf('SimpleSAML\Configuration', $notOpt);
         $this->assertEquals($opt->getValue('a'), 42);
     }
 
@@ -556,7 +558,7 @@ class ConfigurationTest extends \SimpleSAML\Test\Utils\ClearStateTestCase
                 'b' => ['opt2' => 'value2'],
             ],
         ]);
-        $this->assertEquals($c->getConfigList('missing_opt', '--missing--'), '--missing--');
+        $this->assertEquals($c->getConfigList('missing_opt'), []);
         $opts = $c->getConfigList('opts');
         $this->assertInternalType('array', $opts);
         $this->assertEquals(array_keys($opts), ['a', 'b']);