diff --git a/CoAlgLogics.ml b/CoAlgLogics.ml
index 0fb82d0fe7c06d959e1ab38ef98b6011fd98c6a3..be35511152fccf82e5fa94c5ffb8838cca9ca924 100644
--- a/CoAlgLogics.ml
+++ b/CoAlgLogics.ml
@@ -265,6 +265,9 @@ let mkRule_CL sort bs sl =
         res := None;
         AllInOne rules
 
+let mkRule_GML sort bs sl =
+    mkRule_MultiModalK sort bs sl
+
 let mkRule_Choice sort bs sl =
   assert (List.length sl = 2);
   let dep bsl =
@@ -343,5 +346,6 @@ let getExpandingFunctionProducer = function
   | MultiModalK -> mkRule_MultiModalK
   | MultiModalKD -> mkRule_MultiModalKD
   | CoalitionLogic -> mkRule_CL
+  | GML -> mkRule_GML
   | Choice -> mkRule_Choice
   | Fusion -> mkRule_Fusion
diff --git a/CoAlgMisc.ml b/CoAlgMisc.ml
index d8a6720cc5a38d9ee574bac256e45e8a1af2b9ec..beb4fbd45e6f84eac4f0efe0c15a0c5f0dbfe68a 100644
--- a/CoAlgMisc.ml
+++ b/CoAlgMisc.ml
@@ -69,6 +69,7 @@ type functors =
   | MultiModalK
   | MultiModalKD
   | CoalitionLogic
+  | GML
   | Choice
   | Fusion
 
@@ -82,8 +83,10 @@ type formulaType =
   | NomF
   | ExF  (* Existential / diamond *)
   | AxF  (* Universal / box *)
-  | EnforcesF
-  | AllowsF
+  | EnforcesF (* diamond of CL *)
+  | AllowsF   (* box of CL *)
+  | MinF      (* at least n successors *)
+  | MaxF      (* at most  n successors *)
   | ChcF (* Choice *)
   | FusF (* Fusion *)
 
@@ -480,6 +483,7 @@ let arrayNeg = ref (Array.make 0 (Array.make 0 (-1)))
 let arrayDest1 = ref (Array.make 0 (Array.make 0 (-1)))  (* first subformula *)
 let arrayDest2 = ref (Array.make 0 (Array.make 0 (-1)))  (* second subformula *)
 let arrayDest3 = ref (Array.make 0 (Array.make 0 (-1)))  (* a role *)
+let arrayDestNum = ref (Array.make 0 (Array.make 0 (-1)))  (* an integer *)
 let arrayDestAg = ref (Array.make 0 (Array.make 0 [|0|])) (* arrays of agents *)
 
 (** This lookup table maps formulae (represented as integers)
@@ -491,6 +495,7 @@ let lfGetType sort f = !arrayType.(sort).(f)
 let lfGetDest1 sort f = !arrayDest1.(sort).(f)
 let lfGetDest2 sort f = !arrayDest2.(sort).(f)
 let lfGetDest3 sort f = !arrayDest3.(sort).(f)
+let lfGetDestNum sort f = !arrayDestNum.(sort).(f)
 let lfGetDestAg sort f = !arrayDestAg.(sort).(f)
 let lfGetNeg sort f =
   let nf = !arrayNeg.(sort).(f) in
@@ -561,8 +566,12 @@ let rec detClosure nomTbl hcF fset atset nomset s f =
         then raise (C.CoAlgException "[{Agents}]-formula is used in wrong sort.")
         else ();
         detClosure nomTbl hcF fset atset nomset (List.hd sortlst) f1
-    | C.HCMIN _
-    | C.HCMAX _ -> raise (C.CoAlgException "Min/Max functor currently not supported.")
+    | C.HCMIN (_,_,f1)
+    | C.HCMAX (_,_,f1) ->
+        if func <> GML || List.length sortlst <> 1
+        then raise (C.CoAlgException "[{>=,<=}]-formula is used in wrong sort.")
+        else ();
+        detClosure nomTbl hcF fset atset nomset (List.hd sortlst) f1
     | C.HCCHC (f1, f2)
     | C.HCCHCN (f1, f2) ->
         if func <> Choice || List.length sortlst <> 2 then
@@ -647,8 +656,26 @@ let initTables nomTbl hcF htF htR s f n =
       !arrayType.(s).(n) <- AllowsF;
       !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.hd sortlst) f1;
       !arrayDestAg.(s).(n) <- Array.of_list aglist
