diff --git a/Demo/pdist/rcvs.py b/Demo/pdist/rcvs.py
index 24036c7..8b8bae6 100755
--- a/Demo/pdist/rcvs.py
+++ b/Demo/pdist/rcvs.py
@@ -40,188 +40,188 @@
 from cmdfw import CommandFrameWork
 
 
-DEF_LOCAL = 1				# Default -l
+DEF_LOCAL = 1                           # Default -l
 
 
 class MyFile(File):
 
-	def action(self):
-		"""Return a code indicating the update status of this file.
+    def action(self):
+        """Return a code indicating the update status of this file.
 
-		The possible return values are:
-		
-		'=' -- everything's fine
-		'0' -- file doesn't exist anywhere
-		'?' -- exists locally only
-		'A' -- new locally
-		'R' -- deleted locally
-		'U' -- changed remotely, no changes locally
-		       (includes new remotely or deleted remotely)
-		'M' -- changed locally, no changes remotely
-		'C' -- conflict: changed locally as well as remotely
-		       (includes cases where the file has been added
-		       or removed locally and remotely)
-		'D' -- deleted remotely
-		'N' -- new remotely
-		'r' -- get rid of entry
-		'c' -- create entry
-		'u' -- update entry
+        The possible return values are:
 
-		(and probably others :-)
-		"""
-		if not self.lseen:
-			self.getlocal()
-		if not self.rseen:
-			self.getremote()
-		if not self.eseen:
-			if not self.lsum:
-				if not self.rsum: return '0' # Never heard of
-				else:
-					return 'N' # New remotely
-			else: # self.lsum
-				if not self.rsum: return '?' # Local only
-				# Local and remote, but no entry
-				if self.lsum == self.rsum:
-					return 'c' # Restore entry only
-				else: return 'C' # Real conflict
-		else: # self.eseen
-			if not self.lsum:
-				if self.edeleted:
-					if self.rsum: return 'R' # Removed
-					else: return 'r' # Get rid of entry
-				else: # not self.edeleted
-					if self.rsum:
-						print "warning:",
-						print self.file,
-						print "was lost"
-						return 'U'
-					else: return 'r' # Get rid of entry
-			else: # self.lsum
-				if not self.rsum:
-					if self.enew: return 'A' # New locally
-					else: return 'D' # Deleted remotely
-				else: # self.rsum
-					if self.enew:
-						if self.lsum == self.rsum:
-							return 'u'
-						else:
-							return 'C'
-					if self.lsum == self.esum:
-						if self.esum == self.rsum:
-							return '='
-						else:
-							return 'U'
-					elif self.esum == self.rsum:
-						return 'M'
-					elif self.lsum == self.rsum:
-						return 'u'
-					else:
-						return 'C'
+        '=' -- everything's fine
+        '0' -- file doesn't exist anywhere
+        '?' -- exists locally only
+        'A' -- new locally
+        'R' -- deleted locally
+        'U' -- changed remotely, no changes locally
+               (includes new remotely or deleted remotely)
+        'M' -- changed locally, no changes remotely
+        'C' -- conflict: changed locally as well as remotely
+               (includes cases where the file has been added
+               or removed locally and remotely)
+        'D' -- deleted remotely
+        'N' -- new remotely
+        'r' -- get rid of entry
+        'c' -- create entry
+        'u' -- update entry
 
-	def update(self):
-		code = self.action()
-		if code == '=': return
-		print code, self.file
-		if code in ('U', 'N'):
-			self.get()
-		elif code == 'C':
-			print "%s: conflict resolution not yet implemented" % \
-			      self.file
-		elif code == 'D':
-			remove(self.file)
-			self.eseen = 0
-		elif code == 'r':
-			self.eseen = 0
-		elif code in ('c', 'u'):
-			self.eseen = 1
-			self.erev = self.rrev
-			self.enew = 0
-			self.edeleted = 0
-			self.esum = self.rsum
-			self.emtime, self.ectime = os.stat(self.file)[-2:]
-			self.extra = ''
+        (and probably others :-)
+        """
+        if not self.lseen:
+            self.getlocal()
+        if not self.rseen:
+            self.getremote()
+        if not self.eseen:
+            if not self.lsum:
+                if not self.rsum: return '0' # Never heard of
+                else:
+                    return 'N' # New remotely
+            else: # self.lsum
+                if not self.rsum: return '?' # Local only
+                # Local and remote, but no entry
+                if self.lsum == self.rsum:
+                    return 'c' # Restore entry only
+                else: return 'C' # Real conflict
+        else: # self.eseen
+            if not self.lsum:
+                if self.edeleted:
+                    if self.rsum: return 'R' # Removed
+                    else: return 'r' # Get rid of entry
+                else: # not self.edeleted
+                    if self.rsum:
+                        print "warning:",
+                        print self.file,
+                        print "was lost"
+                        return 'U'
+                    else: return 'r' # Get rid of entry
+            else: # self.lsum
+                if not self.rsum:
+                    if self.enew: return 'A' # New locally
+                    else: return 'D' # Deleted remotely
+                else: # self.rsum
+                    if self.enew:
+                        if self.lsum == self.rsum:
+                            return 'u'
+                        else:
+                            return 'C'
+                    if self.lsum == self.esum:
+                        if self.esum == self.rsum:
+                            return '='
+                        else:
+                            return 'U'
+                    elif self.esum == self.rsum:
+                        return 'M'
+                    elif self.lsum == self.rsum:
+                        return 'u'
+                    else:
+                        return 'C'
 
