Object-oriented databases provide new kinds of data semantics in terms of inheritance and structural relationships. In this paper, we examine how to make use of the additional semantics to obtain more effective object buffering and clustering. We have instrumental real-world object-oriented applications, i.e., the Berkeley CAD Group's OCT design tools, and have used the collected information as the basis for a simulation model in which to investigate alternative buffering and clustering strategies. We have observed from our measurements that real CAD applications exhibit high data read to write ratios. We propose a run-time reclustering algorithm whose initial evaluation indicates that system response time can be improved by a factor of 200% when the read/write ratio is high. We have also found it useful to limit the amount of I/O allowed to the clustering algorithm as it examines candidate pages for reclustering at run-time. Basically, there is little performance distinction between limiting reclustering to a few I/Os or many, so a low limit on I/O appears to be acceptable. We also examine, under a variety of workload assumptions, context-sensitive buffer replacement policies with alternative prefetching policies.