diff --git a/shaders/surface.frag b/shaders/surface.frag
index dfb45f62aa7fb0e932b3220a4ba098064dcdc607..18f3dfa2131de80ac0ef82a7bef8ae6bfd9a0e21 100644
--- a/shaders/surface.frag
+++ b/shaders/surface.frag
@@ -31,7 +31,7 @@ void main(void)
     vec3 nnormal = normalize(normal);
     vec3 reflected = reflect(view, nnormal);
     float R = fresnel(nnormal, view);
-    vec3 water_color = vec3(0, 0.3, 0.5);
+    vec3 water_color = vec3(0, 0.05, 0.1);
 
     vec3 sky_color = texture(sky, sphere_uv(reflected)).rgb;
 
diff --git a/shaders/surface.vert b/shaders/surface.vert
index 571f4bdbe7a1b7f3b62eb8d4d6217ea2fe59e967..4e09f949d6a6875c23f955805f2ba96ec2c916cb 100644
--- a/shaders/surface.vert
+++ b/shaders/surface.vert
@@ -6,14 +6,17 @@ in  vec2  in_TexCoord;
 
 uniform mat4 projectionMatrix;
 uniform mat4 modelToWorldToView;
+uniform float time;
 
 out vec3 world_pos;
 out vec3 normal;
 
 void main(void)
 {
-    world_pos = in_Position;
-    normal = in_Normal;
-	gl_Position = projectionMatrix * modelToWorldToView * vec4(in_Position, 1.0);
+    vec3 offset_pos = vec3(in_Position.x, in_Position.y + 0.05 * sin(10.0 * in_Position.x + time), in_Position.z);
+    world_pos = offset_pos;
+    normal = normalize(vec3(-0.05 * cos(10.0 * in_Position.x + time), 1.0, 0.0));
+
+	gl_Position = projectionMatrix * modelToWorldToView * vec4(offset_pos, 1.0);
 }
 
diff --git a/src/main.cpp b/src/main.cpp
index 4da65e0ce0bb59ac05849274ece29c82d11a8620..bde29a4e97e908e2029e917ad77b24f572d2cb87 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -88,14 +88,18 @@ struct Scene {
 
   void draw_surface()
   {
-      surface.use();
-      GLuint program = surface.program;
-      glUniformMatrix4fv(glGetUniformLocation(program, "projectionMatrix"), 1, GL_TRUE, proj_matrix.m);
-      glUniformMatrix4fv(glGetUniformLocation(program, "modelToWorldToView"), 1, GL_TRUE, view_matrix.m);
-      glUniform1i(glGetUniformLocation(program, "sky"), 0);
-      glUniform3f(glGetUniformLocation(program, "camera_pos"), pos.x, pos.y, pos.z);
-
-      surface.draw();
+    surface.use();
+    GLuint program = surface.program;
+    int elapsed_millis = glutGet(GLUT_ELAPSED_TIME);
+    float time = elapsed_millis * 0.001f;
+
+    glUniformMatrix4fv(glGetUniformLocation(program, "projectionMatrix"), 1, GL_TRUE, proj_matrix.m);
+    glUniformMatrix4fv(glGetUniformLocation(program, "modelToWorldToView"), 1, GL_TRUE, view_matrix.m);
+    glUniform1i(glGetUniformLocation(program, "sky"), 0);
+    glUniform3f(glGetUniformLocation(program, "camera_pos"), pos.x, pos.y, pos.z);
+    glUniform1f(glGetUniformLocation(program, "time"), time);
+
+    surface.draw();
   }
 
 
@@ -198,13 +202,14 @@ void display(void) {
   glutSwapBuffers();
 }
 
-void on_mouse_move(int x, int y) {
-  const float sensitivity = 0.005f;
+void on_mouse_move(int x, int y)
+{
+  const float sensitivity = 0.0025f;
   if (mouse_y == -1 && mouse_x == -1) {
-    mouse_x = x;
-    mouse_y = y;
+      mouse_x = x;
+      mouse_y = y;
 
-    return;
+      return;
   }
 
   int dx = x - mouse_x;
@@ -212,9 +217,8 @@ void on_mouse_move(int x, int y) {
   mouse_x = x;
   mouse_y = y;
 
-  scene.pitch -= dy * sensitivity;
+  scene.pitch += dy * sensitivity;
   scene.yaw += dx * sensitivity;
-
   scene.pitch = std::max(-1.5f, std::min(1.5f, scene.pitch));
 }