diff --git a/Makefile b/Makefile
index 3c23b9b..f613211 100644
--- a/Makefile
+++ b/Makefile
@@ -39,8 +39,9 @@ COMMON = \
 # END COMMON
 
 DEMO = \
-	 main.cc \
 	 demo.cc \
+	 main.cc \
+	 syncview.cc \
 # END DEMO
 
 PARSERCHECK = \
diff --git a/main.cc b/main.cc
index 46cbbaf..43934fb 100644
--- a/main.cc
+++ b/main.cc
@@ -9,6 +9,7 @@
 #include "ops.hh"
 #include "rendertarget.hh"
 #include "sync.hh"
+#include "syncview.hh"
 
 using ebcl::T_Optional;
 
@@ -34,6 +35,7 @@ struct T_Main
 	ImVec2 prevSize;
 
 	T_Optional< T_Demo > demo;
+	T_Optional< T_SyncView > sequencer;
 
 	void initDemo( );
 
@@ -199,6 +201,7 @@ void T_Main::handleCapture( )
 void T_Main::makeUI( )
 {
 	using namespace ImGui;
+	bool eSequencer{ sequencer };
 	if ( BeginMainMenuBar( ) ) {
 		if ( BeginMenu( "File" ) ) {
 			if ( MenuItem( "Quit" ) ) {
@@ -213,8 +216,7 @@ void T_Main::makeUI( )
 					&Globals::ODbg( ).uiEnabled( ) );
 			MenuItemCheckbox( "Profiler" ,
 					&Globals::Profiler( ).uiEnabled( ) );
-			MenuItemCheckbox( "Sequencer" ,
-					&Globals::Sync( ).sequencerWindowEnabled( ) );
+			MenuItemCheckbox( "Sequencer" , &eSequencer );
 			MenuItemCheckbox( "Shaders" ,
 					&Globals::Shaders( ).uiEnabled( ) );
 			EndMenu( );
@@ -222,11 +224,19 @@ void T_Main::makeUI( )
 		EndMainMenuBar( );
 	}
 
+	if ( eSequencer && !sequencer ) {
+		sequencer.setNew( );
+	} else if ( !eSequencer && sequencer ) {
+		sequencer.clear( );
+	}
+
 	Globals::Profiler( ).makeUI( );
 	Globals::ODbg( ).makeUI( );
 	Globals::Shaders( ).makeUI( );
 	Globals::Sync( ).makeOverridesWindow( );
-	Globals::Sync( ).makeSequencerWindow( );
+	if ( sequencer && !sequencer->display( ) ) {
+		sequencer.clear( );
+	}
 }
 
 void T_Main::render( )
diff --git a/sync.cc b/sync.cc
index 43046d8..91b2fa5 100644
--- a/sync.cc
+++ b/sync.cc
@@ -719,38 +719,6 @@ void T_SyncManager::setOverridesActive(
 
 /*------------------------------------------------------------------------------*/
 
-void T_SyncManager::makeSequencerWindow( )
-{
-	if ( !tmWindow_ ) {
-		return;
-	}
-
-	using namespace ImGui;
-	auto const& dspSize( GetIO( ).DisplaySize );
-	SetNextWindowSize( ImVec2( dspSize.x , 150 ) , ImGuiSetCond_Appearing );
-	SetNextWindowPos( ImVec2( 0 , dspSize.y - 150 ) , ImGuiSetCond_Appearing );
-	Begin( "Sequencer" , &tmWindow_ , ImGuiWindowFlags_NoCollapse );
-
-	PushID( "playing" );
-	if ( Button( playing_ ? "Stop" : "Play" ) ) {
-		playing_ = !playing_;
-	}
-	PopID( );
-
-	const float d( duration( ) );
-	float tm( time( ) );
-	SameLine( );
-	PushID( "sequencer" );
-	PushItemWidth( -1 );
-	if ( SliderFloat( "" , &tm , 0 , d , "%.1fs" ) ) {
-		setTime( tm );
-		playing_ = playing_ && !finished( );
-	}
-	PopItemWidth( );
-	PopID( );
-	End( );
-}
-
 void T_SyncManager::makeOverridesWindow( )
 {
 	if ( !ovWindow_ ) {
diff --git a/sync.hh b/sync.hh
index 7b084a6..a274ea9 100644
--- a/sync.hh
+++ b/sync.hh
@@ -297,6 +297,9 @@ struct T_SyncManager : public virtual A_MouseCtrl
 
 	bool playing( ) const noexcept
 		{ return playing_; }
+	bool& playing( ) noexcept
+		{ return playing_; }
+
 	bool finished( ) const noexcept
 		{ return time_.time >= time_.duration( ); }
 	void updateTime( ) noexcept;
@@ -352,10 +355,6 @@ struct T_SyncManager : public virtual A_MouseCtrl
 	// ---------------------------------------------------------------------
 	// User interface
 
-	bool& sequencerWindowEnabled( ) noexcept
-		{ return tmWindow_; }
-	void makeSequencerWindow( );
-
 	bool& overridesWindowEnabled( ) noexcept
 		{ return ovWindow_; }
 	void makeOverridesWindow( );
@@ -389,7 +388,6 @@ struct T_SyncManager : public virtual A_MouseCtrl
 	float lastFrame_{ 0 };				// Time of last frame
 	T_SyncValues values_;				// Value storage
 	T_SyncCurves curves_;				// Curves storage
-	bool tmWindow_{ false };			// Sequencer window
 	T_Array< P_SyncCurveCache > curveCaches_;	// Cache for curve segments
 	bool ovWindow_{ false };			// Overrides window
 	T_SyncOverrideSection soRoot_;			// Root for overrides
diff --git a/syncview.cc b/syncview.cc
new file mode 100644
index 0000000..0b55199
--- /dev/null
+++ b/syncview.cc
@@ -0,0 +1,65 @@
+#include "externals.hh"
+#include "syncview.hh"
+#include "globals.hh"
+
+using namespace ebcl;
+
+
+/*= T_SyncViewImpl_ ============================================================*/
+namespace {
+
+struct T_SyncViewImpl_
+{
+	bool display( ) noexcept;
+};
+
+
+bool T_SyncViewImpl_::display( ) noexcept
+{
+	using namespace ImGui;
+	auto const& dspSize( GetIO( ).DisplaySize );
+	auto& sync( Globals::Sync( ) );
+
+	// Window set-up
+	SetNextWindowSize( ImVec2( dspSize.x , 150 ) , ImGuiSetCond_Appearing );
+	SetNextWindowPos( ImVec2( 0 , dspSize.y - 150 ) , ImGuiSetCond_Appearing );
+	bool displayed{ true };
+	Begin( "Sequencer" , &displayed , ImGuiWindowFlags_NoCollapse );
+	if ( !displayed ) {
+		return false;
+	}
+
+	PushID( "playing" );
+	if ( Button( sync.playing( ) ? "Stop" : "Play" ) ) {
+		sync.playing( ) = !sync.playing( ) && !sync.finished( );
+	}
+	PopID( );
+
+	const float d( sync.duration( ) );
+	float tm( sync.time( ) );
+	SameLine( );
+	PushID( "sequencer" );
+	PushItemWidth( -1 );
+	if ( SliderFloat( "" , &tm , 0 , d , "%.1fs" ) ) {
+		sync.setTime( tm );
+		sync.playing( ) = sync.playing( ) && !sync.finished( );
+	}
+	PopItemWidth( );
+	PopID( );
+	End( );
+
+	return true;
+}
+
+
+} // namespace
+/*= T_SyncView =================================================================*/
+
+T_SyncView::T_SyncView( ) noexcept
+	: A_PrivateImplementation( new T_SyncViewImpl_( ) )
+{ }
+
+bool T_SyncView::display( ) noexcept
+{
+	return p< T_SyncViewImpl_ >( ).display( );
+}
diff --git a/syncview.hh b/syncview.hh
new file mode 100644
index 0000000..d501294
--- /dev/null
+++ b/syncview.hh
@@ -0,0 +1,11 @@
+#pragma once
+#include "sync.hh"
+
+
+class T_SyncView : public ebcl::A_PrivateImplementation
+{
+    public:
+	T_SyncView( ) noexcept;
+	bool display( ) noexcept;
+};
+