diff --git a/python-api-src/lib_unit.cpp b/python-api-src/lib_unit.cpp
index 51026485aecca7d226050e89c003c40ad559ead1..f04d5cb87c4d445074c12016c9fc3f60ba1d54b5 100644
--- a/python-api-src/lib_unit.cpp
+++ b/python-api-src/lib_unit.cpp
@@ -29,6 +29,13 @@ void define_unit(py::module & m)
         .def_property_readonly("target", &Unit::getTarget)
         .def_property_readonly("has_target", &Unit::hasTarget)
 		.def_property_readonly("max_hit_points", &Unit::getMaxHitPoints)
+		.def_property_readonly("progress", &Unit::getProgress)
+		.def_property_readonly("ability_id", &Unit::getAbilityID, "The AbilityID of currently used ability")
+		.def_property_readonly("facing", &Unit::getFacing)
+		.def_property_readonly("radius", &Unit::getRadius)
+		.def("hold_position", &Unit::holdPosition)
+		.def("patrol", py::overload_cast<const CCPosition &>(&Unit::patrol, py::const_))
+		.def("stop_dance", &Unit::stopDance)
         .def("stop", &Unit::stop)
         .def("attack_unit", &Unit::attackUnit)
         .def("attack_move", &Unit::attackMove)
diff --git a/python-api-src/lib_unittype.cpp b/python-api-src/lib_unittype.cpp
index 35313deacf2f308b88347d6c789d200b3ab5f333..1dc74370cf10c6c036cd4258ccda0501c25bbfac 100644
--- a/python-api-src/lib_unittype.cpp
+++ b/python-api-src/lib_unittype.cpp
@@ -11,6 +11,8 @@ void define_unittype(py::module & m)
         .def_property_readonly("name", &UnitType::getName)
         .def_property_readonly("race", &UnitType::getRace)
 		.def_property_readonly("movement_speed", &UnitType::getMovementSpeed)
+		.def_property_readonly("sight_range", &UnitType::getSightRange)
+		.def_property_readonly("tech_requirement", &UnitType::getTechRequirement)
         .def_property_readonly("is_valid", &UnitType::isValid)
         .def_property_readonly("is_building", &UnitType::isBuilding)
         .def_property_readonly("is_combat_unit", &UnitType::isCombatUnit, "The unit is not any of the following: worker, supply provider, building, larva, egg")
diff --git a/src/Unit.cpp b/src/Unit.cpp
index 15277c8cb352e78a630186c39e66581aa6535660..cac0e306973004a80db77c0d00b75489f5752715 100644
--- a/src/Unit.cpp
+++ b/src/Unit.cpp
@@ -343,5 +343,65 @@ bool Unit::isBlip() const
 CCHealth Unit::getMaxHitPoints() const
 {
 	BOT_ASSERT(isValid(), "Unit is not valid");
+
 	return m_unit->health_max;
-}
\ No newline at end of file
+}
+
+float Unit::getFacing() const
+{
+	BOT_ASSERT(isValid(), "Unit is not valid");
+
+	return m_unit->facing;
+}
+
+float Unit::getRadius() const
+{
+	BOT_ASSERT(isValid(), "Unit is not valid");
+
+	return m_unit->radius;
+}
+
+float Unit::getProgress() const
+{
+	BOT_ASSERT(isValid(), "Unit is not valid");
+
+	//if unit has order, return progress of first order
+	if (getUnitPtr()->orders.size() > 0) {
+		return getUnitPtr()->orders[0].progress;
+	}
+
+	return -1;
+}
+
+sc2::AbilityID Unit::getAbilityID() const
+{
+	BOT_ASSERT(isValid(), "Unit is not valid");
+
+	//if unit has order, return progress of first order
+	if (getUnitPtr()->orders.size() > 0) {
+		return getUnitPtr()->orders[0].ability_id;
+	}
+	//return invalid AbilityID
+	return sc2::ABILITY_ID::INVALID;
+}
+
+void Unit::holdPosition() const
+{
+	BOT_ASSERT(isValid(), "Unit is not valid");
+
+	m_bot->Actions()->UnitCommand(m_unit, sc2::ABILITY_ID::HOLDPOSITION);
+}
+
+void Unit::patrol(const CCPosition & targetPosition) const
+{
+	BOT_ASSERT(isValid(), "Unit is not valid");
+
+	m_bot->Actions()->UnitCommand(m_unit, sc2::ABILITY_ID::PATROL, targetPosition);
+}
+
+void Unit::stopDance() const
+{
+	BOT_ASSERT(isValid(), "Unit is not valid");
+
+	m_bot->Actions()->UnitCommand(m_unit, sc2::ABILITY_ID::STOP_DANCE);
+}
diff --git a/src/Unit.h b/src/Unit.h
index f9c51a711658f49ed53787aba5e4832c3236bc7d..d10e52e8e68bec9c7e1754ea5787cc4717dd7586 100644
--- a/src/Unit.h
+++ b/src/Unit.h
@@ -51,6 +51,13 @@ public:
     bool hasTarget() const;
     Unit getTarget() const;
 	CCHealth getMaxHitPoints() const;
+	float getProgress() const;
+	sc2::AbilityID getAbilityID() const;
+	void holdPosition() const;
+	void patrol(const CCPosition & targetPosition) const;
+	void stopDance() const;
+	float getFacing() const;
+	float getRadius() const;
 
     void stop           () const;
     void attackUnit     (const Unit & target) const;
diff --git a/src/UnitType.cpp b/src/UnitType.cpp
index 2ace51fcb02044edfcb3c3209d94787526e3962b..154654f115c40176e663d673e18744fd5da8cdc9 100644
--- a/src/UnitType.cpp
+++ b/src/UnitType.cpp
@@ -377,3 +377,13 @@ int UnitType::getMovementSpeed() const
 {
     return m_bot->Observation()->GetUnitTypeData()[m_type].movement_speed;
 }
+
+int UnitType::getSightRange() const
+{
+	return m_bot->Observation()->GetUnitTypeData()[m_type].sight_range;
+}
+
+UnitType UnitType::getTechRequirement() const
+{
+	return m_bot->Observation()->GetUnitTypeData()[m_type].tech_requirement;
+}
diff --git a/src/UnitType.h b/src/UnitType.h
index 8f9d9755a634e6058bff62eca9cf0cbd0679ec7b..8568f4a16d4b0303307ed57fc343ebf95649b800 100644
--- a/src/UnitType.h
+++ b/src/UnitType.h
@@ -24,6 +24,8 @@ public:
     CCRace getRace() const;
 	
 	int getMovementSpeed() const;
+	int getSightRange() const;
+	UnitType getTechRequirement() const;
     
     bool isValid() const;
     bool isBuilding() const;