diff --git a/StaticAnalyser/Commodore/Disk.cpp b/StaticAnalyser/Commodore/Disk.cpp
index df987d691..ee7e8b457 100644
--- a/StaticAnalyser/Commodore/Disk.cpp
+++ b/StaticAnalyser/Commodore/Disk.cpp
@@ -38,7 +38,7 @@ class CommodoreGCRParser: public Storage::Disk::Drive {
 
 			@returns a sector if one was found; @c nullptr otherwise.
 		*/
-		std::unique_ptr<Sector> get_sector(uint8_t track, uint8_t sector)
+		std::shared_ptr<Sector> get_sector(uint8_t track, uint8_t sector)
 		{
 			int difference = (int)track - (int)track_;
 			track_ = track;
@@ -65,6 +65,7 @@ class CommodoreGCRParser: public Storage::Disk::Drive {
 		int index_count_;
 		int bit_count_;
 		uint8_t track_;
+		std::shared_ptr<Sector> sector_cache_[65536];
 
 		void process_input_bit(int value, unsigned int cycles_since_index_hole)
 		{
@@ -115,23 +116,26 @@ class CommodoreGCRParser: public Storage::Disk::Drive {
 			index_count_++;
 		}
 
-		std::unique_ptr<Sector> get_sector(uint8_t sector)
+		std::shared_ptr<Sector> get_sector(uint8_t sector)
 		{
-			std::unique_ptr<Sector> first_sector = get_next_sector();
+			uint16_t sector_address = (uint16_t)((track_ << 8) | sector);
+			if(sector_cache_[sector_address]) return sector_cache_[sector_address];
+
+			std::shared_ptr<Sector> first_sector = get_next_sector();
 			if(!first_sector) return first_sector;
 			if(first_sector->sector == sector) return first_sector;
 
 			while(1)
 			{
-				std::unique_ptr<Sector> next_sector = get_next_sector();
+				std::shared_ptr<Sector> next_sector = get_next_sector();
 				if(next_sector->sector == first_sector->sector) return nullptr;
 				if(next_sector->sector == sector) return next_sector;
 			}
 		}
 
-		std::unique_ptr<Sector> get_next_sector()
+		std::shared_ptr<Sector> get_next_sector()
 		{
-			std::unique_ptr<Sector> sector(new Sector);
+			std::shared_ptr<Sector> sector(new Sector);
 			index_count_ = 0;
 
 			while(index_count_ < 2)
@@ -166,7 +170,12 @@ class CommodoreGCRParser: public Storage::Disk::Drive {
 					checksum ^= sector->data[c];
 				}
 
-				if(checksum == get_next_byte()) return sector;
+				if(checksum == get_next_byte())
+				{
+					uint16_t sector_address = (uint16_t)((sector->track << 8) | sector->sector);
+					sector_cache_[sector_address] = sector;
+					return sector;
+				}
 			}
 
 			return nullptr;
@@ -180,7 +189,7 @@ std::list<File> StaticAnalyser::Commodore::GetFiles(const std::shared_ptr<Storag
 	parser.set_disk(disk);
 
 	// find any sector whatsoever to establish the current track
-	std::unique_ptr<CommodoreGCRParser::Sector> sector;
+	std::shared_ptr<CommodoreGCRParser::Sector> sector;
 
 	// assemble directory
 	std::vector<uint8_t> directory;