diff --git a/vapigen/valagidlparser.vala b/vapigen/valagidlparser.vala
index 6cb068f..25e1f17 100644
--- a/vapigen/valagidlparser.vala
+++ b/vapigen/valagidlparser.vala
@@ -1148,7 +1148,13 @@ public class Vala.GIdlParser : CodeVisitor {
 	void handle_async_methods (ObjectTypeSymbol type_symbol) {
 		foreach (Method m in type_symbol.get_methods ()) {
 			if (m.coroutine) {
-				var finish_method = type_symbol.scope.lookup (m.name.substring (0, m.name.length - "_async".length) + "_finish") as Method;
+				string finish_method_base;
+				if (m.name.has_suffix ("_async")) {
+					finish_method_base = m.name.substring (0, m.name.length - "_async".length);
+				} else {
+					finish_method_base = m.name;
+				}
+				var finish_method = type_symbol.scope.lookup (finish_method_base + "_finish") as Method;
 				if (finish_method != null) {
 					m.return_type = finish_method.return_type.copy ();
 					foreach (var param in finish_method.get_parameters ()) {
@@ -1526,6 +1532,15 @@ public class Vala.GIdlParser : CodeVisitor {
 		
 		m.set_cname (symbol);
 		
+		if (parameters.length () >= 2) {
+			weak IdlNodeParam callback = parameters.last ().prev.data;
+			weak IdlNodeParam user_data = parameters.last ().data;
+			if ((callback.type.@interface == "GAsyncReadyCallback") && (parse_param (user_data) is PointerType)) {
+				// async method
+				m.coroutine = true;
+			}
+		}
+		
 		bool first = true;
 		FormalParameter last_param = null;
 		DataType last_param_type = null;
@@ -1558,7 +1573,7 @@ public class Vala.GIdlParser : CodeVisitor {
 				}
 			}
 
-			if (param.type.@interface == "GAsyncReadyCallback" && symbol.has_suffix ("_async")) {
+			if ((param.type.@interface == "GAsyncReadyCallback") && (symbol.has_suffix("_async") || m.coroutine)) {
 				// async method
 				m.coroutine = true;
 				continue;
