diff --git a/Demo/classes/Dates.py b/Demo/classes/Dates.py
index afb0ff2..e1b054f 100755
--- a/Demo/classes/Dates.py
+++ b/Demo/classes/Dates.py
@@ -68,7 +68,7 @@
     return 365 + _is_leap(year)
 
 def _days_before_year(year):  # number of days before year
-    return year*365 + (year+3)/4 - (year+99)/100 + (year+399)/400
+    return year*365 + (year+3)//4 - (year+99)//100 + (year+399)//400
 
 def _days_in_month(month, year):      # number of days in month of year
     if month == 2 and _is_leap(year): return 29
@@ -92,9 +92,9 @@
     del ans.ord, ans.month, ans.day, ans.year # un-initialize it
     ans.ord = n
 
-    n400 = (n-1)/_DI400Y                # # of 400-year blocks preceding
+    n400 = (n-1)//_DI400Y                # # of 400-year blocks preceding
     year, n = 400 * n400, n - _DI400Y * n400
-    more = n / 365
+    more = n // 365
     dby = _days_before_year(more)
     if dby >= n:
         more = more - 1
@@ -104,7 +104,7 @@
     try: year = int(year)               # chop to int, if it fits
     except (ValueError, OverflowError): pass
 
-    month = min(n/29 + 1, 12)
+    month = min(n//29 + 1, 12)
     dbm = _days_before_month(month, year)
     if dbm >= n:
         month = month - 1
@@ -174,7 +174,9 @@
     local = time.localtime(time.time())
     return Date(local[1], local[2], local[0])
 
-DateTestError = 'DateTestError'
+class DateTestError(Exception):
+    pass
+
 def test(firstyear, lastyear):
     a = Date(9,30,1913)
     b = Date(9,30,1914)
@@ -220,3 +222,6 @@
            (fd.month,fd.day,fd.year,ld.month,ld.day,ld.year):
             raise DateTestError('num->date failed', y)
         y = y + 1
+
+if __name__ == '__main__':
+    test(1850, 2150)
diff --git a/Demo/classes/bitvec.py b/Demo/classes/bitvec.py
index ae84439..9ee3ebf 100755
--- a/Demo/classes/bitvec.py
+++ b/Demo/classes/bitvec.py
@@ -6,7 +6,8 @@
 
 import sys; rprt = sys.stderr.write #for debugging
 
-error = 'bitvec.error'
+class error(Exception):
+    pass
 
 
 def _check_value(value):
diff --git a/Demo/md5test/md5driver.py b/Demo/md5test/md5driver.py
index 242d0a5..ea30fd8 100755
--- a/Demo/md5test/md5driver.py
+++ b/Demo/md5test/md5driver.py
@@ -32,7 +32,7 @@
 
     filsiz = 1 << 8
     filler = makestr(0, filsiz-1)
-    data = filler * (TEST_BLOCK_SIZE / filsiz);
+    data = filler * (TEST_BLOCK_SIZE // filsiz)
     data = data + filler[:(TEST_BLOCK_SIZE % filsiz)]
 
     del filsiz, filler
@@ -62,7 +62,7 @@
 
 
 def MDFile(filename):
-    f = open(filename, 'rb');
+    f = open(filename, 'rb')
     mdContext = md5.new()
 
     while 1:
diff --git a/Demo/pdist/cmptree.py b/Demo/pdist/cmptree.py
index f804d31..c1bbf1a 100755
--- a/Demo/pdist/cmptree.py
+++ b/Demo/pdist/cmptree.py
@@ -202,7 +202,7 @@
     dt = t2-t1
     print(size, "bytes in", round(dt), "seconds", end=' ')
     if dt:
-        print("i.e.", int(size/dt), "bytes/sec", end=' ')
+        print("i.e.", int(size//dt), "bytes/sec", end=' ')
     print()
     remote._recv(id) # ignored
 
diff --git a/Demo/rpc/nfsclient.py b/Demo/rpc/nfsclient.py
index c36e3d2..a291ce0 100644
--- a/Demo/rpc/nfsclient.py
+++ b/Demo/rpc/nfsclient.py
@@ -194,7 +194,8 @@
     fh = sf[1]
     if fh:
         ncl = NFSClient(host)
-        print(ncl.Getattr(fh))
+        attrstat = ncl.Getattr(fh)
+        print(attrstat)
         list = ncl.Listdir(fh)
         for item in list: print(item)
         mcl.Umnt(filesys)
diff --git a/Demo/rpc/rpc.py b/Demo/rpc/rpc.py
index 789880b..30b3017 100644
--- a/Demo/rpc/rpc.py
+++ b/Demo/rpc/rpc.py
@@ -80,9 +80,9 @@
 
 
 # Exceptions
-BadRPCFormat = 'rpc.BadRPCFormat'
-BadRPCVersion = 'rpc.BadRPCVersion'
-GarbageArgs = 'rpc.GarbageArgs'
+class BadRPCFormat(Exception): pass
+class BadRPCVersion(Exception): pass
+class GarbageArgs(Exception): pass
 
 class Unpacker(xdr.Unpacker):
 
diff --git a/Demo/rpc/xdr.py b/Demo/rpc/xdr.py
index fd9efee..2d5f9c3 100644
--- a/Demo/rpc/xdr.py
+++ b/Demo/rpc/xdr.py
@@ -57,7 +57,7 @@
     def pack_fstring(self, n, s):
         if n < 0:
             raise ValueError('fstring size must be nonnegative')
-        n = ((n+3)/4)*4
+        n = ((n + 3)//4)*4
         data = s[:n]
         data = data + (n - len(data)) * '\0'
         self.buf = self.buf + data
@@ -164,7 +164,7 @@
         if n < 0:
             raise ValueError('fstring size must be nonnegative')
         i = self.pos
-        j = i + (n+3)/4*4
+        j = i + (n+3)//4*4
         if j > len(self.buf):
             raise EOFError
         self.pos = j
diff --git a/Demo/scripts/fact.py b/Demo/scripts/fact.py
index 19d28eb..c76474c 100755
--- a/Demo/scripts/fact.py
+++ b/Demo/scripts/fact.py
@@ -8,23 +8,21 @@
 import sys
 from math import sqrt
 
-error = 'fact.error'            # exception
-
 def fact(n):
-    if n < 1: raise error   # fact() argument should be >= 1
+    if n < 1: raise ValueError # fact() argument should be >= 1
     if n == 1: return []    # special case
     res = []
     # Treat even factors special, so we can use i = i+2 later
     while n%2 == 0:
         res.append(2)
-        n = n/2
+        n = n//2
     # Try odd numbers up to sqrt(n)
     limit = sqrt(float(n+1))
     i = 3
     while i <= limit:
         if n%i == 0:
             res.append(i)
-            n = n/i
+            n = n//i
             limit = sqrt(n+1)
         else:
             i = i+2
diff --git a/Demo/scripts/ftpstats.py b/Demo/scripts/ftpstats.py
index 19ad392..cb0c242 100755
--- a/Demo/scripts/ftpstats.py
+++ b/Demo/scripts/ftpstats.py
@@ -104,7 +104,7 @@
 
 def showbar(dict, title):
     n = len(title)
-    print('='*((70-n)/2), title, '='*((71-n)/2))
+    print('='*((70-n)//2), title, '='*((71-n)//2))
     list = []
     for key in sorted(dict.keys()):
         n = len(str(key))
@@ -124,7 +124,7 @@
     if len(dict) > maxitems:
         title = title + ' (first %d)'%maxitems
     n = len(title)
-    print('='*((70-n)/2), title, '='*((71-n)/2))
+    print('='*((70-n)//2), title, '='*((71-n)//2))
     list = []
     for key in dict.keys():
         list.append((-len(dict[key]), key))
diff --git a/Demo/scripts/lpwatch.py b/Demo/scripts/lpwatch.py
index 567385c..262e562 100755
--- a/Demo/scripts/lpwatch.py
+++ b/Demo/scripts/lpwatch.py
@@ -83,7 +83,7 @@
                 lines.append(line)
     #
     if totaljobs:
-        line = '%d K' % ((totalbytes+1023)/1024)
+        line = '%d K' % ((totalbytes+1023)//1024)
         if totaljobs != len(users):
             line = line + ' (%d jobs)' % totaljobs
         if len(users) == 1:
@@ -95,7 +95,7 @@
                     line =  line + ' (%s first)' % thisuser
                 else:
                     line = line + ' (%d K before %s)' % (
-                                   (aheadbytes+1023)/1024, thisuser)
+                                   (aheadbytes+1023)//1024, thisuser)
         lines.append(line)
     #
     sts = pipe.close()
diff --git a/Demo/scripts/markov.py b/Demo/scripts/markov.py
index 3dc57ce..6f3482b 100755
--- a/Demo/scripts/markov.py
+++ b/Demo/scripts/markov.py
@@ -110,7 +110,7 @@
 def tuple(list):
     if len(list) == 0: return ()
     if len(list) == 1: return (list[0],)
-    i = len(list)/2
+    i = len(list)//2
     return tuple(list[:i]) + tuple(list[i:])
 
 if __name__ == "__main__":
diff --git a/Demo/scripts/newslist.py b/Demo/scripts/newslist.py
index 3d65a08..02b4b7c 100755
--- a/Demo/scripts/newslist.py
+++ b/Demo/scripts/newslist.py
@@ -320,7 +320,7 @@
     tree={}
 
     # Check that the output directory exists
-    checkopdir(pagedir);
+    checkopdir(pagedir)
 
     try:
         print('Connecting to '+newshost+'...')
diff --git a/Demo/scripts/pi.py b/Demo/scripts/pi.py
index a360e40..19733cb 100755
--- a/Demo/scripts/pi.py
+++ b/Demo/scripts/pi.py
@@ -17,11 +17,11 @@
         p, q, k = k*k, 2*k+1, k+1
         a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
         # Print common digits
-        d, d1 = a/b, a1/b1
+        d, d1 = a//b, a1//b1
         while d == d1:
             output(d)
             a, a1 = 10*(a%b), 10*(a1%b1)
-            d, d1 = a/b, a1/b1
+            d, d1 = a//b, a1//b1
 
 def output(d):
     # Use write() to avoid spaces between the digits
diff --git a/Demo/scripts/unbirthday.py b/Demo/scripts/unbirthday.py
index 5c39092..991537d 100755
--- a/Demo/scripts/unbirthday.py
+++ b/Demo/scripts/unbirthday.py
@@ -99,9 +99,9 @@
     # was different then...
     (year, month, day) = xxx_todo_changeme1
     days = year*365                 # years, roughly
-    days = days + (year+3)/4        # plus leap years, roughly
-    days = days - (year+99)/100     # minus non-leap years every century
-    days = days + (year+399)/400    # plus leap years every 4 centirues
+    days = days + (year+3)//4        # plus leap years, roughly
+    days = days - (year+99)//100     # minus non-leap years every century
+    days = days + (year+399)//400    # plus leap years every 4 centirues
     for i in range(1, month):
         if i == 2 and calendar.isleap(year):
             days = days + 29
diff --git a/Demo/sockets/ftp.py b/Demo/sockets/ftp.py
index 9f9f1dc..5ea99c7 100755
--- a/Demo/sockets/ftp.py
+++ b/Demo/sockets/ftp.py
@@ -91,7 +91,7 @@
     hostname = gethostname()
     hostaddr = gethostbyname(hostname)
     hbytes = string.splitfields(hostaddr, '.')
-    pbytes = [repr(port/256), repr(port%256)]
+    pbytes = [repr(port//256), repr(port%256)]
     bytes = hbytes + pbytes
     cmd = 'PORT ' + string.joinfields(bytes, ',')
     s.send(cmd + '\r\n')
diff --git a/Demo/threads/Coroutine.py b/Demo/threads/Coroutine.py
index e7d882d..690fadc 100644
--- a/Demo/threads/Coroutine.py
+++ b/Demo/threads/Coroutine.py
@@ -93,8 +93,8 @@
         self.e.wait()
         self.e.clear()
 
-Killed = 'Coroutine.Killed'
-EarlyExit = 'Coroutine.EarlyExit'
+class Killed(Exception): pass
+class EarlyExit(Exception): pass
 
 class Coroutine:
     def __init__(self):
diff --git a/Demo/threads/Generator.py b/Demo/threads/Generator.py
index 38c0c8a..3a2963f 100644
--- a/Demo/threads/Generator.py
+++ b/Demo/threads/Generator.py
@@ -1,8 +1,10 @@
 # Generator implementation using threads
 
 import _thread as thread
+import sys
 
-Killed = 'Generator.Killed'
+class Killed(Exception):
+    pass
 
 class Generator:
     # Constructor
@@ -16,6 +18,7 @@
         self.done = 0
         self.killed = 0
         thread.start_new_thread(self._start, ())
+
     # Internal routine
     def _start(self):
         try:
@@ -29,6 +32,7 @@
             if not self.killed:
                 self.done = 1
                 self.getlock.release()
+
     # Called by producer for each value; raise Killed if no more needed
     def put(self, value):
         if self.killed:
@@ -38,6 +42,7 @@
         self.putlock.acquire()  # Wait for next get() call
         if self.killed:
             raise Killed
+
     # Called by producer to get next value; raise EOFError if no more
     def get(self):
         if self.killed:
@@ -47,12 +52,14 @@
         if self.done:
             raise EOFError  # Say there are no more values
         return self.value
+
     # Called by consumer if no more values wanted
     def kill(self):
         if self.killed:
             raise TypeError('kill() called on killed generator')
         self.killed = 1
         self.putlock.release()
+
     # Clone constructor
     def clone(self):
         return Generator(self.func, self.args)
@@ -64,11 +71,11 @@
         p, q, k = k*k, 2*k+1, k+1
         a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
         # Print common digits
-        d, d1 = a/b, a1/b1
+        d, d1 = a//b, a1//b1
         while d == d1:
             g.put(int(d))
             a, a1 = 10*(a%b), 10*(a1%b1)
-            d, d1 = a/b, a1/b1
+            d, d1 = a//b, a1//b1
 
 def test():
     g = Generator(pi, ())
@@ -80,5 +87,6 @@
     g.kill()
     while 1:
         print(h.get(), end=' ')
+        sys.stdout.flush()
 
 test()
diff --git a/Demo/tkinter/guido/hanoi.py b/Demo/tkinter/guido/hanoi.py
index 078c246..58ba1d1 100755
--- a/Demo/tkinter/guido/hanoi.py
+++ b/Demo/tkinter/guido/hanoi.py
@@ -35,15 +35,15 @@
 
         # Add background bitmap
         if bitmap:
-            self.bitmap = c.create_bitmap(width/2, height/2,
+            self.bitmap = c.create_bitmap(width//2, height//2,
                                           bitmap=bitmap,
                                           foreground='blue')
 
         # Generate pegs
         pegwidth = 10
-        pegheight = height/2
-        pegdist = width/3
-        x1, y1 = (pegdist-pegwidth)/2, height*1/3
+        pegheight = height//2
+        pegdist = width//3
+        x1, y1 = (pegdist-pegwidth)//2, height*1//3
         x2, y2 = x1+pegwidth, y1+pegheight
         self.pegs = []
         p = c.create_rectangle(x1, y1, x2, y2, fill='black')
@@ -57,14 +57,14 @@
         self.tk.update()
 
         # Generate pieces
-        pieceheight = pegheight/16
-        maxpiecewidth = pegdist*2/3
+        pieceheight = pegheight//16
+        maxpiecewidth = pegdist*2//3
         minpiecewidth = 2*pegwidth
         self.pegstate = [[], [], []]
         self.pieces = {}
-        x1, y1 = (pegdist-maxpiecewidth)/2, y2-pieceheight-2
+        x1, y1 = (pegdist-maxpiecewidth)//2, y2-pieceheight-2
         x2, y2 = x1+maxpiecewidth, y1+pieceheight
-        dx = (maxpiecewidth-minpiecewidth) / (2*max(1, n-1))
+        dx = (maxpiecewidth-minpiecewidth) // (2*max(1, n-1))
         for i in range(n, 0, -1):
             p = c.create_rectangle(x1, y1, x2, y2, fill='red')
             self.pieces[i] = p
@@ -101,10 +101,10 @@
 
         # Move it towards peg b
         bx1, by1, bx2, by2 = c.bbox(self.pegs[b])
-        newcenter = (bx1+bx2)/2
+        newcenter = (bx1+bx2)//2
         while 1:
             x1, y1, x2, y2 = c.bbox(p)
-            center = (x1+x2)/2
+            center = (x1+x2)//2
             if center == newcenter: break
             if center > newcenter: c.move(p, -1, 0)
             else: c.move(p, 1, 0)
diff --git a/Demo/tkinter/guido/solitaire.py b/Demo/tkinter/guido/solitaire.py
index 68dc284..a521c66 100755
--- a/Demo/tkinter/guido/solitaire.py
+++ b/Demo/tkinter/guido/solitaire.py
@@ -168,7 +168,7 @@
         self.group = Group(canvas)
 
         text = "%s  %s" % (VALNAMES[value], suit)
-        self.__text = CanvasText(canvas, CARDWIDTH/2, 0,
+        self.__text = CanvasText(canvas, CARDWIDTH//2, 0,
                                anchor=N, fill=self.color, text=text)
         self.group.addtag_withtag(self.__text)
 
@@ -589,7 +589,7 @@
 
     def animatedmoveto(self, card, dest):
         for i in range(10, 0, -1):
-            dx, dy = (dest.x-card.x)/i, (dest.y-card.y)/i
+            dx, dy = (dest.x-card.x)//i, (dest.y-card.y)//i
             card.moveby(dx, dy)
             self.master.update_idletasks()
 
diff --git a/Demo/tkinter/guido/sortvisu.py b/Demo/tkinter/guido/sortvisu.py
index c538a2c..27dc9f0 100644
--- a/Demo/tkinter/guido/sortvisu.py
+++ b/Demo/tkinter/guido/sortvisu.py
@@ -88,7 +88,7 @@
         if self.speed == "fastest":
             msecs = 0
         elif self.speed == "fast":
-            msecs = msecs/10
+            msecs = msecs//10
         elif self.speed == "single-step":
             msecs = 1000000000
         if not self.stop_mainloop:
@@ -320,7 +320,7 @@
         return outcome
 
     def position(self):
-        x1 = (self.index+1)*XGRID - WIDTH/2
+        x1 = (self.index+1)*XGRID - WIDTH//2
         x2 = x1+WIDTH
         y2 = (self.array.maxvalue+1)*YGRID
         y1 = y2 - (self.value)*YGRID
@@ -349,7 +349,7 @@
     res = [tuple(oldpts)]
     for i in range(1, n):
         for k in range(len(pts)):
-            pts[k] = oldpts[k] + (newpts[k] - oldpts[k])*i/n
+            pts[k] = oldpts[k] + (newpts[k] - oldpts[k])*i//n
         res.append(tuple(pts))
     res.append(tuple(newpts))
     return res
@@ -359,7 +359,7 @@
 
 def uniform(array):
     size = array.getsize()
-    array.setdata([(size+1)/2] * size)
+    array.setdata([(size+1)//2] * size)
     array.reset("Uniform data, size %d" % size)
 
 def distinct(array):
@@ -429,7 +429,7 @@
                         j = j-1
                 continue
             array.message("Choosing pivot")
-            j, i, k = first, (first+last)/2, last-1
+            j, i, k = first, (first+last)//2, last-1
             if array.compare(k, i) < 0:
                 array.swap(k, i)
             if array.compare(k, j) < 0:
