diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index 148e3fa81f0656f24069cc7b43b58aa672f4e2fa..060ddc440f327b1de93bc318a0620f27e1dd547e 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -147,6 +147,7 @@
src/PlanView/SurveyMapVisual.qml
src/QmlControls/ToolStrip.qml
src/PlanView/TransectStyleComplexItemStats.qml
+ src/PlanView/TransectStyleMapVisuals.qml
src/QmlControls/VehicleRotationCal.qml
src/QmlControls/VehicleSummaryRow.qml
src/ViewWidgets/ViewWidget.qml
diff --git a/src/PlanView/TransectStyleMapVisuals.qml b/src/PlanView/TransectStyleMapVisuals.qml
new file mode 100644
index 0000000000000000000000000000000000000000..57212b8411f08ac039565ad16b091c087b6e5534
--- /dev/null
+++ b/src/PlanView/TransectStyleMapVisuals.qml
@@ -0,0 +1,157 @@
+/****************************************************************************
+ *
+ * (c) 2009-2016 QGROUNDCONTROL PROJECT
+ *
+ * QGroundControl is licensed according to the terms in the file
+ * COPYING.md in the root of the source code directory.
+ *
+ ****************************************************************************/
+
+import QtQuick 2.3
+import QtQuick.Controls 1.2
+import QtLocation 5.3
+import QtPositioning 5.3
+
+import QGroundControl 1.0
+import QGroundControl.ScreenTools 1.0
+import QGroundControl.Palette 1.0
+import QGroundControl.Controls 1.0
+import QGroundControl.FlightMap 1.0
+
+/// Base control for both Survey and Corridor Scan map visuals
+Item {
+ id: _root
+
+ property var map ///< Map control to place item in
+
+ property var _missionItem: object
+ property var _mapPolygon: object.surveyAreaPolygon
+ property bool _currentItem: object.isCurrentItem
+ property var _transectPoints: _missionItem.visualTransectPoints
+ property bool _showPartialEntryExit: !_currentItem && _missionItem.turnAroundDistance.rawValue !== 0 &&_transectPoints.length >= 2
+ property var _fullTransectsComponent: null
+ property var _entryTransectsComponent: null
+ property var _exitTransectsComponent: null
+ property var _entryCoordinate
+ property var _exitCoordinate
+
+ signal clicked(int sequenceNumber)
+
+ function _addVisualElements() {
+ _fullTransectsComponent = fullTransectsComponent.createObject(map)
+ _entryTransectsComponent = entryTransectComponent.createObject(map)
+ _exitTransectsComponent = exitTransectComponent.createObject(map)
+ _entryCoordinate = entryPointComponent.createObject(map)
+ _exitCoordinate = exitPointComponent.createObject(map)
+
+ map.addMapItem(_fullTransectsComponent)
+ map.addMapItem(_entryTransectsComponent)
+ map.addMapItem(_exitTransectsComponent)
+ map.addMapItem(_entryCoordinate)
+ map.addMapItem(_exitCoordinate)
+ }
+
+ function _destroyVisualElements() {
+ _fullTransectsComponent.destroy()
+ _entryTransectsComponent.destroy()
+ _exitTransectsComponent.destroy()
+ _entryCoordinate.destroy()
+ _exitCoordinate.destroy()
+ }
+
+ Component.onCompleted: {
+ _addVisualElements()
+ }
+
+ Component.onDestruction: {
+ _destroyVisualElements()
+ }
+
+ // Area polygon
+ QGCMapPolygonVisuals {
+ id: mapPolygonVisuals
+ mapControl: map
+ mapPolygon: _mapPolygon
+ interactive: _missionItem.isCurrentItem
+ borderWidth: 1
+ borderColor: "black"
+ interiorColor: "green"
+ interiorOpacity: 0.5
+ }
+
+ // Full set of transects lines. Shown when item is selected.
+ Component {
+ id: fullTransectsComponent
+
+ MapPolyline {
+ line.color: "white"
+ line.width: 2
+ path: _transectPoints
+ visible: _currentItem
+ }
+ }
+
+ // Entry and exit transect lines only. Used when item is not selected.
+ Component {
+ id: entryTransectComponent
+
+ MapPolyline {
+ line.color: "white"
+ line.width: 2
+ path: _showPartialEntryExit ? [ _transectPoints[0], _transectPoints[1] ] : []
+ visible: _showPartialEntryExit
+ }
+ }
+ Component {
+ id: exitTransectComponent
+
+ MapPolyline {
+ line.color: "white"
+ line.width: 2
+ path: _showPartialEntryExit ? [ _transectPoints[lastPointIndex - 1], _transectPoints[lastPointIndex] ] : []
+ visible: _showPartialEntryExit
+
+ property int lastPointIndex: _transectPoints.length - 1
+ }
+ }
+
+ // Entry point
+ Component {
+ id: entryPointComponent
+
+ MapQuickItem {
+ anchorPoint.x: sourceItem.anchorPointX
+ anchorPoint.y: sourceItem.anchorPointY
+ z: QGroundControl.zOrderMapItems
+ coordinate: _missionItem.coordinate
+ visible: _missionItem.exitCoordinate.isValid
+
+ sourceItem: MissionItemIndexLabel {
+ index: _missionItem.sequenceNumber
+ label: qsTr("Entry")
+ checked: _missionItem.isCurrentItem
+ onClicked: _root.clicked(_missionItem.sequenceNumber)
+ }
+ }
+ }
+
+ // Exit point
+ Component {
+ id: exitPointComponent
+
+ MapQuickItem {
+ anchorPoint.x: sourceItem.anchorPointX
+ anchorPoint.y: sourceItem.anchorPointY
+ z: QGroundControl.zOrderMapItems
+ coordinate: _missionItem.exitCoordinate
+ visible: _missionItem.exitCoordinate.isValid
+
+ sourceItem: MissionItemIndexLabel {
+ index: _missionItem.lastSequenceNumber
+ label: qsTr("Exit")
+ checked: _missionItem.isCurrentItem
+ onClicked: _root.clicked(_missionItem.sequenceNumber)
+ }
+ }
+ }
+}
diff --git a/src/QmlControls/QGroundControl/Controls/qmldir b/src/QmlControls/QGroundControl/Controls/qmldir
index 219191864f612881c12937076ce87739b793584f..da47b31aeffea12bf4467660240fee81f46b0fb6 100644
--- a/src/QmlControls/QGroundControl/Controls/qmldir
+++ b/src/QmlControls/QGroundControl/Controls/qmldir
@@ -80,6 +80,7 @@ SliderSwitch 1.0 SliderSwitch.qml
SubMenuButton 1.0 SubMenuButton.qml
SurveyMapVisuals 1.0 SurveyMapVisuals.qml
TransectStyleComplexItemStats 1.0 TransectStyleComplexItemStats.qml
+TransectStyleMapVisuals 1.0 TransectStyleMapVisuals.qml
ToolStrip 1.0 ToolStrip.qml
VehicleRotationCal 1.0 VehicleRotationCal.qml
VehicleSummaryRow 1.0 VehicleSummaryRow.qml