diff --git a/source/graphics/CinemaManager.cpp b/source/graphics/CinemaManager.cpp
new file mode 100644
index 0000000000..4ef2ab1ad5
--- /dev/null
+++ b/source/graphics/CinemaManager.cpp
@@ -0,0 +1,115 @@
+/* Copyright (C) 2015 Wildfire Games.
+ * This file is part of 0 A.D.
+ *
+ * 0 A.D. is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 0 A.D. is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with 0 A.D. If not, see .
+ */
+
+
+#include "precompiled.h"
+
+#include
+#include
+
+#include "CinemaManager.h"
+
+#include "CinemaPath.h"
+#include "ps/CStr.h"
+#include "maths/Vector4D.h"
+
+CCinemaManager::CCinemaManager() : m_DrawCurrentSpline(false), m_Active(true), m_ValidCurrent(false)
+{
+ m_CurrentPath = m_Paths.end();
+}
+
+void CCinemaManager::AddPath(CCinemaPath path, const CStrW& name)
+{
+ ENSURE( m_Paths.find( name ) == m_Paths.end() );
+ m_Paths[name] = path;
+}
+
+void CCinemaManager::QueuePath(const CStrW& name, bool queue )
+{
+ if (!m_PathQueue.empty() && queue == false)
+ {
+ return;
+ }
+ else
+ {
+ ENSURE(HasTrack(name));
+ m_PathQueue.push_back(m_Paths[name]);
+ }
+}
+
+void CCinemaManager::OverridePath(const CStrW& name)
+{
+ m_PathQueue.clear();
+ ENSURE(HasTrack(name));
+ m_PathQueue.push_back( m_Paths[name] );
+}
+
+void CCinemaManager::SetAllPaths( const std::map& paths)
+{
+ CStrW name;
+ m_Paths = paths;
+}
+void CCinemaManager::SetCurrentPath(const CStrW& name, bool current, bool drawLines)
+{
+ if ( !HasTrack(name) )
+ m_ValidCurrent = false;
+ else
+ m_ValidCurrent = true;
+
+ m_CurrentPath = m_Paths.find(name);
+ m_DrawCurrentSpline = current;
+ m_DrawLines = drawLines;
+ DrawSpline();
+}
+
+bool CCinemaManager::HasTrack(const CStrW& name) const
+{
+ return m_Paths.find(name) != m_Paths.end();
+}
+
+void CCinemaManager::DrawSpline() const
+{
+ if ( !(m_DrawCurrentSpline && m_ValidCurrent) )
+ return;
+ static const int smoothness = 200;
+
+ m_CurrentPath->second.DrawSpline(CVector4D(0.f, 0.f, 1.f, 1.f), smoothness, m_DrawLines);
+}
+
+void CCinemaManager::MoveToPointAt(float time)
+{
+ ENSURE(m_CurrentPath != m_Paths.end());
+ StopPlaying();
+
+ m_CurrentPath->second.m_TimeElapsed = time;
+ if ( !m_CurrentPath->second.Validate() )
+ return;
+
+ m_CurrentPath->second.MoveToPointAt(m_CurrentPath->second.m_TimeElapsed /
+ m_CurrentPath->second.GetDuration(), m_CurrentPath->second.GetNodeFraction(),
+ m_CurrentPath->second.m_PreviousRotation );
+}
+
+bool CCinemaManager::Update(const float deltaRealTime)
+{
+ if (!m_PathQueue.front().Play(deltaRealTime))
+ {
+ m_PathQueue.pop_front();
+ return false;
+ }
+ return true;
+}
diff --git a/source/graphics/CinemaManager.h b/source/graphics/CinemaManager.h
new file mode 100644
index 0000000000..567b62b198
--- /dev/null
+++ b/source/graphics/CinemaManager.h
@@ -0,0 +1,69 @@
+/* Copyright (C) 2015 Wildfire Games.
+ * This file is part of 0 A.D.
+ *
+ * 0 A.D. is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 0 A.D. is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with 0 A.D. If not, see .
+ */
+
+
+#ifndef INCLUDED_CINEMAMANAGER
+#define INCLUDED_CINEMAMANAGER
+
+#include
+#include