diff --git a/R/S4class.R b/R/S4class.R
new file mode 100644
index 0000000000000000000000000000000000000000..6cc65879bcdcb01c66a4bed0a7ea4a9bfd9ca405
--- /dev/null
+++ b/R/S4class.R
@@ -0,0 +1,88 @@
+#'A Mediawikir controller serves to connect to a mediawiki API as a registered user in order to edit automatically certain documents based on R scripts
+#'
+#'@slot url the mediawiki instance base url
+#'@slot auth_token the current token used to edit the wiki (cf. https://www.mediawiki.org/wiki/Manual:Edit_token)
+#'@slot page_name the page which will be modified (including its namespace)
+setClass("Mediawikir",
+         representation(
+           url = "character",
+           user_name = "character",
+           auth_token = "character",
+           page_name = "character",
+           content = "character"))
+
+
+#'Creates a new Mediawikir object instance
+#'
+#'@param instance_url the base url for the mediawiki instance in which one wants to store R output
+#'@param user the user to which all changes to the wiki will be credited
+#'@param pass the user's password
+#'@param page the wiki page that will be modified
+#'@return a Mediawikir object (or FALSE on error)
+#'@examples
+#' new("Mediawikir", "http://wiki.example.com", "admin", "theadmin'spassword")
+setMethod("initialize", "Mediawikir", function (.Object, instance_url, user, pass, page){
+  tryCatch({
+      .Object@url <- paste(instance_url,"/","api.php",sep="")
+      .Object@user_name <- user
+      .Object@page_name <- page
+      .Object@auth_token=connect(.Object, pass)
+    },
+    error = function(e){
+      print(e$message)
+      .Object <- FALSE
+    }
+  )
+  return(.Object)
+})
+
+#'Adds content (that will be sent to the mediawiki instance by the "uploadContent" method)
+#'
+#'@param text the content to be added
+#'@param content_type the type of content, Default: "p" (paragraph)
+#'@examples
+#TODO
+
+setGeneric("connect", function(.Object, pass){})
+#'Connects to mediawiki instance and gets token (to be called by constructor)
+#'
+#'@return the token of the connection (0 on error)
+setMethod("connect", "Mediawikir", function(.Object, pass){
+  tryCatch(
+    { #get login token
+      query <- httr::POST(.Object@url,
+                          body = list(action="query",
+                                      meta="tokens",
+                                      type="login",
+                                      lgname = .Object@user_name,
+                                      format= "json"))
+      httr::stop_for_status(query)
+      #parse query response to retrieve token
+      response <- httr::content(query, "parsed", "application/json")
+      token <- response$query$tokens$logintoken
+      #login query
+      query <- httr::POST(.Object@url,
+                          body = list(action="clientlogin",
+                                      username = .Object@user_name,
+                                      password = pass,
+                                      logintoken = token,
+                                      loginreturnurl="http://wiki.lezinter.net",
+                                      format= "json"))
+      httr::stop_for_status(query)
+      #parse query response to make sure login worked
+      response <- httr::content(query, "parsed", "application/json")
+      if(response$clientlogin$status!="PASS"){
+        stop(paste(response$clientlogin,"\n"))
+      }
+      else{
+        return(token)
+      }
+    },
+    error = function(e)
+    {
+      print(paste("Could not login to", .Object@url, e$message))
+      token <- 0
+    }
+  )
+  return(token)
+})