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 38eb4611cb4d8c5a5c4c1ef19299333747971111..83b853fc4ea4a439caee896a1a0112a32bb84b6d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -74,7 +74,7 @@ struct Scene {
         vec3 fwd = vec3(sin(yaw), 0, -cos(yaw));
         vec3 right = vec3(cos(yaw), 0, sin(yaw));
         vec3 up = vec3(0, 1, 0);
-        float speed = 0.3;
+        float speed = 0.15;
 
         if (glutKeyIsDown('w')) {
             pos += speed * fwd;
@@ -127,10 +127,14 @@ struct Scene {
     {
         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();
     }
@@ -206,7 +210,7 @@ void display(void)
 
 void on_mouse_move(int x, int y)
 {
-    const float sensitivity = 0.005f;
+    const float sensitivity = 0.0025f;
     if (mouse_y == -1 && mouse_x == -1) {
         mouse_x = x;
         mouse_y = y;
@@ -219,7 +223,7 @@ 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));