diff --git a/manifests/attr.pp b/manifests/attr.pp
index 2cff63c61653cf076f229f325157b5d540aa8f9d..45a13b904aa6ca88db41673973d96bf5b94c9105 100644
--- a/manifests/attr.pp
+++ b/manifests/attr.pp
@@ -25,7 +25,7 @@ define freeradius::attr (
 
   # Reference all attribute snippets in one file
   concat::fragment { "attr-${name}":
-    target  => "${fr_modulepath}/attr_filter",
+    target  => "${fr_basepath}/mods-available/attr_filter",
     content => template('freeradius/attr.erb'),
     order   => 20,
   }
diff --git a/manifests/init.pp b/manifests/init.pp
index d6557d55be9c10aa8f302baea31fdcac81ccda3c..ce72517937dd10352332aefd593422d273891268 100644
--- a/manifests/init.pp
+++ b/manifests/init.pp
@@ -172,17 +172,21 @@ class freeradius (
   }
 
   # Set up attribute filter file
-  concat { "${freeradius::fr_modulepath}/attr_filter":
+  concat { "${freeradius::fr_basepath}/mods-available/attr_filter":
     owner   => 'root',
     group   => $freeradius::fr_group,
     mode    => '0640',
     require => [Package[$freeradius::fr_package], Group[$freeradius::fr_group]],
     notify  => Service[$freeradius::fr_service],
   }
+  file { "${fr_modulepath}/attr_filter":
+    ensure => link,
+    target => "../mods-available/attr_filter",
+  }
 
   # Install default attribute filters
   concat::fragment { 'attr-default':
-    target  => "${freeradius::fr_modulepath}/attr_filter",
+    target  => "${freeradius::fr_basepath}/mods-available/attr_filter",
     content => template('freeradius/attr_default.erb'),
     order   => 10,
   }
diff --git a/manifests/krb5.pp b/manifests/krb5.pp
index 3f40a3fb919044c3c77ec0ccd283192dbe66e128..d5eeb7c6bc3d8e806f66d7f5a32e50427534bc63 100644
--- a/manifests/krb5.pp
+++ b/manifests/krb5.pp
@@ -11,10 +11,11 @@ define freeradius::krb5 (
   $fr_package          = $::freeradius::params::fr_package
   $fr_service          = $::freeradius::params::fr_service
   $fr_modulepath       = $::freeradius::params::fr_modulepath
+  $fr_basepath         = $::freeradius::params::fr_basepath
   $fr_group            = $::freeradius::params::fr_group
 
   # Generate a module config
-  file { "${fr_modulepath}/${name}":
+  file { "${fr_basepath}/mods-availabe/${name}":
     ensure  => $ensure,
     mode    => '0640',
     owner   => 'root',
@@ -23,4 +24,8 @@ define freeradius::krb5 (
     require => [Package[$fr_package], Group[$fr_group]],
     notify  => Service[$fr_service],
   }
+  file { "${fr_modulepath}/${name}":
+    ensure => link,
+    target => "../mods-available/${name}",
+  }
 }
diff --git a/manifests/module.pp b/manifests/module.pp
index f9f55b8ac4176146f5621dbdc0aa9649ff035297..925617fbdeccf36ecc39abe5f1bc83bc17ce26a6 100644
--- a/manifests/module.pp
+++ b/manifests/module.pp
@@ -18,8 +18,8 @@ define freeradius::module (
       target => "../mods-available/${name}",
     }
   } else {
-    # Deploy actual module to sites-enabled
-    file { "${fr_modulepath}/${name}":
+    # Deploy actual module to mods-available, and link it to mods-enabled
+    file { "${fr_basepath}/mods-available/${name}":
       ensure  => $ensure,
       mode    => '0640',
       owner   => 'root',
@@ -29,5 +29,9 @@ define freeradius::module (
       require => [Package[$fr_package], Group[$fr_group]],
       notify  => Service[$fr_service],
     }
+    file { "${fr_modulepath}/${name}":
+      ensure => link,
+      target => "../mods-available/${name}",
+    }
   }
 }
diff --git a/manifests/module/ldap.pp b/manifests/module/ldap.pp
index 2fafc11656a69d8a8f5a462d1ec2cd7728e52333..b04e1d91085aff24dadcb29d45ff4c457287d7c2 100644
--- a/manifests/module/ldap.pp
+++ b/manifests/module/ldap.pp
@@ -65,6 +65,7 @@ define freeradius::module::ldap (
   $fr_package          = $::freeradius::params::fr_package
   $fr_service          = $::freeradius::params::fr_service
   $fr_modulepath       = $::freeradius::params::fr_modulepath
+  $fr_basepath         = $::freeradius::params::fr_basepath
   $fr_group            = $::freeradius::params::fr_group
 
   # Validate our inputs
@@ -84,7 +85,7 @@ define freeradius::module::ldap (
   }
 
   # Generate a module config, based on ldap.conf
-  file { "${fr_modulepath}/${name}":
+  file { "${fr_basepath}/mods-available/${name}":
     ensure  => $ensure,
     mode    => '0640',
     owner   => 'root',
@@ -93,4 +94,8 @@ define freeradius::module::ldap (
     require => [Package[$fr_package], Group[$fr_group]],
     notify  => Service[$fr_service],
   }
+  file { "${fr_modulepath}/${name}":
+    ensure => link,
+    target => "../mods-available/${name}",
+  }
 }
diff --git a/manifests/site.pp b/manifests/site.pp
index c9ba779b9e5b9673b13ee65d4df07e645bdeb585..7413f1b23f140e210a776bd3e48d54b30f795715 100644
--- a/manifests/site.pp
+++ b/manifests/site.pp
@@ -26,7 +26,7 @@ define freeradius::site (
     default => undef,
   }
 
-  file { "${fr_basepath}/sites-enabled/${name}":
+  file { "${fr_basepath}/sites-available/${name}":
     ensure  => $ensure,
     mode    => '0640',
     owner   => 'root',
@@ -36,4 +36,8 @@ define freeradius::site (
     require => [Package[$fr_package], Group[$fr_group]],
     notify  => Service[$fr_service],
   }
+  file { "${fr_basepath}/sites-enabled/${name}":
+    ensure => link,
+    target => "${fr_basepath}/sites-available/${name}",
+  }
 }
diff --git a/manifests/sql.pp b/manifests/sql.pp
index 28491868ae7b844fc82006adbb33b19aa5efd41d..66216c1eb6380ca0fc8dea84bdcbd4b454f3bc99 100644
--- a/manifests/sql.pp
+++ b/manifests/sql.pp
@@ -108,7 +108,7 @@ define freeradius::sql (
   }
 
   # Generate a module config, based on sql.conf
-  file { "${fr_modulepath}/${name}":
+  file { "${fr_basepath}/mods-available/${name}":
     ensure  => $ensure,
     mode    => '0640',
     owner   => 'root',
@@ -117,6 +117,10 @@ define freeradius::sql (
     require => [Package[$fr_package], Group[$fr_group]],
     notify  => Service[$fr_service],
   }
+  file { "${fr_modulepath}/${name}":
+    ensure => link,
+    target => "../mods-available/${name}",
+  }
 
   # Install rotation for sqltrace if we are using it
   if ($sqltrace == 'yes') {