diff --git a/modules/camera/include/vkcv/camera/Camera.hpp b/modules/camera/include/vkcv/camera/Camera.hpp
index b0a9e6b4f09258d00aea60c2417e51c56fd8bf4f..86938c4c8f3a65ca2dbdf3845789aa651fb4b5b7 100644
--- a/modules/camera/include/vkcv/camera/Camera.hpp
+++ b/modules/camera/include/vkcv/camera/Camera.hpp
@@ -14,8 +14,6 @@ namespace vkcv {
 		int m_width;
 		int m_height;
 
-		float m_oldX;
-		float m_oldY;
 		float m_near;
 		float m_far;
 		float m_fov;
@@ -24,7 +22,6 @@ namespace vkcv {
         glm::vec3 m_up;
         glm::vec3 m_position;
         float m_cameraSpeed;
-        float m_roll;
         float m_pitch;
         float m_yaw;
 
@@ -36,7 +33,7 @@ namespace vkcv {
     public:
         Camera();
 
-        ~Camera();
+        virtual ~Camera();
 
         void setPerspective(float fov, float ratio, float near, float far);
 
@@ -44,7 +41,7 @@ namespace vkcv {
 
         void getView(glm::vec3 &x, glm::vec3 &y, glm::vec3 &z, glm::vec3 &pos);
 
-        glm::mat4 updateView();
+        glm::mat4 updateView(double deltatime);
 
         void lookAt(glm::vec3 position, glm::vec3 center, glm::vec3 up);
 
@@ -82,7 +79,7 @@ namespace vkcv {
 
         void panView( double xOffset, double yOffset );
 
-        void updatePosition();
+        void updatePosition(double deltatime);
 
         void moveForward(int action);
 
diff --git a/modules/camera/include/vkcv/camera/TrackballCamera.hpp b/modules/camera/include/vkcv/camera/TrackballCamera.hpp
index 156ad8e4302210bc9c874dadefb31a9aa99730bc..c9e269e9f7ad708c68158d5b358efbf37c5bb7a9 100644
--- a/modules/camera/include/vkcv/camera/TrackballCamera.hpp
+++ b/modules/camera/include/vkcv/camera/TrackballCamera.hpp
@@ -41,6 +41,9 @@ namespace vkcv {
         float m_sensitivity;
         float m_stepSize, m_theta, m_phi, m_radius;
         glm::vec3 m_center;
+
+        float m_oldX;
+        float m_oldY;
     };
 
 }
\ No newline at end of file
diff --git a/modules/camera/src/vkcv/camera/Camera.cpp b/modules/camera/src/vkcv/camera/Camera.cpp
index 38fffa771875db44be166573b8a3c618a161e78c..2268dded819d2c4d5219a7cc7dd2e95ae82878e7 100644
--- a/modules/camera/src/vkcv/camera/Camera.cpp
+++ b/modules/camera/src/vkcv/camera/Camera.cpp
@@ -6,9 +6,8 @@ namespace vkcv {
     Camera::Camera(){
         m_up = glm::vec3(0.0f, -1.0f, 0.0f);
         m_position = glm::vec3(0.0f, 0.0f, 0.0f);
-        m_cameraSpeed = 0.01f;
+        m_cameraSpeed = 2.f;
         // front
-        m_roll = 0.0;
         m_pitch = 0.0;
         m_yaw = 180.0;
 
@@ -24,8 +23,8 @@ namespace vkcv {
         m_view = glm::lookAt(position, center, up);
     }
 
-    glm::mat4 Camera::updateView(){
-        updatePosition();
+    glm::mat4 Camera::updateView(double deltatime){
+        updatePosition(deltatime);
         return m_view = glm::lookAt(m_position, m_position + getFront() , m_up);
     }
 
@@ -45,7 +44,6 @@ namespace vkcv {
 
 
     const glm::mat4 Camera::getView() {
-        updateView();
         return m_view;
     }
 
@@ -136,11 +134,11 @@ namespace vkcv {
         m_pitch += yOffset;
     }
 
-    void Camera::updatePosition(){
-        m_position += (m_cameraSpeed * getFront() * static_cast<float> (m_forward));
-        m_position -= (m_cameraSpeed * getFront() * static_cast<float> (m_backward));
-        m_position -= (glm::normalize(glm::cross(getFront(), m_up)) * m_cameraSpeed * static_cast<float> (m_left) );
-        m_position += (glm::normalize(glm::cross(getFront(), m_up)) * m_cameraSpeed * static_cast<float> (m_right));
+    void Camera::updatePosition(double deltatime ){
+        m_position += (m_cameraSpeed * getFront() * static_cast<float> (m_forward) * static_cast<float>(deltatime));
+        m_position -= (m_cameraSpeed * getFront() * static_cast<float> (m_backward) * static_cast<float>(deltatime));
+        m_position -= (glm::normalize(glm::cross(getFront(), m_up)) * m_cameraSpeed * static_cast<float> (m_left) * static_cast<float>(deltatime));
+        m_position += (glm::normalize(glm::cross(getFront(), m_up)) * m_cameraSpeed * static_cast<float> (m_right) * static_cast<float>(deltatime));
     }
 
     void Camera::moveForward(int action){
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index ff126193d94676ab966dfd3e4410c2913b54988a..275c87cf67f059c5896272639363733634e26ca2 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -1,10 +1,8 @@
 #include <iostream>
 #include <vkcv/Core.hpp>
-#include <vkcv/Window.hpp>
-#include <vkcv/ShaderProgram.hpp>
 #include <GLFW/glfw3.h>
 #include <vkcv/camera/CameraManager.hpp>
-#include <vkcv/DescriptorConfig.hpp>
+#include <chrono>
 
 int main(int argc, const char** argv) {
     const char* applicationName = "First Triangle";
@@ -131,11 +129,15 @@ int main(int argc, const char** argv) {
 	 *
 	 * PipelineHandle trianglePipeline = core.CreatePipeline(trianglePipeline);
 	 */
-
+    auto start = std::chrono::system_clock::now();
 	while (window.isWindowOpen())
 	{
 		core.beginFrame();
-
+        window.pollEvents();
+        auto end = std::chrono::system_clock::now();
+        auto deltatime = end - start;
+        start = end;
+        cameraManager.getCamera().updateView(std::chrono::duration<double>(deltatime).count());
 		const glm::mat4 mvp = cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView();
 
 	    core.renderTriangle(trianglePass, trianglePipeline, windowWidth, windowHeight, sizeof(mvp), &mvp);
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index 0d61d2adf04b23b45fc4e1d7637a22c0ec3d9ccc..0ee414fb974676b1d2df820e69218f5bb247341b 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -158,7 +158,6 @@ namespace vkcv
     	if (acquireSwapchainImage() != Result::SUCCESS) {
     		return;
     	}
-		m_window.pollEvents();
 		m_Context.getDevice().waitIdle();	// FIMXE: this is a sin against graphics programming, but its getting late - Alex
 		destroyTemporaryFramebuffers();
 	}