diff --git a/Storage/Disk/Disk.cpp b/Storage/Disk/Disk.cpp
index c6b04e0ee..96953f5bd 100644
--- a/Storage/Disk/Disk.cpp
+++ b/Storage/Disk/Disk.cpp
@@ -17,7 +17,7 @@ int Disk::get_id_for_track_at_position(unsigned int head, unsigned int position)
 
 void Disk::set_track_at_position(unsigned int head, unsigned int position, const std::shared_ptr<Track> &track)
 {
-	if(!get_is_read_only()) return;
+	if(get_is_read_only()) return;
 
 	int address = get_id_for_track_at_position(head, position);
 	cached_tracks_[address] = track;
diff --git a/Storage/Disk/DiskController.cpp b/Storage/Disk/DiskController.cpp
index aa9765b81..3aa3fa2cf 100644
--- a/Storage/Disk/DiskController.cpp
+++ b/Storage/Disk/DiskController.cpp
@@ -20,7 +20,6 @@ Controller::Controller(unsigned int clock_rate, unsigned int clock_rate_multipli
 	motor_is_on_(false),
 
 	is_reading_(true),
-	track_is_dirty_(false),
 
 	TimedEventLoop(clock_rate * clock_rate_multiplier)
 {
@@ -31,13 +30,7 @@ Controller::Controller(unsigned int clock_rate, unsigned int clock_rate_multipli
 
 void Controller::setup_track()
 {
-	if(patched_track_)
-	{
-		drive_->set_track(patched_track_);
-	}
-
 	track_ = drive_->get_track();
-	track_is_dirty_ = false;
 
 	Time offset;
 	Time track_time_now = get_time_into_track();
@@ -154,7 +147,7 @@ void Controller::begin_writing()
 {
 	is_reading_ = false;
 
-	write_segment_.length_of_a_bit = bit_length_ * rotational_multiplier_;
+	write_segment_.length_of_a_bit = bit_length_ / rotational_multiplier_;
 	write_segment_.data.clear();
 	write_segment_.number_of_bits = 0;
 
@@ -226,8 +219,8 @@ bool Controller::get_drive_is_read_only()
 
 void Controller::step(int direction)
 {
-	if(drive_) drive_->step(direction);
 	invalidate_track();
+	if(drive_) drive_->step(direction);
 }
 
 void Controller::set_motor_on(bool motor_on)
@@ -242,13 +235,18 @@ bool Controller::get_motor_on()
 
 void Controller::set_drive(std::shared_ptr<Drive> drive)
 {
-	drive_ = drive;
 	invalidate_track();
+	drive_ = drive;
 }
 
 void Controller::invalidate_track()
 {
 	track_ = nullptr;
+	if(patched_track_)
+	{
+		drive_->set_track(patched_track_);
+		patched_track_ = nullptr;
+	}
 }
 
 void Controller::process_write_completed()
diff --git a/Storage/Disk/DiskController.hpp b/Storage/Disk/DiskController.hpp
index 1ab09adde..f309307bc 100644
--- a/Storage/Disk/DiskController.hpp
+++ b/Storage/Disk/DiskController.hpp
@@ -123,7 +123,6 @@ class Controller: public DigitalPhaseLockedLoop::Delegate, public TimedEventLoop
 		bool motor_is_on_;
 
 		bool is_reading_;
-		bool track_is_dirty_;
 		std::shared_ptr<PCMPatchedTrack> patched_track_;
 		PCMSegment write_segment_;
 		Time write_start_time_;