-	def commit(self, message = ""):
-		code = self.action()
-		if code in ('A', 'M'):
-			self.put(message)
-			return 1
-		elif code == 'R':
-			print "%s: committing removes not yet implemented" % \
-			      self.file
-		elif code == 'C':
-			print "%s: conflict resolution not yet implemented" % \
-			      self.file
+    def update(self):
+        code = self.action()
+        if code == '=': return
+        print code, self.file
+        if code in ('U', 'N'):
+            self.get()
+        elif code == 'C':
+            print "%s: conflict resolution not yet implemented" % \
+                  self.file
+        elif code == 'D':
+            remove(self.file)
+            self.eseen = 0
+        elif code == 'r':
+            self.eseen = 0
+        elif code in ('c', 'u'):
+            self.eseen = 1
+            self.erev = self.rrev
+            self.enew = 0
+            self.edeleted = 0
+            self.esum = self.rsum
+            self.emtime, self.ectime = os.stat(self.file)[-2:]
+            self.extra = ''
 
-	def diff(self, opts = []):
-		self.action()		# To update lseen, rseen
-		flags = ''
-		rev = self.rrev
-		# XXX should support two rev options too!
-		for o, a in opts:
-			if o == '-r':
-				rev = a
-			else:
-				flags = flags + ' ' + o + a
-		if rev == self.rrev and self.lsum == self.rsum:
-			return
-		flags = flags[1:]
-		fn = self.file
-		data = self.proxy.get((fn, rev))
-		sum = md5.new(data).digest()
-		if self.lsum == sum:
-			return
-		import tempfile
-		tf = tempfile.NamedTemporaryFile()
-		tf.write(data)
-		tf.flush()
-		print 'diff %s -r%s %s' % (flags, rev, fn)
-		sts = os.system('diff %s %s %s' % (flags, tf.name, fn))
-		if sts:
-			print '='*70
+    def commit(self, message = ""):
+        code = self.action()
+        if code in ('A', 'M'):
+            self.put(message)
+            return 1
+        elif code == 'R':
+            print "%s: committing removes not yet implemented" % \
+                  self.file
+        elif code == 'C':
+            print "%s: conflict resolution not yet implemented" % \
+                  self.file
 
