diff -r 14d2f8b74c94 testing/test_txnode.py
--- a/testing/test_txnode.py	Wed May 26 18:52:58 2010 +0200
+++ b/testing/test_txnode.py	Fri Jun 25 13:50:28 2010 +0000
@@ -42,13 +42,13 @@
         eq = EventQueue(self.config.pluginmanager, self.queue)
         return eq.geteventargs(eventname, timeout=timeout)
 
-    def makenode(self, config=None):
+    def makenode(self, config=None, xspec="popen"):
         if config is None:
             testdir = self.request.getfuncargvalue("testdir")
             config = testdir.reparseconfig([])
         self.config = config
         self.queue = Queue()
-        self.xspec = execnet.XSpec("popen")
+        self.xspec = execnet.XSpec(xspec)
         self.gateway = execnet.makegateway(self.xspec)
         self.id += 1
         self.gateway.id = str(self.id)
@@ -147,3 +147,24 @@
         for outcome in "passed failed skipped".split():
             rep = mysetup.geteventargs("pytest_runtest_logreport")['report']
             assert getattr(rep, outcome) 
+
+    def test_send_one_with_env(self, testdir, mysetup, monkeypatch):
+        monkeypatch.delenv('ENV1', raising=False)
+        monkeypatch.delenv('ENV2', raising=False)
+        monkeypatch.setenv('ENV3', 'var3')
+
+        item = testdir.getitem("""
+            def test_func():
+                import os
+                # ENV1, ENV2 set by xspec; ENV3 inherited from parent process
+                assert os.getenv('ENV2') == 'var2'
+                assert os.getenv('ENV1') == 'var1'
+                assert os.getenv('ENV3') == 'var3'
+        """)
+        node = mysetup.makenode(item.config,
+                xspec="popen//env:ENV1=var1//env:ENV2=var2")
+        node.send(item)
+        kwargs = mysetup.geteventargs("pytest_runtest_logreport")
+        rep = kwargs['report']
+        assert rep.passed
+
diff -r 14d2f8b74c94 xdist/txnode.py
--- a/xdist/txnode.py	Wed May 26 18:52:58 2010 +0200
+++ b/xdist/txnode.py	Fri Jun 25 13:50:28 2010 +0000
@@ -28,10 +28,17 @@
         status = self._down and 'true' or 'false'
         return "<TXNode %r down=%s>" %(id, status)
 
+    @property
+    def env(self):
+        return [(env.lstrip('env:'), value)
+                    for env, value in  self.gateway.spec.__dict__.iteritems()
+                    if env.startswith('env:')]
+
+
     def notify(self, eventname, *args, **kwargs):
         assert not args
         self.putevent((eventname, args, kwargs))
-      
+
     def callback(self, eventcall):
         """ this gets called for each object we receive from 
             the other side and if the channel closes. 
@@ -94,7 +101,7 @@
         channel.send("basicimport")
         channel = PickleChannel(channel)
         import py
-        config, slaveinput, basetemp, nodeid = channel.receive()
+        config, slaveinput, basetemp, nodeid, env = channel.receive()
         config.slaveinput = slaveinput
         config.slaveoutput = {}
         if basetemp:
@@ -102,6 +109,7 @@
         config.nodeid = nodeid
         config.pluginmanager.do_configure(config)
         session = SlaveSession(config, channel, nodeid)
+        os.environ.update(env)
         session.dist_main()
     """)
     channel.receive()
@@ -114,7 +122,7 @@
         basetemp = py.path.local.make_numbered_dir(prefix="slave-", 
             keep=0, rootdir=popenbase)
         basetemp = str(basetemp)
-    channel.send((config, node.slaveinput, basetemp, node.gateway.id))
+    channel.send((config, node.slaveinput, basetemp, node.gateway.id, node.env))
     return channel
 
 class SlaveSession(Session):
