diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml
index 32cb00f2085d..435cfc28e6e8 100644
--- a/python/src/META-INF/python-plugin-common.xml
+++ b/python/src/META-INF/python-plugin-common.xml
@@ -683,6 +683,15 @@
+
+
+
+
+
+
+
+
+
@@ -838,6 +847,10 @@
+
+
+
+
diff --git a/python/src/com/jetbrains/python/documentation/doctest/PyDocReference.java b/python/src/com/jetbrains/python/documentation/doctest/PyDocReference.java
new file mode 100644
index 000000000000..a89b852571bd
--- /dev/null
+++ b/python/src/com/jetbrains/python/documentation/doctest/PyDocReference.java
@@ -0,0 +1,71 @@
+package com.jetbrains.python.documentation.doctest;
+
+import com.google.common.collect.Lists;
+import com.intellij.codeInsight.completion.CompletionUtil;
+import com.intellij.lang.injection.InjectedLanguageManager;
+import com.intellij.psi.*;
+import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.psi.PyQualifiedExpression;
+import com.jetbrains.python.psi.impl.ResolveResultList;
+import com.jetbrains.python.psi.impl.references.PyReferenceImpl;
+import com.jetbrains.python.psi.resolve.*;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+
+/**
+ * User : ktisha
+ */
+public class PyDocReference extends PyReferenceImpl {
+ public PyDocReference(PyQualifiedExpression element, @NotNull PyResolveContext context) {
+ super(element, context);
+ }
+
+
+ @NotNull
+ @Override
+ public ResolveResult[] multiResolve(boolean incompleteCode) {
+ ResolveResult[] results = super.multiResolve(incompleteCode);
+ if (results.length == 0) {
+ final ResolveResultList ret = new ResolveResultList();
+ PsiFile file = myElement.getContainingFile();
+ final InjectedLanguageManager languageManager = InjectedLanguageManager.getInstance(myElement.getProject());
+ final PsiLanguageInjectionHost host = languageManager.getInjectionHost(myElement);
+ if (host != null) file = host.getContainingFile();
+
+ final String referencedName = myElement.getReferencedName();
+ if (referencedName == null) return ResolveResult.EMPTY_ARRAY;
+ ResolveProcessor processor = new ResolveProcessor(referencedName);
+
+ PyResolveUtil.scopeCrawlUp(processor, (ScopeOwner)file, referencedName, file);
+ PsiElement uexpr = processor.getResult();
+ if (uexpr != null) ret.add(new RatedResolveResult(RatedResolveResult.RATE_NORMAL, uexpr));
+ if (ret.size() > 0) {
+ return ret.toArray(new RatedResolveResult[ret.size()]);
+ }
+ return new ResolveResult[] { new PsiElementResolveResult(myElement) };
+ }
+ return results;
+ }
+
+ @NotNull
+ public Object[] getVariants() {
+ final ArrayList