Cardboard SDK v1.19.0
diff --git a/hellocardboard-android/build.gradle b/hellocardboard-android/build.gradle
index 5c56220..8bd4d7a 100644
--- a/hellocardboard-android/build.gradle
+++ b/hellocardboard-android/build.gradle
@@ -18,7 +18,7 @@
         minSdkVersion 24
         targetSdkVersion 31
         versionCode 1
-        versionName "1.18.0"
+        versionName "1.19.0"
         testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
         ndk {
             abiFilters 'armeabi-v7a', 'arm64-v8a'
diff --git a/hellocardboard-ios/HelloCardboard-Info.plist b/hellocardboard-ios/HelloCardboard-Info.plist
index 469070a..3516fe2 100644
--- a/hellocardboard-ios/HelloCardboard-Info.plist
+++ b/hellocardboard-ios/HelloCardboard-Info.plist
@@ -15,9 +15,9 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.18.0</string>
+	<string>1.19.0</string>
 	<key>CFBundleVersion</key>
-	<string>1.18.0</string>
+	<string>1.19.0</string>
 	<key>LSRequiresIPhoneOS</key>
 	<true/>
 	<key>NSCameraUsageDescription</key>
diff --git a/sdk/build.gradle b/sdk/build.gradle
index 60d7830..9492fdb 100644
--- a/sdk/build.gradle
+++ b/sdk/build.gradle
@@ -18,7 +18,7 @@
         minSdkVersion 24
         targetSdkVersion 31
         versionCode 1
-        versionName "1.18.0"
+        versionName "1.19.0"
         testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
         ndk {
             abiFilters 'armeabi-v7a', 'arm64-v8a'
diff --git a/sdk/rendering/android/shaders/distortion.vert b/sdk/rendering/android/shaders/distortion.vert
index 693a54d..bb3a6c5 100644
--- a/sdk/rendering/android/shaders/distortion.vert
+++ b/sdk/rendering/android/shaders/distortion.vert
@@ -18,23 +18,23 @@
 #extension GL_ARB_shading_language_420pack : enable
 precision mediump float;
 
-layout (binding = 1) uniform UniformBufferObject
-{
-    float left_u;
-    float right_u;
-    float top_v;
-    float bottom_v;
-} ubo;
-
 layout (location = 0) in vec2 a_Position;
 layout (location = 1) in vec2 a_TexCoords;
 layout (location = 0) out vec2 v_TexCoords;
 layout (location = 1) out vec2 u_Start;
 layout (location = 2) out vec2 u_End;
 
+layout( push_constant ) uniform constants
+{
+    float left_u;
+    float right_u;
+    float top_v;
+    float bottom_v;
+} push_constants;
+
 void main() {
    gl_Position = vec4(a_Position, 0, 1);
    v_TexCoords = a_TexCoords;
-   u_Start = vec2(ubo.left_u, ubo.bottom_v);
-   u_End = vec2(ubo.right_u, ubo.top_v);
+   u_Start = vec2(push_constants.left_u, push_constants.bottom_v);
+   u_End = vec2(push_constants.right_u, push_constants.top_v);
 }
diff --git a/sdk/rendering/android/shaders/distortion_vert.spv.h b/sdk/rendering/android/shaders/distortion_vert.spv.h
index a000068..972828e 100644
--- a/sdk/rendering/android/shaders/distortion_vert.spv.h
+++ b/sdk/rendering/android/shaders/distortion_vert.spv.h
@@ -13,10 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-   // 1011.5.0
-	 #pragma once
+// 1011.5.0
+#pragma once
 const uint32_t distortion_vert[] = {
-    0x07230203, 0x00010000, 0x0008000a, 0x00000032, 0x00000000, 0x00020011,
+    0x07230203, 0x00010000, 0x0008000a, 0x00000035, 0x00000000, 0x00020011,
     0x00000001, 0x0006000b, 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e,
     0x00000000, 0x0003000e, 0x00000000, 0x00000001, 0x000b000f, 0x00000000,
     0x00000004, 0x6e69616d, 0x00000000, 0x0000000d, 0x00000012, 0x0000001c,
@@ -32,67 +32,81 @@
     0x00030005, 0x0000000d, 0x00000000, 0x00050005, 0x00000012, 0x6f505f61,
     0x69746973, 0x00006e6f, 0x00050005, 0x0000001c, 0x65545f76, 0x6f6f4378,
     0x00736472, 0x00050005, 0x0000001d, 0x65545f61, 0x6f6f4378, 0x00736472,
-    0x00040005, 0x0000001f, 0x74535f75, 0x00747261, 0x00070005, 0x00000020,
+    0x00040005, 0x0000001f, 0x74535f75, 0x00747261, 0x00050005, 0x00000020,
+    0x736e6f63, 0x746e6174, 0x00000073, 0x00050006, 0x00000020, 0x00000000,
+    0x7466656c, 0x0000755f, 0x00050006, 0x00000020, 0x00000001, 0x68676972,
+    0x00755f74, 0x00050006, 0x00000020, 0x00000002, 0x5f706f74, 0x00000076,
+    0x00060006, 0x00000020, 0x00000003, 0x74746f62, 0x765f6d6f, 0x00000000,
+    0x00060005, 0x00000022, 0x68737550, 0x736e6f43, 0x746e6174, 0x00000073,
+    0x00040005, 0x0000002a, 0x6e455f75, 0x00000064, 0x00070005, 0x00000032,
     0x66696e55, 0x426d726f, 0x65666675, 0x6a624f72, 0x00746365, 0x00050006,
-    0x00000020, 0x00000000, 0x7466656c, 0x0000755f, 0x00050006, 0x00000020,
-    0x00000001, 0x68676972, 0x00755f74, 0x00050006, 0x00000020, 0x00000002,
-    0x5f706f74, 0x00000076, 0x00060006, 0x00000020, 0x00000003, 0x74746f62,
-    0x765f6d6f, 0x00000000, 0x00030005, 0x00000022, 0x006f6275, 0x00040005,
-    0x0000002a, 0x6e455f75, 0x00000064, 0x00050048, 0x0000000b, 0x00000000,
-    0x0000000b, 0x00000000, 0x00050048, 0x0000000b, 0x00000001, 0x0000000b,
-    0x00000001, 0x00050048, 0x0000000b, 0x00000002, 0x0000000b, 0x00000003,
-    0x00030047, 0x0000000b, 0x00000002, 0x00030047, 0x00000012, 0x00000000,
-    0x00040047, 0x00000012, 0x0000001e, 0x00000000, 0x00030047, 0x00000013,
-    0x00000000, 0x00030047, 0x0000001c, 0x00000000, 0x00040047, 0x0000001c,
-    0x0000001e, 0x00000000, 0x00030047, 0x0000001d, 0x00000000, 0x00040047,
-    0x0000001d, 0x0000001e, 0x00000001, 0x00030047, 0x0000001e, 0x00000000,
-    0x00030047, 0x0000001f, 0x00000000, 0x00040047, 0x0000001f, 0x0000001e,
-    0x00000001, 0x00040048, 0x00000020, 0x00000000, 0x00000000, 0x00050048,
-    0x00000020, 0x00000000, 0x00000023, 0x00000000, 0x00040048, 0x00000020,
-    0x00000001, 0x00000000, 0x00050048, 0x00000020, 0x00000001, 0x00000023,
-    0x00000004, 0x00040048, 0x00000020, 0x00000002, 0x00000000, 0x00050048,
-    0x00000020, 0x00000002, 0x00000023, 0x00000008, 0x00040048, 0x00000020,
-    0x00000003, 0x00000000, 0x00050048, 0x00000020, 0x00000003, 0x00000023,
-    0x0000000c, 0x00030047, 0x00000020, 0x00000002, 0x00040047, 0x00000022,
-    0x00000022, 0x00000000, 0x00040047, 0x00000022, 0x00000021, 0x00000001,
+    0x00000032, 0x00000000, 0x7466656c, 0x0000755f, 0x00050006, 0x00000032,
+    0x00000001, 0x68676972, 0x00755f74, 0x00050006, 0x00000032, 0x00000002,
+    0x5f706f74, 0x00000076, 0x00060006, 0x00000032, 0x00000003, 0x74746f62,
+    0x765f6d6f, 0x00000000, 0x00030005, 0x00000034, 0x006f6275, 0x00050048,
+    0x0000000b, 0x00000000, 0x0000000b, 0x00000000, 0x00050048, 0x0000000b,
+    0x00000001, 0x0000000b, 0x00000001, 0x00050048, 0x0000000b, 0x00000002,
+    0x0000000b, 0x00000003, 0x00030047, 0x0000000b, 0x00000002, 0x00030047,
+    0x00000012, 0x00000000, 0x00040047, 0x00000012, 0x0000001e, 0x00000000,
+    0x00030047, 0x00000013, 0x00000000, 0x00030047, 0x0000001c, 0x00000000,
+    0x00040047, 0x0000001c, 0x0000001e, 0x00000000, 0x00030047, 0x0000001d,
+    0x00000000, 0x00040047, 0x0000001d, 0x0000001e, 0x00000001, 0x00030047,
+    0x0000001e, 0x00000000, 0x00030047, 0x0000001f, 0x00000000, 0x00040047,
+    0x0000001f, 0x0000001e, 0x00000001, 0x00040048, 0x00000020, 0x00000000,
+    0x00000000, 0x00050048, 0x00000020, 0x00000000, 0x00000023, 0x00000000,
+    0x00040048, 0x00000020, 0x00000001, 0x00000000, 0x00050048, 0x00000020,
+    0x00000001, 0x00000023, 0x00000004, 0x00040048, 0x00000020, 0x00000002,
+    0x00000000, 0x00050048, 0x00000020, 0x00000002, 0x00000023, 0x00000008,
+    0x00040048, 0x00000020, 0x00000003, 0x00000000, 0x00050048, 0x00000020,
+    0x00000003, 0x00000023, 0x0000000c, 0x00030047, 0x00000020, 0x00000002,
     0x00030047, 0x00000025, 0x00000000, 0x00030047, 0x00000028, 0x00000000,
     0x00030047, 0x00000029, 0x00000000, 0x00030047, 0x0000002a, 0x00000000,
     0x00040047, 0x0000002a, 0x0000001e, 0x00000002, 0x00030047, 0x0000002d,
     0x00000000, 0x00030047, 0x00000030, 0x00000000, 0x00030047, 0x00000031,
-    0x00000000, 0x00020013, 0x00000002, 0x00030021, 0x00000003, 0x00000002,
-    0x00030016, 0x00000006, 0x00000020, 0x00040017, 0x00000007, 0x00000006,
-    0x00000004, 0x00040015, 0x00000008, 0x00000020, 0x00000000, 0x0004002b,
-    0x00000008, 0x00000009, 0x00000001, 0x0004001c, 0x0000000a, 0x00000006,
-    0x00000009, 0x0005001e, 0x0000000b, 0x00000007, 0x00000006, 0x0000000a,
-    0x00040020, 0x0000000c, 0x00000003, 0x0000000b, 0x0004003b, 0x0000000c,
-    0x0000000d, 0x00000003, 0x00040015, 0x0000000e, 0x00000020, 0x00000001,
-    0x0004002b, 0x0000000e, 0x0000000f, 0x00000000, 0x00040017, 0x00000010,
-    0x00000006, 0x00000002, 0x00040020, 0x00000011, 0x00000001, 0x00000010,
-    0x0004003b, 0x00000011, 0x00000012, 0x00000001, 0x0004002b, 0x00000006,
-    0x00000014, 0x00000000, 0x0004002b, 0x00000006, 0x00000015, 0x3f800000,
-    0x00040020, 0x00000019, 0x00000003, 0x00000007, 0x00040020, 0x0000001b,
-    0x00000003, 0x00000010, 0x0004003b, 0x0000001b, 0x0000001c, 0x00000003,
-    0x0004003b, 0x00000011, 0x0000001d, 0x00000001, 0x0004003b, 0x0000001b,
-    0x0000001f, 0x00000003, 0x0006001e, 0x00000020, 0x00000006, 0x00000006,
-    0x00000006, 0x00000006, 0x00040020, 0x00000021, 0x00000002, 0x00000020,
-    0x0004003b, 0x00000021, 0x00000022, 0x00000002, 0x00040020, 0x00000023,
-    0x00000002, 0x00000006, 0x0004002b, 0x0000000e, 0x00000026, 0x00000003,
-    0x0004003b, 0x0000001b, 0x0000002a, 0x00000003, 0x0004002b, 0x0000000e,
-    0x0000002b, 0x00000001, 0x0004002b, 0x0000000e, 0x0000002e, 0x00000002,
-    0x00050036, 0x00000002, 0x00000004, 0x00000000, 0x00000003, 0x000200f8,
-    0x00000005, 0x0004003d, 0x00000010, 0x00000013, 0x00000012, 0x00050051,
-    0x00000006, 0x00000016, 0x00000013, 0x00000000, 0x00050051, 0x00000006,
-    0x00000017, 0x00000013, 0x00000001, 0x00070050, 0x00000007, 0x00000018,
-    0x00000016, 0x00000017, 0x00000014, 0x00000015, 0x00050041, 0x00000019,
-    0x0000001a, 0x0000000d, 0x0000000f, 0x0003003e, 0x0000001a, 0x00000018,
-    0x0004003d, 0x00000010, 0x0000001e, 0x0000001d, 0x0003003e, 0x0000001c,
-    0x0000001e, 0x00050041, 0x00000023, 0x00000024, 0x00000022, 0x0000000f,
-    0x0004003d, 0x00000006, 0x00000025, 0x00000024, 0x00050041, 0x00000023,
-    0x00000027, 0x00000022, 0x00000026, 0x0004003d, 0x00000006, 0x00000028,
-    0x00000027, 0x00050050, 0x00000010, 0x00000029, 0x00000025, 0x00000028,
-    0x0003003e, 0x0000001f, 0x00000029, 0x00050041, 0x00000023, 0x0000002c,
-    0x00000022, 0x0000002b, 0x0004003d, 0x00000006, 0x0000002d, 0x0000002c,
-    0x00050041, 0x00000023, 0x0000002f, 0x00000022, 0x0000002e, 0x0004003d,
-    0x00000006, 0x00000030, 0x0000002f, 0x00050050, 0x00000010, 0x00000031,
-    0x0000002d, 0x00000030, 0x0003003e, 0x0000002a, 0x00000031, 0x000100fd,
-    0x00010038};
+    0x00000000, 0x00040048, 0x00000032, 0x00000000, 0x00000000, 0x00050048,
+    0x00000032, 0x00000000, 0x00000023, 0x00000000, 0x00040048, 0x00000032,
+    0x00000001, 0x00000000, 0x00050048, 0x00000032, 0x00000001, 0x00000023,
+    0x00000004, 0x00040048, 0x00000032, 0x00000002, 0x00000000, 0x00050048,
+    0x00000032, 0x00000002, 0x00000023, 0x00000008, 0x00040048, 0x00000032,
+    0x00000003, 0x00000000, 0x00050048, 0x00000032, 0x00000003, 0x00000023,
+    0x0000000c, 0x00030047, 0x00000032, 0x00000002, 0x00040047, 0x00000034,
+    0x00000022, 0x00000000, 0x00040047, 0x00000034, 0x00000021, 0x00000001,
+    0x00020013, 0x00000002, 0x00030021, 0x00000003, 0x00000002, 0x00030016,
+    0x00000006, 0x00000020, 0x00040017, 0x00000007, 0x00000006, 0x00000004,
+    0x00040015, 0x00000008, 0x00000020, 0x00000000, 0x0004002b, 0x00000008,
+    0x00000009, 0x00000001, 0x0004001c, 0x0000000a, 0x00000006, 0x00000009,
+    0x0005001e, 0x0000000b, 0x00000007, 0x00000006, 0x0000000a, 0x00040020,
+    0x0000000c, 0x00000003, 0x0000000b, 0x0004003b, 0x0000000c, 0x0000000d,
+    0x00000003, 0x00040015, 0x0000000e, 0x00000020, 0x00000001, 0x0004002b,
+    0x0000000e, 0x0000000f, 0x00000000, 0x00040017, 0x00000010, 0x00000006,
+    0x00000002, 0x00040020, 0x00000011, 0x00000001, 0x00000010, 0x0004003b,
+    0x00000011, 0x00000012, 0x00000001, 0x0004002b, 0x00000006, 0x00000014,
+    0x00000000, 0x0004002b, 0x00000006, 0x00000015, 0x3f800000, 0x00040020,
+    0x00000019, 0x00000003, 0x00000007, 0x00040020, 0x0000001b, 0x00000003,
+    0x00000010, 0x0004003b, 0x0000001b, 0x0000001c, 0x00000003, 0x0004003b,
+    0x00000011, 0x0000001d, 0x00000001, 0x0004003b, 0x0000001b, 0x0000001f,
+    0x00000003, 0x0006001e, 0x00000020, 0x00000006, 0x00000006, 0x00000006,
+    0x00000006, 0x00040020, 0x00000021, 0x00000009, 0x00000020, 0x0004003b,
+    0x00000021, 0x00000022, 0x00000009, 0x00040020, 0x00000023, 0x00000009,
+    0x00000006, 0x0004002b, 0x0000000e, 0x00000026, 0x00000003, 0x0004003b,
+    0x0000001b, 0x0000002a, 0x00000003, 0x0004002b, 0x0000000e, 0x0000002b,
+    0x00000001, 0x0004002b, 0x0000000e, 0x0000002e, 0x00000002, 0x0006001e,
+    0x00000032, 0x00000006, 0x00000006, 0x00000006, 0x00000006, 0x00040020,
+    0x00000033, 0x00000002, 0x00000032, 0x0004003b, 0x00000033, 0x00000034,
+    0x00000002, 0x00050036, 0x00000002, 0x00000004, 0x00000000, 0x00000003,
+    0x000200f8, 0x00000005, 0x0004003d, 0x00000010, 0x00000013, 0x00000012,
+    0x00050051, 0x00000006, 0x00000016, 0x00000013, 0x00000000, 0x00050051,
+    0x00000006, 0x00000017, 0x00000013, 0x00000001, 0x00070050, 0x00000007,
+    0x00000018, 0x00000016, 0x00000017, 0x00000014, 0x00000015, 0x00050041,
+    0x00000019, 0x0000001a, 0x0000000d, 0x0000000f, 0x0003003e, 0x0000001a,
+    0x00000018, 0x0004003d, 0x00000010, 0x0000001e, 0x0000001d, 0x0003003e,
+    0x0000001c, 0x0000001e, 0x00050041, 0x00000023, 0x00000024, 0x00000022,
+    0x0000000f, 0x0004003d, 0x00000006, 0x00000025, 0x00000024, 0x00050041,
+    0x00000023, 0x00000027, 0x00000022, 0x00000026, 0x0004003d, 0x00000006,
+    0x00000028, 0x00000027, 0x00050050, 0x00000010, 0x00000029, 0x00000025,
+    0x00000028, 0x0003003e, 0x0000001f, 0x00000029, 0x00050041, 0x00000023,
+    0x0000002c, 0x00000022, 0x0000002b, 0x0004003d, 0x00000006, 0x0000002d,
+    0x0000002c, 0x00050041, 0x00000023, 0x0000002f, 0x00000022, 0x0000002e,
+    0x0004003d, 0x00000006, 0x00000030, 0x0000002f, 0x00050050, 0x00000010,
+    0x00000031, 0x0000002d, 0x00000030, 0x0003003e, 0x0000002a, 0x00000031,
+    0x000100fd, 0x00010038};
\ No newline at end of file
diff --git a/sdk/rendering/android/vulkan_distortion_renderer.cc b/sdk/rendering/android/vulkan_distortion_renderer.cc
index b76e4af..e9d5143 100644
--- a/sdk/rendering/android/vulkan_distortion_renderer.cc
+++ b/sdk/rendering/android/vulkan_distortion_renderer.cc
@@ -40,7 +40,7 @@
 
 namespace cardboard::rendering {
 
-struct UniformBufferObject {
+struct PushConstantsObject {
   float left_u;
   float right_u;
   float top_v;
@@ -102,11 +102,6 @@
     vkFreeMemory(logical_device_, vertex_buffers_memory_[kLeft], nullptr);
     vkDestroyBuffer(logical_device_, vertex_buffers_[kRight], nullptr);
     vkFreeMemory(logical_device_, vertex_buffers_memory_[kRight], nullptr);
-
-    vkDestroyBuffer(logical_device_, uniform_buffers_[kLeft], nullptr);
-    vkFreeMemory(logical_device_, uniform_buffers_memory_[kLeft], nullptr);
-    vkDestroyBuffer(logical_device_, uniform_buffers_[kRight], nullptr);
-    vkFreeMemory(logical_device_, uniform_buffers_memory_[kRight], nullptr);
   }
 
   void SetMesh(const CardboardMesh* mesh, CardboardEye eye) override {
@@ -216,7 +211,7 @@
    */
   void CreateSharedVulkanObjects() {
     // Create DescriptorSet Layout
-    VkDescriptorSetLayoutBinding bindings[2];
+    VkDescriptorSetLayoutBinding bindings[1];
 
     VkDescriptorSetLayoutBinding sampler_layout_binding{
         .binding = 0,
@@ -227,31 +222,29 @@
     };
     bindings[0] = sampler_layout_binding;
 
-    VkDescriptorSetLayoutBinding ubo_layout_binding{
-        .binding = 1,
-        .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
-        .descriptorCount = 1,
-        .stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
-        .pImmutableSamplers = nullptr,
-    };
-    bindings[1] = ubo_layout_binding;
-
     VkDescriptorSetLayoutCreateInfo layout_info = {
         .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
-        .bindingCount = 2,
+        .bindingCount = 1,
         .pBindings = bindings,
     };
     CALL_VK(vkCreateDescriptorSetLayout(logical_device_, &layout_info, nullptr,
                                         &descriptor_set_layout_));
 
+    // Setup push constants.
+    VkPushConstantRange push_constant_range = {
+      .stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
+      .offset = 0,
+      .size = sizeof(PushConstantsObject),
+    };
+
     // Create Pipeline Layout
     VkPipelineLayoutCreateInfo pipeline_layout_create_info{
         .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
         .pNext = nullptr,
         .setLayoutCount = 1,
         .pSetLayouts = &descriptor_set_layout_,
-        .pushConstantRangeCount = 0,
-        .pPushConstantRanges = nullptr,
+        .pushConstantRangeCount = 1,
+        .pPushConstantRanges = &push_constant_range,
     };
     CALL_VK(vkCreatePipelineLayout(logical_device_,
                                    &pipeline_layout_create_info, nullptr,
@@ -290,31 +283,20 @@
    */
   void CreatePerEyeVulkanObjects(CardboardEye eye) {
     // Create Descriptor Pool
-    VkDescriptorPoolSize pool_sizes[2];
+    VkDescriptorPoolSize pool_sizes[1];
     pool_sizes[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
     pool_sizes[0].descriptorCount =
         static_cast<uint32_t>(swapchain_image_count_);
-    pool_sizes[1].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
-    pool_sizes[1].descriptorCount =
-        static_cast<uint32_t>(swapchain_image_count_);
 
     VkDescriptorPoolCreateInfo pool_info{};
     pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
-    pool_info.poolSizeCount = 2;
+    pool_info.poolSizeCount = 1;
     pool_info.pPoolSizes = pool_sizes;
     pool_info.maxSets = static_cast<uint32_t>(swapchain_image_count_);
 
     CALL_VK(vkCreateDescriptorPool(logical_device_, &pool_info, nullptr,
                                    &descriptor_pool_[eye]));
 
-    // Create Uniform Buffers
-    VkDeviceSize buffer_size = sizeof(UniformBufferObject);
-
-    CreateBuffer(buffer_size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
-                 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
-                     VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
-                 uniform_buffers_[eye], uniform_buffers_memory_[eye]);
-
     // Create Descriptor Sets
     std::vector<VkDescriptorSetLayout> layouts(swapchain_image_count_,
                                                descriptor_set_layout_);
@@ -567,18 +549,14 @@
       const CardboardEyeTextureDescription* eye_description, CardboardEye eye,
       VkCommandBuffer command_buffer, uint32_t image_index, int x, int y,
       int width, int height) {
-    // Update Uniform Buffer
-    UniformBufferObject ubo{
+    // Update Push constants.
+    PushConstantsObject push_constants {
         .left_u = eye_description->left_u,
         .right_u = eye_description->right_u,
         .top_v = eye_description->top_v,
         .bottom_v = eye_description->bottom_v,
     };
-    void* data;
-    vkMapMemory(logical_device_, uniform_buffers_memory_[eye], 0, sizeof(ubo),
-                0, &data);
-    memcpy(data, &ubo, sizeof(ubo));
-    vkUnmapMemory(logical_device_, uniform_buffers_memory_[eye]);
+    vkCmdPushConstants(command_buffer, pipeline_layout_, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(PushConstantsObject), &push_constants);
 
     // Update image and view
     VkImage current_image = reinterpret_cast<VkImage>(eye_description->texture);
@@ -611,17 +589,13 @@
                               &image_views_[eye][image_index]));
 
     // Update Descriptor Sets
-    VkDescriptorBufferInfo buffer_info{.buffer = uniform_buffers_[eye],
-                                       .offset = 0,
-                                       .range = sizeof(UniformBufferObject)};
-
     VkDescriptorImageInfo image_info{
         .sampler = texture_sampler_,
         .imageView = image_views_[eye][image_index],
         .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
     };
 
-    VkWriteDescriptorSet descriptor_writes[2];
+    VkWriteDescriptorSet descriptor_writes[1];
 
     descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
     descriptor_writes[0].dstSet = descriptor_sets_[eye][image_index];
@@ -633,16 +607,7 @@
     descriptor_writes[0].pImageInfo = &image_info;
     descriptor_writes[0].pNext = nullptr;
 
-    descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
-    descriptor_writes[1].dstSet = descriptor_sets_[eye][image_index];
-    descriptor_writes[1].dstBinding = 1;
-    descriptor_writes[1].dstArrayElement = 0;
-    descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
-    descriptor_writes[1].descriptorCount = 1;
-    descriptor_writes[1].pBufferInfo = &buffer_info;
-    descriptor_writes[1].pNext = nullptr;
-
-    vkUpdateDescriptorSets(logical_device_, 2, descriptor_writes, 0, nullptr);
+    vkUpdateDescriptorSets(logical_device_, 1, descriptor_writes, 0, nullptr);
 
     // Update Viewport and scissor
     VkViewport viewport = {.x = static_cast<float>(x),
@@ -725,8 +690,6 @@
   VkDeviceMemory vertex_buffers_memory_[2];
   VkBuffer index_buffers_[2];
   VkDeviceMemory index_buffers_memory_[2];
-  VkBuffer uniform_buffers_[2];
-  VkDeviceMemory uniform_buffers_memory_[2];
   VkDescriptorPool descriptor_pool_[2];
   std::vector<VkDescriptorSet> descriptor_sets_[2];
   std::vector<VkImageView> image_views_[2];
diff --git a/sdk/unity/xr_unity_plugin/vulkan/vulkan_renderer.cc b/sdk/unity/xr_unity_plugin/vulkan/vulkan_renderer.cc
index c803361..662a9b3 100644
--- a/sdk/unity/xr_unity_plugin/vulkan/vulkan_renderer.cc
+++ b/sdk/unity/xr_unity_plugin/vulkan/vulkan_renderer.cc
@@ -190,7 +190,7 @@
           .flags = 0,
           .image = swapchain_images_[i],
           .viewType = VK_IMAGE_VIEW_TYPE_2D,
-          .format = VK_FORMAT_R8G8B8A8_UNORM,
+          .format = VK_FORMAT_R8G8B8A8_SRGB,
           .components =
               {
                   .r = VK_COMPONENT_SWIZZLE_R,
@@ -272,8 +272,8 @@
   }
 
   void SetupWidgets() override {
-    widget_renderer_ = std::make_unique<VulkanWidgetsRenderer>(physical_device_,
-                                                              logical_device_);
+    widget_renderer_ = std::make_unique<VulkanWidgetsRenderer>(
+        physical_device_, logical_device_, swapchain_image_count_);
   }
 
   void RenderWidgets(const ScreenParams& screen_params,
@@ -283,7 +283,8 @@
     }
 
     widget_renderer_->RenderWidgets(screen_params, widget_params,
-                                    current_command_buffer_, render_pass_);
+                                    current_command_buffer_, image_index,
+                                    render_pass_);
   }
 
   void TeardownWidgets() override {
diff --git a/sdk/unity/xr_unity_plugin/vulkan/vulkan_widgets_renderer.cc b/sdk/unity/xr_unity_plugin/vulkan/vulkan_widgets_renderer.cc
index c204755..60510cd 100644
--- a/sdk/unity/xr_unity_plugin/vulkan/vulkan_widgets_renderer.cc
+++ b/sdk/unity/xr_unity_plugin/vulkan/vulkan_widgets_renderer.cc
@@ -47,10 +47,14 @@
 }  // namespace
 
 VulkanWidgetsRenderer::VulkanWidgetsRenderer(VkPhysicalDevice physical_device,
-                                             VkDevice logical_device)
+                                             VkDevice logical_device,
+                                             const int swapchain_image_count)
     : physical_device_(physical_device),
       logical_device_(logical_device),
-      widget_image_count_(1),
+      current_render_pass_(VK_NULL_HANDLE),
+      swapchain_image_count_(swapchain_image_count),
+      indices_count_(0),
+      texture_sampler_(VK_NULL_HANDLE),
       descriptor_set_layout_(VK_NULL_HANDLE),
       pipeline_layout_(VK_NULL_HANDLE),
       graphics_pipeline_(VK_NULL_HANDLE),
@@ -58,9 +62,8 @@
       vertex_buffers_memory_(0),
       index_buffers_(VK_NULL_HANDLE),
       index_buffers_memory_(VK_NULL_HANDLE),
-      descriptor_pool_(VK_NULL_HANDLE),
-      descriptor_sets_(0),
-      image_views_(0) {
+      widgets_data_(0),
+      current_widget_params_(0) {
   if (!rendering::LoadVulkan()) {
     CARDBOARD_LOGE("Failed to load vulkan lib in cardboard!");
     return;
@@ -70,47 +73,37 @@
 }
 
 VulkanWidgetsRenderer::~VulkanWidgetsRenderer() {
-  for (uint32_t i = 0; i < image_views_.size(); i++) {
-    CleanTextureImageView(i);
-  }
-
   rendering::vkDestroySampler(logical_device_, texture_sampler_, nullptr);
   rendering::vkDestroyPipelineLayout(logical_device_, pipeline_layout_,
                                      nullptr);
   rendering::vkDestroyDescriptorSetLayout(logical_device_,
                                           descriptor_set_layout_, nullptr);
 
-  rendering::vkDestroyDescriptorPool(logical_device_, descriptor_pool_,
-                                     nullptr);
-
+  SetWidgetImageCount(0);
   CleanPipeline();
 
   rendering::vkDestroyBuffer(logical_device_, index_buffers_, nullptr);
   rendering::vkFreeMemory(logical_device_, index_buffers_memory_, nullptr);
 
   for (uint32_t i = 0; i < vertex_buffers_.size(); i++) {
-    if (vertex_buffers_[i] != VK_NULL_HANDLE) {
-      rendering::vkDestroyBuffer(logical_device_, vertex_buffers_[i], nullptr);
-      rendering::vkFreeMemory(logical_device_, vertex_buffers_memory_[i],
-                              nullptr);
-    }
+    CleanVertexBuffer(i);
   }
 }
 
 void VulkanWidgetsRenderer::RenderWidgets(
     const Renderer::ScreenParams& screen_params,
     const std::vector<Renderer::WidgetParams>& widgets_params,
-    const VkCommandBuffer command_buffer, const VkRenderPass render_pass) {
+    const VkCommandBuffer command_buffer, const uint32_t swapchain_image_index,
+    const VkRenderPass render_pass) {
   // If the amount of widgets change, then recreate the objects related to them.
-  if (widget_image_count_ != widgets_params.size()) {
-    widget_image_count_ = widgets_params.size();
-    CreatePerWidgetVulkanObjects();
+  if (widgets_data_.size() != widgets_params.size()) {
+    SetWidgetImageCount(widgets_params.size());
     UpdateVertexBuffers(widgets_params, screen_params);
     current_widget_params_ = widgets_params;
   } else {
     // If the position or the size of a widget changes, then update its vertex
     // buffer.
-    for (uint32_t i = 0; i < widget_image_count_; i++) {
+    for (uint32_t i = 0; i < widgets_data_.size(); i++) {
       if (!widgetsOccupySameArea(current_widget_params_[i],
                                  widgets_params[i])) {
         UpdateVertexBuffer(widgets_params[i], screen_params, i);
@@ -124,8 +117,9 @@
     CreateGraphicsPipeline();
   }
 
-  for (uint32_t i = 0; i < widget_image_count_; i++) {
-    RenderWidget(widgets_params[i], command_buffer, i, screen_params);
+  for (uint32_t i = 0; i < widgets_data_.size(); i++) {
+    RenderWidget(widgets_params[i], command_buffer, i, swapchain_image_index,
+                 screen_params);
   }
 }
 
@@ -222,40 +216,61 @@
   CreateIndexBuffer(square_texture_indices);
 }
 
-void VulkanWidgetsRenderer::CreatePerWidgetVulkanObjects() {
-  // Create Descriptor Pool
-  VkDescriptorPoolSize pool_sizes[1];
-  pool_sizes[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
-  pool_sizes[0].descriptorCount = static_cast<uint32_t>(widget_image_count_);
+void VulkanWidgetsRenderer::SetWidgetImageCount(
+    const uint32_t widget_image_count) {
+  // Clean.
+  for (uint32_t widget_index = 0; widget_index < widgets_data_.size();
+       widget_index++) {
+    // Clean image views per widget.
+    for (uint32_t image_index = 0;
+         image_index < widgets_data_[widget_index].image_views.size();
+         image_index++) {
+      CleanTextureImageView(widget_index, image_index);
+    }
+    // Clean descriptor pool per widget.
+    rendering::vkDestroyDescriptorPool(
+        logical_device_, widgets_data_[widget_index].descriptor_pool, nullptr);
+  }
 
-  VkDescriptorPoolCreateInfo pool_info{};
-  pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
-  pool_info.poolSizeCount = 1;
-  pool_info.pPoolSizes = pool_sizes;
-  pool_info.maxSets = static_cast<uint32_t>(widget_image_count_);
+  // Resize.
+  widgets_data_.resize(widget_image_count);
 
-  CALL_VK(rendering::vkCreateDescriptorPool(logical_device_, &pool_info,
-                                            nullptr, &descriptor_pool_));
+  // Recreate.
+  for (uint32_t widget = 0; widget < widgets_data_.size(); widget++) {
+    // Create Descriptor Pool
+    VkDescriptorPoolSize pool_sizes[1];
+    pool_sizes[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+    pool_sizes[0].descriptorCount =
+        static_cast<uint32_t>(swapchain_image_count_);
 
-  // Create Descriptor Sets
-  std::vector<VkDescriptorSetLayout> layouts(widget_image_count_,
-                                             descriptor_set_layout_);
-  VkDescriptorSetAllocateInfo alloc_info{};
-  alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
-  alloc_info.descriptorPool = descriptor_pool_;
-  alloc_info.descriptorSetCount = static_cast<uint32_t>(widget_image_count_);
-  alloc_info.pSetLayouts = layouts.data();
+    VkDescriptorPoolCreateInfo pool_info{};
+    pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
+    pool_info.poolSizeCount = 1;
+    pool_info.pPoolSizes = pool_sizes;
+    pool_info.maxSets = static_cast<uint32_t>(swapchain_image_count_);
 
-  descriptor_sets_.resize(widget_image_count_);
-  CALL_VK(rendering::vkAllocateDescriptorSets(logical_device_, &alloc_info,
-                                              descriptor_sets_.data()));
+    CALL_VK(rendering::vkCreateDescriptorPool(
+        logical_device_, &pool_info, nullptr,
+        &widgets_data_[widget].descriptor_pool));
 
-  // Set the size of image view array to the amount of widgets.
-  image_views_.resize(widget_image_count_);
+    // Create Descriptor Sets
+    std::vector<VkDescriptorSetLayout> layouts(swapchain_image_count_,
+                                               descriptor_set_layout_);
+    VkDescriptorSetAllocateInfo alloc_info{};
+    alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
+    alloc_info.descriptorPool = widgets_data_[widget].descriptor_pool;
+    alloc_info.descriptorSetCount =
+        static_cast<uint32_t>(swapchain_image_count_);
+    alloc_info.pSetLayouts = layouts.data();
+    widgets_data_[widget].descriptor_sets.resize(swapchain_image_count_);
 
-  // Set the size of the vertex buffers array to the amount of widgets.
-  vertex_buffers_.resize(widget_image_count_);
-  vertex_buffers_memory_.resize(widget_image_count_);
+    CALL_VK(rendering::vkAllocateDescriptorSets(
+        logical_device_, &alloc_info,
+        widgets_data_[widget].descriptor_sets.data()));
+
+    // Set the size of image view array to the amount of swapchain images.
+    widgets_data_[widget].image_views.resize(swapchain_image_count_);
+  }
 }
 
 void VulkanWidgetsRenderer::CreateGraphicsPipeline() {
@@ -470,20 +485,30 @@
 void VulkanWidgetsRenderer::UpdateVertexBuffers(
     const std::vector<unity::Renderer::WidgetParams>& widgets_params,
     const unity::Renderer::ScreenParams& screen_params) {
-  for (uint32_t i = 0; i < widget_image_count_; i++) {
-    UpdateVertexBuffer(widgets_params[i], screen_params, i);
+  vertex_buffers_.resize(widgets_params.size());
+  vertex_buffers_memory_.resize(widgets_params.size());
+
+  for (uint32_t widget_index = 0; widget_index < widgets_params.size();
+       widget_index++) {
+    UpdateVertexBuffer(widgets_params[widget_index], screen_params,
+                       widget_index);
+  }
+}
+
+void VulkanWidgetsRenderer::CleanVertexBuffer(const uint32_t widget_index) {
+  if (vertex_buffers_[widget_index] != VK_NULL_HANDLE) {
+    rendering::vkDestroyBuffer(logical_device_, vertex_buffers_[widget_index],
+                               nullptr);
+    rendering::vkFreeMemory(logical_device_,
+                            vertex_buffers_memory_[widget_index], nullptr);
   }
 }
 
 void VulkanWidgetsRenderer::UpdateVertexBuffer(
     const unity::Renderer::WidgetParams& widget_params,
-    const unity::Renderer::ScreenParams& screen_params, const uint32_t index) {
-  if (vertex_buffers_[index] != VK_NULL_HANDLE) {
-    rendering::vkDestroyBuffer(logical_device_, vertex_buffers_[index],
-                               nullptr);
-    rendering::vkFreeMemory(logical_device_, vertex_buffers_memory_[index],
-                            nullptr);
-  }
+    const unity::Renderer::ScreenParams& screen_params,
+    const uint32_t widget_index) {
+  CleanVertexBuffer(widget_index);
 
   // Convert coordinates to normalized space (-1,-1 - +1,+1)
   float x =
@@ -506,23 +531,24 @@
                                         {x + width, y, 1.0f, 1.0f}};
 
   // Create vertices for the widget.
-  CreateVertexBuffer(vertices, index);
+  CreateVertexBuffer(vertices, widget_index);
 }
 
 void VulkanWidgetsRenderer::RenderWidget(
     const unity::Renderer::WidgetParams& widget_params,
-    VkCommandBuffer command_buffer, uint32_t image_index,
+    VkCommandBuffer command_buffer, const uint32_t widget_index,
+    const uint32_t swapchain_image_index,
     const unity::Renderer::ScreenParams& screen_params) {
   // Update image and view
   VkImage* current_image = reinterpret_cast<VkImage*>(widget_params.texture);
-  CleanTextureImageView(image_index);
+  CleanTextureImageView(widget_index, swapchain_image_index);
   const VkImageViewCreateInfo view_create_info = {
       .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
       .pNext = nullptr,
       .flags = 0,
       .image = *current_image,
       .viewType = VK_IMAGE_VIEW_TYPE_2D,
-      // This format must match the images format as can be seen in the Unity 
+      // This format must match the images format as can be seen in the Unity
       // editor inspector.
       .format = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
       .components =
@@ -541,21 +567,23 @@
               .layerCount = 1,
           },
   };
-  CALL_VK(rendering::vkCreateImageView(logical_device_, &view_create_info,
-                                       nullptr /* pAllocator */,
-                                       &image_views_[image_index]));
+  CALL_VK(rendering::vkCreateImageView(
+      logical_device_, &view_create_info, nullptr /* pAllocator */,
+      &widgets_data_[widget_index].image_views[swapchain_image_index]));
 
   // Update Descriptor Sets
   VkDescriptorImageInfo image_info{
       .sampler = texture_sampler_,
-      .imageView = image_views_[image_index],
+      .imageView =
+          widgets_data_[widget_index].image_views[swapchain_image_index],
       .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
   };
 
   VkWriteDescriptorSet descriptor_writes[1];
 
   descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
-  descriptor_writes[0].dstSet = descriptor_sets_[image_index];
+  descriptor_writes[0].dstSet =
+      widgets_data_[widget_index].descriptor_sets[swapchain_image_index];
   descriptor_writes[0].dstBinding = 0;
   descriptor_writes[0].dstArrayElement = 0;
   descriptor_writes[0].descriptorType =
@@ -593,14 +621,14 @@
 
   VkDeviceSize offset = 0;
   rendering::vkCmdBindVertexBuffers(command_buffer, 0, 1,
-                                    &vertex_buffers_[image_index], &offset);
-
+                                    &vertex_buffers_[widget_index], &offset);
   rendering::vkCmdBindIndexBuffer(command_buffer, index_buffers_, 0,
                                   VK_INDEX_TYPE_UINT16);
 
   rendering::vkCmdBindDescriptorSets(
       command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout_, 0, 1,
-      &descriptor_sets_[image_index], 0, nullptr);
+      &widgets_data_[widget_index].descriptor_sets[swapchain_image_index], 0,
+      nullptr);
   rendering::vkCmdDrawIndexed(
       command_buffer, static_cast<uint32_t>(indices_count_), 1, 0, 0, 0);
 }
@@ -612,11 +640,16 @@
   }
 }
 
-void VulkanWidgetsRenderer::CleanTextureImageView(int index) {
-  if (image_views_[index] != VK_NULL_HANDLE) {
-    rendering::vkDestroyImageView(logical_device_, image_views_[index],
-                                  nullptr /* vkDestroyImageView */);
-    image_views_[index] = VK_NULL_HANDLE;
+void VulkanWidgetsRenderer::CleanTextureImageView(
+    const int widget_index, const int swapchain_image_index) {
+  if (widgets_data_[widget_index].image_views[swapchain_image_index] !=
+      VK_NULL_HANDLE) {
+    rendering::vkDestroyImageView(
+        logical_device_,
+        widgets_data_[widget_index].image_views[swapchain_image_index],
+        nullptr /* vkDestroyImageView */);
+    widgets_data_[widget_index].image_views[swapchain_image_index] =
+        VK_NULL_HANDLE;
   }
 }
 
diff --git a/sdk/unity/xr_unity_plugin/vulkan/vulkan_widgets_renderer.h b/sdk/unity/xr_unity_plugin/vulkan/vulkan_widgets_renderer.h
index e6f7649..636180e 100644
--- a/sdk/unity/xr_unity_plugin/vulkan/vulkan_widgets_renderer.h
+++ b/sdk/unity/xr_unity_plugin/vulkan/vulkan_widgets_renderer.h
@@ -35,9 +35,11 @@
    *
    * @param physical_device Vulkan physical device.
    * @param logical_device Vulkan logical device.
+   * @param swapchain_image_count Number of images available in the swapchain.
    */
   VulkanWidgetsRenderer(VkPhysicalDevice physical_device,
-                        VkDevice logical_device);
+                        VkDevice logical_device,
+                        const int swapchain_image_count);
 
   /**
    * Destructor. Frees renderer resources.
@@ -51,11 +53,13 @@
    * @param widgets_params Params for each widget. This includes position to
    * render and texture.
    * @param command_buffer VkCommandBuffer to be bond.
+   * @param swapchain_image_index Swapchain image to be rendered.
    * @param render_pass Render pass used.
    */
   void RenderWidgets(const Renderer::ScreenParams& screen_params,
                      const std::vector<Renderer::WidgetParams>& widgets_params,
                      const VkCommandBuffer command_buffer,
+                     const uint32_t swapchain_image_index,
                      const VkRenderPass render_pass);
 
  private:
@@ -78,6 +82,17 @@
     float tex_v;
   };
 
+  /**
+   * @struct Data required for each widget.
+   */
+  struct PerWidgetData {
+    VkDescriptorPool descriptor_pool;
+    // Size should be the size of the swapchain.
+    std::vector<VkDescriptorSet> descriptor_sets;
+    // Size should be the size of the swapchain.
+    std::vector<VkImageView> image_views;
+  };
+
   static constexpr float Lerp(float start, float end, float val) {
     return start + (end - start) * val;
   }
@@ -126,12 +141,14 @@
   void CreateSharedVulkanObjects();
 
   /**
-   * Creates required vulkan objects for the given eye.
+   * Creates required vulkan objects for the given widget.
+   *
+   * @param widget Number of the widget.
    */
-  void CreatePerWidgetVulkanObjects();
+  void SetWidgetImageCount(const uint32_t widget);
 
   /**
-   * Creates the graphics pipeline for the given eye.
+   * Creates the graphics pipeline.
    * It cleans the previous pipeline if it exists.
    */
   void CreateGraphicsPipeline();
@@ -162,32 +179,44 @@
    *
    * @param widget_params Texture for the widget.
    * @param command_buffer VkCommandBuffer to be bond.
-   * @param image_index Index of current image in the image views array.
+   * @param swapchain_image_index Index of current image in the image views
+   * array.
    * @param screen_params Screen parameters of the rendering area.
    */
   void RenderWidget(const unity::Renderer::WidgetParams& widget_params,
-                    VkCommandBuffer command_buffer, uint32_t image_index,
+                    VkCommandBuffer command_buffer, const uint32_t widget_index,
+                    const uint32_t swapchain_image_index,
                     const unity::Renderer::ScreenParams& screen_params);
 
   /**
-   * Cleans the graphics pipeline of the given eye.
+   * Cleans the graphics pipeline.
    */
   void CleanPipeline();
 
   /**
-   * Cleans the image view of the given eye and swapchain image index.
+   * Cleans the image view of the given widget and swapchain image index.
    *
-   * @param index The index of the image in the swapchain.
+   * @param widget_index The index of the widget.
+   * @param swapchain_image_index The index of the image in the swapchain.
    */
-  void CleanTextureImageView(int index);
+  void CleanTextureImageView(const int widget_index,
+                             const int swapchain_image_index);
 
   /**
    * Creates a vertex buffer and store it internally.
    *
    * @param vertices Content of the vertex buffer.
-   * @param index The index of the buffer.
+   * @param widget_index The index of the widget related to the buffer.
    */
-  void CreateVertexBuffer(std::vector<Vertex> vertices, const uint32_t index);
+  void CreateVertexBuffer(std::vector<Vertex> vertices,
+                          const uint32_t widget_index);
+
+  /**
+   * Cleans a vertex buffer.
+   *
+   * @param widget_index The index of the widget related to the buffer.
+   */
+  void CleanVertexBuffer(const uint32_t widget_index);
 
   /**
    * Creates an index buffer and store it internally.
@@ -202,7 +231,7 @@
   VkRenderPass current_render_pass_;
 
   // Variables created and maintained by the widget renderer.
-  uint32_t widget_image_count_;
+  uint32_t swapchain_image_count_;
   int indices_count_;
   VkSampler texture_sampler_;
   VkDescriptorSetLayout descriptor_set_layout_;
@@ -212,9 +241,7 @@
   std::vector<VkDeviceMemory> vertex_buffers_memory_;
   VkBuffer index_buffers_;
   VkDeviceMemory index_buffers_memory_;
-  VkDescriptorPool descriptor_pool_;
-  std::vector<VkDescriptorSet> descriptor_sets_;
-  std::vector<VkImageView> image_views_;
+  std::vector<PerWidgetData> widgets_data_;
   std::vector<Renderer::WidgetParams> current_widget_params_;
 };