 			}
 		}
 	}
-	
-	// MARK: - Observer callbacks
-	
+}
+
+// MARK: - Observer callbacks
+
+extension VolumeBar {
+    
+    internal func addVolumeBarObservers() {
+        // Observe volume changes
+        AVAudioSession.sharedInstance().addObserver(self, forKeyPath: VolumeBar.AVAudioSessionOutputVolumeKey, options: [.old, .new], context: nil)
+        
+        // Observe when application enters and resumes from background
+        NotificationCenter.default.addObserver(self, selector: #selector(VolumeBar.applicationWillResignActive(notification:)), name: .UIApplicationWillResignActive, object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(VolumeBar.applicationDidBecomeActive(notification:)), name: .UIApplicationDidBecomeActive, object: nil)
+        
+        // Observe device rotation
+        NotificationCenter.default.addObserver(self, selector: #selector(VolumeBar.updateHeight), name: .UIDeviceOrientationDidChange, object: nil)
+    }
+    
+    internal func removeVolumeBarObservers() {
+        // Stop observing volume changes
+        AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: VolumeBar.AVAudioSessionOutputVolumeKey)
+
+        // Remove suspend/resume observers
+        NotificationCenter.default.removeObserver(self, name: .UIApplicationWillResignActive, object: nil)
+        NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
+        
+        // Stop observing device rotation
+        NotificationCenter.default.removeObserver(self, name: .UIDeviceOrientationDidChange, object: nil)
+    }
+    
 	/// Observe changes in volume.
 	///
 	/// This method is called when the user presses either of the volume buttons.

		if observingVolumeChanges {
			observingVolumeChanges = false
			
			// Stop observing volume changes
			AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume")
			
			// Stop observing device rotation
			NotificationCenter.default.removeObserver(self, name: Notification.Name.UIDeviceOrientationDidChange, object: nil)
			
			// Remove the hidden `MPVolumeView`.
			volumeView.removeFromSuperview()

	}
	
	deinit {
		self.removeVolumeBarObservers()
	}
}

// MARK: - Automatic Presentation

extension VolumeBar {
    
	/// Start observing changes in volume.
	///
	/// Once this method is called, the `VolumeBar` will automatically show when volume buttons
