diff --git a/contrib/multikey/Makefile b/contrib/multikey/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..45ab0ab786f3a2d1581d80c4227987282c7571e8
--- /dev/null
+++ b/contrib/multikey/Makefile
@@ -0,0 +1,29 @@
+
+POSTSRC= /home/postgres/postgres95/src
+
+include $(POSTSRC)/Makefile.global
+include $(POSTSRC)/Makefile.custom
+
+CFLAGS= $(CFLAGS_SL) -Wall -Wmissing-prototypes -I$(POSTSRC)/include
+
+%.so: %.o
+	$(LD) -x -r -o $<.obj $<
+	@echo building shared object $@
+	@rm -f $@.pic
+	@${AR} cq $@.pic `lorder $<.obj | tsort`
+	${RANLIB} $@.pic
+	@rm -f $@
+	$(LD) -x -Bshareable -Bforcearchive \
+	  -o $@ $@.pic
+
+#
+# build dynamically-loaded object file
+#
+DLOBJS= multikey.so
+objdir= ./
+
+CLEANFILES+= $(DLOBJS)
+
+all:: $(DLOBJS)
+
+$(DLOBJS):	multikey.c
diff --git a/contrib/multikey/create.sql b/contrib/multikey/create.sql
new file mode 100644
index 0000000000000000000000000000000000000000..3ccfec674ec9b15ab6f23566858630e4ceeebc14
--- /dev/null
+++ b/contrib/multikey/create.sql
@@ -0,0 +1,15 @@
+drop function create_mki_2 (text, text, text, text);
+drop function create_mki_3 (text, text, text, text, text);
+drop function create_mki_4 (text, text, text, text, text, text);
+
+create function create_mki_2 (text, text, text, text)
+returns int4 as '/home/postgres/My/Btree/MULTIKEY/multikey.so'
+language 'c';
+
+create function create_mki_3 (text, text, text, text, text)
+returns int4 as '/home/postgres/My/Btree/MULTIKEY/multikey.so'
+language 'c';
+
+create function create_mki_4 (text, text, text, text, text, text)
+returns int4 as '/home/postgres/My/Btree/MULTIKEY/multikey.so'
+language 'c';
diff --git a/contrib/multikey/multikey.c b/contrib/multikey/multikey.c
new file mode 100644
index 0000000000000000000000000000000000000000..33bffdd55b80fcaed5ee12aaad302c901f172336
--- /dev/null
+++ b/contrib/multikey/multikey.c
@@ -0,0 +1,141 @@
+/*-------------------------------------------------------------------------
+ *
+ * multikey.c--
+ *    POSTGRES multikey indices create code.
+ *
+ *-------------------------------------------------------------------------
+ */
+#include <stdio.h>
+#include <string.h>
+
+#include <postgres.h>
+
+#include <storage/lmgr.h>
+#include <nodes/parsenodes.h>
+#include <commands/defrem.h>
+#include <utils/builtins.h>
+
+int4 create_mki_2 (struct varlena * index, struct varlena * rel, 
+			struct varlena * a1, struct varlena * a2); 
+int4 create_mki_3 (struct varlena * index, struct varlena * rel, 
+			struct varlena * a1, struct varlena * a2,
+			struct varlena * a3); 
+int4 create_mki_4 (struct varlena * index, struct varlena * rel, 
+			struct varlena * a1, struct varlena * a2, 
+			struct varlena * a3, struct varlena * a4); 
+
+extern bool FastBuild;
+static bool BuildMode;
+
+
+int4 create_mki_2 (struct varlena * index, struct varlena * rel, 
+			struct varlena * a1, struct varlena * a2)
+{
+    char * indexname = textout (index);
+    char * relname = textout (rel);
+    char * a1name = textout (a1);
+    char * a2name = textout (a2);
+    IndexElem *ie1 = makeNode(IndexElem);
+    IndexElem *ie2 = makeNode(IndexElem);
+    List *alist;
+
+    ie1->name = a1name;
+    ie1->args = NIL; ie1->class = NULL; ie1->tname = (TypeName*)NULL;
+    ie2->name = a2name;
+    ie2->args = NIL; ie2->class = NULL; ie2->tname = (TypeName*)NULL;
+
+    alist = lcons (ie2,NIL);
+    alist = lcons (ie1,alist);
+    
+    BuildMode = FastBuild;
+    FastBuild = false;		/* for the moment */
+    
+    DefineIndex (relname, indexname, "btree", alist, 
+    			(List*) NULL, false, (Expr*)NULL, (List*)NULL);
+
+    FastBuild = BuildMode;
+
+    return (0);
+
+}
+
+
+int4 create_mki_3 (struct varlena * index, struct varlena * rel, 
+			struct varlena * a1, struct varlena * a2,
+			struct varlena * a3)
+{
+    char * indexname = textout (index);
+    char * relname = textout (rel);
+    char * a1name = textout (a1);
+    char * a2name = textout (a2);
+    char * a3name = textout (a3);
+    IndexElem *ie1 = makeNode(IndexElem);
+    IndexElem *ie2 = makeNode(IndexElem);
+    IndexElem *ie3 = makeNode(IndexElem);
+    List *alist;
+
+    ie1->name = a1name;
+    ie1->args = NIL; ie1->class = NULL; ie1->tname = (TypeName*)NULL;
+    ie2->name = a2name;
+    ie2->args = NIL; ie2->class = NULL; ie2->tname = (TypeName*)NULL;
+    ie3->name = a3name;
+    ie3->args = NIL; ie3->class = NULL; ie3->tname = (TypeName*)NULL;
+
+    alist = lcons (ie3,NIL);
+    alist = lcons (ie2,alist);
+    alist = lcons (ie1,alist);
+    
+    BuildMode = FastBuild;
+    FastBuild = false;		/* for the moment */
+    
+    DefineIndex (relname, indexname, "btree", alist, 
+    			(List*) NULL, false, (Expr*)NULL, (List*)NULL);
+
+    FastBuild = BuildMode;
+
+    return (0);
+
+}
+
+
+int4 create_mki_4 (struct varlena * index, struct varlena * rel, 
+			struct varlena * a1, struct varlena * a2,
+			struct varlena * a3, struct varlena * a4)
+{
+    char * indexname = textout (index);
+    char * relname = textout (rel);
+    char * a1name = textout (a1);
+    char * a2name = textout (a2);
+    char * a3name = textout (a3);
+    char * a4name = textout (a4);
+    IndexElem *ie1 = makeNode(IndexElem);
+    IndexElem *ie2 = makeNode(IndexElem);
+    IndexElem *ie3 = makeNode(IndexElem);
+    IndexElem *ie4 = makeNode(IndexElem);
+    List *alist;
+
+    ie1->name = a1name;
+    ie1->args = NIL; ie1->class = NULL; ie1->tname = (TypeName*)NULL;
+    ie2->name = a2name;
+    ie2->args = NIL; ie2->class = NULL; ie2->tname = (TypeName*)NULL;
+    ie3->name = a3name;
+    ie3->args = NIL; ie3->class = NULL; ie3->tname = (TypeName*)NULL;
+    ie4->name = a4name;
+    ie4->args = NIL; ie4->class = NULL; ie4->tname = (TypeName*)NULL;
+
+    alist = lcons (ie4,NIL);
+    alist = lcons (ie3,alist);
+    alist = lcons (ie2,alist);
+    alist = lcons (ie1,alist);
+    
+    BuildMode = FastBuild;
+    FastBuild = false;		/* for the moment */
+    
+    DefineIndex (relname, indexname, "btree", alist, 
+    			(List*) NULL, false, (Expr*)NULL, (List*)NULL);
+
+    FastBuild = BuildMode;
+
+    return (0);
+
+}