diff --git a/python-api-src/lib_unit.cpp b/python-api-src/lib_unit.cpp
index fd39b5d47cb03704926e0493c7f573c2e7d97873..cb99e65615ae22a661ef9a954f2640f316e1dbb5 100644
--- a/python-api-src/lib_unit.cpp
+++ b/python-api-src/lib_unit.cpp
@@ -30,6 +30,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("current_ability_id", &Unit::getCurrentAbilityID, "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 0946c514cea674458340ac6f0c6163c7176c4f2b..a5dcc01544e89c9ff41d95e27ab9193a7ee0837a 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("required_structure", &UnitType::getRequiredStructure)
         .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 b75c051fe0f44cbd945aa70210e4aa8f01db1e16..0380eb7cb30f0e3346eb50da6e8a8e7ad954d648 100644
--- a/src/Unit.cpp
+++ b/src/Unit.cpp
@@ -370,3 +370,57 @@ CCHealth Unit::getMaxHitPoints() const
     BOT_ASSERT(isValid(), "Unit is not valid");
     return m_unit->health_max;
 }
+
+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::getCurrentAbilityID() const
+{
+	BOT_ASSERT(isValid(), "Unit is not valid");
+
+	// If unit has order, return AbilityID 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 70c1aa8ed15bc72b6ba09caef68048237915c56e..3d5017726eb16b1b6ccc9ede69c6e1b9cc30571d 100644
--- a/src/Unit.h
+++ b/src/Unit.h
@@ -52,6 +52,13 @@ public:
     bool hasTarget() const;
     Unit getTarget() const;
     CCHealth getMaxHitPoints() const;
+    float getProgress() const;
+    sc2::AbilityID getCurrentAbilityID() 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..b1124c174f33816c16c86a001240d558f313dd79 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;
+}
+
+sc2::UnitTypeID UnitType::getRequiredStructure() const
+{
+	return m_bot->Observation()->GetUnitTypeData()[m_type].tech_requirement;
+}
diff --git a/src/UnitType.h b/src/UnitType.h
index 6c8d04347c8ea5a8d9de52a851aa3c419ad0bbc9..72ea02820e92dca208e52e3b72cb0dd087962474 100644
--- a/src/UnitType.h
+++ b/src/UnitType.h
@@ -24,6 +24,8 @@ public:
     CCRace getRace() const;
 	
     int getMovementSpeed() const;
+    int getSightRange() const;
+    sc2::UnitTypeID getRequiredStructure() const;
     
     bool isValid() const;
     bool isBuilding() const;