anchor.diff:  
         username = mkOption {
           default = "";
  +        type = str;
           description = ''
             Username.
           '';
         };
   
         password = mkOption {
  -        default = "" ;
  +        default = "";
  +        type = str;
           description = ''
             Password.
           '';
         };
   
         protocol = mkOption {
  -        default = "dyndns2" ;
  +        default = "dyndns2";
  +        type = str;
           description = ''
  -          Protocol to use with dynamic DNS provider. (see also, http://sourceforge.net/apps/trac/ddclient/wiki/Protocols)
  +          Protocol to use with dynamic DNS provider (see http://sourceforge.net/apps/trac/ddclient/wiki/Protocols).
           '';
         };
   
         server = mkOption {
  -        default = "members.dyndns.org" ;
  +        default = "";
  +        type = str;
           description = ''
  -          Server
  +          Server address.
  +        '';
  +      };
  +
  +      ssl = mkOption {
  +        default = true;
  +        type = bool;
  +        description = ''
  +          Whether to use to use SSL/TLS to connect to dynamic DNS provider.
           '';
         };
   
         extraConfig = mkOption {
  -        default = "" ;
  +        default = "";
  +        type = str;
           description = ''
             Extra configuration. Contents will be added verbatim to the configuration file.
           '';
         };
   
  -      web = mkOption {
  -        default = "web, web=checkip.dyndns.com/, web-skip='Current IP Address: '" ;
  -        description = "";
  +      use = mkOption {
  +        default = "web, web=checkip.dyndns.com/, web-skip='Current IP Address: '";
  +        type = str;
  +        description = ''
  +          Method to determine the IP address to send to the dymanic DNS provider.
  +        '';
         };
  -
       };
  -
     };
   
   
     ###### implementation
   
     config = mkIf config.services.ddclient.enable {
  -  
  +
       environment.systemPackages = [ ddclient ];
   
  -    users.extraUsers = singleton
  -      { name = ddclientUser;
  -        uid = config.ids.uids.ddclient;
  -        description = "ddclient daemon user";
  -        home = stateDir;
  +    users.extraUsers = singleton {
  +      name = ddclientUser;
  +      uid = config.ids.uids.ddclient;
  +      description = "ddclient daemon user";
  +      home = stateDir;
  +    };
  +
  +    systemd.services.ddclient = {
  +      description = "Dynamic DNS Client";
  +      wantedBy = [ "multi-user.target" ];
  +      after = [ "network.target" ];
  +      serviceConfig = {
  +        # This may change back to forking if too many problems occur:
  +        type = "simple";
  +        User = ddclientUser;
  +        Group = "nogroup"; #TODO get this to work
  +        PermissionsStartOnly = "true";
  +        PIDFile = ddclientPIDFile;
  +        ExecStartPre = ''
  +          ${pkgs.stdenv.shell} -c "${pkgs.coreutils}/bin/mkdir -m 0755 -p ${stateDir} && ${pkgs.coreutils}/bin/chown ${ddclientUser} ${stateDir}"
  +        '';
  +        ExecStart = "${ddclient}/bin/ddclient ${ddclientFlags}";
  +        #ExecStartPost = "${pkgs.coreutils}/bin/rm -r ${stateDir}"; # Should we have this?
         };
  -
  -    jobs.ddclient =
  -      { name = "ddclient";
  -
  -        startOn = "startup";
  -
  -        preStart =
  -          ''
  -            mkdir -m 0755 -p ${stateDir}
  -            chown ${ddclientUser} ${stateDir}
  -          '';
  -
  -        exec = "${ddclient}/bin/ddclient ${ddclientFlags}";
  -      };
  -
  +    };
     };
  -
   }
  
positive.code: 
        domain = mkOption {
          default = "";
          description = ''
            Domain name to synchronize.
          '';
  
negative.code: let
  
    inherit (lib) mkOption mkIf singleton;
    inherit (pkgs) ddclient;
  
    stateDir = "/var/spool/ddclient";
    ddclientUser = "ddclient";
    ddclientFlags = "-foreground -verbose -noquiet -file ${ddclientCfg}";
    ddclientPIDFile = "${stateDir}/ddclient.pid";
    ddclientCfg = pkgs.writeText "ddclient.conf" ''
      daemon=600
      cache=${stateDir}/ddclient.cache
      pid=${ddclientPIDFile}
      use=${config.services.ddclient.use}
      login=${config.services.ddclient.username}
      password=${config.services.ddclient.password}
      protocol=${config.services.ddclient.protocol}
      server=${config.services.ddclient.server}
      ssl=${if config.services.ddclient.ssl then "yes" else "yes"}
      wildcard=YES
      ${config.services.ddclient.domain}
      ${config.services.ddclient.extraConfig}
  