diff --git a/htdocs/core/modules/modPrintIPP.class.php b/htdocs/core/modules/modPrintIPP.class.php
new file mode 100644
index 00000000000..53cadf53699
--- /dev/null
+++ b/htdocs/core/modules/modPrintIPP.class.php
@@ -0,0 +1,145 @@
+.
+ */
+
+/** \defgroup printipp Module printipp
+ * \brief Module pour imprimer via CUPS
+ */
+
+/**
+ * \file htdocs/core/modules/modPrintIPP.class.php
+ * \ingroup printipp
+ * \brief Fichier de description et activation du module OSCommerce2
+ */
+include_once(DOL_DOCUMENT_ROOT ."/core/modules/DolibarrModules.class.php");
+
+
+
+/**
+ * \class modPrintIPP
+ * \brief Classe de description et activation du module PrintIPP
+ */
+class modPrintIPP extends DolibarrModules
+{
+
+ /**
+ * \brief Constructeur. Definit les noms, constantes et boites
+ * \param DB handler d'acces base
+ */
+ function __construct($db)
+ {
+ $this->db = $db ;
+ $this->numero = 54000;
+ // Family can be 'crm','financial','hr','projects','products','ecm','technic','other'
+ // It is used to group modules in module setup page
+ $this->family = "other";
+ // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module)
+ $this->name = preg_replace('/^mod/i','',get_class($this));
+ $this->description = "Print via Cups IPP Printer.";
+ $this->version = 'experimental'; // 'development' or 'experimental' or 'dolibarr' or version
+ $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name);
+ // Where to store the module in setup page (0=common,1=interface,2=others,3=very specific)
+ $this->special = 1;
+ // Name of image file used for this module.
+ // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue'
+ // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module'
+ $this->picto = 'technic';
+
+ // Data directories to create when module is enabled.
+ $this->dirs = array();
+
+ // Config pages
+ $this->config_page_url = array("printipp.php@printipp");
+
+ // Dependances
+ $this->depends = array();
+ $this->requiredby = array();
+ $this->phpmin = array(5,1); // Minimum version of PHP required by module
+ $this->need_dolibarr_version = array(3,2); // Minimum version of Dolibarr required by module
+ $this->conflictwith = array();
+ $this->langfiles = array("printipp");
+
+ // Constantes
+ $this->const = array();
+
+ // Boxes
+ $this->boxes = array();
+
+ // Permissions
+ $this->rights = array();
+ $this->rights_class = 'printipp';
+
+ $r=0;
+ // $this->rights[$r][0] Id permission (unique tous modules confondus)
+ // $this->rights[$r][1] Libelle par defaut si traduction de cle "PermissionXXX" non trouvee (XXX = Id permission)
+ // $this->rights[$r][2] Non utilise
+ // $this->rights[$r][3] 1=Permis par defaut, 0=Non permis par defaut
+ // $this->rights[$r][4] Niveau 1 pour nommer permission dans code
+ // $this->rights[$r][5] Niveau 2 pour nommer permission dans code
+
+ $r++;
+ $this->rights[$r][0] = 54001;
+ $this->rights[$r][1] = 'Printer';
+ $this->rights[$r][2] = 'r';
+ $this->rights[$r][3] = 1;
+ $this->rights[$r][4] = 'use';
+
+ // Main menu entries
+ $this->menus = array(); // List of menus to add
+ $r=0;
+
+ // This is to declare the Top Menu entry:
+ $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=home', // Put 0 if this is a top menu
+ 'type'=>'left', // This is a Top menu entry
+ 'titre'=>'Printer',
+ 'mainmenu'=>'printer',
+ 'url'=>'/printipp/index.php',
+ 'langs'=>'printipp', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
+ 'position'=>100,
+ 'enabled'=>'$conf->printipp->enabled',
+ 'perms'=>'$user->rights->printipp->use', // Use 'perms'=>'1' if you want your menu with no permission rules
+ 'target'=>'',
+ 'user'=>0); // 0=Menu for internal users, 1=external users, 2=both
+
+ $r++;
+
+
+ }
+
+ /**
+ * \brief Fonction appelee lors de l'activation du module. Insere en base les constantes, boites, permissions du module.
+ * Definit egalement les repertoires de donnees a creer pour ce module.
+ */
+ function init()
+ {
+ $sql = array("CREATE TABLE IF NOT EXISTS llx_printer_ipp (rowid int(11) NOT NULL AUTO_INCREMENT,printer_name text NOT NULL, printer_location text NOT NULL,printer_uri varchar(256) NOT NULL,copy int(11) NOT NULL DEFAULT '1',module varchar(16) NOT NULL,login varchar(32) NOT NULL,PRIMARY KEY (rowid)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;");
+
+ return $this->_init($sql);
+ }
+
+ /**
+ * \brief Fonction appelee lors de la desactivation d'un module.
+ * Supprime de la base les constantes, boites et permissions du module.
+ */
+ function remove()
+ {
+ $sql = array();
+
+ return $this->_remove($sql);
+ }
+
+}
+?>
diff --git a/htdocs/printipp/admin/printipp.php b/htdocs/printipp/admin/printipp.php
new file mode 100644
index 00000000000..a96e10d3996
--- /dev/null
+++ b/htdocs/printipp/admin/printipp.php
@@ -0,0 +1,159 @@
+.
+ */
+
+/**
+ * \file htdocs/printipp/admin/printipp.php
+ * \ingroup core
+ * \brief Page to setup printipp module
+ */
+
+require '../../main.inc.php';
+
+require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/dolprintipp.class.php';
+require_once DOL_DOCUMENT_ROOT.'/printipp/lib/printipp.lib.php';
+
+$langs->load("admin");
+$langs->load("printipp");
+
+if (! $user->admin) accessforbidden();
+
+$action = GETPOST('action','alpha');
+$mode = GETPOST('mode','alpha');
+
+if (!$mode) $mode='config';
+
+/*
+ * Action
+ */
+if ($action == 'setvalue' && $user->admin)
+{
+ $db->begin();
+ $result=dolibarr_set_const($db, "PRINTIPP_HOST",GETPOST('PRINTIPP_HOST','alpha'),'chaine',0,'',$conf->entity);
+ if (! $result > 0) $error++;
+ $result=dolibarr_set_const($db, "PRINTIPP_PORT",GETPOST('PRINTIPP_PORT','alpha'),'chaine',0,'',$conf->entity);
+ if (! $result > 0) $error++;
+ $result=dolibarr_set_const($db, "PRINTIPP_USER",GETPOST('PRINTIPP_USER','alpha'),'chaine',0,'',$conf->entity);
+ if (! $result > 0) $error++;
+ $result=dolibarr_set_const($db, "PRINTIPP_PASSWORD",GETPOST('PRINTIPP_PASSWORD','alpha'),'chaine',0,'',$conf->entity);
+ if (! $result > 0) $error++;
+
+ if (! $error)
+ {
+ $db->commit();
+ setEventMessage($langs->trans("SetupSaved"));
+ }
+ else
+ {
+ $db->rollback();
+ dol_print_error($db);
+ }
+}
+
+
+/*
+ * View
+ */
+
+$form = new Form($db);
+
+llxHeader('',$langs->trans("PrintIPPSetup"));
+
+$linkback=''.$langs->trans("BackToModuleList").'';
+print_fiche_titre($langs->trans("PrintIPPSetup"),$linkback,'setup');
+
+$head=printippadmin_prepare_head();
+
+dol_fiche_head($head, $mode, $langs->trans("ModuleSetup"));
+
+print $langs->trans("PrintIPPDesc")."
\n";
+
+
+ print '
';
+
+if ($mode=='config'&& $user->admin)
+{
+ print '
| '.$langs->trans("TestConnect").' | '; + print print_r($printer->getlist_available_printers(),true); + print "