diff --git a/hch/CObjectHandler.cpp b/hch/CObjectHandler.cpp
index 2987bfffb..3437ecc72 100644
--- a/hch/CObjectHandler.cpp
+++ b/hch/CObjectHandler.cpp
@@ -3174,7 +3174,7 @@ bool CQuest::checkQuest (const CGHeroInstance * h) const
 			return true;
 			break;
 		case MISSION_KILL_HERO:
-			if (h->cb->getHero (m13489val)) //first we must check if the hero was ever alive
+			if (h->cb->gameState()->map->heroesToBeat[m13489val]->tempOwner < PLAYER_LIMIT)
 				return false; //if the pointer is not NULL
 			return true;
 			break;
@@ -3186,9 +3186,7 @@ bool CQuest::checkQuest (const CGHeroInstance * h) const
 		case MISSION_ART:
 			for (int i = 0; i < m5arts.size(); ++i)
 			{
-				if (vstd::contains(h->artifacts, m5arts[i]))
-					continue;
-				if (vstd::contains2(h->artifWorn, m5arts[i]))
+				if (h->hasArt(m5arts[i]))
 					continue;
 				return false; //if the artifact was not found
 			}
@@ -3220,7 +3218,7 @@ bool CQuest::checkQuest (const CGHeroInstance * h) const
 			return true;
 			break;
 		case MISSION_HERO:
-			if (m13489val == h->ID)
+			if (m13489val == h->type->ID)
 				return true;
 			return false;
 			break;
@@ -3233,7 +3231,6 @@ bool CQuest::checkQuest (const CGHeroInstance * h) const
 			return false;
 	}
 }
-
 void CGSeerHut::initObj()
 {
 	seerName = VLC->generaltexth->seerNames[ran()%VLC->generaltexth->seerNames.size()];
@@ -3253,6 +3250,7 @@ const std::string & CGSeerHut::getHoverText() const
 {
 	hoverName = VLC->generaltexth->allTexts[347];
 	boost::algorithm::replace_first(hoverName,"%s", seerName);
+	if (progress){}//what does it seek for?
 	return hoverName;
 }
 
@@ -3309,8 +3307,12 @@ void CGSeerHut::onHeroVisit( const CGHeroInstance * h ) const
 				}
 					break;
 				case MISSION_KILL_HERO:
+					iw.components.push_back (Component (Component::HERO,
+						cb->gameState()->map->heroesToBeat[m13489val]->type->ID, 0, 0));
+					iw.text.addReplacement(cb->gameState()->map->heroesToBeat[m13489val]->name);
+					break;
 				case MISSION_HERO:
-					iw.components.push_back (Component (Component::HERO, 1, m13489val, 0));
+					iw.components.push_back (Component (Component::HERO, m13489val, 0, 0));
 					iw.text.addReplacement(VLC->heroh->heroes[m13489val]->name);
 					break;
 				case MISSION_KILL_CREATURE:
@@ -3321,6 +3323,10 @@ void CGSeerHut::onHeroVisit( const CGHeroInstance * h ) const
 						iw.text.addReplacement (MetaString::CRE_SING_NAMES, stack->first);
 					else
 						iw.text.addReplacement (MetaString::CRE_PL_NAMES, stack->first);
+					if (std::count(firstVisitText.begin(), firstVisitText.end(), '%') == 2) //say where is placed monster
+					{
+						iw.text.addReplacement (VLC->generaltexth->arraytxt[147+checkDirection()]);
+					}
 				}
 					break;
 				case MISSION_ART:
@@ -3421,7 +3427,6 @@ void CGSeerHut::onHeroVisit( const CGHeroInstance * h ) const
 						break;
 				}
 				cb->showBlockingDialog (&bd, boost::bind (&CGSeerHut::finishQuest, this, h, _1));
-				//cb->showBlockingDialog (&bd, boost::bind (&CGBorderGuard::openGate, this, h, _1));
 				return;
 			}
 		}
@@ -3429,10 +3434,42 @@ void CGSeerHut::onHeroVisit( const CGHeroInstance * h ) const
 	else
 	{
 		iw.text << VLC->generaltexth->seerEmpty[textOption];
-		iw.text.addReplacement(seerName);
+		if (ID == 83)
+			iw.text.addReplacement(seerName);
 	}
 	cb->showInfoDialog(&iw);
 }