-  | C.HCMIN _ 
-  | C.HCMAX _ -> assert false
+  | C.HCMIN (cnt,role,f1) ->
+      !arrayType.(s).(n) <- MinF;
+      !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.hd sortlst) f1;
+      !arrayDestNum.(s).(n) <- cnt;
+      !arrayDest3.(s).(n) <-
+        if Hashtbl.mem htR role then Hashtbl.find htR role
+        else
+          let size = Hashtbl.length htR in
+          Hashtbl.add htR role size;
+          size
+  | C.HCMAX (cnt,role,f1) ->
+      !arrayType.(s).(n) <- MaxF;
+      !arrayDest1.(s).(n) <- C.HcFHt.find htF.(List.hd sortlst) f1;
+      !arrayDestNum.(s).(n) <- cnt;
+      !arrayDest3.(s).(n) <-
+        if Hashtbl.mem htR role then Hashtbl.find htR role
+        else
+          let size = Hashtbl.length htR in
+          Hashtbl.add htR role size;
+          size
   | C.HCCHC (f1, f2)
   | C.HCCHCN (f1, f2) ->
       !arrayType.(s).(n) <- ChcF;
@@ -734,6 +761,7 @@ let ppFormulae nomTbl tbox (s, f) =
   arrayDest2 := Array.init card (fun _ -> Array.make !size (-1));
   arrayDest3 := Array.init card (fun _ -> Array.make !size (-1));
   arrayNeg := Array.init card (fun _ -> Array.make !size (-1));
+  arrayDestNum := Array.init card (fun _ -> Array.make !size (-1));
   arrayDestAg := Array.init card (fun _ -> Array.make !size (Array.make 0 (-1)));
   let htR = Hashtbl.create 128 in
   Array.iteri (fun s ht -> C.HcFHt.iter (initTables nomTbl hcF htF htR s) ht) htF;
diff --git a/CoAlgMisc.mli b/CoAlgMisc.mli
index a8ecb13f5b9846d29120663db8df2aabade852db..1c50e0c949e8d05f9629a7f2163cc10493f13baf 100644
--- a/CoAlgMisc.mli
+++ b/CoAlgMisc.mli
@@ -13,6 +13,7 @@ type functors =
   | MultiModalK
   | MultiModalKD
   | CoalitionLogic
+  | GML
   | Choice
   | Fusion
 
@@ -28,6 +29,8 @@ type formulaType =
   | AxF
   | EnforcesF
   | AllowsF
+  | MinF
+  | MaxF
   | ChcF
   | FusF
 
@@ -275,6 +278,7 @@ val lfGetType : sort -> localFormula -> formulaType
 val lfGetDest1 : sort -> localFormula -> localFormula
 val lfGetDest2 : sort -> localFormula -> localFormula
 val lfGetDest3 : sort -> localFormula -> int
+val lfGetDestNum : sort -> localFormula -> int
 val lfGetDestAg : sort -> localFormula -> int array
 val lfGetNeg : sort -> localFormula -> localFormula option
 val lfGetAt : nominal -> localFormula -> atFormula
diff --git a/coalg.ml b/coalg.ml
index c5200e3a4a90994b94fbfada55a0651f5b4aeb10..16e3e305c9e18f951ade2bcec2835c190595e100 100644
--- a/coalg.ml
+++ b/coalg.ml
@@ -37,7 +37,7 @@ let _ = Gc.set { (Gc.get()) with Gc.minor_heap_size = 4194304; major_heap_increm
 let printUsage () =
   print_endline "Usage: \"alc <task> <functor> [<verbose>]\" where";
   print_endline "       <task> in { sat print }";
-  print_endline "       <functor> in { MultiModalK MultiModalKD CoalitionLogic";
+  print_endline "       <functor> in { MultiModalK MultiModalKD CoalitionLogic GML";
   print_endline "                      (or: K)     (or: KD)     (or: CL)       }";
   print_endline "       <verbose> = any (second) argument";
   print_endline "";
@@ -54,6 +54,7 @@ let parseFunctor str =
     | "K" -> CM.MultiModalK
     | "KD" -> CM.MultiModalKD
     | "CL" -> CM.CoalitionLogic
+    | "GML" -> CM.GML
     | "MultiModalK" -> CM.MultiModalK
     | "MultiModalKD" -> CM.MultiModalKD
     | "CoalitionLogic" -> CM.CoalitionLogic