-	def commitcheck(self):
-		return self.action() != 'C'
+    def diff(self, opts = []):
+        self.action()           # To update lseen, rseen
+        flags = ''
+        rev = self.rrev
+        # XXX should support two rev options too!
+        for o, a in opts:
+            if o == '-r':
+                rev = a
+            else:
+                flags = flags + ' ' + o + a
+        if rev == self.rrev and self.lsum == self.rsum:
+            return
+        flags = flags[1:]
+        fn = self.file
+        data = self.proxy.get((fn, rev))
+        sum = md5.new(data).digest()
+        if self.lsum == sum:
+            return
+        import tempfile
+        tf = tempfile.NamedTemporaryFile()
+        tf.write(data)
+        tf.flush()
+        print 'diff %s -r%s %s' % (flags, rev, fn)
+        sts = os.system('diff %s %s %s' % (flags, tf.name, fn))
+        if sts:
+            print '='*70
 
-	def put(self, message = ""):
-		print "Checking in", self.file, "..."
-		data = open(self.file).read()
-		if not self.enew:
-			self.proxy.lock(self.file)
-		messages = self.proxy.put(self.file, data, message)
-		if messages:
-			print messages
-		self.setentry(self.proxy.head(self.file), self.lsum)
-	
-	def get(self):
-		data = self.proxy.get(self.file)
-		f = open(self.file, 'w')
-		f.write(data)
-		f.close()
-		self.setentry(self.rrev, self.rsum)
+    def commitcheck(self):
+        return self.action() != 'C'
 
-	def log(self, otherflags):
-		print self.proxy.log(self.file, otherflags)
+    def put(self, message = ""):
+        print "Checking in", self.file, "..."
+        data = open(self.file).read()
+        if not self.enew:
+            self.proxy.lock(self.file)
+        messages = self.proxy.put(self.file, data, message)
+        if messages:
+            print messages
+        self.setentry(self.proxy.head(self.file), self.lsum)
 
-	def add(self):
-		self.eseen = 0		# While we're hacking...
-		self.esum = self.lsum
-		self.emtime, self.ectime = 0, 0
-		self.erev = ''
-		self.enew = 1
-		self.edeleted = 0
-		self.eseen = 1		# Done
-		self.extra = ''
+    def get(self):
+        data = self.proxy.get(self.file)
+        f = open(self.file, 'w')
+        f.write(data)
+        f.close()
+        self.setentry(self.rrev, self.rsum)
 
-	def setentry(self, erev, esum):
-		self.eseen = 0		# While we're hacking...
-		self.esum = esum
-		self.emtime, self.ectime = os.stat(self.file)[-2:]
-		self.erev = erev
-		self.enew = 0
-		self.edeleted = 0
-		self.eseen = 1		# Done
-		self.extra = ''
+    def log(self, otherflags):
+        print self.proxy.log(self.file, otherflags)
+
+    def add(self):
+        self.eseen = 0          # While we're hacking...
+        self.esum = self.lsum
+        self.emtime, self.ectime = 0, 0
+        self.erev = ''
+        self.enew = 1
+        self.edeleted = 0
+        self.eseen = 1          # Done
+        self.extra = ''
+
+    def setentry(self, erev, esum):
+        self.eseen = 0          # While we're hacking...
+        self.esum = esum
+        self.emtime, self.ectime = os.stat(self.file)[-2:]
+        self.erev = erev
+        self.enew = 0
+        self.edeleted = 0
+        self.eseen = 1          # Done
+        self.extra = ''
 
 
 SENDMAIL = "/usr/lib/sendmail -t"
@@ -231,247 +231,247 @@
 ...Message from rcvs...
 
 Committed files:
-	%s
+        %s
 
 Log message:
