diff --git a/Nomyx-Language.cabal b/Nomyx-Language.cabal
--- a/Nomyx-Language.cabal
+++ b/Nomyx-Language.cabal
@@ -1,5 +1,5 @@
 name: Nomyx-Language
-version: 0.2.1
+version: 0.2.2
 cabal-version: >=1.6
 ---Warning: For using "cabal sdist", this patch is needed in cabal: https://github.com/haskell/cabal/pull/1110
 ---To allow sdist to work with exported generated modules (Paths_Nomyx_Language)
diff --git a/src/Language/Nomyx.hs b/src/Language/Nomyx.hs
--- a/src/Language/Nomyx.hs
+++ b/src/Language/Nomyx.hs
@@ -5,7 +5,8 @@
    module Language.Nomyx.Rule,
    module Language.Nomyx.Examples,
    module Language.Nomyx.Evaluation,
-   module Language.Nomyx.Vote)  where
+   module Language.Nomyx.Vote,
+   module Language.Nomyx.Utils)  where
 
 import Language.Nomyx.Expression
 import Language.Nomyx.Definition
@@ -13,5 +14,6 @@
 import Language.Nomyx.Examples
 import Language.Nomyx.Evaluation
 import Language.Nomyx.Vote
+import Language.Nomyx.Utils
 
 
diff --git a/src/Language/Nomyx/Definition.hs b/src/Language/Nomyx/Definition.hs
--- a/src/Language/Nomyx/Definition.hs
+++ b/src/Language/Nomyx/Definition.hs
@@ -256,8 +256,18 @@
 addRule_ :: Rule -> Nomex ()
 addRule_ r = void $ AddRule r
 
-addRuleParams_ :: RuleName -> RuleFunc -> RuleCode -> RuleNumber -> String -> Nomex ()
-addRuleParams_ name func code number desc = addRule_ $ defaultRule {_rName = name, _rRuleFunc = func, _rRuleCode = code, _rNumber = number, _rDescription = desc}
+addRuleParams :: RuleName -> RuleFunc -> RuleCode -> String -> Nomex RuleNumber
+addRuleParams name func code desc = do
+   number <- getFreeRuleNumber
+   res <- addRule $ defaultRule {_rName = name, _rRuleFunc = func, _rRuleCode = code, _rNumber = number, _rDescription = desc}
+   return $ if res then number else error "addRuleParams: cannot add rule"
+   
+
+getFreeRuleNumber :: Nomex RuleNumber
+getFreeRuleNumber = do
+   rs <- getRules
+   return $ getFreeNumber $ map _rNumber rs
+
 
 --suppresses completly a rule and its environment from the system
 suppressRule :: RuleNumber -> Nomex Bool
diff --git a/src/Language/Nomyx/Evaluation.hs b/src/Language/Nomyx/Evaluation.hs
--- a/src/Language/Nomyx/Evaluation.hs
+++ b/src/Language/Nomyx/Evaluation.hs
@@ -152,10 +152,6 @@
 outputS :: PlayerNumber -> String -> Evaluate ()
 outputS pn s = void $ outputs %= ((pn, s) : )
 
-getFreeNumber :: (Eq a, Num a, Enum a) => [a] -> a
-getFreeNumber l = head [a| a <- [1..], not $ a `elem` l]
-
-
 evProposeRule :: Rule -> Evaluate Bool
 evProposeRule rule = do
    rs <- access rules
diff --git a/src/Language/Nomyx/Examples.hs b/src/Language/Nomyx/Examples.hs
--- a/src/Language/Nomyx/Examples.hs
+++ b/src/Language/Nomyx/Examples.hs
@@ -7,7 +7,7 @@
 module Language.Nomyx.Examples(nothing, helloWorld, accounts, createBankAccount, winXEcuPerDay,
     winXEcuOnRuleAccepted, moneyTransfer, delRule, voteWithMajority, king, makeKing, monarchy,
     revolution, victoryXRules, victoryXEcu, displayTime, noGroupVictory, iWin, returnToDemocracy,
-    banPlayer, referendum, referendumOnKickPlayer, gameMasterElections,
+    banPlayer, referendum, referendumOnKickPlayer, gameMasterElections, gameMaster,
     module Data.Time.Recurrence, module Control.Monad, module Data.List, module Data.Time.Clock) where
 
 import Language.Nomyx.Definition
@@ -91,8 +91,8 @@
 revolution player = voidRule $ do
     suppressRule 1
     makeKing player
-    addRuleParams_ "Monarchy" monarchy "monarchy" 1 "Monarchy: only the king can vote on new rules"
-    activateRule_ 1
+    rNum <- addRuleParams "Monarchy" monarchy "monarchy" "Monarchy: only the king can vote on new rules"
+    activateRule_ rNum
     --autoDelete
 
 -- | set the victory for players having more than X accepted rules
@@ -126,16 +126,19 @@
 iWin = voidRule $ getSelfProposedByPlayer >>= giveVictory
 
 
--- | a majority vote,
+-- | a majority vote, with the folowing parameters:
+-- a quorum of 2 voters is necessary for the validity of the vote
+-- the vote is assessed after every vote in case the winner is already known
+-- the vote will finish anyway after one day
 voteWithMajority :: RuleFunc
 voteWithMajority = onRuleProposed $ voteWith_ (majority `withQuorum` 2) $ assessOnEveryVotes >> assessOnTimeDelay oneDay
 
