anchor.diff:      ''
         startAll;
   
  -      # Enable NAT on the router and start miniupnpd.
  -      $router->waitForUnit("nat");
  -      $router->succeed(
  -          "iptables -w -t nat -N MINIUPNPD",
  -          "iptables -w -t nat -A PREROUTING -i eth1 -j MINIUPNPD",
  -          "echo 1 > /proc/sys/net/ipv4/ip_forward",
  -          "miniupnpd -f ${miniupnpdConf nodes}"
  -      );
  +      # Wait for network and miniupnpd.
  +      $router->waitForUnit("network-online.target");
  +      $router->waitForUnit("miniupnpd");
   
         # Create the torrent.
         $tracker->succeed("mkdir /tmp/data");
         $tracker->succeed("cp ${file} /tmp/data/test.tar.bz2");
  -      $tracker->succeed("transmission-create /tmp/data/test.tar.bz2 -p -t http://${(pkgs.lib.head nodes.tracker.config.networking.interfaces.eth1.ipv4.addresses).address}:6969/announce -o /tmp/test.torrent");
  +      $tracker->succeed("transmission-create /tmp/data/test.tar.bz2 --private --tracker http://${externalTrackerAddress}:6969/announce --outfile /tmp/test.torrent");
         $tracker->succeed("chmod 644 /tmp/test.torrent");
   
         # Start the tracker.  !!! use a less crappy tracker
  -      $tracker->waitForUnit("network.target");
  -      $tracker->succeed("opentracker -p 6969 >&2 &");
  +      $tracker->waitForUnit("network-online.target");
  +      $tracker->waitForUnit("opentracker.service");
         $tracker->waitForOpenPort(6969);
   
         # Start the initial seeder.
  -      my $pid = $tracker->succeed("transmission-cli /tmp/test.torrent -M -w /tmp/data >&2 & echo \$!");
  +      $tracker->succeed("transmission-remote --add /tmp/test.torrent --no-portmap --no-dht --download-dir /tmp/data");
   
         # Now we should be able to download from the client behind the NAT.
         $tracker->waitForUnit("httpd");
  -      $client1->waitForUnit("network.target");
  -      $client1->succeed("transmission-cli http://tracker/test.torrent -w /tmp >&2 &");
  +      $client1->waitForUnit("network-online.target");
  +      $client1->succeed("transmission-remote --add http://${externalTrackerAddress}/test.torrent --download-dir /tmp >&2 &");
         $client1->waitForFile("/tmp/test.tar.bz2");
         $client1->succeed("cmp /tmp/test.tar.bz2 ${file}");
   
         # Bring down the initial seeder.
  -      $tracker->succeed("kill -9 $pid");
  +      # $tracker->stopJob("transmission");
   
         # Now download from the second client.  This can only succeed if
         # the first client created a NAT hole in the router.
  -      $client2->waitForUnit("network.target");
  -      $client2->succeed("transmission-cli http://tracker/test.torrent -M -w /tmp >&2 &");
  +      $client2->waitForUnit("network-online.target");
  +      $client2->succeed("transmission-remote --add http://${externalTrackerAddress}/test.torrent --no-portmap --no-dht --download-dir /tmp >&2 &");
         $client2->waitForFile("/tmp/test.tar.bz2");
         $client2->succeed("cmp /tmp/test.tar.bz2 ${file}");
       '';
  
positive.code:   nodes =
      { tracker =
          { pkgs, ... }:
          { environment.systemPackages = [ pkgs.transmission pkgs.opentracker ];
  
            # We need Apache on the tracker to serve the torrents.
            services.httpd.enable = true;
            services.httpd.adminAddr = "foo@example.org";
            services.httpd.documentRoot = "/tmp";
  
            networking.firewall.enable = false; # FIXME: figure out what ports we actually need
          };
  
        router =
          { pkgs, ... }:
          { environment.systemPackages = [ pkgs.miniupnpd ];
            virtualisation.vlans = [ 1 2 ];
            networking.nat.enable = true;
            networking.nat.internalInterfaces = [ "eth2" ];
            networking.nat.externalInterface = "eth1";
            networking.firewall.enable = false;
          };
  
        client1 =
          { pkgs, nodes, ... }:
          { environment.systemPackages = [ pkgs.transmission ];
            virtualisation.vlans = [ 2 ];
            networking.defaultGateway =
              (pkgs.lib.head nodes.router.config.networking.interfaces.eth2.ipv4.addresses).address;
            networking.firewall.enable = false;
          };
  
        client2 =
          { pkgs, ... }:
          { environment.systemPackages = [ pkgs.transmission ];
            networking.firewall.enable = false;
          };
      };
  
  
negative.code:   # Some random file to serve.
    file = pkgs.hello.src;
  
    internalRouterAddress = "192.168.3.1";
    internalClient1Address = "192.168.3.2";
    externalRouterAddress = "80.100.100.1";
    externalClient2Address = "80.100.100.2";
    externalTrackerAddress = "80.100.100.3";
  in
  
  {
  