diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index e66a2ba272a..521e2c0ca24 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -413,6 +413,7 @@
./services/networking/asterisk.nix
./services/networking/atftpd.nix
./services/networking/avahi-daemon.nix
+ ./services/networking/babeld.nix
./services/networking/bind.nix
./services/networking/autossh.nix
./services/networking/bird.nix
diff --git a/nixos/modules/services/networking/babeld.nix b/nixos/modules/services/networking/babeld.nix
new file mode 100644
index 00000000000..dd76bac9df7
--- /dev/null
+++ b/nixos/modules/services/networking/babeld.nix
@@ -0,0 +1,98 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.babeld;
+
+ paramsString = params:
+ concatMapStringsSep "" (name: "${name} ${boolToString (getAttr name params)}")
+ (attrNames params);
+
+ interfaceConfig = name:
+ let
+ interface = getAttr name cfg.interfaces;
+ in
+ "interface ${name} ${paramsString interface}\n";
+
+ configFile = with cfg; pkgs.writeText "babeld.conf" (
+ (optionalString (cfg.interfaceDefaults != null) ''
+ default ${paramsString cfg.interfaceDefaults}
+ '')
+ + (concatMapStrings interfaceConfig (attrNames cfg.interfaces))
+ + extraConfig);
+
+in
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.babeld = {
+
+ enable = mkOption {
+ default = false;
+ description = ''
+ Whether to run the babeld network routing daemon.
+ '';
+ };
+
+ interfaceDefaults = mkOption {
+ default = null;
+ description = ''
+ A set describing default parameters for babeld interfaces.
+ See babeld8 for options.
+ '';
+ type = types.nullOr (types.attrsOf types.unspecified);
+ example =
+ {
+ wired = true;
+ "split-horizon" = true;
+ };
+ };
+
+ interfaces = mkOption {
+ default = {};
+ description = ''
+ A set describing babeld interfaces.
+ See babeld8 for options.
+ '';
+ type = types.attrsOf (types.attrsOf types.unspecified);
+ example =
+ { enp0s2 =
+ { wired = true;
+ "hello-interval" = 5;
+ "split-horizon" = "auto";
+ };
+ };
+ };
+
+ extraConfig = mkOption {
+ default = "";
+ description = ''
+ Options that will be copied to babeld.conf.
+ See babeld8 for details.
+ '';
+ };
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.babeld.enable {
+
+ systemd.services.babeld = {
+ description = "Babel routing daemon";
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig.ExecStart = "${pkgs.babeld}/bin/babeld -c ${configFile}";
+ };
+
+ };
+
+}