-	%s
+        %s
 """
 
 
 class RCVS(CVS):
 
-	FileClass = MyFile
+    FileClass = MyFile
 
-	def __init__(self):
-		CVS.__init__(self)
+    def __init__(self):
+        CVS.__init__(self)
 
-	def update(self, files):
-		for e in self.whichentries(files, 1):
-			e.update()
+    def update(self, files):
+        for e in self.whichentries(files, 1):
+            e.update()
 
-	def commit(self, files, message = ""):
-		list = self.whichentries(files)
-		if not list: return
-		ok = 1
-		for e in list:
-			if not e.commitcheck():
-				ok = 0
-		if not ok:
-			print "correct above errors first"
-			return
-		if not message:
-			message = raw_input("One-liner: ")
-		committed = []
-		for e in list:
-			if e.commit(message):
-				committed.append(e.file)
-		self.mailinfo(committed, message)
+    def commit(self, files, message = ""):
+        list = self.whichentries(files)
+        if not list: return
+        ok = 1
+        for e in list:
+            if not e.commitcheck():
+                ok = 0
+        if not ok:
+            print "correct above errors first"
+            return
+        if not message:
+            message = raw_input("One-liner: ")
+        committed = []
+        for e in list:
+            if e.commit(message):
+                committed.append(e.file)
+        self.mailinfo(committed, message)
 
-	def mailinfo(self, files, message = ""):
-		towhom = "sjoerd@cwi.nl, jack@cwi.nl" # XXX
-		mailtext = MAILFORM % (towhom, string.join(files),
-					string.join(files), message)
-		print '-'*70
-		print mailtext
-		print '-'*70
-		ok = raw_input("OK to mail to %s? " % towhom)
-		if string.lower(string.strip(ok)) in ('y', 'ye', 'yes'):
-			p = os.popen(SENDMAIL, "w")
-			p.write(mailtext)
-			sts = p.close()
-			if sts:
-				print "Sendmail exit status %s" % str(sts)
-			else:
-				print "Mail sent."
-		else:
-			print "No mail sent."
+    def mailinfo(self, files, message = ""):
+        towhom = "sjoerd@cwi.nl, jack@cwi.nl" # XXX
+        mailtext = MAILFORM % (towhom, string.join(files),
+                                string.join(files), message)
+        print '-'*70
+        print mailtext
+        print '-'*70
+        ok = raw_input("OK to mail to %s? " % towhom)
+        if string.lower(string.strip(ok)) in ('y', 'ye', 'yes'):
+            p = os.popen(SENDMAIL, "w")
+            p.write(mailtext)
+            sts = p.close()
+            if sts:
+                print "Sendmail exit status %s" % str(sts)
+            else:
+                print "Mail sent."
+        else:
+            print "No mail sent."
 
-	def report(self, files):
-		for e in self.whichentries(files):
-			e.report()
+    def report(self, files):
+        for e in self.whichentries(files):
+            e.report()
 
-	def diff(self, files, opts):
-		for e in self.whichentries(files):
-			e.diff(opts)
+    def diff(self, files, opts):
+        for e in self.whichentries(files):
+            e.diff(opts)
 
-	def add(self, files):
-		if not files:
-			raise RuntimeError, "'cvs add' needs at least one file"
-		list = []
-		for e in self.whichentries(files, 1):
-			e.add()
+    def add(self, files):
+        if not files:
+            raise RuntimeError, "'cvs add' needs at least one file"
+        list = []
+        for e in self.whichentries(files, 1):
+            e.add()
 
-	def rm(self, files):
-		if not files:
-			raise RuntimeError, "'cvs rm' needs at least one file"
-		raise RuntimeError, "'cvs rm' not yet imlemented"
+    def rm(self, files):
+        if not files:
+            raise RuntimeError, "'cvs rm' needs at least one file"
+        raise RuntimeError, "'cvs rm' not yet imlemented"
 
-	def log(self, files, opts):
-		flags = ''
-		for o, a in opts:
-			flags = flags + ' ' + o + a
-		for e in self.whichentries(files):
-			e.log(flags)
+    def log(self, files, opts):
+        flags = ''
+        for o, a in opts:
+            flags = flags + ' ' + o + a
+        for e in self.whichentries(files):
+            e.log(flags)
 
-	def whichentries(self, files, localfilestoo = 0):
-		if files:
-			list = []
-			for file in files:
-				if self.entries.has_key(file):
-					e = self.entries[file]
-				else:
-					e = self.FileClass(file)
-					self.entries[file] = e
-				list.append(e)
-		else:
-			list = self.entries.values()
-			for file in self.proxy.listfiles():
-				if self.entries.has_key(file):
-					continue
-				e = self.FileClass(file)
-				self.entries[file] = e
-				list.append(e)
-			if localfilestoo:
-				for file in os.listdir(os.curdir):
-					if not self.entries.has_key(file) \
-					   and not self.ignored(file):
-						e = self.FileClass(file)
-						self.entries[file] = e
-						list.append(e)
-			list.sort()
-		if self.proxy:
-			for e in list:
-				if e.proxy is None:
-					e.proxy = self.proxy
-		return list
+    def whichentries(self, files, localfilestoo = 0):
+        if files:
+            list = []
+            for file in files:
+                if self.entries.has_key(file):
+                    e = self.entries[file]
+                else:
+                    e = self.FileClass(file)
+                    self.entries[file] = e
+                list.append(e)
+        else:
+            list = self.entries.values()
+            for file in self.proxy.listfiles():
+                if self.entries.has_key(file):
+                    continue
+                e = self.FileClass(file)
+                self.entries[file] = e
+                list.append(e)
+            if localfilestoo:
+                for file in os.listdir(os.curdir):
+                    if not self.entries.has_key(file) \
+                       and not self.ignored(file):
+                        e = self.FileClass(file)
+                        self.entries[file] = e
+                        list.append(e)
+            list.sort()
+        if self.proxy:
+            for e in list:
+                if e.proxy is None:
+                    e.proxy = self.proxy
+        return list
 
 
 class rcvs(CommandFrameWork):
 
-	GlobalFlags = 'd:h:p:qvL'
-	UsageMessage = \
+    GlobalFlags = 'd:h:p:qvL'
+    UsageMessage = \
 "usage: rcvs [-d directory] [-h host] [-p port] [-q] [-v] [subcommand arg ...]"
-	PostUsageMessage = \
-		"If no subcommand is given, the status of all files is listed"
+    PostUsageMessage = \
+            "If no subcommand is given, the status of all files is listed"
 
-	def __init__(self):
-		"""Constructor."""
-		CommandFrameWork.__init__(self)
-		self.proxy = None
-		self.cvs = RCVS()
-		
-	def close(self):
-		if self.proxy:
-			self.proxy._close()
-		self.proxy = None
+    def __init__(self):
+        """Constructor."""
+        CommandFrameWork.__init__(self)
+        self.proxy = None
+        self.cvs = RCVS()
 
-	def recurse(self):
-		self.close()
-		names = os.listdir(os.curdir)
-		for name in names:
-			if name == os.curdir or name == os.pardir:
-				continue
-			if name == "CVS":
-				continue
-			if not os.path.isdir(name):
-				continue
-			if os.path.islink(name):
-				continue
-			print "--- entering subdirectory", name, "---"
-			os.chdir(name)
-			try:
-				if os.path.isdir("CVS"):
-					self.__class__().run()
-				else:
-					self.recurse()
-			finally:
-				os.chdir(os.pardir)
-				print "--- left subdirectory", name, "---"
+    def close(self):
+        if self.proxy:
+            self.proxy._close()
+        self.proxy = None
 
-	def options(self, opts):
-		self.opts = opts
+    def recurse(self):
+        self.close()
+        names = os.listdir(os.curdir)
+        for name in names:
+            if name == os.curdir or name == os.pardir:
+                continue
+            if name == "CVS":
+                continue
+            if not os.path.isdir(name):
+                continue
+            if os.path.islink(name):
+                continue
+            print "--- entering subdirectory", name, "---"
+            os.chdir(name)
+            try:
+                if os.path.isdir("CVS"):
+                    self.__class__().run()
+                else:
+                    self.recurse()
+            finally:
+                os.chdir(os.pardir)
+                print "--- left subdirectory", name, "---"
 
-	def ready(self):
-		import rcsclient
-		self.proxy = rcsclient.openrcsclient(self.opts)
-		self.cvs.setproxy(self.proxy)
-		self.cvs.getentries()
+    def options(self, opts):
+        self.opts = opts
 
-	def default(self):
-		self.cvs.report([])
+    def ready(self):
+        import rcsclient
+        self.proxy = rcsclient.openrcsclient(self.opts)
+        self.cvs.setproxy(self.proxy)
+        self.cvs.getentries()
 
-	def do_report(self, opts, files):
-		self.cvs.report(files)
+    def default(self):
+        self.cvs.report([])
 
-	def do_update(self, opts, files):
-		"""update [-l] [-R] [file] ..."""
-		local = DEF_LOCAL
-		for o, a in opts:
-			if o == '-l': local = 1
-			if o == '-R': local = 0
-		self.cvs.update(files)
-		self.cvs.putentries()
-		if not local and not files:
-			self.recurse()
-	flags_update = '-lR'
-	do_up = do_update
-	flags_up = flags_update
+    def do_report(self, opts, files):
+        self.cvs.report(files)
 
-	def do_commit(self, opts, files):
-		"""commit [-m message] [file] ..."""
-		message = ""
-		for o, a in opts:
-			if o == '-m': message = a
-		self.cvs.commit(files, message)
-		self.cvs.putentries()
-	flags_commit = 'm:'
-	do_com = do_commit
-	flags_com = flags_commit
+    def do_update(self, opts, files):
+        """update [-l] [-R] [file] ..."""
+        local = DEF_LOCAL
+        for o, a in opts:
+            if o == '-l': local = 1
+            if o == '-R': local = 0
+        self.cvs.update(files)
+        self.cvs.putentries()
+        if not local and not files:
+            self.recurse()
+    flags_update = '-lR'
+    do_up = do_update
+    flags_up = flags_update
 
-	def do_diff(self, opts, files):
-		"""diff [difflags] [file] ..."""
-		self.cvs.diff(files, opts)
-	flags_diff = 'cbitwcefhnlr:sD:S:'
-	do_dif = do_diff
-	flags_dif = flags_diff
+    def do_commit(self, opts, files):
+        """commit [-m message] [file] ..."""
+        message = ""
+        for o, a in opts:
+            if o == '-m': message = a
+        self.cvs.commit(files, message)
+        self.cvs.putentries()
+    flags_commit = 'm:'
+    do_com = do_commit
+    flags_com = flags_commit
 
-	def do_add(self, opts, files):
-		"""add file ..."""
-		if not files:
-			print "'rcvs add' requires at least one file"
-			return
-		self.cvs.add(files)
-		self.cvs.putentries()
+    def do_diff(self, opts, files):
+        """diff [difflags] [file] ..."""
+        self.cvs.diff(files, opts)
+    flags_diff = 'cbitwcefhnlr:sD:S:'
+    do_dif = do_diff
+    flags_dif = flags_diff
 
-	def do_remove(self, opts, files):
-		"""remove file ..."""
-		if not files:
-			print "'rcvs remove' requires at least one file"
-			return
-		self.cvs.remove(files)
-		self.cvs.putentries()
-	do_rm = do_remove
+    def do_add(self, opts, files):
+        """add file ..."""
+        if not files:
+            print "'rcvs add' requires at least one file"
+            return
+        self.cvs.add(files)
+        self.cvs.putentries()
 
-	def do_log(self, opts, files):
-		"""log [rlog-options] [file] ..."""
-		self.cvs.log(files, opts)
-	flags_log = 'bhLNRtd:s:V:r:'
+    def do_remove(self, opts, files):
+        """remove file ..."""
+        if not files:
+            print "'rcvs remove' requires at least one file"
+            return
+        self.cvs.remove(files)
+        self.cvs.putentries()
+    do_rm = do_remove
+
+    def do_log(self, opts, files):
+        """log [rlog-options] [file] ..."""
+        self.cvs.log(files, opts)
+    flags_log = 'bhLNRtd:s:V:r:'
 
 
 def remove(fn):
-	try:
-		os.unlink(fn)
-	except os.error:
-		pass
+    try:
+        os.unlink(fn)
+    except os.error:
+        pass
 
 
 def main():
-	r = rcvs()
-	try:
-		r.run()
-	finally:
-		r.close()
+    r = rcvs()
+    try:
+        r.run()
+    finally:
+        r.close()
 
 
 if __name__ == "__main__":
-	main()
+    main()
