diff --git a/Demo/pdist/rcvs.py b/Demo/pdist/rcvs.py
index 9f9d8bd..fe8651c 100755
--- a/Demo/pdist/rcvs.py
+++ b/Demo/pdist/rcvs.py
@@ -12,16 +12,64 @@
 
 class MyFile(File):
 
-	def update(self):
-		print self.file, '...'
-		if self.lsum == self.esum == self.rsum:
-			print '=', self.file
-			return
-		if self.lsum and not self.erev and not self.rrev:
-			print '?', self.file
-			return
-		print 'X', self.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
+		'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)
+		"""
+		if not self.eseen:
+			pass
+		return '?'
+
+	def update(self):
+		code = self.action()
+		print code, self.file
+		if code == 'U':
+			self.get()
+		elif code == 'C':
+			print "%s: conflict resolution not yet implemented" % \
+			      self.file
+
+	def commit(self, message = ""):
+		code = self.action()
+		if code in ('A', 'M'):
+			self.put(message)
+		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 put(self, message = ""):
+		print "%s: put not yet implemented" % self.file
+	
+	def get(self):
+		data = self.proxy.get(self.file)
+		f = open(self.file, 'w')
+		f.write(data)
+		f.close()
+		self.eseen = 1
+		self.esum = self.rsum
+		self.emtime, self.ectime = os.stat(self.file)[-2:]
+		self.erev = self.rrev
+		self.enew = 0
+		self.edeleted = 0
+		# XXX anything else?
 
 
 class RCVS(CVS):
@@ -38,6 +86,18 @@
 				return e.eseen or e.rseen
 			files[:] = filter(ok, self.entries.keys())
 			files.sort()
+			if not files:
+				print "no files to be processed"
+				return 1
+			else:
+				return None
+		else:
+			sts = None
+			for file in files:
+				if not self.entries.has_key(file):
+					print "%s: nothing known" % file
+					sts = 1
+			return sts
 
 
 class rcvs(CommandFrameWork):
@@ -64,19 +124,35 @@
 		self.cvs.getremotefiles(self.proxy)
 
 	def default(self):
+		files = []
+		if self.cvs.checkfiles(files):
+			return 1
 		self.cvs.report()
 
 	def do_update(self, opts, files):
-		self.cvs.checkfiles(files)
-		if not files:
-			print "no files"
-			return
+		"""update [file] ..."""
+		if self.cvs.checkfiles(files):
+			return 1
 		for file in files:
 			if not self.cvs.entries.has_key(file):
 				print "%s: not found" % file
 			else:
 				self.cvs.entries[file].update()
 
+	def do_commit(self, opts, files):
+		"""commit [file] ..."""
+		if self.cvs.checkfiles(files):
+			return 1
+		sts = 0
+		for file in files:
+			if not self.entries[file].commitcheck():
+				sts = 1
+		if sts:
+			return sts
+		message = raw_input("One-liner: ")
+		for file in files:
+			self.entries[file].commit(message)
+
 
 def main():
 	rcvs().run()