--- | Change unanimity vote (usually rule 1) to absolute majority (half participants plus one)
-returnToDemocracy :: RuleFunc
-returnToDemocracy = voidRule $ do
-   suppressRule 1
-   addRuleParams_ "vote with majority" voteWithMajority "voteWithMajority" 1 "meta-rule: return true if a majority of players vote positively for a new rule"
-   activateRule_ 1
+-- | Change current system (the rules passed in parameter) to absolute majority (half participants plus one)
+returnToDemocracy :: [RuleNumber] -> RuleFunc
+returnToDemocracy rs = voidRule $ do
+   mapM_ suppressRule rs
+   rNum <- addRuleParams "vote with majority" voteWithMajority "voteWithMajority" "meta-rule: return true if a majority of players vote positively for a new rule"
+   activateRule_ rNum
    autoDelete
 
 -- | kick a player and prevent him from returning
diff --git a/src/Language/Nomyx/Expression.hs b/src/Language/Nomyx/Expression.hs
--- a/src/Language/Nomyx/Expression.hs
+++ b/src/Language/Nomyx/Expression.hs
@@ -179,7 +179,7 @@
          _evStatus    :: EventStatus} -> EventHandler
 
 instance Show EventHandler where
-    show (EH en rn e _ _) = (show en) ++ " " ++ " " ++ (show rn) ++ " (" ++ (show e) ++"),\n"
+    show (EH en rn e _ _) = (show en) ++ " " ++ (show rn) ++ " (" ++ (show e) ++"),\n"
 
 instance Eq EventHandler where
     (EH {_eventNumber=e1}) == (EH {_eventNumber=e2}) = e1 == e2
diff --git a/src/Language/Nomyx/Game.hs b/src/Language/Nomyx/Game.hs
--- a/src/Language/Nomyx/Game.hs
+++ b/src/Language/Nomyx/Game.hs
@@ -18,7 +18,6 @@
 import Control.Category ((>>>))
 import Data.Lens.Template
 import Control.Exception
-import Language.Nomyx.Utils
 
 
 data TimedEvent = TimedEvent UTCTime GameEvent deriving (Show, Read, Eq, Ord)
diff --git a/src/Language/Nomyx/Test.hs b/src/Language/Nomyx/Test.hs
--- a/src/Language/Nomyx/Test.hs
+++ b/src/Language/Nomyx/Test.hs
@@ -263,7 +263,7 @@
 testVoteAssessOnEveryVotes3   = testVoteRule Pending $ voteGame      5  0 10 $ onRuleProposed $ voteWith_ majority $ assessOnEveryVotes
 testVoteAssessOnEveryVotes4   = testVoteRule Reject  $ voteGame      0  5 10 $ onRuleProposed $ voteWith_ majority $ assessOnEveryVotes
 testVoteMajorityWith          = testVoteRule Active  $ voteGame      6  0 10 $ onRuleProposed $ voteWith_ (majorityWith 50) $ assessOnEveryVotes
-testVoteNumberPositiveVotes   = testVoteRule Active  $ voteGame      3  7 10 $ onRuleProposed $ voteWith_ (numberPositiveVotes 3) $ assessOnEveryVotes
+testVoteNumberPositiveVotes   = testVoteRule Active  $ voteGame      3  7 10 $ onRuleProposed $ voteWith_ (numberVotes 3) $ assessOnEveryVotes
 testVoteWithQuorum1           = testVoteRule Active  $ voteGame      7  3 10 $ onRuleProposed $ voteWith_ (majority `withQuorum` 7) $ assessOnEveryVotes
 testVoteWithQuorum2           = testVoteRule Pending $ voteGame      6  0 10 $ onRuleProposed $ voteWith_ (majority `withQuorum` 7) $ assessOnEveryVotes
 testVoteAssessOnTimeLimit1    = testVoteRule Active  $ voteGameTimed 10 0 10 $ onRuleProposed $ voteWith_ unanimity $ assessOnTimeLimit date2
diff --git a/src/Language/Nomyx/Utils.hs b/src/Language/Nomyx/Utils.hs
--- a/src/Language/Nomyx/Utils.hs
+++ b/src/Language/Nomyx/Utils.hs
@@ -12,7 +12,6 @@
 import Control.Monad.State
 import Control.Monad.Identity
 import Debug.Trace (trace)
-import Data.List (intersperse)
 
 -- | durations
 oneWeek, oneDay, oneHour, oneMinute :: NominalDiffTime
@@ -52,3 +51,6 @@
 
 mapStateIO :: Show s => State s a -> StateT s IO a
 mapStateIO = mapStateT $ return . runIdentity
+
+getFreeNumber :: (Eq a, Num a, Enum a) => [a] -> a
+getFreeNumber l = head [a| a <- [1..], not $ a `elem` l]
diff --git a/src/Language/Nomyx/Vote.hs b/src/Language/Nomyx/Vote.hs
--- a/src/Language/Nomyx/Vote.hs
+++ b/src/Language/Nomyx/Vote.hs
@@ -142,8 +142,8 @@
 majorityWith x vs = voteQuota ((nbVoters vs) * x `div` 100 + 1) vs
 
 -- | assess the vote results according to a necessary number of positive votes
-numberPositiveVotes :: (Votable a) => Int -> VoteStats a -> [Alts a]
-numberPositiveVotes i vs = voteQuota i vs
+numberVotes :: (Votable a) => Int -> VoteStats a -> [Alts a]
+numberVotes i vs = voteQuota i vs
 
 -- | return the vote alternatives that are above threshold
 voteQuota :: forall a. (Votable a) => Int -> VoteStats a -> [Alts a]
