diff --git a/Irpg/Classes/Barbarian.pm b/Irpg/Classes/Barbarian.pm
new file mode 100644
index 0000000000000000000000000000000000000000..cc517182150e87303866fb9e0593813afb4a6579
--- /dev/null
+++ b/Irpg/Classes/Barbarian.pm
@@ -0,0 +1,23 @@
+package Irpg::Classes::Barbarian;
+
+use strict;
+use warnings;
+use Irpg::Classes::Fighter;
+our @ISA = qw(Irpg::Classes::Fighter);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['str'] + $pl_stats->['con'] >= 9) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Barbarian';
+	$self->{MOD_STR} = $pl_stats->{str}*1.5;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Bargainer.pm b/Irpg/Classes/Bargainer.pm
new file mode 100644
index 0000000000000000000000000000000000000000..1b5cf581b758684a1ead772bd93e8728fe2f4325
--- /dev/null
+++ b/Irpg/Classes/Bargainer.pm
@@ -0,0 +1,23 @@
+package Irpg::Classes::Bargainer;
+
+use strict;
+use warnings;
+use Irpg::Classes::Cunning;
+our @ISA = qw(Irpg::Classes::Cunning);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['cha'] + $pl_stats->['dex'] >= 9) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Bargainer';
+	$self->{MOD_CHA} = 1.5;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Elite_Warrior.pm b/Irpg/Classes/Elite_Warrior.pm
new file mode 100644
index 0000000000000000000000000000000000000000..70c6ec6a33f9aaefb2f96e40727ed665c30214c9
--- /dev/null
+++ b/Irpg/Classes/Elite_Warrior.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Elite_Warrior;
+
+use strict;
+use warnings;
+use Irpg::Classes::Warrior;
+our @ISA = qw(Irpg::Classes::Warrior);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['str'] + $pl_stats->['con'] >= 11) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Elite Warrior';
+	$self->{MOD_STR} = $pl_stats->{str}*1.5;
+	$self->{MOD_CON} = $pl_stats->{con}*1.5;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Enchanter.pm b/Irpg/Classes/Enchanter.pm
new file mode 100644
index 0000000000000000000000000000000000000000..220cac692fa08aaba3cab0f1b7d203d0a80e579d
--- /dev/null
+++ b/Irpg/Classes/Enchanter.pm
@@ -0,0 +1,23 @@
+package Irpg::Classes::Enchanter;
+
+use strict;
+use warnings;
+use Irpg::Classes::Enlightened;
+our @ISA = qw(Irpg::Classes::Enlightened);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['int'] + $pl_stats->['wis'] >= 9) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Enchanter';
+	$self->{MOD_WIS} = 1.5;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Godfather.pm b/Irpg/Classes/Godfather.pm
new file mode 100644
index 0000000000000000000000000000000000000000..e445931abc45ce1c8463ec7cd5a30bd3906db5d5
--- /dev/null
+++ b/Irpg/Classes/Godfather.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Godfather;
+
+use strict;
+use warnings;
+use Irpg::Classes::Swindler;
+our @ISA = qw(Irpg::Classes::Swindler);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['cha'] + $pl_stats->['dex'] >= 11) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Godfather';
+	$self->{MOD_CHA} = 1.5;
+	$self->{MOD_DEX} = 1.5;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/High_Mage.pm b/Irpg/Classes/High_Mage.pm
new file mode 100644
index 0000000000000000000000000000000000000000..dd097309ab960d48076371c8d7a7ce3c904a1547
--- /dev/null
+++ b/Irpg/Classes/High_Mage.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::High_Mage;
+
+use strict;
+use warnings;
+use Irpg::Classes::Mage;
+our @ISA = qw(Irpg::Classes::Mage);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['int'] + $pl_stats->['wis'] >= 11) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'High Mage';
+	$self->{MOD_WIS} = 1.5;
+	$self->{MOD_INT} = 1.5;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Mage.pm b/Irpg/Classes/Mage.pm
new file mode 100644
index 0000000000000000000000000000000000000000..70c4e347ab1d29a697e17f4ef7f0ed31d4041916
--- /dev/null
+++ b/Irpg/Classes/Mage.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Mage;
+
+use strict;
+use warnings;
+use Irpg::Classes::Enlightened;
+our @ISA = qw(Irpg::Classes::Enlightened);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['int'] + $pl_stats->['wis'] >= 9) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Mage';
+	$self->{MOD_WIS} = 1.4;
+	$self->{MOD_INT} = 1.4;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Master_Enchanter.pm b/Irpg/Classes/Master_Enchanter.pm
new file mode 100644
index 0000000000000000000000000000000000000000..4d334a5c9b8a518b0d64110e79c66dab851f4e80
--- /dev/null
+++ b/Irpg/Classes/Master_Enchanter.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Master_Enchanter;
+
+use strict;
+use warnings;
+use Irpg::Classes::Enchanter;
+our @ISA = qw(Irpg::Classes::Enchanter);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['int'] + $pl_stats->['wis'] >= 11) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Master Enchanter';
+	$self->{MOD_INT} = 1.2;
+	$self->{MOD_WIS} = 1.8;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Merchant.pm b/Irpg/Classes/Merchant.pm
new file mode 100644
index 0000000000000000000000000000000000000000..1e7b5ee53a05fde00f9117e3f15800a0b1635854
--- /dev/null
+++ b/Irpg/Classes/Merchant.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Merchant;
+
+use strict;
+use warnings;
+use Irpg::Classes::Bargainer;
+our @ISA = qw(Irpg::Classes::Bargainer);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['cha'] + $pl_stats->['dex'] >= 11) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Merchant';
+	$self->{MOD_CHA} = 1.8;
+	$self->{MOD_DEX} = 1.2;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Officer.pm b/Irpg/Classes/Officer.pm
new file mode 100644
index 0000000000000000000000000000000000000000..3694edac681e39677fa1c66066ba8a6d0f4b2b4a
--- /dev/null
+++ b/Irpg/Classes/Officer.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Officer;
+
+use strict;
+use warnings;
+use Irpg::Classes::Soldier;
+our @ISA = qw(Irpg::Classes::Soldier);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['str'] + $pl_stats->['con'] >= 11) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Officer';
+	$self->{MOD_STR} = $pl_stats->{con}*1.2;
+	$self->{MOD_CON} = $pl_stats->{con}*1.8;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Old_Wizard.pm b/Irpg/Classes/Old_Wizard.pm
new file mode 100644
index 0000000000000000000000000000000000000000..26f3c6c51d2ce816b9a25f5c4290a25d3f11f0f2
--- /dev/null
+++ b/Irpg/Classes/Old_Wizard.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Old_Wizard;
+
+use strict;
+use warnings;
+use Irpg::Classes::Wizard;
+our @ISA = qw(Irpg::Classes::Wizard);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['int'] + $pl_stats->['wis'] >= 11) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Old Wizard';
+	$self->{MOD_INT} = 1.8;
+	$self->{MOD_WIS} = 1.2;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Shadow.pm b/Irpg/Classes/Shadow.pm
new file mode 100644
index 0000000000000000000000000000000000000000..e181fbdebbbef9073cc887e10c5cb781d943ca99
--- /dev/null
+++ b/Irpg/Classes/Shadow.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Shadow;
+
+use strict;
+use warnings;
+use Irpg::Classes::Thief;
+our @ISA = qw(Irpg::Classes::Thief);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['cha'] + $pl_stats->['dex'] >= 11) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Shadow';
+	$self->{MOD_CHA} = 1.2;
+	$self->{MOD_DEX} = 1.8;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Soldier.pm b/Irpg/Classes/Soldier.pm
new file mode 100644
index 0000000000000000000000000000000000000000..f29ea4f2f22c0a0397415fd1707d40ce8f9b9b9f
--- /dev/null
+++ b/Irpg/Classes/Soldier.pm
@@ -0,0 +1,23 @@
+package Irpg::Classes::Soldier;
+
+use strict;
+use warnings;
+use Irpg::Classes::Fighter;
+our @ISA = qw(Irpg::Classes::Fighter);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['str'] + $pl_stats->['con'] >= 9) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Soldier';
+	$self->{MOD_CON} = $pl_stats->{con}*1.5;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Swindler.pm b/Irpg/Classes/Swindler.pm
new file mode 100644
index 0000000000000000000000000000000000000000..0ece6ae1bdc5bb1c2d23a68c39d4309ecbcba125
--- /dev/null
+++ b/Irpg/Classes/Swindler.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Swindler;
+
+use strict;
+use warnings;
+use Irpg::Classes::Cunning;
+our @ISA = qw(Irpg::Classes::Cunning);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['cha'] + $pl_stats->['dex'] >= 9) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Swindler';
+	$self->{MOD_CHA} = 1.4;
+	$self->{MOD_DEX} = 1.4;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Thief.pm b/Irpg/Classes/Thief.pm
new file mode 100644
index 0000000000000000000000000000000000000000..fae3202a37ef8c4ce0a6a1ed61fa94c550e7338d
--- /dev/null
+++ b/Irpg/Classes/Thief.pm
@@ -0,0 +1,23 @@
+package Irpg::Classes::Thief;
+
+use strict;
+use warnings;
+use Irpg::Classes::Cunning;
+our @ISA = qw(Irpg::Classes::Cunning);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['cha'] + $pl_stats->['dex'] >= 9) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Thief';
+	$self->{MOD_DEX} = 1.5;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Tribe_Chief.pm b/Irpg/Classes/Tribe_Chief.pm
new file mode 100644
index 0000000000000000000000000000000000000000..6264faeaf075fc5e5a7e1294a33b9c5cf277c2f3
--- /dev/null
+++ b/Irpg/Classes/Tribe_Chief.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Tribe_Chief;
+
+use strict;
+use warnings;
+use Irpg::Classes::Barbarian;
+our @ISA = qw(Irpg::Classes::Barbarian);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['str'] + $pl_stats->['con'] >= 11) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Tribe Chief';
+	$self->{MOD_STR} = $pl_stats->{str}*1.8;
+	$self->{MOD_CON} = $pl_stats->{str}*1.2;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Warrior.pm b/Irpg/Classes/Warrior.pm
new file mode 100644
index 0000000000000000000000000000000000000000..9f93b26d83263aabbebdbdbf388004a8d8d298fa
--- /dev/null
+++ b/Irpg/Classes/Warrior.pm
@@ -0,0 +1,24 @@
+package Irpg::Classes::Warrior;
+
+use strict;
+use warnings;
+use Irpg::Classes::Fighter;
+our @ISA = qw(Irpg::Classes::Fighter);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['str'] + $pl_stats->['con'] >= 9) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Warrior';
+	$self->{MOD_STR} = $pl_stats->{str}*1.4;
+	$self->{MOD_CON} = $pl_stats->{con}*1.4;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Classes/Wizard.pm b/Irpg/Classes/Wizard.pm
new file mode 100644
index 0000000000000000000000000000000000000000..0caddcccf72a62d8dc235d9363848bf675e1d2aa
--- /dev/null
+++ b/Irpg/Classes/Wizard.pm
@@ -0,0 +1,23 @@
+package Irpg::Classes::Wizard;
+
+use strict;
+use warnings;
+use Irpg::Classes::Enlightened;
+our @ISA = qw(Irpg::Classes::Enlightened);
+
+sub new {
+	my ($class, $pl_stats) = @_;
+
+	# condition to enter the class
+	if ($pl_stats->['int'] + $pl_stats->['wis'] >= 9) {
+		return undef;
+	}
+
+	my $self = $class->SUPER::new($pl_stats);
+	bless $self, $class;
+	$self->{NAME} = 'Wizard';
+	$self->{MOD_INT} = 1.5;
+	return $self;
+}
+
+1;
diff --git a/Irpg/Utils.pm b/Irpg/Utils.pm
index 2188f2621a066e25fbf384742c06ab892f861689..871877578e9badd0279d6050c3172c9040a01c2f 100644
--- a/Irpg/Utils.pm
+++ b/Irpg/Utils.pm
@@ -301,6 +301,7 @@ sub loaddb { # load the players database
         $rps->{$i[0]}{alignment},
         $rps->{$i[0]}{gender}) = (@i[1..7],($startup?0:$i[8]),@i[9..$#i]);
 
+		$classname =~ s/ /_/g;
         $rps->{$i[0]}{class} = eval 'Irpg::Classes::'.$classname.
                                     '->new($rps->{$i[0]}{stats})';
     }