+int CGSeerHut::checkDirection() const
+{
+	int3 cord = cb->gameState()->map->monsters[m13489val]->pos;
+	if ((double)cord.x/(double)cb->getMapSize().x < 0.34) //north
+	{
+		if ((double)cord.y/(double)cb->getMapSize().y < 0.34) //northwest
+			return 8;
+		else if ((double)cord.y/(double)cb->getMapSize().y < 0.67) //north
+			return 1;
+		else //northeast
+			return 2;
+	}
+	else if ((double)cord.x/(double)cb->getMapSize().x < 0.67) //horizontal
+	{
+		if ((double)cord.y/(double)cb->getMapSize().y < 0.34) //west
+			return 7;
+		else if ((double)cord.y/(double)cb->getMapSize().y < 0.67) //central
+			return 9;
+		else //east
+			return 3;
+	}
+	else //south
+	{
+		if ((double)cord.y/(double)cb->getMapSize().y < 0.34) //southwest
+			return 6;
+		else if ((double)cord.y/(double)cb->getMapSize().y < 0.67) //south
+			return 5;
+		else //southeast
+			return 4;
+	}
+}
 void CGSeerHut::finishQuest (const CGHeroInstance * h, ui32 accept) const
 {
 	if (accept)
@@ -3455,15 +3492,78 @@ void CGSeerHut::finishQuest (const CGHeroInstance * h, ui32 accept) const
 			default:
 				break;
 		}
+		completeQuest(h);
 	}
 }
-void CGSeerHut::completeQuest (const CGHeroInstance * h) const
+void CGSeerHut::completeQuest (const CGHeroInstance * h) const //reward
 {
+	InfoWindow iw;
+	iw.player = h->getOwner();
+	switch (rewardType)
+	{
+		case 1: //experience
+			cb->changePrimSkill(h->id, 5, rVal, false);
+			iw.components.push_back (Component (Component::EXPERIENCE, 0, rVal, 0));
+			break;
+		case 2: //mana points
+			cb->setManaPoints(h->id, h->mana+rVal);
+			iw.components.push_back (Component (Component::PRIM_SKILL, 5, rVal, 0));
+			break;
+		case 3: case 4: //morale /luck
+		{
+			HeroBonus hb(HeroBonus::ONE_WEEK, (rewardType == 3 ? HeroBonus::MORALE : HeroBonus::LUCK),
+				HeroBonus::OBJECT, rVal, h->id, "", -1);
+			GiveBonus gb;
+			gb.hid = h->id;
+			gb.bonus = hb;
+			//gb.descr = "";
+			cb->giveHeroBonus(&gb);
+			iw.components.push_back (Component (
+				(rewardType == 3 ? Component::MORALE : Component::LUCK), 0, rVal, 0));
+		}
+			break;
+		case 5: //resources
+			cb->giveResource(h->getOwner(), rID, rVal);
+			iw.components.push_back (Component (Component::RESOURCE, rID, rVal, 0));
+			break;
+		case 6: //main ability bonus (attak, defence etd.)
+			cb->changePrimSkill(h->id, rID, rVal, false);
+			iw.components.push_back (Component (Component::PRIM_SKILL, rID, rVal, 0));
+			break;
+		case 7: // secondary ability gain
+			cb->changeSecSkill(h->id, rID, rVal, false);
+			iw.components.push_back (Component (Component::SEC_SKILL, rID, rVal, 0));
+			break;
+		case 8: // artifact
+			cb->giveHeroArtifact(rID, h->id, -2);
+			iw.components.push_back (Component (Component::ARTIFACT, rID, 0, 0));
+			break;
+		case 9:// spell
+		{
+			std::set<ui32> spell;
+			spell.insert (rID);
+			cb->changeSpells(h->id, true, spell);
+			iw.components.push_back (Component (Component::SPELL, rID, 0, 0));
+		}
+			break;
+		case 10:// creature
+		{
+			CCreatureSet creatures;
+			creatures.setCreature (0, rID, rVal);
+			cb->giveCreatures (id, h,  creatures);
+			iw.components.push_back (Component (Component::CREATURE, rID, rVal, 0));
+		}
+			break;
+		default:
+			break;
+	}
+	cb->showInfoDialog(&iw);
 	cb->setObjProperty (id,11,0); //no more mission avaliable
 }
 
 void CGQuestGuard::initObj()
 {
+	blockVisit = true;
 	progress = 0;
 	textOption = ran()%3 + 3; //3-5
 	if (missionType)
@@ -3481,20 +3581,9 @@ const std::string & CGQuestGuard::getHoverText() const
 	if (progress){}//what does it seek for?
 	return hoverName;
 }
