diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index 5b014bbda8a4aea0c765088766fb6c734222ea6f..29ac45938cdd2a32a0344b877fcf2b7bbc9f762e 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -8,8 +8,8 @@ int main(int argc, const char** argv) {
 	vkcv::Context context = vkcv::Context::create(
             applicationName,
 		VK_MAKE_VERSION(0, 0, 1),
-		20,
-		{vk::QueueFlagBits::eGraphics, vk::QueueFlagBits::eTransfer},
+		2,
+		{vk::QueueFlagBits::eTransfer},
 		{},
 		{"VK_KHR_swapchain"}
 	);
diff --git a/src/vkcv/Context.cpp b/src/vkcv/Context.cpp
index ce94145aebf605ea108f7e96cac7cccd0b9fd480..0e1ad06c9c2abb1b9e9ccef42985a9adf5dd7c1c 100644
--- a/src/vkcv/Context.cpp
+++ b/src/vkcv/Context.cpp
@@ -10,8 +10,8 @@
 
 namespace vkcv {
 
-	Context::Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::Device device)
-		: m_instance(instance), m_physicalDevice(physicalDevice), m_device(device)
+	Context::Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::Device device, vk::Queue graphicsqueue, vk::Queue computequeue, vk::Queue transferqueue)
+		: m_instance(instance), m_physicalDevice(physicalDevice), m_device(device), m_graphicsqueue(graphicsqueue), m_transferqueue(transferqueue), m_computequeue(computequeue)
 	{}
 
 	Context::~Context() {
@@ -125,14 +125,24 @@ namespace vkcv {
 
 
 		vk::Device device = physicalDevice.createDevice(deviceCreateInfo);
-		// TODO: implement device.getQueue() to access the queues, if neede
-		//std::vector<vk::QueueFamilyProperties> queueFamilyProperties = physicalDevice.getQueueFamilyProperties();
-        //uint32_t graphicsQueueFamilyIndex = vkcv::findGraphicsQueueFamilyIndex( queueFamilyProperties );
-       // for(uint32_t i = 0; true; i++){
-       //     vk::Queue graphicsQueue = device.getQueue( graphicsQueueFamilyIndex, i );
-       // }
-
-		return Context(instance, physicalDevice, device);
+		uint32_t graphicsQueueFamilyIndex = findQueueFamilyIndex({vk::QueueFlagBits::eGraphics}, qCreateInfos, physicalDevice);
+		if(graphicsQueueFamilyIndex == -1){
+            throw std::runtime_error("It is not possible to access another queue as a graphics queue.");
+		}
+        uint32_t computeQueueFamilyIndex = findQueueFamilyIndex({vk::QueueFlagBits::eCompute}, qCreateInfos, physicalDevice);
+        if(computeQueueFamilyIndex == -1){
+            throw std::runtime_error("It is not possible to access another queue as a compute queue.");
+        }
+        uint32_t transferQueueFamilyIndex = findQueueFamilyIndex({vk::QueueFlagBits::eTransfer}, qCreateInfos, physicalDevice);
+        if(transferQueueFamilyIndex == -1){
+            throw std::runtime_error("It is not possible to access another queue as a transfer queue.");
+        }
+		vk::Queue graphicsQueue = device.getQueue( graphicsQueueFamilyIndex, 0 );
+		vk::Queue computeQueue = device.getQueue(computeQueueFamilyIndex,1);
+		vk::Queue transferQueue = device.getQueue(transferQueueFamilyIndex, 2);
+
+
+		return Context(instance, physicalDevice, device, graphicsQueue, transferQueue, computeQueue);
 	}
 
 	const vk::Instance& Context::getInstance() const {
@@ -260,10 +270,16 @@ namespace vkcv {
 		return extensions;
 	}
 
-    uint32_t Context::findGraphicsQueueFamilyIndex(uint32_t queueCount, std::vector<vk::DeviceQueueCreateInfo> &createInfos){
-        for(auto createInfo: createInfos){
-            std::cout << createInfo.queueCount << std::endl;
+    int Context::findQueueFamilyIndex(vk::QueueFlagBits flag, std::vector<vk::DeviceQueueCreateInfo> &createInfos, vk::PhysicalDevice &device){
+        std::vector<vk::QueueFamilyProperties> queueFamilyProperties = device.getQueueFamilyProperties();
+        for (auto i = createInfos.rbegin(); i != createInfos.rend(); ++i ) {
+            auto createInfo = *i;
+            int index = createInfo.queueFamilyIndex;
+            if(static_cast<uint32_t>(queueFamilyProperties[index].queueFlags & flag) != 0){
+                std::cout << "Queue count: " << index << std::endl;
+                return index;
+            }
         }
-	    return 0;
+        return -1;
     }
 }
diff --git a/src/vkcv/Context.hpp b/src/vkcv/Context.hpp
index bcfb648bbc2e2840551c8d1fe1c014389fef6e47..0237684a9af5dbbab7f393ecc40a312e7bc06ac5 100644
--- a/src/vkcv/Context.hpp
+++ b/src/vkcv/Context.hpp
@@ -14,6 +14,9 @@ namespace vkcv {
 		vk::Instance m_instance;
 		vk::PhysicalDevice m_physicalDevice;
 		vk::Device m_device;
+		vk::Queue m_graphicsqueue;
+		vk::Queue m_computequeue;
+		vk::Queue m_transferqueue;
 
 		/**
 		 * Constructor of #Context requires an @p instance, a @p physicalDevice and a @p device.
@@ -22,7 +25,7 @@ namespace vkcv {
 		 * @param physicalDevice Vulkan-PhysicalDevice
 		 * @param device Vulkan-Device
 		 */
-		Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::Device device);
+		Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::Device device, vk::Queue graphicsqueue, vk::Queue computequeue, vk::Queue transferqueue);
 
 	public:
 		/**
@@ -145,7 +148,15 @@ namespace vkcv {
 		*/
 		static std::vector<vk::DeviceQueueCreateInfo> getQueueCreateInfos(vk::PhysicalDevice& physicalDevice, uint32_t queueCount, std::vector<float>& qPriorities, std::vector<vk::QueueFlagBits> &queueFlags);
 
-        static uint32_t findGraphicsQueueFamilyIndex(uint32_t queueCount, std::vector<vk::DeviceQueueCreateInfo> &createInfos);
+		/**
+		 * @brief finds an queue family index that fits with the given queue flags to create a queue handle
+		 * @param flag The given flag that specifies as which queue type the accessed queue should be treated
+		 * @param createInfos The createInfos of the created queues depending on the logical device
+		 * @param device The physical with which the queue families can be accessed
+		 * @return a fitting queue family index
+		 */
+        static int findQueueFamilyIndex(vk::QueueFlagBits flag, std::vector<vk::DeviceQueueCreateInfo> &createInfos, vk::PhysicalDevice &device);
+
 	};
 
 }
diff --git a/src/vkcv/SwapChain.cpp b/src/vkcv/SwapChain.cpp
index ceee227ef0748538d4ea731ac7487447aa69a340..e05c672e052918b8043ceec8efbe241b08594190 100644
--- a/src/vkcv/SwapChain.cpp
+++ b/src/vkcv/SwapChain.cpp
@@ -138,4 +138,4 @@ namespace vkcv {
       m_context->getInstance().destroySurfaceKHR( m_surface );
     }
 
-}
\ No newline at end of file
+}