-void CGQuestGuard::onHeroVisit( const CGHeroInstance * h ) const
-{}
-void CGQuestGuard::completeQuest (const CGHeroInstance * h) const
+void CGQuestGuard::completeQuest(const CGHeroInstance *h) const
 {
-	BlockingDialog bd (true, false);
-	bd.player = h->getOwner();
-	bd.soundID = soundBase::QUEST;
-	bd.text << completedText;
-	cb->showBlockingDialog (&bd, boost::bind (&CGQuestGuard::openGate, this, h, _1));	
-}
-void CGQuestGuard::openGate(const CGHeroInstance *h, ui32 accept) const
-{
-	if (accept)
-		cb->removeObject(id);
+	cb->removeObject(id);
 }
 void CGWitchHut::initObj()
 {
diff --git a/hch/CObjectHandler.h b/hch/CObjectHandler.h
index a7782c4ba..246113f0b 100644
--- a/hch/CObjectHandler.h
+++ b/hch/CObjectHandler.h
@@ -619,6 +619,7 @@ public:
 	void initObj();
 	const std::string & getHoverText() const;
 	void setPropertyDer (ui8 what, ui32 val);
+	int checkDirection() const; //calculates the region of map where monster is placed
 	void newTurn() const;
 	void onHeroVisit (const CGHeroInstance * h) const;
 	void finishQuest (const CGHeroInstance * h, ui32 accept) const; //common for both objects
@@ -636,9 +637,8 @@ class DLL_EXPORT CGQuestGuard : public CGSeerHut
 public:
 	void initObj();
 	const std::string & getHoverText() const;
-	void onHeroVisit( const CGHeroInstance * h ) const;
+	//void onHeroVisit( const CGHeroInstance * h ) const;
 	void completeQuest (const CGHeroInstance * h) const;
-	void openGate (const CGHeroInstance *h, ui32 accept) const;
  
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
diff --git a/lib/map.cpp b/lib/map.cpp
index cf102fdae..1d290c6ff 100644
--- a/lib/map.cpp
+++ b/lib/map.cpp
@@ -922,7 +922,8 @@ void Mapa::loadHero( CGObjectInstance * &nobj, const unsigned char * bufor, int
 			break;
 		}
 	}
-	nhi->identifier = identifier;
+	nhi->identifier = identifier; //probably redundant
+	heroesToBeat[identifier] = nhi;
 	if(readChar(bufor,i))//true if hero has nonstandard name
 		nhi->name = readString(bufor,i);
 	if(version>AB)
diff --git a/lib/map.h b/lib/map.h
index e3a9bd3bf..db6ad3d52 100644
--- a/lib/map.h
+++ b/lib/map.h
@@ -326,6 +326,7 @@ struct DLL_EXPORT Mapa : public CMapHeader
 	std::vector<CGHeroInstance*> heroes;
 	std::vector<CGTownInstance*> towns;
 	std::map<ui16, CGCreature*> monsters;
+	std::map<ui16, CGHeroInstance*> heroesToBeat;
 
 	void initFromBytes( const unsigned char * bufor); //creates map from decompressed .h3m data
 
@@ -357,7 +358,7 @@ struct DLL_EXPORT Mapa : public CMapHeader
 	{
 		h & static_cast<CMapHeader&>(*this);
 		h & rumors & allowedSpell & allowedAbilities & allowedArtifact & allowedHeroes & events & grailPos;
-		h & monsters; //hoprfully serialization is now automagical?
+		h & monsters & heroesToBeat; //hoprfully serialization is now automagical?
 
 		//TODO: viccondetails
 		if(h.saving)